Prompt-surface budgets and the hot/cold law — shrink pass + standing ratchet (0.14.69) - #1234
Merged
Merged
Conversation
…1.3 (operator-directed) Adds Task 1.3 (ADR 0041 attribution repair — name ADR 0029 Decision point 2 and ADR 0024 §(C) in Relationship-to-prior-ADRs + References, additive only), End state 10, and the Notes provenance bullet. File-disjoint from 1.1/1.2, same wave, deps: []. Both cited section labels verified to exist at this base; the task re-verifies rule content before writing (spec-citation lesson). Operator direction 2026-07-28: "Add #1200 to Plan 2". Refs #1200 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ted A-N, plan patched in place 12/12 probes on-target (wf_d40ba28d-d1a, 23 agents): 40 unique findings, 13 root defects, all patched under AFK self-adjudication. Highlights: - Guard-suite enumeration was wrong on every shrink task (five probes independently; proven by one sandbox eviction redding diagnosis-preflight). Re-anchoring is now discovery-based (E); Files lists carry the measured 0dc004a inventory. - advisory = 80% of (1.25x) multiplied out to exactly 1.0x post-shrink — zero headroom, End state 6 unsatisfiable on a KB boundary. Decoupled: advisory = 1.10x, hard = 1.25x, grew-surface = blocking Lead flag (D). - Spec's literal-share row (164,234 B / 238 / 74%) is arithmetically impossible (exceeds the file's non-comment total); pinned extraction algorithm replaces it (C). All spec 1 byte literals are dated fa3c838 snapshots (B). - End state 5 re-set to <= 65% of the measured base; tier-1 boundary pinned to the every-invocation reading (A, full census in the report). - Both-surfaces registry spans carved out of the literal shrink (G); card evictions homed at skills/war/references/ (H); OLD-absent keys re-anchor as UNION scans (I); D22 Gate-2 region atomic + inline (J); instruction-survival lens pinned deep on every shrink roster (K); Task 6.2 gains its guard suites and requiresTest: true (L); precision set (M). Adjudication N carries the operator-directed #1200 fold-in (its attribution probe was the one clean pass). Terminal state: CLEARED by adjudication (plan-1 precedent; probes not re-run — the report's Adjudications table is the authority for every superseded literal). Refs #1200 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…(ADR 0014 provenance) Same directive; two-part re-verify test applied — no A-N root meets both arms. Adjudications table byte-unchanged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ure-pin the extraction algorithm, in-gate placeholder-marker self-assert (#1205) Task 1.2 deliverable (prompt-surface-budgets.test.mjs) plus the two approved absorb-disposition findings: 1. [Minor] Pinned extraction algorithm has no assertion that fails when its nesting-awareness breaks — the only assertion exercising the hand-rolled tokenizer was the non-vacuity blocks.length > 0, which with 26% budget headroom stays green even if the comment/string skips or the ${...} nesting fold (adjudication C's pin) are deleted; the pinned behavior was unwitnessed while Task 7.1 ratchets a permanent constant off this parser (14-recurrence weak-test-assertion lesson). Fix: one fixture test over extractTopLevelTemplateLiterals covering the four pinned behaviors — backtick in a comment is not an opener, backtick in a quoted string is not an opener, a nested template inside ${...} folds into its parent (block count asserted), and a < MIN_BLOCK_BYTES block is filtered. Mutation-verified: disabling each skip branch (line comment, block comment, string, interpolation) or the min-bytes filter reds the test. (The finding's "helper is already exported" premise does not hold at this tip — the fixture test lives in the same module and calls it directly, a smaller diff than adding an export.) 2. [Minor] PLACEHOLDER-BUDGET marker has no in-gate self-assert, and the OLD-absent grep it feeds Task 7.1 can never return zero — the token also lives in the plan and the red-team report, so a repo-wide zero-hit grep is unsatisfiable by construction (the recorded old-absent-half failure shape), and a row could lose its marker with the gate green. Fix: a self-assert that reads this file's own source and requires the marker count to equal the placeholder row count (FILE_BUDGETS rows + the workflow-literal row); the marker token is built by concatenation so the test never matches its own source. Task 7.1's flip becomes file-scoped (expected count -> 0) instead of a hand-scoped repo grep. Mutation-verified: dropping one row's marker reds the test. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nonical rung sources Adds two bullets to ADR 0041's Relationship-to-prior-ADRs section (0007/0008/0025 bullet style, numeric order) naming the ADRs whose ratified rules the ladders rank without attribution: ADR 0024 §(C) — canonical source of `execution` rung 1 (the captured gate-evidence artifact as the sole HARD basis for a provably-unrun finding) and rung 4 (absent artifact => SOFT cannot-confirm); ADR 0029 Decision point 2 — canonical source of `content-at-pin` rungs 1-2 (git show <audit_sha>:<path>; working-tree grep never the sole basis) and `history` rung 1 (history verb per claim shape). Both citations mirrored into the References section in its existing entry style. Verified before writing: 0029 Decision point 2 and 0024 §(C) each carry the exact rule attributed — #1200's shorthand is accurate, no re-homing needed. Purely additive: 17 insertions, 0 deletions (word-diff-verified); the D26 doc-contract row matches token keys against norm(adr0041) and stays green. Closes-condition evidence for #1200 (Lead closes at phase close citing the landed SHA). Task 1.3, sub-issue #1206. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…d law summary (#1204) Task 1.1 (prompt-surface-simplification phase 1). Records D1-D6, the ratified budget formula (hard = post-shrink x1.25 ceil-KB, advisory = x1.10 ceil-KB per red-team adjudication D, superseding the spec's 80%-of-hard), the ratchet-down rule, move-verbatim discipline, and the rejected alternatives (shrink-only, budgets-only, size-threshold placement); cross-refs ADR 0015/0038 (donor memory budgets) and ADR 0025 (guards follow text). CONTEXT.md gains **surface budget**, **prose temperature**, **trigger pointer** (spec section 6, each with _Avoid_); CLAUDE.md gains the hot/cold law summary (spec section 4.2). ADR number 0042 re-resolved as next-free at task base (0041 = audit-evidence-precedence, landed). All additions land outside every pinned doc-contract extraction region; ratified pointer line untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…R range, disambiguate glossary homonyms (#1204) Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…adjudication-row check-off, half-true measurement sentence) Gate-2 promotion; all type: project, lint clean. Two code-verified at the landed tip fca6160; the race lesson agent-unverified (Lead-narrated incident). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…s/, discovery-based guard re-anchor (#1210) Spec §4.3 applied to the Lead surface at the rebased base (96,608 B measured; adjudication B supersedes the spec's stale 95,586 B snapshot). Tier boundary pinned per adjudication A: tier 1 = every-invocation text (Setup, Decompose + approve, Per phase incl. the Gate-2 publication flow per adjudication J, Run manifest, Finish, Invariants) stays inline; every block reachable only through a branch marker (if docker / on resume / when held:* / --afk / submodule present) moved VERBATIM — byte-identity machine-verified per block against the pre-change HEAD — into four new reference files, each eviction site keeping a `when <trigger>, read references/<file>` pointer: - references/docker-gate.md — Setup step-3 docker probe-build routing (3,843 B) - references/setup.md — crash-heal pre-flight detail (579 B), --afk sanity floor (776 B), per-phase pending-proposal re-check (2,125 B) - references/submodule-flows.md — submodule router (1,378 B), resume submodule co-truth (651 B), held:submodule-pr sub-procedure (1,001 B) - references/resume-and-recovery.md — Resume reconciliation body (2,868 B), Checkpoint outcome handling incl. held:* arms, env-blocked, gate_failed routing, manual-land hygiene (19,313 B), Recovery relaunch (3,492 B), held-partial-phase runbook (5,418 B) 41,444 B evicted; post-shrink SKILL.md = 58,488 B = 60.54% of base (End state 5 ceiling: 65% = 62,795 B). No compression performed — every removal is a verbatim move; zero cross-surface redundancy collapsed, so no canonical-copy naming applies. Guard re-anchoring, discovery-based (adjudication E), zero rows deleted or loosened: presence keys relocated their read (war-config recovery-relaunch / held:workflow-error / env-blocked rows; skill-doc-contracts D10 bullet half, D14, D16, D18, D21; land-decision Task 1.2), OLD-absent / whole-file keys widened to UNION scans over origin + all four destinations (adjudication I: war-config scope-hook-glob, docs/learnings-glob sweep, _polish sweep; skill-doc-contracts D13; doc-cli-consistency verb-claim scan). Architect tour step 4 re-anchored to the post-shrink Invariants line. Two lagging workflow-template.js comments naming SKILL.md as the runbook/resume-prose home re-pointed at references/resume-and-recovery.md (comments only — no engine logic, exit code, schema, or floor script changed). Full gate green: 1009 JS tests + all 27 shell suites. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ss-ref, D14 union, D18/D21 comment lag (#1210) Absorbed auditor findings (advisory polish, --ace): - [Minor] "Eight relative links inside the evicted blocks resolve one directory short in references/resume-and-recovery.md" / [Minor] "Verbatim-moved blocks carry ~9 relative links that no longer resolve from skills/war/references/" / [Minor] "Verbatim eviction breaks 8 relative markdown links in references/resume-and-recovery.md": the moved blocks were authored relative to skills/war/SKILL.md, so `references/<x>.md` and `../../docs/…` links rebase one directory short from their new home. Editing the links would break the plan's End-state-2 byte-identity mandate (ADR 0042 D3), so the fix is a header-note extension: the existing positional-words caveat in resume-and-recovery.md (and submodule-flows.md, for symmetry) now states that relative link paths likewise resolve from skills/war/SKILL.md's directory. Moved bytes untouched. - [Minor] "SKILL.md's every-invocation launch paragraph still points at 'Resume vs. recovery relaunch below', which no longer exists in SKILL.md" / [Minor] "SKILL.md still points 'below' at the Resume vs. recovery relaunch subsection it evicted" / [Minor] "Dangling in-document cross-reference: 'per **Resume vs. recovery relaunch** below' survives inline after the subsection was evicted": the referenced subsection moved to references/resume-and-recovery.md, leaving the every-invocation launch paragraph pointing at a heading that no longer exists anywhere in SKILL.md. Replaced "below" with an explicit link to references/resume-and-recovery.md; surrounding tokens kept intact (the war-config.test.mjs launch-step pins are untouched). - [Nit] "D14's OLD-absent UNION covers origin + 1 of 4 destinations, not 'every destination' (adjudication I)": D14's misattribution absence loop scanned [skillMd, dockerMd] only, while D13 and the war-config.test.mjs OLD-absent rows union all destinations. Extended to [skillMd, setupRefMd, dockerMd, submoduleMd, resumeMd], matching D13. - [Nit] "Comment lag: D18 and D21 headers still name SKILL.md as the home of bullets this commit moved": reworded both header comments to name references/resume-and-recovery.md as the bullets' home, and rephrased D21's "zero occurrences in SKILL.md" as "zero occurrences in the bullet's home file" (the land-decision.test.mjs wording). ADR 0025 comment-lag duty. - [Nit] "docker-gate.md header omits the positional-words caveat its three sibling eviction files carry": added the same one-line caveat to docker-gate.md's header block, naming its own positional hazards ("step below", "the Checkpoint's `gate_failed` routing"). Gate green: node --test 'skills/**/*.test.mjs' (1009 pass), all shell tests, redaction lint clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ause branches to SKILL.md §4.3 — point to references/resume-and-recovery.md (#1210) Finding 1 [Nit]: "schemas.md still attributes the held:land-failed root-cause branches to SKILL.md, which now carries only the trigger pointer". The (a)/(b)/(c) root-cause recipes moved to references/resume-and-recovery.md in task 2.1; the enum bullet's citation now links there directly instead of routing readers through SKILL.md's trigger pointer. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ot, enumerated existsSync fail-open) Gate-2 promotion; both type: project, code-verified, lint clean. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…, card-dedup skeletons (#1214) Card (agents/war-auditor.md, 23,823 -> 22,216 B): three tier>=2 blocks moved byte-identical to skills/war/references/auditor-teach.md (3,932 B) with trigger pointers left behind — the guard-contract mirror-architecture teach tail (444 B; maintainer-only wiring), the submodule-task diff-scope arm (443 B) and the gitlink-bump pin-validity arm (1,759 B; both reachable only through the Step-1 task-type branch marker — the intent's submodule floor marker). The reserved-lens sentence now routes pin-validity through the reference. Tour step 9's line anchor re-anchored to the '## Review through your lens' heading (discovery-based, adj E). Dispatched literals (workflow-template.js; adjudication M scope = auditPrompt + all three gate-audit-family seats): three auditPrompt clauses whose FULL text the standing card already carries compressed to token skeletons + standing-card pointers, the ADR 0041 D4 tiered-copies precedent — the surviving canonical copy of each is the agents/war-auditor.md section named inside the skeleton (Stale-looking-but-correct calibration subsection; cascading-impact lens bullet; Committed-tree grounding section). Every registry / both-surfaces anchor token survives in place: the four CALIBRATION_RULE_ANCHORS + per-window live-artifact qualifier (single-line shape kept), the D8/D9/D12/D6 cascade tokens, and the committed-tree row's five anchors. Zero rows deleted or loosened; zero test edits. Registry carve-out residue (adjudication G, measured): pinned-extraction literal share 52,636 -> 51,991 B (112 blocks both); auditor-facing share (auditPrompt + gate-audit regions) 16,242 -> 15,597 B. The remaining auditor literal residue is negligible by construction — byte-identical shared sentences (LATITUDE/DISPO/ CALIBRATION/COST-CLAIM/RELEASE-BASELINE), the D5+D6 guard-contract token set, the five-surface evidence-precedence skeleton, and the gate-audit seats' test-pinned operational pin/artifact clauses — so no further cut is forced. Gate: node --test 1009/1009 green; all 27 shell suites green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…auditor-teach.md eviction destination (#1214) The Task 3.1 eviction moved the guard-contract teach prose out of agents/war-auditor.md into skills/war/references/auditor-teach.md, leaving four OLD-absent whole-file keys (%-format, reflog syntax, the #1080 'mirrored verbatim' lock, BRANCH_READ_FLAGS_ONLY_RETIRED) scanning only the origin. Per the Commander's Intent Method (adjudication I) each re-anchors as a UNION scan over origin + destination, never a relocated read: an auditorTeachMd read joins auditorMd, the destination joins the three doesNotMatch surface lists, and the #1080 comment now names the eviction. Negative-reference samples untouched — non-vacuity proof preserved. This mapped-test edit also satisfies assert-test-in-diff.sh's skills/**/*.test.mjs arm for this requiresTest:true task. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… lag, evicted SKILL.md citation (#1214) 1. [Minor] Comment-lag (ADR 0025 D9): the per-rule qualifier-lock test still claimed the intro-line qualifier sits before anchor 1 on BOTH surfaces, but this task's rewrite of auditPrompt()'s calibration intro dropped the 'only when the live artifact confirms' wording from the dispatched surface — the claim is now true only of agents/war-auditor.md. Both comments (the per-rule test header and the delete-the-feature complement rationale) are qualified to the standing card; no assertion change. 2. [Minor] Evicted pin-validity step 4 cites 'SKILL.md, submodule co-source-of-truth' — that block moved to references/submodule-flows.md in phase 2 (Task 2.1). Byte-identity is mandated for the moved block, so the remedy is a header caveat (mirroring submodule-flows.md's own relative-path caveat): a SKILL.md citation inside the moved blocks resolves to submodule-flows.md § Resume — submodule remote as co-source-of-truth. Additive, single-file, no byte-identity line touched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… line-number fact, qualifier-lock comments false for the dispatched surface (#1214) 1. [Nit] Tour step 9 (edited by this diff) still carries the stale line-number fact 'workflow ≈729' for the execution-evidence pass: dropped the '≈729' parenthetical — '(a reserved lens, never roster-selectable)' — per ADR 0025's retirement of snapshot line-number references. 2. [Minor] Qualifier-lock test comments now false for the dispatched surface; 'intro never rescues' half of the delete-the-feature complement went vacuous there: the shrunk calibration skeleton's intro no longer carries 'only when the live artifact confirms', so both comments (per-rule test header, complement rationale) are scoped to the standing card. Comment-only; no assertion changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Gate-2 promotion; all type: project, lint clean. New: agent-card reference pointers are repo-relative and will not resolve against a foreign target repo. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ion, registry carve-out residue reported (#1218) Card (agents/war-refiner.md, 31,957 -> 26,804 B): three tier>=2 branch-gated blocks moved byte-identical (6,822 B total) to skills/war/references/refiner-recovery.md (8,017 B) with trigger pointers left behind — the Submodule-as-repo provisioning recipe (1,621 B; reachable only on a submodule-target phase), the superproject land-phase step-3 reland discrimination (1,686 B; reachable only on the final failed CAS attempt), and the 2A/2B submodule land arms (3,515 B; the submodule escalation arms). Each pointer states its trigger (when <trigger>, read references/refiner-recovery.md §...). Tour step 11's line anchor re-anchored to the merge-task two-worktree-split paragraph (discovery-based, adj E). Guard re-anchors (adjudications E + I, zero rows deleted or loosened): - workflow-template.test.mjs: the p<phase>-<taskId> presence key and the five grep-parity discrimination keys (RELAND_DISC_CMD/BUDGET/DIVERGE, the >=2 superproject+2A count, NEVER-the-local-follower) relocate their reads to refiner-recovery.md (presence keys move with the text); a new card assertion keeps the trigger pointer routed; the 'curate or excerpt' OLD-absent key UNION-widens over the eviction destination, never a relocated read. - refinery-surface.test.sh: the three whole-file absence checks (positive 'from the Lead', bare checkout/switch origin/) UNION-widen over refiner-recovery.md via LIVE_SURFACE_FILES; stale 'war-refiner.md:24' line ref replaced with the merge-task step 2 construct locator. - war-config.test.mjs readDoc('agents/war-refiner.md') pins the Gate contract section — stayed inline (tier-1), no edit needed. Dispatched literals (workflow-template.js): registry carve-out residue (adjudication G, measured) — the refiner-facing literal family is pinned wall-to-wall, so no literal span was cut and the literal share is byte-unchanged (comment-only edit naming refiner-recovery.md as the discrimination's standing copy). Pinned families: relandDiscrimination (prompt regexes on all three land prompts + grep parity), classificationClause (#1151 site drift guard + token pins), gateCaptureClause (captureUses === 3), baselineDebtClause, the STALE_REMOTE both-surfaces barrier carve-out, submodLandNote (#1114 on all three land prompts), the floor prose (#1046/#819/#268), the two-worktree merge split (Task 5 pins), and the TMPDIR= >= 2 presence floor. Per the Task 3.1-ratified treatment the measured residue is reported rather than a cut forced. Tier-1 kept inline on the card: provision (all three dispatch flavors + STALE_REMOTE taxonomy — both-surfaces-pinned), merge-task steps 1-7, post-merge evidence dispatch, superproject land steps 1/2/4, gate-failure classification (both-surfaces mirror of classificationClause), gate contract, Never, Return. Gate: node --test 1009/1009 green; all 27 shell suites green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…1218) - agents/war-refiner.md lines 21/94/99: drop the ../ prefix from all three refiner-recovery.md trigger pointers — adjudication O(2) mandates the owner-relative form (skills/war/references/<file>); the refiner seat's cwd is the main checkout, so ../skills/... walked OUT of the repo (dead link). - docs/adr/0023 §(D): the reland-discrimination mirror now lives at skills/war/references/refiner-recovery.md (evicted from the card, which retains the trigger pointer) — attribution updated, one sentence only. - workflow-template.test.mjs grep-parity suite: tighten the shape-agnostic refiner-recovery assert to pin the owner-relative pointer shape and reject the forbidden ../-prefixed form. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ts, presence check, outline heading, pointer fallbacks, count-pinned guard (#1218) 1+2. [Nit] refinery-surface.test.sh ABSENCE CHECK header still named the pre-UNION surface set — the lines-96/97 comment lagged the widened LIVE_SURFACE_FILES (ADR 0025 comment-lag class); updated to name the agents/ + workflow-template.js + refiner-recovery.md UNION scan, matching the file-top comment. 3+7. [Nit] Evicted 2A/2B land arms nested under the reland-discrimination heading, implying a false hierarchy — added an additive '## Submodule land arms (2A / 2B)' separator heading before the 2A block; every evicted block stays byte-identical (End state 2). 4. [Minor] Submodule base-resolution refusal evicted with no inline mirror — appended the refusal to the card's retained provisioning sentence: the integration cut uses the resolved base from run config or .gitmodules, never silently the remote default. 5+9. [Minor/Nit] New UNION member RECOVERY_FILE had no fail-loud existence check, so all three absence scans failed open on a rename — added PRESENCE CHECK 5 before LIVE_SURFACE_FILES is consumed, mirroring the fail-closed convention of checks 1-4 (the recorded enumerated-destination-list fail-open shape). 6. [Minor] Two of the three trigger pointers carried no fallback sentence unlike land step 3's — appended the survival net to the provisioning pointer and the 2A/2B pointer: the dispatched merge/land prompt threads the submodule targetRepo/targetBase and the 2A/2B routing. 8. [Nit] Pointer-survival guard pinned the shape but not the count — one surviving pointer kept it green while two evicted sections orphaned; now count-pinned to exactly 3, and the negative widened to reject any ../-prefixed depth.
…, 1 mirror repair New: - byte-identical-eviction-can-legitimately-drop-a-list-marker-or-need-an-additive-heading: a "byte-identical" eviction mandate governs the moved block's bytes, not its outline context. A moved numbered-list item legitimately loses its leading ordinal when it becomes a standalone section, and a heading-level mismatch is fixed by an ADDITIVE parent heading, never by editing the moved heading. ~6 independent Nit findings in one audit round. - registry-carveout-rationale-cannot-justify-retaining-a-card-span-inline: adjudication G's carve-out is scoped to workflow-template.js registry rows pinning runtime prompt strings. Citing it to justify NOT evicting a plan-named branch-gated card section is scope-confused — a card span always has a file re-anchor available. Flagged as a risk for Task 5.1. Recurrence updates (existing lessons amended in place, not duplicated): - agent-card-reference-pointer-is-repo-relative-…-foreign-target-repo: the phase-3 lesson predicted this class recurring in phases 4-5; confirmed at 4.1. - enumerated-destination-list-existssync-guard-fail-open-vs-sibling-fail-closed: 4.1's refinery-surface.test.sh hit the same fail-open shape; the fix round added a fail-loud PRESENCE CHECK 5, confirming the prescribed pattern. Mirror repair (closes #1220 — a phase-4 demoted absorb): - reland-loop-contender-less-transient-vs-real-divergence named agents/war-refiner.md §land-phase as the standing byte-parallel surface. Task 4.1 evicted that copy to skills/war/references/refiner-recovery.md and left a trigger pointer, so the lesson's own Verification note instructed a grep that now returns nothing and reads as a missing mirror. Repointed both references and made the absence-note say so explicitly. The ADR 0025 doc-and-mirror cascade that a name-grep misses (reachable only via git log -S). Phase 4 landed cce6686. Redaction lint clean over 84 files; version slots held at 0.14.68. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… eviction, servitor Wrap-up skeletons (#1223) Cards: four tier>=2 branch-gated blocks moved byte-identical to skills/war/references/worker-servitor-edges.md (4,889 B) with trigger pointers keeping the decisive rules inline (foreign-target-repo lesson: a references/ pointer is enrichment, never the sole carrier of a blocking rule): - agents/war-worker.md 10,664 -> 9,208 B: Submodule task mechanics body (1,140 B; reachable only on a declared submodule task), Gitlink-bump task mechanics body (1,308 B; declared gitlink-bump only — the ledger merge_sha authority + gitlink-only rules stay inline), Servitor confinement rationale (574 B; background doctrine, no every-turn trigger). Byte-identical except the one ADR 0002 link in Servitor confinement, whose relative depth is re-rooted (../docs/... -> ../../../docs/...) so it resolves from the destination (verbatim-doc-move-breaks-relative-links; intent's zero-behavior- change requires a resolving link) — deviation noted in the reference header. Kept inline on tier/cost grounds: Harness note (branch-gated but ~230 B; a trigger pointer would be the same size, saving nothing). - agents/war-servitor.md 15,550 -> 15,481 B: Archived lessons body (413 B; reachable only when D1 dedup lands on an archive/ lesson) — the hot/archive move prohibition stays inline. All other card sections are registry/ both-surfaces-pinned or tier-1 for a once-per-phase seat. Dispatched literals (workflow-template.js): the servitor Wrap-up prompt's five discipline blocks (D1/D2/D3, LANDED-TIP GROUNDING, FINDING-MATCH) compressed to token skeletons + standing-card pointers — the surviving canonical copy of each full text is the named agents/war-servitor.md section (## Memory admission checklist, ### Landed-tip grounding), the ADR 0041 D4 tiered-copies precedent as ratified in Task 3.1. Every registry / both-surfaces anchor token survives in place (mutation-guard/recurrence/files_written-absolute, path-hygiene placeholders + governs-lesson-content-only, gitdir/not-assumed/gate-audit fallback/checkout-topology, finding-match/named-construct/pattern-not-live- instance) and the CWD_IS_TIP_ASSERTING exemption shape is kept. Literal share (pinned extraction) 51,991 -> 49,864 B; 112 -> 113 blocks (the checklist header line crossed the 200 B floor as a skeleton-pointer line). Worker-facing literal residue (adjudication G, measured): the worker dispatch prompt is pinned wall-to-wall — FORCE_WITH_LEASE_RULE + FILES_CHANGED_RULE (byte-compare), COMMENT_LAG_RULE / PLAN_DEFECT_RULE / STALE_PRIOR_ATTEMPT_RULE / self-query line (both-surfaces rows), depClause + workerExtraCtx (runtime- value threading pinned by the T4 #297 and dep-clause tests) — so no worker literal span was cut; per the Task 3.1-ratified treatment the measured residue is reported rather than a cut forced. Guard re-anchors (adjudications E + I, zero rows deleted or loosened): the task-base discovery grep (diagnosis-preflight.test.sh, the two hooks suites, land-decision.test.mjs, workflow-template.test.mjs, prompt-surface-budgets .test.mjs, .tours/) found ZERO suites pinning the moved spans — diagnosis- preflight pins the untouched Stop-and-escalate/D3-addendum sections, validate- worktree-scope pins the untouched servitor frontmatter, clean-surface's OLD- absent greps are directory-recursive over skills/ so the destination is already UNION-covered, land-decision's war-worker.md mention is an unwired fixture string. New relocated presence keys added in workflow-template .test.mjs: destination fragments for all four moved blocks + card pointer routing + decisive-rules-inline (1010/1010 JS green, all shell suites green). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Adjudication O(2): an agent card in agents/ names the owning skill (skills/war/references/<file>) and MUST NOT use a ../-prefixed path — the worker seat's cwd is its task worktree root and the servitor's is the main checkout, so ../skills/... resolves outside the repo (dead link). Same defect fixed for war-refiner.md by 606b72b one phase ago. - Drop the ../ prefix from all four new trigger pointers (war-worker.md x3, war-servitor.md x1). - Retarget the two pointer asserts in workflow-template.test.mjs to the owner-relative form (count-pinned for the worker card, mirroring the phase-4 guard shape). - Add a shape-generic ../-absence assert over BOTH cards' references/ pointers — closes the enumerated-scope gap (606b72b's absence assert was scoped to refiner-recovery.md only) that let this recur. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ivor, ADR-link byte-identity, UNION absence keys, decisive-rule pins (#1223) 1+6. [Minor] "Servitor D1 skeleton drops 'Cross-link related facts with [[slug]] references.' with no surviving canonical copy" / [Minor] "Compression without a survivor: D1's general '[[slug]]' cross-link directive is now on neither surface" — the shrunk dispatched D1 skeleton dropped the general cross-link directive and the named survivor (agents/war-servitor.md D1) carried [[slug]] only inside the user-authored-file arm, so the instruction existed on NEITHER surface — a real instruction loss on a zero-behavior-change plan, with no registry/F05 anchor to catch it. Fix: append "Cross-link related facts with `[[slug]]` references." to the card's D1 bullet, restoring the survivor rather than re-growing the dispatched literal (the skeleton comment's survivor claim is now true). 2+5. [Minor] "End state 2 byte-identity broken: the ADR 0002 link inside the moved §Servitor confinement block was rewritten, not caveated" / [Minor] "Evicted §Servitor confinement block is not byte-identical — the ADR 0002 link was rewritten, diverging from the same plan's two landed reference files" — the moved block's link was re-rooted to ../../../docs/, violating the plan's byte-identical-move mandate and forking the convention the sibling destinations (resume-and-recovery, refiner-recovery, auditor-teach) and the code-verified lesson [[verbatim-doc-move-breaks-relative-links-authored-for-old-location]] established: header caveat, never a link rewrite. Fix: restore `](../docs/adr/0002-scope-by-agent-type.md)` verbatim (paragraph now byte-identical to the pre-eviction card text, cmp-verified against 44eddf0~1), drop the header's "except the one ADR link" exception, and add the ratified translation caveat mirroring resume-and-recovery.md ("read `../docs/…` as `../../../docs/…` from here"). 3. [Minor] "OLD-absent keys over agents/war-servitor.md were not widened to a UNION over the new eviction destination (adjudication I)" — the D3 registry test's two whole-file doesNotMatch keys (phase-<N>.md, else-append) still scanned only the card after Task 5.1 evicted a block into worker-servitor-edges.md, silently narrowing the absence scan and breaking the module-level-UNION pattern Tasks 3.1/4.1 established. Fix: add the module-level `edgesMd` const next to refinerRecoveryMd with the same UNION comment, and iterate both keys over [war-servitor.md, worker-servitor-edges.md]. 4. [Nit] "New eviction guard asserts decisive-rules-inline for only 2 of the 4 evicted sections" — the Task 5.1 guard pinned merge_sha / gitlink-only and the hot/archive prohibition but not the worker card's submodule remote-identity check or the servitor-confinement primary-confinement summary, so deleting either inline sentence stayed green (the adjudication O(1) survival failure — a pointer is enrichment, never the sole carrier). Fix: two assert.match calls on workerMd (/own remote, not the superproject/, /primary confinement/). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This reverts dc72d36, restoring a8cbd17. dc72d36 was a rationale-free revert — its whole body was the auto-generated "This reverts commit a8cbd17…". The post-merge gate-audit (execution-evidence lens, audit_sha dc72d36) escalated it as Critical, and every claim reproduces: 1. CRITICAL — green-by-deletion. The revert removed two `assert.match(workerMd, …)` pins from the mapped acceptance test "Task 5.1 — worker/servitor card evictions": /own remote, not the superproject/ and /primary confinement/. Both subjects are STILL live inline on agents/war-worker.md (lines 23 and 66 at dc72d36). So the deletion removed guard, not obsolete assertions: after it, deleting either inline decisive rule stays green — exactly the adjudication O(1) survival failure the polish had closed. 2. MAJOR — adjudication I narrowing. The revert dropped `const edgesMd` and re-narrowed the two D3 OLD-absent keys from a UNION scan over [war-servitor.md, worker-servitor-edges.md] back to a single-surface read of the card, so retired forms could reappear at the eviction destination undetected. Latent today (the destination carries neither form), but the re-anchor obligation is an End-state condition and was unmet. 3. MAJOR — End-state-2 byte-identity. The revert re-introduced a rewritten ADR 0002 link (../../../docs/…) in place of the byte-identical original (../docs/…) plus the header-caveat convention that Task 2.1 landed two phases earlier in references/resume-and-recovery.md. Verified before reapplying: a8cbd17's own gate is fully green — node --test 1010/1010 and all 27 shell suites pass — identical to dc72d36's count, because the polish's assertions live inside an existing test rather than adding cases. The revert therefore had no gate justification of any kind. Recurrence of the phase-3 incident (7e21867, re-absorbed by 39afb54) and of the recorded lesson phase-close-polish-revert-can-silently-orphan-a-subset-of-absorbed-findings. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…rence, harder mode) The servitor did not run this phase — the land held at held:escalation, so servitorResult was null and the exactly-once learnings capture falls to the Lead. Updated in place (recurrence, not a duplicate): - phase-close-polish-revert-can-silently-orphan-a-subset-of-absorbed-findings Phase 5's dc72d36 reverted polish a8cbd17 with the same signature as phase 3's 7e21867 — body only git's auto-generated "This reverts commit …". Two occurrences in one plan makes this a standing hazard of the phase-close flow, not an incident. Worse than phase 3 in one specific way: the reverted polish had added assertions, so the revert was GREEN-BY-DELETION. It removed two assert.match(workerMd, …) pins while both pinned sentences stayed live inline on the card, and the test count was identical either side (1010/1010) because those assertions live inside an existing test rather than adding cases — no count-based check could see it. Caught by the post-merge gate-audit (execution-evidence) as Critical; phase held, landResult null, dev never advanced. Phase 3's instance shipped silently. Records the cheap decisive check the phase-3 entry lacked: gate the reverted commit itself. a8cbd17 was fully green (1010/1010 JS + 27/27 shell), so the revert had no justification and re-applying was unambiguous. A revert whose target is green is a defect until someone records why. Phase 5 landed bd5faa9. Lint clean; version slots held at 0.14.68. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ten.md; re-anchor doc-contract locks (#1227) Spec §4.3 pass over skills/lessons-learned/SKILL.md (38,711 B at the phase-6 base). The tighten mode's five-step procedure — the whole branch-gated body below the intro paragraph — moves byte-identical (verified via cmp against HEAD) into skills/lessons-learned/references/tighten.md, finishing the half-applied references/ pattern (seeding.md, migration.md). The section keeps its heading (the seed-placement contract (18a) anchors on it), the trigger + orientation paragraph, and gains the trigger pointer ("load references/tighten.md and execute...") plus two decisive one-line rules, matching the sibling evict-mode skeleton shape. Pure move + skeleton — no compression, no surviving-copy dedup in this commit. Guard re-anchors, same task (discovered set: lessons-learned-doc-contract.test.mjs only; war-config.test.mjs's RETIRED_CLAIM_SURFACES sweep is commitLearnings- scoped, none of the moved bytes match it, and that file is Task 6.2's — file-disjoint; prompt-surface-budgets.test.mjs is a size ceiling, green): - #992 banner (17) OLD-absent x6: UNION scan over SKILL.md + references/tighten.md per adjudication I (surfaces 1, 2, 5, 6 moved with the eviction; 3, 4 stay in SKILL.md) — zero rows deleted, zero needles loosened. - (19)/(20)/(21) NEW-present keys: reads move to the destination file (presence keys follow their text). - #1088 banner (2): assert (i) fence extraction co-targets the moved fence in tighten.md (still the SAME extraction as (21)); assert (ii) TIGHTEN_TARGET retirement widens to a UNION over origin + destination. - tighten.md read is unguarded on purpose — a rename/delete throws, never silently narrows the UNION (enumerated-destination existsSync lesson). Post-shrink size: SKILL.md 32,923 B (was 38,711 B; moved block 6,377 B; references/tighten.md 7,108 B). Placeholder budget (hard 49,152 / advisory 43,008) unchanged — Task 7.1 owns the ratchet. Gate: node --test 'skills/**/*.test.mjs' (1010 pass) + all *.test.sh green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…guarded reads (#1227) Resolves the fix-round Majors: Task 6.1's eviction moved shell-out prose (the `safe-swap.sh stage "$MEM"` span) out of doc-cli-consistency's skills/*/SKILL.md scan into skills/lessons-learned/references/tighten.md, which was in neither scan arm — a silent narrowing against the list's own same-commit contract. Adds the destination to EVICTION_DESTINATIONS and drops the existsSync fail-open on the enumerated loop so a renamed/deleted destination throws instead of silently narrowing the UNION scan (lesson: enumerated-destination-list-existssync-guard-fail-open-vs-sibling-fail-closed), matching the unguarded tighten.md read already in lessons-learned-doc-contract.test.mjs. Verified green: the only claimed verb in tighten.md, safe-swap.sh stage, resolves to a real case arm. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…t scans to references/tighten.md, disambiguate the Task 6.1 re-anchor comment (#1227) Finding 1 [Minor] "Three OLD-absent whole-file keys in the task's own doc-contract suite still scan SKILL.md alone after the eviction": the UNION re-anchor rode only (17)'s six #992 needles and the #1088 banner's assert (ii), leaving (6)'s retired-prose-grep guard, (7)'s hot-only forbiddance sweep, and (11)'s retired default-`true` / economy-pins-false pair covering strictly less of the doctrine surface than before the eviction — the exact silent narrowing adjudication I names, and the b6ee5a2/a317137 same-campaign precedent extends enumerated OLD-absent lists to every destination, not just the needles that moved. Fix mirrors the (17)/#1088(ii) shape: (6)/(7) loop over SKILL.md + references/tighten.md, (11)'s array gains the references/tighten.md arm, per-surface name kept in each message. Verified a no-op at this pin — tighten.md carries none of the retired shapes. Finding 2 [Nit] "Task 6.1 re-anchor comment cites (19)-(21) without its banner, against the convention the same file documents": the file's own last banner mandates citing a (N) with its banner (a second (19)–(21) set exists under the Task 2.2 banner), and the same comment said "the six OLD-absent keys below" where the structure is ONE key (17) carrying six needles. Reworded to "(19)-(21) of THIS banner (Task 1.2, #992)" and "the six-needle OLD-absent key (17) below" — comment-only, no assertion touched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… phase-2-landed procedure (#1228) Spec §4.4 applied to the two top-level surfaces: CONTEXT.md keeps definitions; operative procedure lives in exactly one operative home. Two compressions, each naming its surviving canonical copy: - Removal 1 — `held:submodule-pr`: the resume mechanics (merge auto-detect via `gh pr view --json state,mergeCommit`, taking `mergeCommit.oid` as the landed SHA, operator-supplied-SHA fallback) restated the `## held:submodule-pr sub-procedure` now carried verbatim by skills/war/references/submodule-flows.md (landed Phase 2) — the surviving canonical copy. The entry keeps the definition (deliberate out-of-band-merge pause, human-triggered, no poller, remote-reachable SHA) plus a trigger pointer. - Removal 2 — `recovery relaunch`: the playbook detail (kept-commit branch reuse, dep-less one-task-DAG form, orphan adoption via record-as-owned, full-original-DAG + args.recovery, barrier ancestry authoritative, reclaimStaleRemote arming) restated the `### Recovery relaunch` section now carried by skills/war/references/resume-and-recovery.md (landed Phase 2) — the surviving canonical copy. The entry keeps the definition (fresh run, same slug + numeric phase.id, owned-file continuity, never resumeFromRunId, operator playbook) plus a trigger pointer. CLAUDE.md audited, deliberately untouched: every paragraph is an entry-map summary, none restates procedure landed in Phases 2-5, and its hot/cold law summary is mandated by intent End state 7. The ratified byte-identical pointer line is untouched. Guard discovery (grep CLAUDE.md/CONTEXT.md across *.test.mjs, *.test.sh, .tours/ at the task base) found six suites + the tour; none pins the two edited entries (D19/D24/D26 and the lessons-learned Advisory-line/Tighten-pass regions are untouched; the tour anchors CONTEXT.md line 22, above both edits), so no re-anchor was required. Full gate green. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…nical homes (#1228) Fixes the five audit findings on d8ed6e3: Task 6.2 carries requiresTest: true (red-team adjudication L flipped it, adding this suite to Files:), but the diff was CONTEXT.md-only — assert-test-in-diff.sh would exit 1 (no-test route) at the merge floor, and the two compressions had no mechanical anchor. The prior done-report's "requiresTest: false per plan" claim was wrong against the plan blob at the pin. One D-row in skills/war/assets/skill-doc-contracts.test.mjs, the D19/D24 by-construct idiom (bolded term -> next bolded term or ###, never a whole-file scan), covering both compressed entries as glossary -> canonical-home pointer pairs: - **`held:submodule-pr`**: entry keeps its definition anchors (human-triggered, no background poller, remote-reachable SHA) plus the trigger clause naming skills/war/references/submodule-flows.md; the destination's `## held:submodule-pr sub-procedure` section still carries mergeCommit.oid and the operator-supplied-SHA fallback. - **recovery relaunch**: entry keeps its definition anchors (fresh Workflow run, same numeric phase.id, owned-file continuity, never resumeFromRunId) plus the trigger clause naming skills/war/references/resume-and-recovery.md; the destination's `### Recovery relaunch` playbook (heading -> EOF, spanning the runbook) still carries record-as-owned, args.recovery, reclaimStaleRemote, and the full-original-DAG clause. Delete-and-trace verified by mutation probe: renaming mergeCommit.oid, renaming the ### Recovery relaunch heading, or retargeting a CONTEXT.md pointer path each reds D28; all probes restored, working tree clean. Satisfies the merge floor (the diff now carries a skills/**/*.test.mjs path) and closes the pointer-orphan class in the same stroke. Full gate green (1011 JS tests, all shell suites, redaction lint). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ment + destination pin (#1228) 1. [Minor] D28's rationale comment asserts two code-verifiably false facts ('nothing else pins ... the delegated doctrine'; 'a rename ... would orphan both pointers with zero red') — war-config.test.mjs pins the '### Recovery relaunch' heading + entry-point tokens at the destination, and a rename reds via this file's module-scope readFileSync's plus war-config.test.mjs's UNION absence sweeps. Reworded the premise to the real residual: the CONTEXT.md trigger clauses/paths, the sub-procedure's mergeCommit.oid + operator-SHA content, and the runbook's record-as-owned / args.recovery / reclaimStaleRemote / full-original-DAG tokens are what nothing else pins — a within-file re-home or gutted section is the class D28 closes. 2. [Nit] D28 header says each destination 'is its file's trailing section'; for pair 2 the extraction deliberately spans two sections — amended the parenthetical: submodule-flows.md's section is the trailing section, the resume-and-recovery.md match deliberately spans the Recovery-relaunch subsection plus the held-partial-phase runbook (see the recDest comment). 3. [Minor] D28's recovery-relaunch destination half is satisfied by the ADJACENT runbook section — gutting the pointed-at '### Recovery relaunch' body still read green, since all four asserted tokens live in the runbook half while CONTEXT.md's pointer promises the single-task vs full-DAG forms homed only in that body. Added the [/two entry points/i] key, anchored on the body's only in-extraction occurrence, so deleting the Recovery-relaunch body proper now reds. 4. [Nit] D28 block comment's structural justification is false for the second destination — same parenthetical contradiction as finding 2 (the header claimed trailing-section for both while the inline recDest comment correctly states the two-section span); resolved by the same reword.
…_SURFACES over references/tighten.md (#1226) Phase-close absorb, applied by the Lead: the run's polish-worktree and land agents both died on API 529s (held:land-failed), so this and the land were completed by hand. Task 6.1 evicted the tighten five-step procedure (~4.8 KB) out of skills/lessons-learned/SKILL.md into references/tighten.md. war-config.test.mjs's clause-B drift guard enumerates the origin surface in RETIRED_CLAIM_SURFACES — a whole-file OLD-absent key — so the destination escaped its three scanners (RETIRED_PUBLICATION_PHRASES, COMMITLEARNINGS_BARE_TRUE, COMMITLEARNINGS_DEFAULT_TRUE). Adjudication I requires such a key to re-anchor as a UNION over origin + every destination, and that rule is not conditioned on whether the moved bytes currently match. migration.md already sits in the same array for exactly this reason. Nine audit seats converged on this and all correctly refused to fix it in-task: war-config.test.mjs is in Task 6.2's Files list, same phase and same wave, so 6.1 touching it would be precisely the same-file rebase collision the plan's disjointness law forbids. Phase close is the first tip where both tasks have merged. STRUCTURED_SURFACES deliberately untouched — tighten.md is a prose surface, so the free-text adjacency sweep should apply to it. Verified non-vacuous (delete-the-feature): injecting "`commitLearnings` defaults to `true`" into tighten.md reds the suite naming that exact file; removing it returns to green. Green-on-arrival otherwise — tighten.md carries none of the three retired shapes today, the same verified-no-op shape #779's own sweep recorded as success. The other three queued phase-close findings were already absorbed in-task by d8ed058 and c1306ad..0be16ae; verified at this tip rather than re-applied: - CONTEXT.md:1295 already reads "commits on a retried branch" (definite article gone) - the D28 recDest loop already carries the in-extraction /two entry points/i key - the doc-contract cite already reads "of THIS banner (Task 1.2, #992)" Gate at this tip: node --test 1011/1011, 27/27 shell suites. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…lision) The servitor did not run this phase either — the land failed on API 529s (held:land-failed, servitorResult null), so the exactly-once learnings capture falls to the Lead. Second consecutive phase needing manual completion. New: - folded-in-followup-can-be-silently-consumed-by-a-row-label-collision Issue #1208 was folded into Task 6.2's dispatch asking for "one D28 row" binding the ADR 0042 <-> CONTEXT.md <-> CLAUDE.md doctrine mirror. Task 6.2 landed a row labelled D28 for a DIFFERENT subject (the glossary-compression pin, #1228). Five audit seats reviewed 6.2 and none flagged the fold-in as unmet: by label the deliverable was present, named as specified, and green. Measured at 5df7e47 across skills/**/*.test.mjs — 0042: 0 occurrences, "trigger is the skeleton": 0, "when <trigger>": 0, "Doctrine placement": 0. The mirror is still hand-synced with no suite reading any of it. The rule this records: verify a fold-in by its required TOKENS at the landed tip, never by its row label or row count. A doc-contract suite numbers rows in landing order, so "the D28 row" names a moving slot another task can claim first — the label aliases two subjects and the collision is invisible to a per-row audit. Corollary for authoring: say "the next free row label", never name one. #1208 deliberately left OPEN with the measurement recorded in its thread. Not freelanced at phase close: phase 6 is landed and gated, and writing a substantive new guard post-land with no audit roster on it would bypass the discipline that caught it. Phase 6 landed 5df7e47. Lint clean; version slots held at 0.14.68. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…1208) OPERATOR-DIRECTED amendment, 2026-07-29. Not Lead-invented scope: the operator reviewed the phase-6 close-out report and directed that #1208 be appended to phase 7 as a third task rather than deferred past the campaign. Why it is owed. #1208 was folded into Task 6.2's dispatch and did NOT land: the D28 label was consumed by 6.2's own glossary-compression row, so by label the deliverable looked present and green and all five audit seats passed it. Measured at 5df7e47 across skills/**/*.test.mjs — 0042: 0, "trigger is the skeleton": 0, "when <trigger>": 0, "Doctrine placement": 0. The three-surface mirror Task 1.1 authored (ADR 0042 D4/D5 <-> CONTEXT.md ### Prompt-surface budgets <-> CLAUDE.md ## Doctrine placement) is still hand-synced with no suite reading any of it. Task 7.3 supplies the missing mechanical guard for End state 7, whose CONTENT phase 1 landed but left unpinned. Decomposition. Task 7.3's only Files entry is skill-doc-contracts.test.mjs, which is file-disjoint from 7.1 (prompt-surface-budgets.test.mjs) and from 7.2 (the three release slots) — so it joins 7.1 in wave 1 rather than needing a phase of its own. 7.2's deps widen from [7.1] to [7.1, 7.3] to keep the release bump the trailing act, per the code-boundary rule that a version bump is always last; its blurb is then written over the finished phase. Guard-authoring constraints threaded from the miss itself: pick the next free label at the rebased base and never reuse one (D28 is taken), and make non-vacuity the acceptance bar — a one-sided mutation of ANY of the three surfaces must red the row, demonstrated per surface in the done report, not asserted. Lesson: folded-in-followup-can-be-silently-consumed-by-a-row-label-collision. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…1230) Replace every Phase-1 placeholder budget with post-shrink derivations measured at this task's rebased base (c6a05fb): hard = post-shrink x1.25 ceil-KB, advisory = x1.10 ceil-KB (adjudication D). Ratchet-down only: CONTEXT.md GREW (computed hard 128,000 B > placeholder 126,976 B) — its placeholder is retained and a blocking done-report flag raised for Lead adjudication. agents/war-setup-scout.md ratchets to its own measured size without a flag (adjudication M: unchanged is not failed). The placeholder marker self-assert flips to the OLD-absent form: zero marker occurrences, carried by the gate itself. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… records the no-flag conclusion but omits that the surface grew (#1230) [Nit] CLAUDE.md row comment states the no-flag conclusion but never says the surface grew: CLAUDE.md went 12,400 B (762a7e4) -> 12,987 B (c6a05fb), +587 B, and its computed hard (ceil-KB 12,987 x 1.25 = 16,384 B) exactly EQUALS the placeholder, so the plan's flag criterion genuinely does not fire — but the ratchet record hid that the surface was spared purely by KB rounding. One clause keeps the record honest: the comment now states the growth fact alongside the rounding rationale. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…d, CLAUDE.md, and the budget-suite formula (#1231, closes #1208) One additive row, shaped on D26: per-term construct extraction of CONTEXT.md's Surface budget / Prose temperature / Trigger pointer entries (bolded term -> next bolded-term-with-colon or ###, each non-vacuously reaching its _Avoid_ line), CLAUDE.md's '## Doctrine placement' (heading -> next ##), and the prompt-surface-budgets.test.mjs header (file start -> first import). Every key asserted on BOTH its mirror block and norm(adr0042); direction-paired keys bind lowering<->normal-PR, raising<->commit-body, advisory<->x1.10, hard<->x1.25 so a ratchet/formula inversion reds while sanctioned rewording does not. The x1.10/x1.25 pair mirrors against the budget suite's formula comment — the numeric pair's only surface beyond the ADR (verified at base). Zero existing rows touched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… budgets + hot/cold law (#1232) Next free patch above the live integration base (slots read 0.14.68 at the rebased tip; origin/master lags at 0.14.67 — expected stacked-release lag). README ## Status replaced in place, authored against the Status-blurb authoring checklist; shrink figures cite the landed budget constants' own derivation comments (post-shrink @ c6a05fb), never draft numbers. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…26 escape idiom, Status-blurb same-task absolute Fixes the queued phase-7 coherence-sweep findings in one commit: 1. [Nit] Newly-pinned budget-suite header carries no coupling comment naming its guard — added the "Pinned by skill-doc-contracts.test.mjs's D29 row" line above the Formula sentence in prompt-surface-budgets.test.mjs, per the repo's both-copies convention. 2. [Nit] `term` interpolated into `new RegExp` without the metachar escape the D26 precedent it is modelled on carries — D29's CONTEXT.md per-term extraction now escapes the term (D26's exact idiom) before building the pattern. 3. [Minor] Status blurb's unqualified "every … re-anchored in the same task as the move" is falsified by the phase-6 phase-close UNION widening. 4. [Minor] README Status blurb's "re-anchored in the same task as the move" absolute is false for one UNION key — that re-anchor landed at the phase-6 close, not in-task. 5. [Minor] Release blurb's "re-anchored in the same task as the move" absolute has a landed counter-example (phase-close UNION widening). Findings 3-5 share one fix: the Status paragraph now names the sanctioned exception — war-config.test.mjs's RETIRED_CLAIM_SURFACES widened over references/tighten.md at the phase-6 close (commit 5df7e47), forced there by the file-disjointness law (the suite sat in same-wave Task 6.2's Files list). The **0.14.69** slot token is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The servitor ran this phase (first clean land since phase 4), so this promotes its three type: project writes. New: - release-blurb-fix-for-one-finding-can-violate-its-own-appositive-checklist-item: fixing one release-blurb finding can break the paragraph's own appositive-proximity checklist item — the blurb checklist items interact, so re-run all of them after any single-item fix rather than only the one just addressed. Recurrence updates (existing lessons amended in place, not duplicated): - coupling-comment-restating-grep-pattern-bytes-self-matches-the-sweep: the self-match hazard extends beyond exactly-N grep sweeps to non-vacuity and truncation asserts — a comment quoting the pattern becomes a hit for it. - guard-task-split-from-mirror-task-needs-deps-edge-same-wave-insufficient: phase 7's same-wave sibling-task guard/mirror coupling held WITHOUT a deps edge, but only by lucky convergent plan-literal wording. Same-wave is still not a substitute for a deps edge; this is a near-miss recorded as one, not a counterexample. Phase 7 landed 2037e64, released 0.14.69. Lint clean; all four version slots verified at 0.14.69 immediately before this commit (gate2-commit-from-stale-verify-worktree- can-revert-a-release-bump). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Base automatically changed from
dev/2026-07-28-audit-evidence-precedence
to
master
August 1, 2026 19:16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Campaign plan 2 of 2, stacked on plan 1 (#1202). Base is
dev/2026-07-28-audit-evidence-precedence, notmaster— merge #1202 first (ADR 0011 stack-and-plow).Plan:
docs/plans/2026-07-28-prompt-surface-simplification.md· ADR: 0042 · red-team: OPERATOR-ADJUDICATED CLEAR (13 roots patched, adjudications A–N, plus Lead rows O and the phase-7 growth ruling).What this does
Every prompt-bearing prose surface grew monotonically across 0.14.38 → 0.14.67 with zero shrink events. This ports the memory subsystem’s governance to those surfaces — an advisory line, a hard refusal, and temperature-is-location — and runs the one-time shrink that makes the budgets meaningful.
skills/war/SKILL.mdagents/war-refiner.mdagents/war-auditor.mdagents/war-worker.mdagents/war-servitor.mdskills/lessons-learned/SKILL.mdCONTEXT.mdCLAUDE.mdAll nine budgeted rows are under advisory at the tip. † These two grew because End state 7 mandates the new doctrine on them; task 6.2’s dedup recovered 670 B. Ratchet-down retained the tighter phase-1 placeholders and task 7.1 raised the blocking flag — adjudicated ACCEPT with the accounting reproduced by hand on #1229.
How it holds
prompt-surface-budgets.test.mjs— one row per surface, reds on a 1-byte hard-line crossing.references/plus a trigger pointer; a dedicatedinstruction-survivalaudit seat judged every shrink task.CONTEXT.md↔CLAUDE.md), asserting every key on both the mirror and the canonical ADR. Proven non-vacuous per surface — closes #1208.Phases
1 governance
fca6160· 2 Lead surfaced845fa8· 3 auditor53ef8a7· 4 refinercce6686· 5 worker+servitorbd5faa9· 6 periphery5df7e47· 7 ratchet+D29+release2037e64. Gate at tip: 1012 JS tests, 27/27 shell suites, redaction lint clean, four version slots lock-step at 0.14.69.Phases 5 and 6 needed Lead manual completion (a rationale-free polish revert caught Critical by the post-merge gate-audit; then API 529s killing the polish and land agents). Both are documented in the campaign checkpoint with the checks they taught.
Deferred validations
Three, all requiring future releases to measure: the non-monotonic growth interval over ~5 releases, hot/cold law authoring adherence, and advisory-warn visibility on first crossing. None is waivable in prose — each names its runner.
🤖 Generated with Claude Code