GSTA-36 rule-19 grant 2026-10-27 naming 1f246e35. CHANGELOG via mergeChangelogs ([Unreleased] on top); CONTRIBUTING.md keeps this PR's new-skill steps 3-4 and main's step 5 (generated sections/preamble.md); test/fixtures/context-budget.json keeps main's values with modernize recaptured at 3772 (the preamble hoist moved it from 9466) and alwaysOnTotal 7769 -> 7880; test/helpers/carve-guards.ts ship cap 1.7524 -> 1.7528, measured 329,005 / 187,706 = 1.75277 on the merged tree (skeleton 60,900 after the hoist, 0 bytes from this PR); modernize/sections/preamble.md generated by the hoist.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
A plain git rebase drops merge commits and git range-diff compares only the
non-merge patches, so a change authored in a PR's merge commit disappeared
while the proof printed = for every patch and Step 5 force-pushed the loss.
Step 4 now counts merges in $MERGE_BASE..$OLD_HEAD and stops when there are
any, switches with -C so a rerun after a refused lease does not fail on the
existing branch, and asks for a cross-repository diff to be read as untrusted
input before the repository's test command runs it. Step 5 pushes a fork head
to the fork's URL with the same pinned lease instead of to origin, where the
lease could never match.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
A rerun after the author force-pushed left refs/modernize/pr-N stale (the
non-forced refspec is rejected with exit 0 through the pipe), and the lease
pinned to the current remote head would then have let the rebased stale head
overwrite the author's newer commits. The fetch is forced, Steps 2 and 4 stop
when the head is not the one observed in Step 1, and the head-is-base guard
applies only to same-repository PRs (a fork's main into main is a valid head).
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
- gstack-post: with --attribute, report scan findings at the body file's own
line numbers and a finding inside the callout as PART: attribute (the
coordinates were shifted by the three callout lines)
- /modernize: route commit messages through gstack-issue-guard with the rest
of the PR text, read isCrossRepository and maintainerCanModify, fetch a fork
head from pull/N/head, refuse a PR whose head is the base branch, and list
moved files NUL-safely
- docs/unattended.md: say that /ship never rebases or force-pushes and an
unattended /modernize stops at its verdict
- CHANGELOG: seven skills carry a codex_default_prompt, not six
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>