Skip to content

Commit e722c5b

Browse files
garrytanclaude
andauthored
v1.57.0.0 feat: carve-guard system + carve cso/document-release/design-consultation (garrytan#1907)
* test: canonical CARVE_GUARDS registry; derive parity + size-budget from it Single source of truth for the carved-skill set + per-skill invariants (EQ1). parity-harness.ts sectioned entries and skill-size-budget.ts SECTIONS_EXTRACTED now derive from it instead of hand-maintained lists. Closes a pre-existing drift: plan-devex-review was in SECTIONS_EXTRACTED but had no sectioned parity invariant; now generated. carve-guards.ts is a pure leaf data module (import type only) to avoid an import cycle. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: shared carve-guard check fns with injectable root discoverCarvedSkills/checkOrdering/checkCompleteness take a root param so the negative tests can point the real guards at a fixture dir. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: E2 data-driven carve static ordering guard (gate) Per-PR backstop for every carved skill, one test() per skill, driven by CARVE_GUARDS staticInvariants. Generalizes + retires the ceo-specific ordering test. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: E1 carve-guard completeness meta-guard (gate) Asserts filesystem carved set == CARVE_GUARDS set both directions, so a future carve without a registry entry fails CI. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: ET1 guard-of-guards negative tests (gate) Temp fixture broken 3 ways proves E1/E2 actually throw, via the injectable root. Kills the silent-pass-guard failure class. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: T2 data-driven behavioral section-loading guard (periodic) One file iterating CARVE_GUARDS, one test() per skill with GSTACK_CARVE_SKILL cost-scoping (D-CODEX A). external carves (ship, plan-ceo) keep bespoke tests; testNames aligned to their touchfile keys. Registered in touchfiles. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * docs: defer E3 real-session carve canary to TODOS Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: carve document-release into skeleton + on-demand section Steps 2-9 (per-file audit, auto-updates, risky-change asks, CHANGELOG voice polish, cross-doc consistency, TODOS cleanup, VERSION bump, commit + PR body) move to sections/release-body.md, read on demand after the Step 1.5 coverage map. Skeleton 59,256 -> 45,797 B (-23%); union preserved. Adds the CARVE_GUARDS entry (auto-extends parity + size-budget via EQ1). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: carve design-consultation into skeleton + on-demand section Phases 3-6 (complete proposal, drill-downs, design preview, writing DESIGN.md) move to sections/proposal-and-preview.md, read on demand after product context + research. Skeleton 80,719 -> 59,229 B (-27%); union preserved. Adds the CARVE_GUARDS entry. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * feat: carve cso into skeleton + on-demand section (security-safe) Scope-dependent audit Phases 2-11 move to sections/audit-phases.md. Mode dispatch (## Arguments, ## Mode Resolution), always-run Phases 0/1, and the Phase 12 false-positive-filtering exceptions stay ALWAYS-LOADED in the skeleton. Skeleton 79,383 -> 65,117 B (-18%); union preserved. Adds a cso CARVE_GUARDS entry with an earliest-use invariant (mustPrecedeStop): mode dispatch must appear before any STOP-Read, so a directive that decides which sections to read can't be stranded behind the STOP that reads them (codex outside-voice garrytan#6). carve-guard-checks gains the mustPrecedeStop check. parity moves cso monolith -> generated carved entry. cso-preserved.test.ts strengthened: phrases checked against the union, plus an always-loaded contract on the skeleton (dispatch + FP-filtering, codex garrytan#5). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * test: make redaction/taxonomy tests union-aware for cso + document-release carves The cso carve moved Secrets Archaeology (prefixes, lib/redact-patterns.ts pointer, git-history scan) into sections/audit-phases.md, and the document-release carve moved the Step 9 PR-body redaction scan into sections/release-body.md. Three content-presence tests asserted that content in the skeleton SKILL.md/.md.tmpl; they now read the skeleton+sections union (same fix as cso-preserved + parity). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * chore: bump version and changelog (v1.57.0.0) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> * fix: address pre-landing review (codex) on the carve - cso section: add a scope-gate header so '--owasp' (and other scoped modes) run only their selected phases, not every phase bundled in the section ('execute in full' no longer overrides Mode Resolution). - carve-guard-checks: gateAfterStop now compares against the LAST STOP, not the first, so a gate stranded between two STOPs in a multi-STOP skeleton fails. - TODOS: behavioral section-loading hermeticity (verifier matches global-install path, not the fixture) — pre-existing in auq-sdk-capture.ts, deferred. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
1 parent 476b0ec commit e722c5b

34 files changed

Lines changed: 2981 additions & 2071 deletions

CHANGELOG.md

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,58 @@
11
# Changelog
22

3+
## [1.57.0.0] - 2026-06-07
4+
5+
## **Three more heavyweight skills load lighter, and every carved skill finally has a test that proves it loads.**
6+
## **`/cso`, `/document-release`, and `/design-consultation` shed ~49KB of always-loaded prose; CI now blocks any carve that ships without its guards.**
7+
8+
gstack splits its biggest skills into a small always-loaded skeleton plus on-demand
9+
sections that load only when a step needs them. This release carves three more,
10+
`/document-release`, `/design-consultation`, and `/cso`, so the first time you invoke
11+
them the agent reads far less. It also closes a gap from the earlier carves: only two
12+
of six already-carved skills had a test proving an agent actually reads the section it
13+
was told to read. Now all nine carved skills are guarded the same way, and CI blocks
14+
any future carve that ships without its guards. `/cso` got extra care: its mode
15+
dispatch and false-positive-filtering rules stay always-loaded, so a security audit
16+
can never run with a rule stranded in an unread section.
17+
18+
### The numbers that matter
19+
20+
Measured with `wc -c <skill>/SKILL.md`; the skeleton+sections union is reproduced by
21+
`bun test test/parity-suite.test.ts test/skill-size-budget.test.ts`.
22+
23+
| Skill | Always-loaded before | After | Δ |
24+
|---|---|---|---|
25+
| /design-consultation | 80,719 B | 59,229 B | **−27%** |
26+
| /document-release | 59,256 B | 45,797 B | **−23%** |
27+
| /cso | 79,383 B | 65,117 B | **−18%** |
28+
| Carved skills with a section-load guard | 2 of 6 | 9 of 9 | **full coverage** |
29+
30+
Total always-loaded prose across the three skills drops about 49KB (~12K tokens) on
31+
first invoke, with nothing lost: every line moved into an on-demand section the
32+
skeleton points at, and the parity suite checks the union still contains it.
33+
34+
### What this means for you
35+
36+
Run `/cso`, `/document-release`, or `/design-consultation` and the agent does less
37+
reading before it starts working, so the session stays leaner. The carve pattern is
38+
now safe to extend: a free static test runs on every PR and a behavioral test runs
39+
weekly to prove the agent reads each section, so future slimming can't quietly drop
40+
behavior. Nothing about how you invoke these skills changed.
41+
42+
### Itemized changes
43+
44+
#### Added
45+
- Canonical carved-skill guard registry (`test/helpers/carve-guards.ts`): one source of truth for which skills are carved and what each must preserve. `parity-harness.ts` and `skill-size-budget.ts` derive their carved-skill lists from it.
46+
- Carve guard suite: data-driven static ordering test, behavioral section-loading test (periodic), a completeness meta-guard that fails CI if a carved skill lacks its guards, and negative tests proving the guards actually fire.
47+
- `/cso`, `/document-release`, and `/design-consultation` carved into skeleton + on-demand sections.
48+
49+
#### Changed
50+
- `/cso` keeps its mode dispatch (`## Arguments`, `## Mode Resolution`), always-run phases, and false-positive-filtering exceptions always-loaded; an earliest-use invariant enforces that dispatch appears before any on-demand read.
51+
52+
#### For contributors
53+
- Redaction, taxonomy, and parity content tests now read the skeleton+sections union so relocated prose still counts toward coverage.
54+
- Real-session section-read canary deferred to TODOS (the deterministic guards ship first).
55+
356
## [1.56.1.0] - 2026-06-03
457

558
## **`/sync-gbrain` can no longer delete your repo. Cleanup now refuses any directory it cannot prove it created.**

TODOS.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2283,3 +2283,54 @@ into `test/helpers/fake-gbrain.ts` when the second consumer arrives
22832283
runs).
22842284

22852285
**Depends on:** None.
2286+
2287+
### P2: Real-session carve canary (E3, deferred from carve-guard plan)
2288+
2289+
**What:** Wire a real-session section-Read-miss canary on top of the
2290+
carved skills. When a real user session drives a carved skill and the
2291+
agent does NOT Read a section the skeleton's STOP directive pointed it
2292+
at, log it (salted, content-free) to
2293+
`~/.gstack/analytics/section-reads.jsonl` and surface drift via
2294+
`bun run eval:summary`. Non-blocking alert, never a merge gate
2295+
(real-session data is non-deterministic).
2296+
2297+
**Why:** The static (E2) + behavioral (T2) guards prove carves are
2298+
structurally sound and that a real agent Reads sections in a controlled
2299+
eval. They do NOT see production drift — a prompt-context change that
2300+
makes live agents start skipping a section. The canary is the only
2301+
mechanism that catches that, from real usage.
2302+
2303+
**Context:** Deferred from the carve-guard-hardening plan (D5→T2, codex
2304+
outside-voice #7). `test/helpers/transcript-section-logger.ts` exists but
2305+
is built for deterministic test transcripts + ship action fingerprints,
2306+
NOT real-session drift — it needs rework before it can back this. Ship
2307+
the deterministic guards first; add this once they've proven useful. The
2308+
carved-skill set + each skill's `requiredReads` are already declared in
2309+
`test/helpers/carve-guards.ts`, so the canary reads its expectations
2310+
from there.
2311+
2312+
**Effort:** M (human ~2d, CC ~4h).
2313+
2314+
**Depends on:** `transcript-section-logger.ts` real-session-drift rework.
2315+
2316+
### P2: Harden behavioral section-loading test hermeticity
2317+
2318+
**What:** `captureSectionReads` in `test/helpers/auq-sdk-capture.ts` accepts ANY
2319+
Read whose path matches `sections/<file>.md`. The skeleton's STOP-Read directive
2320+
points at the gstack-root install path (`scripts/resolvers/sections.ts` builds it
2321+
from `ctx.paths.skillRoot`), not the planted fixture copy. So a run can satisfy
2322+
the section-read assertion by reading the GLOBAL install's section instead of the
2323+
hermetic fixture.
2324+
2325+
**Why:** A behavioral test that passes by reading the global install doesn't prove
2326+
THIS branch's carved section loads. If the fixture's section were broken but the
2327+
global install's weren't, the test would still pass.
2328+
2329+
**Context:** Codex outside-voice finding on the carve-guard ship (v1.57.0.0).
2330+
Pre-existing in `auq-sdk-capture.ts` — affects `skill-e2e-ship-section-loading`,
2331+
`skill-e2e-plan-ceo-review-section-loading`, and the new
2332+
`carve-section-loading.test.ts`. Fix: match the fixture's ABSOLUTE sections path
2333+
(the `planDir` copy), not a bare `sections/<file>.md` regex; or rewrite the STOP
2334+
path to the fixture during the run.
2335+
2336+
**Effort:** S (human ~3h, CC ~30min). **Depends on:** None.

VERSION

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
1.56.1.0
1+
1.57.0.0

0 commit comments

Comments
 (0)