Skip to content

Prompt-surface budgets and the hot/cold law — shrink pass + standing ratchet (0.14.69) - #1234

Merged
Ljferrer merged 48 commits into
masterfrom
dev/2026-07-28-prompt-surface-simplification
Aug 1, 2026
Merged

Prompt-surface budgets and the hot/cold law — shrink pass + standing ratchet (0.14.69)#1234
Ljferrer merged 48 commits into
masterfrom
dev/2026-07-28-prompt-surface-simplification

Conversation

@Ljferrer

Copy link
Copy Markdown
Owner

Campaign plan 2 of 2, stacked on plan 1 (#1202). Base is dev/2026-07-28-audit-evidence-precedence, not master — 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.

surface before after advisory hard
skills/war/SKILL.md 96,608 58,555 (60.6%) 64,512 73,728
agents/war-refiner.md 31,957 27,109 30,720 34,816
agents/war-auditor.md 23,823 22,216 24,576 28,672
agents/war-worker.md 10,664 9,199 10,240 12,288
agents/war-servitor.md 15,550 15,531 17,408 19,456
skills/lessons-learned/SKILL.md 38,711 32,923 36,864 41,984
CONTEXT.md 100,984 101,769 † 111,616 126,976
CLAUDE.md 12,400 12,987 † 14,336 16,384

All 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.
  • Eviction is a byte-identical move to references/ plus a trigger pointer; a dedicated instruction-survival audit seat judged every shrink task.
  • Zero doc-contract rows deleted or loosened. Every relocated presence key re-anchored to its destination; every whole-file OLD-absent key widened to a UNION scan over origin + destination (adjudication I).
  • New D29 row binds the three-surface doctrine mirror (ADR 0042 ↔ CONTEXT.mdCLAUDE.md), asserting every key on both the mirror and the canonical ADR. Proven non-vacuous per surface — closes #1208.
  • No behavior change: prose and test re-anchors only. No engine code path, exit code, schema, or floor script moved.

Phases

1 governance fca6160 · 2 Lead surface d845fa8 · 3 auditor 53ef8a7 · 4 refiner cce6686 · 5 worker+servitor bd5faa9 · 6 periphery 5df7e47 · 7 ratchet+D29+release 2037e64. 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

RT Probe and others added 30 commits July 28, 2026 14:23
…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>
… comment lag, evicted SKILL.md citation (#1214)"

This reverts commit c6015c4.
… 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>
…ink survivor, ADR-link byte-identity, UNION absence keys, decisive-rule pins (#1223)"

This reverts commit a8cbd17.
Ljferrer and others added 18 commits July 29, 2026 10:58
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
@Ljferrer
Ljferrer merged commit bcb33c4 into master Aug 1, 2026
1 check passed
@Ljferrer
Ljferrer deleted the dev/2026-07-28-prompt-surface-simplification branch August 1, 2026 19:16
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.

D28 mirror-guard row: bind ADR 0042 ↔ CONTEXT.md ↔ CLAUDE.md doctrine mirror

1 participant