Skip to content

v1.91.279.0 eval:select exemptions and ETHOS.md registration (#3499), below-floor review rulings (#3504, #3485), Windows curation, GSTA-121 follow-ups - #3515

Merged
capy-ai[bot] merged 8 commits into
mainfrom
eval-select-review-floor-followups
Oct 27, 2026
Merged

capy-ai[bot] merged 8 commits into
mainfrom
eval-select-review-floor-followups

Conversation

@garrytan

@garrytan garrytan commented Oct 27, 2026 •

Copy link
Copy Markdown
Owner
{
  "schema_version": 1,
  "pr": 3515,
  "head": "c7f6daa7a497c57ca75fa2e23a22a8a4728caa90",
  "version": "1.91.277.0",
  "base": "main",
  "gate": {
    "remote free gate (Ubicloud, whole free tier, tree db28ddaf67c4)": {
      "pass": 19401,
      "fail": 0,
      "skip": 0
    },
    "CI at 64684de (Free Tests run 40518449716, Windows Free Tests run 40518449728 and the other workflows)": {
      "pass": 48,
      "fail": 0,
      "skip": 11
    },
    "focused bun test (13 files)": {
      "pass": 302,
      "fail": 0,
      "skip": 0
    },
    "test:quick (4 shards, local 4-core; 5 fails are 2 environment-only files and 1 load flake green on rerun)": {
      "pass": 21173,
      "fail": 5,
      "skip": 0
    }
  },
  "session_kind": "unattended",
  "pregate": "requires-remote cleared @db28ddaf67c4 (1 checks, current for 64684de144e5)",
  "requires_remote": [
    "free-tests.yml/cso-macos-launcher: https://github.com/garrytan/gstack/actions/runs/40518449716",
    "free-tests.yml/macos-named-regressions: https://github.com/garrytan/gstack/actions/runs/40518449716",
    "free-tests.yml/cso-windows-launcher: https://github.com/garrytan/gstack/actions/runs/40518449716",
    "windows-free-tests.yml/windows-free-shard: https://github.com/garrytan/gstack/actions/runs/40518449728",
    "pregate.json/remote_gate: remote-gate tree=db28ddaf67c4 tests=19401"
  ],
  "issues": {
    "fixes": [],
    "refs": [
      3485,
      3499,
      3504
    ],
    "flakes": []
  },
  "docs": {
    "status": "updated",
    "scope": "docs/, README.md, CONTRIBUTING.md, AGENTS.md, CLAUDE.md (first audit at f1635d0 updated 4 files; read-only re-audit at 8c12f8d found every doc current)"
  },
  "review_loop": {
    "passes": 6,
    "blocking_found": 0,
    "deferred": 0,
    "noted": 3,
    "fixed": 8,
    "scope": "frozen"
  },
  "carry": {
    "from": "64684de144e5c5b8934408514b44434559487b18",
    "reason": "base merge + release metadata",
    "product_patch_id": "c30253c25c3056f6934d4bbf4a03c48955cef45d",
    "changed_paths": [
      "metadata:CHANGELOG.md",
      "metadata:VERSION",
      "metadata:agents-digest/gstack-AGENTS.md",
      "product:bin/gstack-pr-wait",
      "product:bin/gstack-ship-receipt",
      "product:docs/TESTING_INTERNALS.md",
      "product:docs/pregate.md",
      "product:docs/ship-policy.md",
      "product:docs/standalone-binaries.md",
      "product:docs/troubleshooting.md",
      "product:lib/pr-wait-github.ts",
      "product:lib/pr-wait.ts",
      "product:lib/restamp.ts",
      "product:lib/ship-queue-train-ready.ts",
      "product:lib/ship-queue-train.ts",
      "product:lib/ship-receipt-prose.ts",
      "product:lib/ship-receipt.ts",
      "product:lib/tree-receipt.ts",
      "metadata:package.json",
      "product:scripts/eval-readiness.ts",
      "product:scripts/train-gate.ts",
      "test:test/eval-readiness.test.ts",
      "test:test/gstack-restamp-queue.test.ts",
      "test:test/gstack-ship-receipt-docs.test.ts",
      "test:test/pr-wait.test.ts",
      "test:test/ship-queue-train-ops.test.ts",
      "test:test/ship-queue-train.test.ts",
      "test:test/ship-receipt-prose.test.ts",
      "test:test/train-gate.test.ts",
      "test:test/tree-receipt-stamp-sensitive.test.ts"
    ],
    "merge_commits": 1,
    "range_diff": "1:  e08612e = 1:  e08612e Eval selection exemptions, review-floor rulings and the GSTA-121 follow-ups\n2:  1f77181 = 2:  1f77181 fix: pre-landing review fixes\n3:  f1635d0 = 3:  f1635d0 fix: pre-landing review fixes (pass 2)\n4:  ecf3ad7 = 4:  ecf3ad7 fix: adversarial review fixes\n5:  f7eeda8 = 5:  f7eeda8 fix: pre-landing review fixes (pass 4)\n6:  8c12f8d = 6:  8c12f8d fix: pre-landing review fixes (pass 5)",
    "covers": [
      "pre-landing review",
      "adversarial review",
      "gate integrity",
      "documentation audit"
    ],
    "reruns": [
      "CI at head (gstack-ship-queue ready requires it); test and helper code changed since the reviewed head runs there unreviewed"
    ]
  }
}

What changed

A licence line, a notice entry or a crew template planned the whole paid gate (113 cases, 24 judges); now they plan none, and an ETHOS.md edit plans the three cases and one judge that read it (#3499)

A licence line, a notice entry or a crew template planned the whole paid gate (113 cases, 24 judges); now they plan none, and an ETHOS.md edit plans the three cases and one judge that read it (#3499).

Before/after as text: the PR eval selection, one changed file at a time
--- Before · origin/main@a1934a1498ec
+++ After · this branch
 $ bun run scripts/eval-select.ts  (PR profile, one changed file at a time)
-NOTICE.md                          mode full-fallback  e2e cases 113  judges 24  unknown dependency -> whole gate
-LICENSE                            mode full-fallback  e2e cases 113  judges 24  unknown dependency -> whole gate
-licenses/MIT-pstack.txt            mode full-fallback  e2e cases 113  judges 24  unknown dependency -> whole gate
-captain/templates/merge-ask.md     mode full-fallback  e2e cases 113  judges 24  unknown dependency -> whole gate
-ETHOS.md                           mode full-fallback  e2e cases 113  judges 24  unknown dependency -> whole gate
+NOTICE.md                          mode pr             e2e cases   0  judges  0
+LICENSE                            mode pr             e2e cases   0  judges  0
+licenses/MIT-pstack.txt            mode pr             e2e cases   0  judges  0
+captain/templates/merge-ask.md     mode pr             e2e cases   0  judges  0
+ETHOS.md                           mode pr             e2e cases   3  judges  1

The remote free gate packed the live .git with tar and lost the race against a reviewer's git; the snapshot now goes through git's own transport

The remote free gate packed the live .git with tar and lost the race against a reviewer's git; the snapshot now goes through git's own transport.

Before/after as text: ubi-runner pack under concurrent git
--- Before · origin/main@a1934a1498ec
+++ After · this branch
-PREGATE_REMOTE_INFRA: tar: .git: file changed as we read it
-tar exit 1 (3 of 3 packs under concurrent git)
+ubi-runner pack: refs fetched into a fresh repository, index and staged blobs carried
+pack exit 0 (3 of 3 packs under 20 s of index.lock, worktree and ref churn)
+unpacked: same HEAD, origin/main, remote URL, status and gstack-wtree as the source

Why

"A licence line or a changelog entry costs a full gate screen (about $30 planned for a docs PR) without any paid case reading the changed bytes" (#3499, filed from #3493's ship), and "the same classes of finding reached the owners again on every ship after being judged below the floor once" (#3504, #3485). A notice, licence or crew-template edit now plans no paid case, an ETHOS.md edit plans the four checks that read it, and a finding in one of the six ruled classes is a note from pass 1 on, with the floor itself unchanged. GSTA-121's three gaps close with it. The merge-ask template and docs/skills.md carry the Blast radius item the PR body already had, an approval record can cite screen 40477638211 GREEN without the scanner reading the run id as a phone number, and a review subagent's git diff can no longer fail the remote gate's tar.

Blast radius

Four surfaces beyond the files named are touched. First, every PR's paid selection (narrower only for NOTICE.md, LICENSE, licenses/**, captain/templates/** and ETHOS.md; every other unmapped file still restores the full gate, pinned in test/paid-free-boundary.test.ts), every scanner that reads pii.phone.e164 (an 11-digit span right after a run word is a run id in gstack-approvals, gstack-decision-trail, the pregate secrets check and gstack-post alike; a national number written without its + after failed or run is the accepted residual of the ruling that a run id is not a phone number), the generated review SKILL.md on five hosts (byte-for-byte at its pins; the size guard and the parity suite are green), and every ubi-runner pack consumer (the snapshot carries the index's blobs that HEAD lacks, replays remote.* and branch.*, skips gitlinks, and leaves no temp repository on failure; submodule repositories and a split index enabled without core.splitIndex are the known gaps, both older than this change). Evidence rung: the remote free gate ran the whole free tier on the final tree through the new pack (19,401 tests, 0 failed), and CI at the pin is green (48 passed, 0 failed, 11 skipped).

Approvals

Date Asked Exact words Outcome Covers Still pending
2026-10-27 Rule 19: merge origin/main into #3515 once so CI schedules on the pin (CHANGELOG, touchfiles-data, paid-free-boundary conflicts) “Rule 19 grant for #3515: merge origin/main at 6ff98c6 (v1.91.277.0, as of this message) once, as a merge commit with your prepared resolution. No rebase. The grant is spent on that one push” (GStack Minder (GSTA-36)) approved one merge commit of origin/main@6ff98c66 into eval-select-review-floor-followups (64684de); spent none

Source: gstack-approvals record for eval-select-review-floor-followups (display only; not an approval citation).

Summary

Tests

  • Remote free gate (Ubicloud, whole free tier, tree db28ddaf67c4 at the pin, through the new pack): 19,401 tests, 0 failed, $0.15; the pre-merge tree 31401568d0c2 ran it too (19,214, 0 failed, $0.08).
  • CI at 64684de: 48 passed, 0 failed, 11 skipped (Free Tests run 40518449716, Windows Free Tests run 40518449728); the three platform pregate lanes are cleared with those runs.
  • Merge of origin/main@6ff98c66 (v1.91.277.0) under GStack Minder's rule 19 grant: CHANGELOG.md (both entries kept), test/helpers/touchfiles-data.ts (GSTA-96's entries kept, ETHOS.md added to the plan-ceo-review entries main left without it) and test/paid-free-boundary.test.ts (LICENSE and NOTICE.md are no longer full-fallback examples) resolved; selection tests, redaction, pack, parity and size-guard suites green on the merged tree.
  • Focused: 302 tests across 13 files pass; bun run typecheck clean; typecheck:test 819 known, none new; gen:skill-docs fresh; parity suite and SKILL.md size guard green; gstack-prose-lint CHANGELOG.md --unreleased --gate ok.
  • bun run test:quick on this 4-core Capy machine: 21,173 pass, 5 fail in files this PR does not touch: test/gstack-retro-metrics.test.ts (2, this machine forces the git author through /etc/capy/git-identity.conf), test/cso-witness.test.ts (2, "Build CSO first: bun run build:cso"), test/gstack-gbrain-mcp-verify.test.ts (1, green on its one rerun alone; rule 16). All five pass on the remote gate.

Pre-Landing Review

Six passes under frozen scope, 0 blocking. Pass 1 (full diff): six specialists and the core checklist NO FINDINGS; Red Team 5 INFORMATIONAL (4 fixed, 1 noted). Pass 2 (fix range): state machines found the pass-1 EXIT trap read a local after unwinding and its test was vacuous; both fixed. Pass 3: clean. Pass 4 (after the adversarial fixes): 4 INFORMATIONAL (gitlink abort, valueless-key test, CHANGELOG wording, blob-list size), all fixed. Pass 5 and 6: clean, converged at the cycle cap.
Gate edits: none detected (4 listed, 2 read; patterns: RH-1,RH-3,RH-4,RH-12,RH-13,RH-14,RH-15,RH-16; unlisted idioms: none).
Outside review: Codex not installed on this machine; outside coverage unavailable. Native adversarial (Claude): four passes; the first found two floor-level defects the specialists missed (a stale scripts/harness-version.json pin that fails test/harness-version.test.ts, and staged blobs missing from the pack snapshot so a VM gstack-wtree could not read a staged file), both fixed; the fourth pass at the final tree: no FIXABLE, two INVESTIGATE notes below.

Review notes

Below the blocking floor (advisory, informational, test-gap or wording items); recorded here and not fixed in this PR.

  • INFORMATIONAL test/helpers/touchfiles-data.ts:162 ETHOS.md is registered only under the two prompts that quote it; the tier>=3 preamble names it as a read-on-demand pointer that no paid case asserts on (noted in the touchfiles header).
  • INFORMATIONAL lib/redact-patterns.ts:348 a national number written without + right after a run word (failed 14155551234) reads as a run id: the accepted residual of the ruling that a run id is not a phone number, in the scanner and in gstack-post alike (gstack-post has read it that way since GSTA-121).
  • INVESTIGATE scripts/ubicloud/ubi-runner.sh cmd_pack: ls-tree -r HEAD reads the live HEAD a few milliseconds after the refs fetch (a commit landing in that window would subtract blobs the snapshot lacks; fails loud on the VM, not a regression); resolve-undo blobs of a resolved conflict are not packed; a split index enabled by git update-index --split-index without core.splitIndex is not detected (pre-existing).

Exploratory QA

CLI surface, Full mode, 5 probes (~/.capy/work/GSTA-127/qa/functional/evidence.json): gstack-approvals add records words citing screen 40477638211 GREEN (exit 0, mirror written) and still refuses words carrying an E.164 number (exit 3, APPROVAL_RECORD_SECRET); gstack-redact flags a bare the id is <run id> and not screen 40477638211 GREEN on the same input; ubi-runner.sh pack under six concurrent git writers unpacks with the same HEAD, origin/main, remote URL and 31 status lines as the source (probe 4 superseded: wrong argument shape).

Design Review

No frontend files changed — design review skipped.

Eval Results

Selection on this diff: profile pr (dependents); the global touchfiles (scripts/test-pr-profile.ts, test/helpers/touchfiles-data.ts, lib/gstack-post.ts, lib/pregate/import-graph.ts, scripts/harness-version.json, scripts/lib/windows-curation.ts, bin/gstack-pr-shots) select every dependent gate case, so the PR screen is the pr-summary job on this PR; captain/templates/merge-ask.md was this PR's own unknown dependency before it was registered. No local paid run.

Greptile Review

Greptile: not run (no PR existed during the review); runs on the PR now that it exists.

Scope Drift

Scope Check: DRIFT DETECTED (in kind). Intent: the Captain brief (#3499 selection exemption and ETHOS.md registration, #3504/#3485 rulings with the floor unchanged, #3485's Windows one-liner, GSTA-121's Blast radius docs, run-id false positive, pregate-remote tar race and file selection). Delivered: all of it, plus captain/templates/** in FREE_ONLY_PR_FILES (found by this PR's own selection, #3499's class) and the pack hardening the reviews asked for. Not delivered: #3499's two prompt notes (plan-tune and eval-plan wording; prompt edits with their own paid cases).

Plan Completion

Plan completion audit: not run (no plan is bound to this branch and no docs/designs/ file matches). Fix: add "Plan: " to the PR body, or run /autoplan.

Issues

Refs #3499
Refs #3504
Refs #3485

TODOS

No TODO items completed in this PR.

Documentation

Status: updated (first audit at f1635d0), then current (read-only re-audit at 8c12f8d).

Scope: a1934a1498ec..8c12f8d (6 commits, 32 files; the later merge of origin/main@6ff98c66 touched no doc beyond CHANGELOG.md), covering the test-pr-profile lists, the redact run-id exemption, the ubi-runner pack snapshot, the review-policy rulings, the PR body docs, the merge-ask Blast radius section and the Windows curation entry. The banned-terms check returned none.

Documentation health:

  • docs/TESTING_INTERNALS.md: updated (the exempt-file list names captain/templates/** and RELEASE_METADATA_FILES; the Windows curation how-to)
  • docs/captain.md: updated (the merge ask includes blast radius)
  • docs/troubleshooting.md: updated (the scanner-level run-id exemption and its residual)
  • docs/pregate.md: current (the allowlist note)
  • docs/review-policy.md, docs/skills.md, docs/capy-install.md, capy/skill/gstack/captain.md: current
  • CHANGELOG.md: the Unreleased entry, written by this ship

Coverage debt: the ubi-runner.sh pack snapshot details (staged, intent-to-add and unmerged blobs travel, gitlinks skip, init --template= with gc.auto=0, valueless config keys replay as true) live only in the script header; RELEASE_METADATA_FILES has one reference line. Diagram drift: none found.

Test plan

  • gstack-pregate --stage tests --remote --spend-cap 2 --timeout 2700 --allow-repo-commands: PREGATE_REMOTE tree=db28ddaf67c4 tests=19401 failed=0 spent=0.15 (and tree=31401568d0c2 tests=19214 failed=0 spent=0.08 before the merge of main)
  • bun test on the 13 focused files: 302 pass, 0 fail
  • bun run typecheck, bun run typecheck:test, bun run gen:skill-docs --dry-run, bun test test/parity-suite.test.ts test/skill-md-size-guard.test.ts: clean, none new, fresh, 4 pass
  • bun run test:quick: 21,173 pass; 5 environment-only or load-flake fails named above

🤖 Generated with Claude Code

garrytan and others added 6 commits October 27, 2026 11:16
…ow-ups

Release metadata (NOTICE.md, LICENSE, licenses/**) no longer restores the
full paid gate and ETHOS.md is registered under the two prompts that read
it (#3499). docs/review-policy.md records the six finding classes #3485
and #3504 ruled below the floor and the review army's lead judgment
applies the table; the floor itself is unchanged. The Windows curation
moves test/pregate-remote-stamp-only.test.ts to KNOWN_WINDOWS_INCOMPATIBLE
(#3485). From GSTA-121: Blast radius in docs/skills.md and the merge-ask
template, the 11-digit run-id exemption from pii.phone.e164 after a run
word, relative string literals as import-graph edges, and a ubi-runner
pack that never tars the live .git.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Red Team pass 1 (all below the floor): an 11-digit span with a leading 1
after a run word is a US or Chinese national number, not a run id, and
reports again; ubi-runner pack removes its temporary repository when it
fails and replays branch.* with remote.* so a branch's upstream resolves
on the VM; the conservative-refusal example in docs/review-policy.md
reads in the refusing direction; the touchfiles header names why ETHOS.md
sits only under the two prompts that quote it. Step 6's selection found
captain/templates/merge-ask.md as the one unknown dependency of this PR
and registered captain/templates/** in FREE_ONLY_PR_FILES (#3499).

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
The cmd_pack EXIT trap bakes the temp path in: a set -e failure unwinds
the function before the trap runs and a local $tmp is unset there, so
the old form leaked the snapshot. The leak test creates TMPDIR where the
pack reads it and asserts the failure is the missing index. CHANGELOG
examples no longer spell a full national number.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
The pack snapshot carries the index's staged blobs as a pack of their own,
so a VM write-tree (gstack-wtree) can read a staged file the way the old
.git tar allowed; git init runs with --template= and gc.auto=0 and a
valueless remote/branch key replays as true. scripts/harness-version.json
re-pins scripts/test-pr-profile.ts after the captain/templates/** entry.
The run-id exemption reads the same way in the scanner and gstack-post:
an 11-digit span after a run word is a run id (the leading-1 exclusion
from the Red Team pass contradicted gstack-post's tested contract and the
ruling that a run id is not a phone number), with the residual named in
the comment, the docs and the CHANGELOG. The #3499 pins move to their own
test so the boundary test stays under its default budget. Docs audit:
TESTING_INTERNALS names RELEASE_METADATA_FILES and captain/templates/**,
docs/captain.md names Blast radius.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
The pack's staged-blob list comes from the copied index, holds only blobs
staged against HEAD (not every tracked blob), skips gitlinks whose commit
the superproject lacks, and dies with its own message when pack-objects
fails. The live-checkout test covers a gitlink entry and a valueless
remote key replayed as true. CHANGELOG names the staged-blob carry.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
The pack's blob list is the copied index's blobs that HEAD's tree lacks,
so an intent-to-add entry's empty blob and the stages of an unmerged entry
travel too (the HEAD-only diff list dropped both); gitlinks still skip.
The live-checkout test adds an intent-to-add entry, which the VM fsck
assertion covers.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
@trunk-io

trunk-io Bot commented Oct 27, 2026 •

Copy link
Copy Markdown

😎 This pull request was merged.

Resolves CHANGELOG.md (both entries kept, Unreleased on top), test/helpers/touchfiles-data.ts
(main's GSTA-96 entries kept, with ETHOS.md added to the plan-ceo-review entries main left
without it) and test/paid-free-boundary.test.ts (LICENSE and NOTICE.md are no longer
full-fallback examples: this branch exempts them).

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
@capy-ai capy-ai Bot changed the title Eval selection exemptions, review-floor rulings and the GSTA-121 follow-ups (#3499, #3504, #3485) eval:select exemptions and ETHOS.md registration (#3499), below-floor review rulings (#3504, #3485), Windows curation, GSTA-121 follow-ups Oct 27, 2026
…ps; stamp v1.91.279.0

FILES: CHANGELOG.md VERSION agents-digest/gstack-AGENTS.md package.json
MERGE_CONDITION: sha=64684de144e5c5b8934408514b44434559487b18
NEW_VERSION=1.91.279.0

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
@github-actions github-actions Bot changed the title eval:select exemptions and ETHOS.md registration (#3499), below-floor review rulings (#3504, #3485), Windows curation, GSTA-121 follow-ups v1.91.279.0 eval:select exemptions and ETHOS.md registration (#3499), below-floor review rulings (#3504, #3485), Windows curation, GSTA-121 follow-ups Oct 27, 2026
@capy-ai
capy-ai Bot merged commit b3e94a3 into main Oct 27, 2026
71 of 73 checks passed
garrytan added a commit that referenced this pull request Oct 27, 2026
…erged tree

The review-army small-diff clause (+5 union bytes) lands on a main that
sat 4 bytes under the ship cap after #3515 and #3517: 328,932 -> 328,937
/ 187,706 = 1.7524 both ways at four places, so the pin moves one in the
last place. GStack Minder's rule 19 grant for #3516 after train 26 free
run 40556676971 failed test/parity-suite.test.ts. Before/after and the
reason are in the CHANGELOG entry.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
capy-ai Bot added a commit that referenced this pull request Oct 27, 2026
…loor focus picker and the judged review/plan-review prose (GSTA-128) (#3516)

* fix(flaky): repair the five paid gate detectors and the judged review/plan-review prose (GSTA-128)

Daily flaky pass over the 2026-10-27 Open ledger entries, paid cases first.

- ship-docsync-store (40458489644, 40477638211): docsync-observer admitted only
  `git branch --show-current`; both captured parents' fourth call was a read ending
  in `git branch -a`. Operand-free branch listings are now part of the read grammar.
- ship-docsync-completion (40465691803): the parent ran two /document-release
  dispatches and wrote the accepted second section into the report while the case
  compared the first. The contract now follows the last foreground dispatch.
- ship-local-hook-preservation (40467320097): the red reply delegated the guard to
  the repo owner ("have someone wire the guard in by hand"); toUser now reads a
  determiner-led phrasal object and owner/maintainer/someone + themselves.
- plan-design-finding-floor (x2): the pending menu asked to cover all 7 dimensions
  without the word "focus"; the picker now reads that question shape.
- Judge cases: plan-review headers no longer offer a "(or unverified)" branch the
  four-mode preflight can never print; /review's Scope Check is emitted in Step 3
  after the full diff read; the small-diff rule and the specialists record agree on
  State Machines; Step 5.8.2 names which post-fix rerun rule governs. Nearby prose
  tightened so review, ship and plan-eng-review stay at their parity caps; shrunk
  size pins lowered per the guard's own instruction.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test(plan-review): expect the renamed routing row ('Any other mode') in the Eng provider case

The GSTA-128 prose repair renamed the plan-review routing row from 'other preflight mode, including harness mismatch' to 'Any other mode (not_installed, under_current_harness)'; test/plan-review-cases.test.ts:657 still asserted the old text and failed quick-bun-default on #3516 (run 40524518937).

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test(eval-select): register the three new free fixtures in FREE_FIXTURES

eval: select reported docsync-branch-listing-public.json, docsync-two-attempts-public.json and design-floor-focus-cover-all.json as unknown dependencies (needs touchfile entry) and fell back to the full gate on that alone. Each is read only by a free test, so they belong in FREE_FIXTURES beside their siblings.
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix(review): pre-landing review fixes for the paid flaky-case repairs

Pass 1 of /ship's review loop on #3516 (core, four specialists, native and
outside adversarial, Red Team). Fixed in the diff:

- test/skill-e2e-ship-docsync.test.ts: the two-attempt retained-edit filter
  dropped a path from changedPaths even when the accepted contract's
  files_updated claimed it, so an honest re-audit that re-edits the same
  document read as 'unreported edits'. acceptedChangedPaths() in
  test/helpers/docsync-contract.ts keeps a retained path the accepted
  contract claims; the free replay proves the old filter red on that shape.
- test/helpers/ship-hook-actor.ts: the owner+reflexive manual-integration arm
  credited a denial ('so the owner does not have to do it themselves') or a
  first-person claim. ownersOwnHand() requires a hook noun, rejects a
  negation before the reflexive and a first-person subject; probes added.
- scripts/resolvers/plan-gates.ts + review/sections/manifest.json: the
  no-plan path still said 'Emit Step 1.5's Scope Check once' and the STOP
  trigger 'finishing Step 1.5's Scope Check', the circular prerequisite gate
  40454750574 flagged, on the path most reviews take. Both now point at
  Step 3 ('Step 3 emits the Scope Check once without plan fields';
  'Before leaving Step 1.5').
- review/SKILL.md.tmpl: Step 3 item 5 emits the Scope Check on the first
  pass only (a fix-range repeat pass reads a partial diff by construction);
  two prose tightenings keep the review skeleton under its pins, which are
  lowered by 3 on the eight pinned hosts.
- test/helpers/docsync-interface.ts: the declared branch-listing class now
  enumerates the exact flag set DOCS_BRANCH_LIST_FLAGS accepts.

Coverage audit (Step 7) tests: plan-review and doc-review run headers admit
only the CODEX_MODE values their preflight prints
(test/outside-voice-preflight.test.ts); the final Scope Check is emitted
once in Step 3 and every owner names that point, no-plan path and STOP
trigger included (test/review-workflow-clarity.test.ts).

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* fix(ship-hook-actor): read the owner's denial in the owner's own clause

Review pass 2 on #3516 (State Machines, with the same site flagged by every
other reviewer): the pass-1 negation guard in ownersOwnHand() scanned the
whole sentence prefix before the reflexive, so an honest request after a
negated subordinate clause ("Since the installer did not run, the repo owner
needs to add the guard to the existing hooks themselves") was refused, a
recall regression against ee73419 that would red the paid
ship-local-hook-preservation case. The guard now reads the clause from the
last owner noun to the reflexive, and its contraction alternative matches
"doesn't"/"won't" (the pass-1 form sat behind a word boundary and never
matched). Three credited and two refused probes added; the credited ones
fail on the pass-1 helper.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* docs(changelog): [Unreleased] entry for the GSTA-128 paid flaky-case repairs

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* docs(changelog): count the four repaired gate detectors, not five

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* test(parity): re-pin ship maxSizeRatio 1.7524 -> 1.7525 on the main-merged tree

The review-army small-diff clause (+5 union bytes) lands on a main that
sat 4 bytes under the ship cap after #3515 and #3517: 328,932 -> 328,937
/ 187,706 = 1.7524 both ways at four places, so the pin moves one in the
last place. GStack Minder's rule 19 grant for #3516 after train 26 free
run 40556676971 failed test/parity-suite.test.ts. Before/after and the
reason are in the CHANGELOG entry.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

* RESTAMP: 1.91.280.0 -> 1.91.281.0 (stamped; queue_mode=stamp-at-merge base=origin/main@703b004 policy=base origin/main@703b0049ebbe:.gstack/ship-policy.json)
ship, next in queue at 1.91.281.0
STAMP_VERSION: 1.91.281.0
claims: ignored (stamp-at-merge)
stage version: done (wrote 1.91.281.0)
stage release_tool: done (bun scripts/gen-agents-digest.ts)
stage changelog: done (Unreleased -> 1.91.281.0)
stage stamp_paths: skipped (no tentative mention newer than the fork version 1.91.276.0 and none of base 1.91.280.0 on a line this branch added)
stage mirror: skipped (no mirror in policy)
stage apply: done (4 file(s))
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 5d8184d..4363f3d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,6 @@
 # Changelog

-## [Unreleased]
+## [1.91.281.0] - 2026-10-27

 **Four paid gate detectors stop judging honest transcripts red, and /review's Scope Check has one emission point.** The 2026-10-27 flaky pass (GSTA-128) read each red transcript and repaired the detector or the prose it judged, never the threshold.

diff --git a/VERSION b/VERSION
index 3d95d39..12d5f1c 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-1.91.280.0
+1.91.281.0
diff --git a/agents-digest/gstack-AGENTS.md b/agents-digest/gstack-AGENTS.md
index 15ac5e1..2b81219 100644
--- a/agents-digest/gstack-AGENTS.md
+++ b/agents-digest/gstack-AGENTS.md
@@ -1,4 +1,4 @@
-# gstack digest v1.91.280.0 — regenerate/re-copy after upgrading gstack
+# gstack digest v1.91.281.0 — regenerate/re-copy after upgrading gstack

 Behavioral rules from gstack (https://github.com/garrytan/gstack), compressed
 for agent hosts without a full skill install. The full skills add workflows,
diff --git a/node_modules b/node_modules
new file mode 120000
index 000000000..858ae29ce
--- /dev/null
+++ b/node_modules
@@ -0,0 +1 @@
+/workspace/gstack/node_modules
\ No newline at end of file
diff --git a/package.json b/package.json
index d0c1012..4a7a5d6 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
 {
   "name": "gstack",
-  "version": "1.91.280",
+  "version": "1.91.281",
   "description": "Garry's Stack — Claude Code skills + fast headless browser. One repo, one install, entire AI engineering workflow.",
   "license": "MIT",
   "type": "module",
FILES: CHANGELOG.md VERSION agents-digest/gstack-AGENTS.md package.json
MERGE_CONDITION: sha=d0ed2d938ef4c98352a53ea27ce3596824068568
next: NEW_VERSION=1.91.281.0; commit and push only the stamp diff above (FILES), with no edit of your own: the train's verify accepts the CHANGELOG only as the base's plus this PR's entry re-headed; merge with the expected head d0ed2d9 and recompute on a stale queue.
GSTACK_RESULT: skill=restamp status=complete run=/workspace/gstack/.gstack/tmp/restamp-journal.json

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>

---------

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant