diff --git a/CHANGELOG.md b/CHANGELOG.md index b4820f2e3..0f1801536 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,7 +8,7 @@ - **`/modernize`**: bring an aging pull request onto its current base and decide whether it should still exist. The skill reads the PR as a claim (the problem, the change, what must be true of the codebase), reads its title, body and comments only through `gstack-issue-guard`, reads what moved under it for conflicts in meaning as well as in text, and writes one of three verdicts before anything is pushed: **MODERNIZE** (rebase with the author's commits kept as theirs, `git range-diff` with a one-line reason per changed hunk, the repo's own tests, then `git push --force-with-lease=:`), **REWORK** (the problem stands, this diff does not; nothing pushed) or **CLOSE** (recommended with the superseding commit; the PR stays open until someone with the authority says so). The skill never closes a PR and never uses a bare `--force`; `/careful` already rates the lease push MEDIUM. Rows in README, AGENTS.md, `docs/skills.md` (with a deep dive), `docs/PROJECT_STRUCTURE.md`, the root router and `gstack/llms.txt`. - **Per-skill Codex default prompts**: a template's `codex_default_prompt:` frontmatter key becomes that skill's `default_prompt` in `agents/openai.yaml`, the sentence Codex's picker inserts when a user chooses the skill; a template without the key keeps `Use for this task.`. `/ship`, `/review`, `/qa`, `/autoplan`, `/office-hours`, `/land-and-deploy` and `/modernize` carry one. The key is generator input only: no host's SKILL.md render carries it (Claude strips it; the allowlist hosts never copy it), so every pinned render is byte-identical. `bin/gstack-host-renders.sh`'s proof that a yaml file is gstack's accepts any `default_prompt` line. - **`gstack-post --attribute " on behalf of "`** on `pr-comment`, `issue-comment` and `reply`: opt-in and off by default, it opens the comment with a `> [!NOTE]` callout (`🤖 ****`) naming who wrote it, then the body as written. The callout bytes are scanned and bound into the MEDIUM confirmation token with the body, so a changed attribution needs a new token (findings are reported at the body file's own line numbers, a finding in the callout as `PART: attribute`); the flag is refused (exit 64) on a PR body, a title or an issue body, and for empty, multi-line or over-200-character text. `review/greptile-triage.md` says when to add it to a reply. -- **`docs/unattended.md` "What an unattended session may do"**: merge never (nor auto-merge, a merge queue or `gh pr ready` on a PR the run did not open); force-push only the run's own branch, after a rebase the plan or a `/modernize` disposition named, with `git range-diff` in the handoff and a lease pinned to the observed sha; tests only by the methods the repository's instructions name, no ask-first; proof is what the run observed itself. Anything outside the list is a pending approval item. `/ship`'s handoff section points at it (one line in the lazy section; the ship skeleton is unchanged at 82,645 bytes). +- **`docs/unattended.md` "What an unattended session may do"**: merge never (nor auto-merge, a merge queue or `gh pr ready` on a PR the run did not open); force-push only the run's own branch, after a rebase the plan or a `/modernize` disposition named, with `git range-diff` in the handoff and a lease pinned to the observed sha; tests only by the methods the repository's instructions name, no ask-first; proof is what the run observed itself. Anything outside the list is a pending approval item. `/ship`'s handoff section points at it (one line in the lazy section; this PR adds no skeleton bytes). - **CONTRIBUTING.md "Porting a contributor's PR"**: review and test the port head first (a fork's green checks prove nothing here), keep their commits as theirs with `Co-authored-by` on anything rewritten, your fixes on top as separate commits, the port names the original and its author, and the original closes with a specific thank-you linking the port; closing without landing is a maintainer's call. The repo-side home of the crew rule in `docs/captain.md`. ### Tests @@ -17,7 +17,7 @@ - `test/gstack-post.test.ts`: no flag means the body is sent as written; the callout on all three comment operations and on GitLab; scan and token cover the callout; refusals on the other operations and bad text. ### Gate integrity -- No threshold, timeout, trial count or case kind changed. `test/catalog-budget.test.ts` moves 1,314 → 1,359 token-equivalents for the new skill, re-measured on top of main's `/ubicloud` and `/design-motion` rows (pre-addition 5,249 bytes on d9b0d600, modernize adds 178, measured 5,427 = 1,357; 9 bytes left), and `test/fixtures/context-budget.json` is recaptured on the same base: `modernize: 9466` and `alwaysOnTotal` 7458 → 7880 (capture × 1.05). No pinned render in `test/fixtures/skill-md-size-allowlist.json` changed size; the ship union is 321,800 / 187,706 = 1.7144 against the 1.7150 cap (87 bytes in the lazy handoff section, 0 in the skeleton). +- The one threshold this PR moves is the ship union cap in `test/helpers/carve-guards.ts`, 1.7400 → 1.7405 under GStack Minder's grant: on the tree merged with f27a7605 the union is 326,691 / 187,706 = 1.7404 against #3487's 1.7400 (pinned at a measured 1.7391), the 87 bytes being the handoff pointer line. No timeout, trial count or case kind changed. `test/catalog-budget.test.ts` moves 1,314 → 1,359 token-equivalents for the new skill, re-measured on top of main's `/ubicloud` and `/design-motion` rows (pre-addition 5,249 bytes on d9b0d600, modernize adds 178, measured 5,427 = 1,357; 9 bytes left), and `test/fixtures/context-budget.json` is recaptured on the same base: `modernize: 9466` and `alwaysOnTotal` 7458 → 7880 (capture × 1.05). No pinned render in `test/fixtures/skill-md-size-allowlist.json` changed size (0 skeleton bytes added). ## [1.91.270.0] - 2026-10-27