Skip to content

v1.91.249.0 fix(evals): repair five paid-case flakes at their causes (GSTA-107 daily flaky pass) - #3472

Merged
capy-ai[bot] merged 4 commits into
mainfrom
capy/gsta-107-paid-flakes
Oct 26, 2026
Merged

capy-ai[bot] merged 4 commits into
mainfrom
capy/gsta-107-paid-flakes

Conversation

@garrytan

@garrytan garrytan commented Oct 26, 2026 •

Copy link
Copy Markdown
Owner
{
  "schema_version": 1,
  "pr": 3472,
  "head": "8c106d642b1b59d049404ee22f53dbc7252d4756",
  "version": "1.91.246.0",
  "base": "main",
  "gate": {
    "remote-gate": {
      "pass": 9261,
      "fail": 0,
      "skip": 0
    },
    "free-tests.yml": {
      "pass": 1,
      "fail": 0,
      "skip": 0
    },
    "windows-free-tests.yml": {
      "pass": 1,
      "fail": 0,
      "skip": 0
    }
  },
  "ci": {
    "free-tests.yml": "https://github.com/garrytan/gstack/actions/runs/40344967390",
    "windows-free-tests.yml": "https://github.com/garrytan/gstack/actions/runs/40344976952"
  },
  "spend_usd": 0.18,
  "session_kind": "unattended",
  "pregate": "requires-remote cleared @7761de88263c (1 checks, current for 8c106d642b1b)",
  "requires_remote": [
    "free-tests.yml/macos-named-regressions: https://github.com/garrytan/gstack/actions/runs/40344967390",
    "windows-free-tests.yml/windows-free-shard: https://github.com/garrytan/gstack/actions/runs/40344976952",
    "pregate.json/remote_gate: remote-gate tree=7761de88263c tests=9261"
  ],
  "issues": {
    "fixes": [],
    "refs": [
      3472
    ],
    "flakes": []
  }
}

What changed

The five captured gate slips (docsync --help retype, state-dir artifacts, preamble asset, 'wait for now' defer, bare probe --help) now replay as free tests: 5 fail on main's helpers, 0 fail with the repaired helpers, so the $1-per-rerun flakes are pinned without touching thresholds or trial counts.

The five captured gate slips (docsync --help retype, state-dir artifacts, preamble asset, 'wait for now' defer, bare probe --help) now replay as free tests: 5 fail on main's helpers, 0 fail with the repaired helpers, so the $1-per-rerun flakes are pinned without touching thresholds or trial counts.

Before/after as text: The five captured gate slips (docsync --help retype, state-dir artifacts, preamble asset, 'wait for now' defer, bare probe --help) now replay as free tests: 5 fail on main's helpers, 0 fail with the repaired helpers, so the $1-per-rerun flakes are pinned without touching thresholds or trial counts.
--- Before · before.txt · captured output
+++ After · after.txt · captured output
+$ bun test test/third-party-actions.test.ts test/qa-functional-prompt.test.ts test/docsync-lifecycle-interface.test.ts test/docsync-authority.test.ts   # this branch (8c106d6)
+ 167 pass
+ 0 fail
+Ran 167 tests across 4 files. [5.08s]
-$ bun test test/third-party-actions.test.ts test/qa-functional-prompt.test.ts test/docsync-lifecycle-interface.test.ts test/docsync-authority.test.ts   # origin/main helpers + this branch's tests
-error: expect(received).toBeDefined()
-(fail) the declared interface names every refused private-artifact root [138.56ms]
-error: expect(received).toEqual(expected)
-(fail) candidate call at a missing binary path (exit 127) > captured run 40323…742 ship-docsync-store: a mistyped --help after the declared usage was read > the capture passes; the mistyped --help alone is outside the interface [6.78ms]
-(fail) candidate call at a missing binary path (exit 127) > captured run 40323…742 ship-docsync-store: a mistyped --help after the declared usage was read > an earlier declared run excuses only --help, never snapshot or compare [8.22ms]
-error: expect(received).toContain(expected)
-(fail) the prompt grants --help to the evidence helper alone, and a bare probe --help stays outside the grammar [0.32ms]
-error: tpa-present 40290…102
-(fail) Opus consent renders (gate captures) > every consent question offers defer as a lettered option, including the paraphrased ones [0.51ms]
- 162 pass
- 5 fail
-Ran 167 tests across 4 files. [4.77s]
 

The 2026-10-26 train gates (40290033102, 40323989742) and the #3434 screen (40269992077) each failed one paid rule case that passed on its in-run rerun. The flake ledger grouped four of them as a "ship-docsync family"; the captured transcripts show three distinct slips plus a branch-specific fixture gap, and two more cases outside the family. Each is repaired where it arose, with the captured run replayed as a free regression and negative controls beside it. No threshold, trial count, case kind or budget changes.

Case Run Cause Repair
ship-docsync-store 40323989742 slice 3 the parent read gstack-docs-candidate --help at the declared path, later typed a second --help at the shard root (exit 127), and went on to compare; candidateNotFound required the same command after the slip a not-found --help is excused by the declared --help anywhere in the transcript; snapshot and compare keep the after-the-slip rule
ship-docsync-completion 40290033102 slice 2 snapshot --out, the saved section and the report insert went under <home>/state, gstack's GSTACK_HOME, which the authority refuses and the interface never named the interface names where a private artifact lives and every refused root; the authority is unchanged
docsync-spawned #3434 screen 40269992077 slice 13 #3434's generated SKILL.md names sections/preamble.md as a required asset; fixtureDocs copies a fixed list that lacks it, so the spawned child blocked ("Missing required skill asset") the fixture installs sections/preamble.md when the generated skill has one; main's skills install exactly what they did
tpa-present 40290033102 slice 14 "D) Wait for now. I'll mark this step as blocked on you." is the contract's defer in other words; offersDefer knew defer/postpone/put off/skip/come back/leave "wait for now" / "hold off for now" count as the option's own opening or sentence only
qa-functional-webhook-fix 40290033102 slice 9 the agent ran bun run probe -- --help bare before its first capture; the interface grants the helper's --help and says nothing about the probe's the interface says that is the only --help and a bare probe call is a bypass; grammar and detector unchanged

ship-docsync-missing-asset (40290033102 slice 13) is not repaired: its only refused command was echo "find-exit:$?", a variable the shared read-only grammar text already rules out in so many words ("echo and printf with literal arguments only"; "variables … stay outside this grammar"). It is logged as Won't fix.

Two review-fix commits on top of the original head: 470ac55 tightens offersDefer so "wait for now" counts only when it ends its sentence (red-team finding), and 8c106d6 fixes the Windows-deterministic docsync-authority path assertion (outside-voice P1), accepts em/en dashes and curly apostrophes in the defer paraphrase, never counts a browser-drive option as a defer, and registers the two new docsync fixtures under their paid touchfiles (the remote free gate's one red).

Why

The docsync detector and interface are the contract the paid cases judge against; a false refusal of a harmless, already-answered help probe, and a refusal the prompt never disclosed, each cost a $1 rerun per gate and will keep doing so. The preamble gap turns red on every #3434 run and on every train after it merges. The tpa and qa-functional entries are the same shape as the GSTA-57/63/65 repairs already in the ledger.

Approvals

No approvals recorded for branch capy/gsta-107-paid-flakes.

Recorded by the thread (CREW rule 5 citation, kept from the original body):

Date Ask Words Covers Pending
2026-10-15 Focused paid runs Garry: "it's fine run as many $93 paid gates as you want who cares" (CREW 5) focused reruns of the repaired cases none

Summary

  • Paid-case flake repairs in test helpers and fixtures only (no product code): docsync observer --help carve-out, docsync interface naming every refused private-artifact root, fixtureDocs preamble install, offersDefer "wait for now" / "hold off for now" paraphrase, qa-functional helper-only --help sentence; captured runs replayed as free regressions with negative controls.
  • Pre-landing review fixes (two commits): defer detector tightened and widened per findings; Windows path assertion split; fixtures registered under paid touchfiles.
  • CHANGELOG entry under ## [Unreleased] (stamp-at-merge; VERSION, package.json and the agents digest untouched).

Test Coverage

No new application code paths to audit (test-only diff: helpers, fixtures, tests, CHANGELOG). Step 7 skipped.
Tests ran: remote free gate (Ubicloud standard-16, us-east-a2) 9261 tests, 0 failed on tree 7761de88263c (PREGATE_REMOTE spent $0.04).
Tests ran: focused at 8c106d6: third-party-actions + docsync-authority + free-fixtures 78 pass; touchfile/selection files 159 pass; typecheck green; typecheck:test 819 known diagnostics, none new.
Regression proof: base control (main's helpers + this branch's tests) 162 pass / 5 fail; this branch 167 pass / 0 fail (image above).

Pre-Landing Review

Review loop per CREW rule 23: 3 passes (the cap), converged with deferred items; no fourth pass.

  • Pass 1 (whole diff at 2e3f7ba): specialists on anthropic/claude-sonnet-5-5 (testing, maintainability, performance, simplification: no findings; security: coverage note only). Red team (sonnet-5-5 high): 1 informational fixed in 470ac55 (over-broad clause-start match in offersDefer), 2 advisories deferred. Fix-range re-review 2e3f7ba..470ac55: clean.
  • Pass 2 (adversarial at 470ac55): native anthropic/claude-fable-5-1 (informational) and outside voice openai/gpt-6.1-sol (P1: docsync-authority Windows path assertion). All fixed in 8c106d6. Codex CLI not installed (CODEX_MODE: not_installed); the outside voice ran as an OpenAI-model Capy subagent.
  • Pass 3 (delta 470ac55..8c106d6 only): anthropic/claude-sonnet-5-5 high and openai/gpt-6.1-sol high. Nothing blocking under the rule-23 floor (no test fails, no production or data impact). Both recommend shipping with the items below deferred.

Deferred (named per rule 23; none fails a test):

  • [P2] test/helpers/third-party-actions.ts:58: the new non-drive guard tests the whole option, so a legitimate defer that merely mentions Aside/browse/drive ("D) Wait for now. I'll mark this step as blocked until Aside is installed.") returns false. Fail-closed recall gap, not a consent bypass; the captured tpa-present option is unaffected. Suggested fix: apply the guard to the text before the matched phrase.
  • [P3] test/helpers/third-party-actions.ts:59: an unspaced - ends the phrase, so "wait for now-do it yourself" counts; allow unspaced em/en dashes only.
  • [P3] test/helpers/third-party-actions.ts:59: "I'll wait for now" / "We'll wait for now" are not accepted (contractions).
  • Advisory: test/helpers/qa-functional-eval.ts:57 the interface sentence is stricter than the grammar it describes; test/helpers/docsync-fixture.ts:68 the preamble install is existence-gated (silent skip when the generated skill has none).
  • Informational (native adversarial at 470ac55): bare --help only inside the carve-out; the 'ran' predicate; mixed separators; zsh-only exit-127 signature.

Gate edits: none detected (18 listed, 11 read; patterns: RH-1,RH-3,RH-4,RH-12,RH-13,RH-14,RH-15,RH-16; unlisted idioms: none). Detector relaxations in docsync-observer (--help carve-out) and third-party-actions (defer paraphrase) are justified by the captured-run replays and the negative controls in the same diff; no thresholds, budgets, trial counts or case kinds changed.
Outside review: openai/gpt-6.1-sol completed at 470ac55 (gate fail, fixed) and at 8c106d6 (gate pass with the P3 deferred). Codex CLI: not installed, recorded as such.

Exploratory QA

Functional surface only (test-helper diff): probes 001-007 under .gstack/qa-reports/ship-3472, verdict pass at 2e3f7ba; base control 006 proved the new tests red on main's helpers. No capture at 8c106d6 beyond the focused runs above and the base-control image. Browser/API/job surfaces not applicable. The paid cases themselves were rerun focused by the parent thread before this /ship and were not rerun here.

Design Review

No frontend files changed — design review skipped.

Eval Results

No prompt-related files changed — evals skipped. Paid cases not rerun by /ship (rerun focused by the parent thread beforehand).

Greptile Review

Greptile triage: UNAVAILABLE (dispatch failed) — no Greptile integration reachable from this unattended Capy run.

Plan Completion

Plan completion: not run (no Plan: binding in the PR body, no docs/designs plan candidate).

Issues

Refs #3472

Verification Results

No Step 8.1 obligations (no plan). Remote free gate PASS (9261/0), focused lanes PASS, typecheck PASS; dispatched CI runs listed in the receipt block.

TODOS

No TODO items completed in this PR.

Documentation

Status: current — read-only re-audit at head 8c106d6 (base ab9a854) found no factual doc correction needed and no blockers; no edits were made.

Audited scope: 15 committed files vs base (CHANGELOG.md [Unreleased] entry, six test helpers incl. touchfiles-data.ts, five test files, three JSON fixtures); staged, unstaged and untracked sets are empty. No product code changed. Banned-terms check: none (no list in the repo). Discovery used the candidate's 123-doc inventory; each doc that names a changed contract was checked by targeted grep or section read, not read end to end (see decisions).

CHANGELOG [Unreleased] fact check against the final tree:

  • ship-docsync-store: candidateNotFound ignores a wrong-path --help (exit 127) when the declared --help ran anywhere in the transcript; snapshot/compare still need the retry after the slip. Matches docsync-observer.ts and the three lifecycle controls.
  • ship-docsync-completion: interface names the refused roots (repository, installed skills, Claude config dir, <home>/state, <home>/remote.git); the authority is unchanged. Matches docsync-interface.ts; the replay test pins four refused commands and one refused write.
  • docsync-spawned: fixtureDocs installs sections/preamble.md only when the generated skill has one. Matches the fixture and the dispatch test.
  • tpa-present: accurate after the round-2 fixes. I ran offersDefer on sample options: "Wait for now. I'll mark…", "Hold off on this for now.", "I wait for now." and "We wait for now - …" count; "Wait for now and do it yourself.", "Do not wait for now.", the phrase outside a lettered option, and "A) I drive it in Aside. I wait for now." do not. The bullet omits two rules the code comment states: the phrase must end its sentence, and a browser drive option never counts. It does not contradict the code, so it is a wording note, not a blocker.
  • qa-functional-webhook-fix: the helper-only --help sentence is present and the grammar is unchanged. Matches qa-functional-eval.ts and the prompt test.
  • Tests list: 29 consent renders, 5 paraphrased defers, fixture source updated for run 40290033102. Matches.

Documentation health:
CHANGELOG.md Current — [Unreleased] entry matches the code; offersDefer bullet is accurate but less specific than the code comment (decision below)
AGENTS.md Current — no changed contract described
CLAUDE.md Current — not touched; no changed contract described
README.md Current — not touched; no changed contract described
CONTRIBUTING.md Current — touchfiles-data.ts description still correct
TODOS.md Current — not touched by the diff
docs/CHANGELOG_STYLE.md Current — no style conflict found for the Unreleased entry
docs/TESTING_INTERNALS.md Current — touchfiles-data.ts references still correct
docs/TEST_PORTFOLIO.md Current — docsync row still accurate
docs/evals/detector-inventory.md Current — dated snapshot at HEAD cbcccf9; its tpa-present row ("Aside, A), defer, dashboard host") still holds
docs/ship-policy.md Current — [Unreleased] handling unchanged

Cross-doc consistency: VERSION 1.91.246.0 equals the latest released CHANGELOG heading (the new entry is under [Unreleased], as the stamp-at-merge flow expects); package.json 1.91.246 is the matching npm form. No narrative contradictions found.

Documentation coverage: no new public surface (test-infrastructure repairs only). Common gap: docs/TEST_PORTFOLIO.md names no row for third-party-actions, qa-functional-prompt or ship-document-release-dispatch (reference-only debt that predates this diff); not filled.

Diagram drift: none. No ARCHITECTURE diagram entity is renamed, split or removed by the diff.

Test plan

  • gstack-pregate --stage tests --base main --remote --spend-cap 2 (Ubicloud standard-16): PREGATE_REMOTE tree=7761de88263c tests=9261 failed=0 spent=0.04
  • bun test test/third-party-actions.test.ts test/docsync-authority.test.ts test/free-fixtures.test.ts: 78 pass
  • bun test touchfile/selection files (7): 159 pass
  • bun run typecheck + bun run typecheck:test: green, 819 known, none new
  • Base control (origin/main helpers + this branch's tests): 162 pass / 5 fail; branch: 167 pass / 0 fail
  • Dispatched CI: free-tests.yml and windows-free-tests.yml at 8c106d6 (URLs in the receipt)

Open in Capy

…elp slip, state-dir artifacts, preamble asset, defer paraphrase, probe --help (GSTA-107)

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

trunk-io Bot commented Oct 26, 2026 •

Copy link
Copy Markdown

😎 This pull request was merged.

garrytan and others added 2 commits October 26, 2026 14:39
offersDefer: the wait/hold-off-for-now paraphrase must open the option or a
sentence and end it, so a drive option's "I wait for now while you sign in"
or a manual option's "wait for now and do it yourself" no longer reads as the
defer option (red-team finding on #3472). Negative controls added.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
- offersDefer: the wait/hold-off-for-now paraphrase never counts inside a
  browser drive option, accepts an em dash without spaces and a curly
  apostrophe in let's; negative and positive controls added (adversarial
  review on #3472).
- docsync-authority: the interface assertion expects the rendered
  `<home>/remote.git` form so it holds on Windows; the captured Linux
  replay is POSIX-only like the late-result replay (outside voice P1).
- touchfiles: register the two new docsync captures with the paid cases
  they replay (ship-docsync-store, ship-docsync-completion), which
  test/free-fixtures.test.ts requires (remote gate red at 470ac55).

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
garrytan added a commit that referenced this pull request Oct 26, 2026
…d (hunk taken from #3472)

A generated skill that loads the shared preamble names sections/preamble.md
as a required asset before skill start, and a spawned document-release child
blocks on its absence, so docsync-spawned stayed red on every #3434 screen.
fixtureDocs now copies that file when the generated skill has it.

This single hunk is taken unchanged from gstack#3472 (head 2e3f7ba,
GSTA-107), which trains ahead of #3434, so the train merge sees identical
lines. Nothing else from #3472 is included.

Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
garrytan added a commit that referenced this pull request Oct 26, 2026
Co-authored-by: capy-ai[bot] <230910855+capy-ai[bot]@users.noreply.github.com>
… base=origin/main@5755601 policy=base origin/main@5755601dac5d:.gstack/ship-policy.json)

STAMP_VERSION: 1.91.249.0
stage version: done (wrote 1.91.249.0)
stage release_tool: done (bun scripts/gen-agents-digest.ts)
stage changelog: done (Unreleased -> 1.91.249.0)
stage stamp_paths: skipped (no stamp_paths in policy)
stage mirror: skipped (no mirror in policy)
stage apply: done (4 file(s))
FILES: CHANGELOG.md VERSION agents-digest/gstack-AGENTS.md package.json
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>
@github-actions github-actions Bot changed the title fix(evals): repair five paid-case flakes at their causes (GSTA-107 daily flaky pass) v1.91.249.0 fix(evals): repair five paid-case flakes at their causes (GSTA-107 daily flaky pass) Oct 26, 2026
@capy-ai
capy-ai Bot merged commit 3ab7b14 into main Oct 26, 2026
62 checks passed
garrytan added a commit that referenced this pull request Oct 26, 2026
CHANGELOG additive. #3472's companion fixtureDocs test removes ship's generated sections/preamble.md from its copied tree before asserting that a skill without one gets none: under the hoist every generated tier 2+ skill, ship included, has one, so the train-14 assertion at :249 named a skill that does have it.

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
…nce per session (GSTA-96) (#3434)

* fix(preamble): completeness means complete coverage with minimal code (GSTA-96)

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

* feat(preamble): tier 2+ skills load the shared preamble once per session (GSTA-96)

Every tier 2+ SKILL.md inlined the same ~23 KB preamble. It now renders once
per host into sections/preamble.md beside each tier 2+ SKILL.md; the SKILL.md
keeps a pointer that asks for the Read only when the file's id is not already
in context. Only sections byte-identical to the shared render move, so every
skill keeps exactly its pre-hoist paragraphs (verified across all 41 skills).

Parity caps for ten skills raised to their measured unions (owner-approved,
Garry 2026-10-25: "do it"); 63 size pins lowered and 26 deleted.

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

* fix(paid-select): a generated sections/preamble.md takes its skill template's identity in the PR planner (GSTA-96)

screen-summary failed on #3434 with 'PR profile requires full validation' for nine
skills whose only paid coverage is periodic: their new sections/preamble.md had no
dependency identity, while the SKILL.md beside it inherits its template's.

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

* test(section-manifest): the shared sections/preamble.md renders from the hoist resolver, not a section template (GSTA-96)

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

* fix: pre-landing review fixes (CHANGELOG says 3 characters shorter; model-overlays guards the coverage half)

The completeness section shrank by 3 characters (5 bytes), matching the 89 pins lowered by 3. The default-copy test pinned only the minimal-code half; an expectMentions check now fails if the full-coverage or never-excuses-a-gap clause is dropped.

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

* fix: pre-landing review fixes (model-overlays binds smaller diff to equal coverage)

The default-copy check now also fails if 'on equal coverage' is dropped from the smaller-diff rule (which would tell models to prefer the smaller diff unconditionally) or if the no-impossible-state-checks clause is removed.

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

* docs: CHANGELOG lists the model-overlays coverage checks

The [Unreleased] Tests bullet now says the default-copy test checks both halves of the rule (full coverage of the requirement; smaller diff only at equal coverage; no impossible-state checks; never excuses a gap), matching 88e3cc0 and 44eacaf.

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

* fix: plan-ceo-review and ETHOS say completeness means coverage, not more code

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

* fix: pre-landing review fixes (CEO bullet bounds code by accepted scope; tests bind each completeness rule)

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

* test: cover the shared-preamble hoist (ship Step 7)

Adds test/preamble-hoist.test.ts (tier 1 unchanged; tier 2+ SKILL.md plus
sections/preamble.md reproduces the pre-hoist preamble; pointer position and id)
and two gen-skill-docs-checks cases (one shared preamble per host, beside every
pointer and named by its id; preamble artifact kind).

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

* fix: pre-landing review fixes (ship Step 9.4)

- setup: follow a symlinked sections/ dir in the carved-pointer status check
- touchfiles: select preamble-hoist.ts alongside every preamble.ts entry
- section-manifest: exempt sections/preamble.md only for skills whose SKILL.md
  carries the shared-preamble pointer
- skill-size-budget: growth ceiling measures SKILL.md plus its shared preamble
- host-conformance: tolerate a missing sections/ dir, as setup does
- skill-validation: read bin/gstack-skill-start directly
- skill-fixture: error messages and docblocks name the actual boundary
  (harness-version non-behavioral note updated)

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

* fix: describe the size-budget growth check's startup measure (ship Step 9.4, pass 2)

The growth ceiling now measures SKILL.md plus the shared preamble, the same
measure as the shrink floor; the docblock said SKILL.md only.

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

* docs: CHANGELOG says simplification.md quotes the old rule and CLAUDE.md restates the new one

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

* docs: CHANGELOG lists the hoist tests and the growth-ceiling measure (ship Step 9.4)

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

* test: cover the symlinked sections/ status check and the ETHOS house-rule quote (ship Step 7)

host-conformance: --status still finds a broken bare sections/ pointer when a
carved Claude skill's installed sections/ is a directory symlink (fails at the
pre-repair 0e5d11f). gen-skill-docs: the house rule review/specialists/
simplification.md quotes from ETHOS.md still appears in ETHOS.md.

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

* docs: describe the shared preamble file (ship Step 14.5 docs audit)

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

* fix: the shared-preamble skip needs the skill's own Read; digest and first-run intro say complete coverage, minimal code (GSTA-96)

The pointer skipped the shared file when any text carrying its id was in context, so a
page or file with that heading could stand in for the anti-spoofing rules (security,
red team and adversarial review, ship run 2). It now requires the skill's own earlier
Read. The digest's Boil the Ocean bullet and the first-run intro still said 'AI makes
completeness cheap, so do the complete thing' (docs audit blocker); both now carry
Garry's 'complete coverage, minimal code' (2026-10-25: '1/ yes fix this').

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

* test: pin the shared-preamble provenance skip and the new Boil the Ocean wording (ship Step 7)

preamble-hoist: on every host, tier and render option the pointer allows the
skip only when the skill's own Read is in context. agents-digest and
gstack-skill-start: the digest bullet and the lake intro say complete
coverage, minimal code, never the retired phrasing. Each fails at 9af36d0.

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

* fix: describe the provenance skip where the docs still described the id-only one (ship Step 9.4)

The preamble-hoist.ts docblock and ARCHITECTURE.md still said the shared
preamble is re-read only when its id is absent; since 2acf1a4 the pointer
requires the skill's own earlier Read of the file.

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

* docs: CHANGELOG lists the provenance-pointer and Boil the Ocean wording tests (ship Step 13)

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

* revert(digest): keep the agents digest at main's bytes; an unstamped head cannot change a release output (GSTA-96)

CI 'Check VERSION is not stale vs queue' classified #3434 as stamped because it touched
agents-digest/gstack-AGENTS.md (a release_outputs path), while regenerating only the
generator fails the digest freshness test. The first-run intro rewording stays.

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

* test: voice judge reads the hoisted preamble; register ETHOS.md on its reader cases

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

* test: refresh the claude ship golden the main merge took from main (ship Step 5 preflight)

The 1a4dcaf merge resolved test/fixtures/golden/claude-ship-SKILL.md to
main's pre-hoist bytes. The golden is a copy of ship/SKILL.md; regenerated
with bun scripts/gen-ship-goldens.ts (pregate regen: REGEN_STALE).

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

* test: pr-dependencies' unplaceable-file example uses SECURITY.md now that ETHOS.md is mapped

6183ca8 registered ETHOS.md on its reader cases in touchfiles-data.ts, so a
PR touching only ETHOS.md plans in pr mode and no longer restores the full gate.
The fail-closed test and the real-unknown label check now use SECURITY.md, which
is tracked and unmapped; the assertions are unchanged. CHANGELOG names the
third test file. (CI free shard 7 at 7c21720; remote pregate shard 6.)

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

* test: host path-leak checks read the moved shared preamble too; name SHARED_PREAMBLE_FILE (ship review pass 2)

The external-host path-leak assertions in gen-skill-docs.test.ts (Codex,
Factory) and host-config.test.ts (Copilot, Antigravity) read SKILL.md
alone, so a Claude path that moved into sections/preamble.md with the
hoist went unchecked. They now read the skill's startup text through
readSkillStartup. workflow-judge-input and host-conformance use the
SHARED_PREAMBLE_FILE constant instead of a bare 'preamble.md' literal,
and preamble.ts's header describes the hoisted composition.

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

* docs: CHANGELOG token savings name the per-skill skip and the autoplan follow-up (ship review pass 2)

The pointer's skip is bound to the skill's own copy of sections/preamble.md,
so "every later one saves about 5,800" holds per skill, not per session, and
/autoplan's skip list and the inline /office-hours loader do not yet skip the
pointer section. The entry now says so instead of claiming the full /autoplan
saving. Adding the skip entry grows size-pinned skills, so it is a follow-up.

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

* test: corpus budget measures startup bytes; carve-safety counts shared preamble as uncarved (ship review pass 2)

skill-size-budget's growth ceiling and shrink floor already measured
SKILL.md plus sections/preamble.md, but the total-corpus check still summed
hoisted SKILL.md bytes against the pre-hoist baseline, hiding about 0.9 MB
of headroom. It now sums the same startup bytes (3,114,885 -> 2,590,484,
x0.832); the unreachable SKILL.md-missing fallback is gone.

auq-format-always-loaded's carve-safety guard treated any sections/ dir as
carved, so every skill with only the shared preamble ran it and its sanity
check passed on preamble.md. It now uses setup --status's rule: a section
other than the shared preamble. Those skills keep the per-skill checks.

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

* test: remaining SKILL.md-only negatives read the shared preamble too (ship review pass 3)

The parameterized external-host path-leak smoke test, the two Codex
.claude path checks and both vestigial-handshake negatives read SKILL.md
alone, so text that moved into sections/preamble.md went unchecked. They
now read readSkillStartup. preamble.ts's header no longer says tier 1
renders through generatePreamble().

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

* test: ratchet skeleton caps and eager context ceilings down after the hoist (ship review pass 3)

The hoist moved about 22 KB out of every tier 2+ SKILL.md, which left
each hoisted maxSkeletonBytes cap and each eagerPerInvocation ceiling
roughly 22 KB / 5-6K tokens slack. The 20 hoisted skeleton caps now sit at
the post-hoist skeleton plus their pre-hoist headroom, and 42 context-budget
ceilings take the recaptured (lower) values. Nothing was raised: the four
ceilings the recapture would have raised keep their old values.

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

* fix: preamble-hoist's section splitter closes a fence only on a bare delimiter (ship Step 11)

Inside an open fence, a line such as "```bash" is content in CommonMark,
but splitSections treated it as the closing fence, so a later "## " line in
the same block could split a section mid-code-block and hoist half of it.
A closing delimiter now needs nothing but whitespace after it. Every host's
render is unchanged (gen-skill-docs --dry-run FRESH on all twelve hosts).

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

* test: skill-startup.ts is a global, pinned harness file like skill-fixture.ts (ship review pass 3)

skill-fixture.ts is a global touchfile pinned in scripts/harness-version.json
because it reshapes the skill content most E2E suites read, and it now
builds that content through test/helpers/skill-startup.ts. That helper was
in neither list, so a later edit to it would change fixture inputs without
the harness-version guard and select only 27 keys. It is now global and
pinned, recorded non-behavioral (its fixtures are byte-identical to the
pre-hoist output). ARCHITECTURE.md and the CHANGELOG stop calling the
pointer id a content id: it hashes the shared text before host rewrites.

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

* docs: CHANGELOG matches the merged skip lists and the baseline diff (ship review, run 4)

The headline still called the autoplan and inline /office-hours skip
entries a follow-up, but the main merge added them; it now says the loaded
skills skip their shared Read. The #3451 sentence is dropped, because that
fix shipped in v1.91.237.0 and is recorded there. The typecheck baseline
line says the TS2769 entry was re-keyed for the 'preamble' artifact kind
with its count unchanged, not fixed and lowered.

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

* test: pin the pointer entry in the loader skip lists; drop a carve-safety tautology (ship review, run 4)

A new INVOKE_SKILL test checks that plan-ceo-review's inline /office-hours
skip list and autoplan's section skip list both name the shared-preamble
pointer heading, and that office-hours and the four plan reviews carry it.
The carve-safety "sanity" assertion repeated the predicate discoverSkills()
now uses to set sectionsDir, so it could never fail; it is removed.

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

* fix: gstack-doctor finds the Codex model patch in the hoisted shared preamble (ship Step 11, run 4)

The doctor's patch row grepped only the Codex review SKILL.md for the
"Model-Specific Behavioral Patch (" heading. The hoist moves that section
into sections/preamble.md, so the required row (for ship, review, the plan
reviews, office-hours, investigate and more) would fail on every correct
post-hoist Codex install and block install.sh's "gstack: ok". It now checks
the SKILL.md and then its shared preamble and names the file it found. A
new doctor test covers a hoisted render.

preamble-hoist's variantSubsections also returns null when no subsection
differs, instead of emitting a replacing heading with no subsections.
Every host's render is unchanged.

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

* test(docsync): fixtureDocs installs the generated sections/preamble.md (hunk taken from #3472)

A generated skill that loads the shared preamble names sections/preamble.md
as a required asset before skill start, and a spawned document-release child
blocks on its absence, so docsync-spawned stayed red on every #3434 screen.
fixtureDocs now copies that file when the generated skill has it.

This single hunk is taken unchanged from gstack#3472 (head 2e3f7ba,
GSTA-107), which trains ahead of #3434, so the train merge sees identical
lines. Nothing else from #3472 is included.

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

* docs: CHANGELOG notes the docsync fixture hunk taken from #3472

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

* docs: CHANGELOG names the post-merge context-budget ratchet (captain hoisted)

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

* test(auq): planted skill fixtures resolve the shared preamble like an install (GSTA-96)

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

* test(plan-format): mode menu delivers its question without output-harvesting wording (GSTA-96)

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

* docs(changelog): record the v1.91.270.0 merge values (GSTA-96)

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

* test(auq): parallel-capture contract expects the planted skill with its sections path mapped (GSTA-96)

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

* docs(changelog): record the v1.91.273.0 merge re-measurements (GSTA-96)

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

* docs(changelog): restore the released entries the previous commit truncated (GSTA-96)

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

* docs(changelog): end two sentences the prose gate flags (GSTA-96)

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>
capy-ai Bot added a commit that referenced this pull request Oct 27, 2026
…UserQuestion subsections (GSTA-96) (#3453)

* fix(preamble): completeness means complete coverage with minimal code (GSTA-96)

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

* feat(preamble): tier 2+ skills load the shared preamble once per session (GSTA-96)

Every tier 2+ SKILL.md inlined the same ~23 KB preamble. It now renders once
per host into sections/preamble.md beside each tier 2+ SKILL.md; the SKILL.md
keeps a pointer that asks for the Read only when the file's id is not already
in context. Only sections byte-identical to the shared render move, so every
skill keeps exactly its pre-hoist paragraphs (verified across all 41 skills).

Parity caps for ten skills raised to their measured unions (owner-approved,
Garry 2026-10-25: "do it"); 63 size pins lowered and 26 deleted.

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

* fix(paid-select): a generated sections/preamble.md takes its skill template's identity in the PR planner (GSTA-96)

screen-summary failed on #3434 with 'PR profile requires full validation' for nine
skills whose only paid coverage is periodic: their new sections/preamble.md had no
dependency identity, while the SKILL.md beside it inherits its template's.

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

* test(section-manifest): the shared sections/preamble.md renders from the hoist resolver, not a section template (GSTA-96)

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

* fix: pre-landing review fixes (CHANGELOG says 3 characters shorter; model-overlays guards the coverage half)

The completeness section shrank by 3 characters (5 bytes), matching the 89 pins lowered by 3. The default-copy test pinned only the minimal-code half; an expectMentions check now fails if the full-coverage or never-excuses-a-gap clause is dropped.

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

* fix: pre-landing review fixes (model-overlays binds smaller diff to equal coverage)

The default-copy check now also fails if 'on equal coverage' is dropped from the smaller-diff rule (which would tell models to prefer the smaller diff unconditionally) or if the no-impossible-state-checks clause is removed.

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

* docs: CHANGELOG lists the model-overlays coverage checks

The [Unreleased] Tests bullet now says the default-copy test checks both halves of the rule (full coverage of the requirement; smaller diff only at equal coverage; no impossible-state checks; never excuses a gap), matching 88e3cc0 and 44eacaf.

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

* fix: plan-ceo-review and ETHOS say completeness means coverage, not more code

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

* fix: pre-landing review fixes (CEO bullet bounds code by accepted scope; tests bind each completeness rule)

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

* test: cover the shared-preamble hoist (ship Step 7)

Adds test/preamble-hoist.test.ts (tier 1 unchanged; tier 2+ SKILL.md plus
sections/preamble.md reproduces the pre-hoist preamble; pointer position and id)
and two gen-skill-docs-checks cases (one shared preamble per host, beside every
pointer and named by its id; preamble artifact kind).

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

* fix: pre-landing review fixes (ship Step 9.4)

- setup: follow a symlinked sections/ dir in the carved-pointer status check
- touchfiles: select preamble-hoist.ts alongside every preamble.ts entry
- section-manifest: exempt sections/preamble.md only for skills whose SKILL.md
  carries the shared-preamble pointer
- skill-size-budget: growth ceiling measures SKILL.md plus its shared preamble
- host-conformance: tolerate a missing sections/ dir, as setup does
- skill-validation: read bin/gstack-skill-start directly
- skill-fixture: error messages and docblocks name the actual boundary
  (harness-version non-behavioral note updated)

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

* fix: describe the size-budget growth check's startup measure (ship Step 9.4, pass 2)

The growth ceiling now measures SKILL.md plus the shared preamble, the same
measure as the shrink floor; the docblock said SKILL.md only.

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

* docs: CHANGELOG says simplification.md quotes the old rule and CLAUDE.md restates the new one

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

* docs: CHANGELOG lists the hoist tests and the growth-ceiling measure (ship Step 9.4)

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

* test: cover the symlinked sections/ status check and the ETHOS house-rule quote (ship Step 7)

host-conformance: --status still finds a broken bare sections/ pointer when a
carved Claude skill's installed sections/ is a directory symlink (fails at the
pre-repair 0e5d11f). gen-skill-docs: the house rule review/specialists/
simplification.md quotes from ETHOS.md still appears in ETHOS.md.

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

* docs: describe the shared preamble file (ship Step 14.5 docs audit)

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

* fix: the shared-preamble skip needs the skill's own Read; digest and first-run intro say complete coverage, minimal code (GSTA-96)

The pointer skipped the shared file when any text carrying its id was in context, so a
page or file with that heading could stand in for the anti-spoofing rules (security,
red team and adversarial review, ship run 2). It now requires the skill's own earlier
Read. The digest's Boil the Ocean bullet and the first-run intro still said 'AI makes
completeness cheap, so do the complete thing' (docs audit blocker); both now carry
Garry's 'complete coverage, minimal code' (2026-10-25: '1/ yes fix this').

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

* test: pin the shared-preamble provenance skip and the new Boil the Ocean wording (ship Step 7)

preamble-hoist: on every host, tier and render option the pointer allows the
skip only when the skill's own Read is in context. agents-digest and
gstack-skill-start: the digest bullet and the lake intro say complete
coverage, minimal code, never the retired phrasing. Each fails at 9af36d0.

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

* fix: describe the provenance skip where the docs still described the id-only one (ship Step 9.4)

The preamble-hoist.ts docblock and ARCHITECTURE.md still said the shared
preamble is re-read only when its id is absent; since 2acf1a4 the pointer
requires the skill's own earlier Read of the file.

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

* docs: CHANGELOG lists the provenance-pointer and Boil the Ocean wording tests (ship Step 13)

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

* revert(digest): keep the agents digest at main's bytes; an unstamped head cannot change a release output (GSTA-96)

CI 'Check VERSION is not stale vs queue' classified #3434 as stamped because it touched
agents-digest/gstack-AGENTS.md (a release_outputs path), while regenerating only the
generator fails the digest freshness test. The first-run intro rewording stays.

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

* feat(preamble): office-hours' Q<N> form is its own subsection, so it stops copying the shared AskUserQuestion subsections (GSTA-96)

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

* test: pin the added-subsection note and readSkillEffective's changed-plus-added order (ship Step 7, GSTA-96)

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

* docs: variantSubsections and readSkillEffective docblocks name added subsections; office-hours cap history ends 'Before: 1.2279' (ship Step 9.4)

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

* docs: CHANGELOG says the Q<N> lead-in gained the Layout line text instead of claiming no wording changed (ship Step 11)

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

* docs: CHANGELOG gives office-hours' measured SKILL.md drop, 6,333 bytes (ship Step 13)

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

* test: CEO completeness posture check covers the accepted-scope bound

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

* fix: CHANGELOG says plan-ceo-review grows about 110 characters and each skill loses 3 from the section (cherry-picked from #3425's 25eec73; the digest/lake-intro line is dropped because #3434 rewords the intro and its own bullet names the digest deferral)

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

* test: voice judge reads the hoisted preamble; register ETHOS.md on its reader cases

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

* test: refresh the claude ship golden the main merge took from main (ship Step 5 preflight)

The 1a4dcaf merge resolved test/fixtures/golden/claude-ship-SKILL.md to
main's pre-hoist bytes. The golden is a copy of ship/SKILL.md; regenerated
with bun scripts/gen-ship-goldens.ts (pregate regen: REGEN_STALE).

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

* test: pr-dependencies' unplaceable-file example uses SECURITY.md now that ETHOS.md is mapped

6183ca8 registered ETHOS.md on its reader cases in touchfiles-data.ts, so a
PR touching only ETHOS.md plans in pr mode and no longer restores the full gate.
The fail-closed test and the real-unknown label check now use SECURITY.md, which
is tracked and unmapped; the assertions are unchanged. CHANGELOG names the
third test file. (CI free shard 7 at 7c21720; remote pregate shard 6.)

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

* test: host path-leak checks read the moved shared preamble too; name SHARED_PREAMBLE_FILE (ship review pass 2)

The external-host path-leak assertions in gen-skill-docs.test.ts (Codex,
Factory) and host-config.test.ts (Copilot, Antigravity) read SKILL.md
alone, so a Claude path that moved into sections/preamble.md with the
hoist went unchecked. They now read the skill's startup text through
readSkillStartup. workflow-judge-input and host-conformance use the
SHARED_PREAMBLE_FILE constant instead of a bare 'preamble.md' literal,
and preamble.ts's header describes the hoisted composition.

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

* docs: CHANGELOG token savings name the per-skill skip and the autoplan follow-up (ship review pass 2)

The pointer's skip is bound to the skill's own copy of sections/preamble.md,
so "every later one saves about 5,800" holds per skill, not per session, and
/autoplan's skip list and the inline /office-hours loader do not yet skip the
pointer section. The entry now says so instead of claiming the full /autoplan
saving. Adding the skip entry grows size-pinned skills, so it is a follow-up.

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

* test: corpus budget measures startup bytes; carve-safety counts shared preamble as uncarved (ship review pass 2)

skill-size-budget's growth ceiling and shrink floor already measured
SKILL.md plus sections/preamble.md, but the total-corpus check still summed
hoisted SKILL.md bytes against the pre-hoist baseline, hiding about 0.9 MB
of headroom. It now sums the same startup bytes (3,114,885 -> 2,590,484,
x0.832); the unreachable SKILL.md-missing fallback is gone.

auq-format-always-loaded's carve-safety guard treated any sections/ dir as
carved, so every skill with only the shared preamble ran it and its sanity
check passed on preamble.md. It now uses setup --status's rule: a section
other than the shared preamble. Those skills keep the per-skill checks.

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

* test: remaining SKILL.md-only negatives read the shared preamble too (ship review pass 3)

The parameterized external-host path-leak smoke test, the two Codex
.claude path checks and both vestigial-handshake negatives read SKILL.md
alone, so text that moved into sections/preamble.md went unchecked. They
now read readSkillStartup. preamble.ts's header no longer says tier 1
renders through generatePreamble().

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

* test: ratchet skeleton caps and eager context ceilings down after the hoist (ship review pass 3)

The hoist moved about 22 KB out of every tier 2+ SKILL.md, which left
each hoisted maxSkeletonBytes cap and each eagerPerInvocation ceiling
roughly 22 KB / 5-6K tokens slack. The 20 hoisted skeleton caps now sit at
the post-hoist skeleton plus their pre-hoist headroom, and 42 context-budget
ceilings take the recaptured (lower) values. Nothing was raised: the four
ceilings the recapture would have raised keep their old values.

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

* fix: preamble-hoist's section splitter closes a fence only on a bare delimiter (ship Step 11)

Inside an open fence, a line such as "```bash" is content in CommonMark,
but splitSections treated it as the closing fence, so a later "## " line in
the same block could split a section mid-code-block and hoist half of it.
A closing delimiter now needs nothing but whitespace after it. Every host's
render is unchanged (gen-skill-docs --dry-run FRESH on all twelve hosts).

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

* test: skill-startup.ts is a global, pinned harness file like skill-fixture.ts (ship review pass 3)

skill-fixture.ts is a global touchfile pinned in scripts/harness-version.json
because it reshapes the skill content most E2E suites read, and it now
builds that content through test/helpers/skill-startup.ts. That helper was
in neither list, so a later edit to it would change fixture inputs without
the harness-version guard and select only 27 keys. It is now global and
pinned, recorded non-behavioral (its fixtures are byte-identical to the
pre-hoist output). ARCHITECTURE.md and the CHANGELOG stop calling the
pointer id a content id: it hashes the shared text before host rewrites.

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

* docs: CHANGELOG matches the merged skip lists and the baseline diff (ship review, run 4)

The headline still called the autoplan and inline /office-hours skip
entries a follow-up, but the main merge added them; it now says the loaded
skills skip their shared Read. The #3451 sentence is dropped, because that
fix shipped in v1.91.237.0 and is recorded there. The typecheck baseline
line says the TS2769 entry was re-keyed for the 'preamble' artifact kind
with its count unchanged, not fixed and lowered.

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

* test: pin the pointer entry in the loader skip lists; drop a carve-safety tautology (ship review, run 4)

A new INVOKE_SKILL test checks that plan-ceo-review's inline /office-hours
skip list and autoplan's section skip list both name the shared-preamble
pointer heading, and that office-hours and the four plan reviews carry it.
The carve-safety "sanity" assertion repeated the predicate discoverSkills()
now uses to set sectionsDir, so it could never fail; it is removed.

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

* fix: gstack-doctor finds the Codex model patch in the hoisted shared preamble (ship Step 11, run 4)

The doctor's patch row grepped only the Codex review SKILL.md for the
"Model-Specific Behavioral Patch (" heading. The hoist moves that section
into sections/preamble.md, so the required row (for ship, review, the plan
reviews, office-hours, investigate and more) would fail on every correct
post-hoist Codex install and block install.sh's "gstack: ok". It now checks
the SKILL.md and then its shared preamble and names the file it found. A
new doctor test covers a hoisted render.

preamble-hoist's variantSubsections also returns null when no subsection
differs, instead of emitting a replacing heading with no subsections.
Every host's render is unchanged.

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

* test(docsync): fixtureDocs installs the generated sections/preamble.md (hunk taken from #3472)

A generated skill that loads the shared preamble names sections/preamble.md
as a required asset before skill start, and a spawned document-release child
blocks on its absence, so docsync-spawned stayed red on every #3434 screen.
fixtureDocs now copies that file when the generated skill has it.

This single hunk is taken unchanged from gstack#3472 (head 2e3f7ba,
GSTA-107), which trains ahead of #3434, so the train merge sees identical
lines. Nothing else from #3472 is included.

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

* docs: CHANGELOG notes the docsync fixture hunk taken from #3472

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

* test: pin readSkillEffective's added-subsection change in harness-version.json as non-behavioral (CI quick-bun-default)

skill-startup.ts changed in this PR so readSkillEffective appends a variant's added ### subsections.
Its output is byte-identical to the pinned helper for every tier 2+ render without added
subsections (735 across all hosts) and for office-hours' pre-change SKILL.md, so no pass-rate
series resets. CHANGELOG Tests line updated.

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

* docs: CHANGELOG and the office-hours cap note give the post-merge measure (6,328 bytes; union 160,952 -> 154,624) (ship Step 11, #3453)

The 6,333-byte drop and the 160,989 -> 154,653 union were measured at 5db328f, before main
was merged; against this PR's base b727a6d the numbers are 6,328 bytes and 160,952 -> 154,624.
The cap stays 1.1796.

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

* docs: round the post-merge office-hours ratio correctly (154,624 / 131,110 = 1.1793) (ship review pass 2, #3453)

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

* docs: CHANGELOG names the post-merge context-budget ratchet (captain hoisted)

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

* docs(changelog): correct #3434's post-merge allowlist count and the two context-budget rows above main (GSTA-96, per GStack Minder)

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

* docs(changelog): restate the corrections to #3434's post-merge bullets after its v1.91.265.0 merge (GSTA-96, per GStack Minder)

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

* test(auq): planted skill fixtures resolve the shared preamble like an install (GSTA-96)

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

* test(plan-format): mode menu delivers its question without output-harvesting wording (GSTA-96)

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

* docs(changelog): record the v1.91.270.0 merge values (GSTA-96)

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

* docs(changelog): office-hours context-budget ceiling after the v1.91.270.0 merge (GSTA-96)

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

* test(auq): parallel-capture contract expects the planted skill with its sections path mapped (GSTA-96)

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

* docs(changelog): correct the v1.91.270.0 recapture wording for hoisted rows (GSTA-96)

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

* docs(changelog): record the v1.91.273.0 merge re-measurements (GSTA-96)

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

* docs(changelog): restore the released entries the previous commit truncated (GSTA-96)

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

* docs(changelog): end two sentences the prose gate flags (GSTA-96)

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