Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
182 commits
Select commit Hold shift + click to select a range
4448c8c
docs(stories): confirm the loop-rule consolidation profile
dsnger Sep 10, 2026
510f6ce
docs(specs): loop-rule consolidation design (Gate A pending)
dsnger Sep 10, 2026
07c88a1
docs(specs): loop-rule consolidation — Gate-A pass 1 revision
dsnger Sep 10, 2026
8d20b2e
docs(specs): loop-rule consolidation — Gate-A pass 2 revision
dsnger Sep 10, 2026
0a5205f
docs(specs): loop-rule consolidation — Gate-A pass 3 revision
dsnger Sep 10, 2026
b8d7673
docs(specs): loop-rule consolidation — Gate-A pass 4 revision
dsnger Sep 10, 2026
4625679
docs(stories): record the accepted scope expansion and its criterion
dsnger Sep 10, 2026
726a5de
docs(specs): loop-rule consolidation — Gate-A pass 5 revision
dsnger Sep 10, 2026
de66e00
docs(specs): loop-rule consolidation — Gate-A pass 6 revision
dsnger Sep 10, 2026
5aef816
docs(specs): loop-rule consolidation — Gate-A pass 7 revision
dsnger Sep 10, 2026
2feab0c
docs(specs): loop-rule consolidation — Gate-A pass 8 revision
dsnger Sep 10, 2026
18c742f
docs(specs): loop-rule consolidation — Gate-A pass 9 revision (slim t…
dsnger Sep 10, 2026
6cbc174
docs(stories): split the record-durability subject out of this story
dsnger Sep 10, 2026
f3cb98a
docs(stories): record durability across sessions, commits and rollbacks
dsnger Sep 10, 2026
c8f96b8
docs(specs): narrow to the closure ordering; defer record durability
dsnger Sep 10, 2026
11b0e47
docs(specs): loop-rule consolidation — Gate-A pass 11 revision (one a…
dsnger Sep 10, 2026
d5a4f14
docs(stories): terminate repeated harness findings by criterion, not …
dsnger Sep 10, 2026
78e5f97
docs(specs): loop-rule consolidation — Gate-A pass 12 revision (end t…
dsnger Sep 10, 2026
8e11f37
docs(stories): add the two missing loop bounds to the termination story
dsnger Sep 10, 2026
0168f88
docs(specs): cut the spec to the design; the plan carries the bookkee…
dsnger Sep 10, 2026
c7c1403
docs(stories): cut the two bounds to what the field record supports
dsnger Sep 11, 2026
c06dd69
chore: track .context/codex-reviews/ so pass curves survive on their own
dsnger Sep 11, 2026
17cf2e9
docs(specs): apply Gate-A pass 14; extend the coherence instruction (…
dsnger Sep 11, 2026
af05d72
docs(specs): bounded rollback after Gate-A pass 15; decide, don't enu…
dsnger Sep 11, 2026
5d12884
docs(specs): the two health readings hold differently; fix stale item…
dsnger Sep 11, 2026
c792383
docs(specs): apply Gate-A pass 16; two disagreements with standing se…
dsnger Sep 11, 2026
c2d5fe1
docs(specs): separate the cycle-wide resolve duty from per-pass clean…
dsnger Sep 11, 2026
12fe2e6
docs(context): Gate-A pass 17 — mandatory two-tell stop, findings hel…
dsnger Sep 11, 2026
bc08236
docs(specs): produce the non-active target text; stop describing the …
dsnger Sep 11, 2026
96c3611
docs(specs): target text — six changed sentences in passage (b), not …
dsnger Sep 11, 2026
ef9a504
docs(specs): apply Gate-A pass 18; finish the target text, §H becomes…
dsnger Sep 11, 2026
0350b82
docs(context): prepare the cycle record for handoff
dsnger Sep 11, 2026
6d52fcc
docs(specs): precheck repairs before pass 19
dsnger Sep 11, 2026
8714e43
docs(context): Gate-A pass 19 — one tell, findings open
dsnger Sep 11, 2026
5174d7a
docs(specs): apply Gate-A pass 19 in one repair round
dsnger Sep 11, 2026
5f6e81c
docs(context): Gate-A pass 20 — B+M 11 to 6, findings open
dsnger Sep 11, 2026
8dc22fb
docs(specs): apply Gate-A pass 20; correct two claims of my own
dsnger Sep 11, 2026
b9fc786
docs(context): Gate-A pass 21 — cycle-low findings, zero Blockers, open
dsnger Sep 11, 2026
2ff9f24
docs(specs): apply Gate-A pass 21 across whole passages
dsnger Sep 11, 2026
17fcf7a
docs(context): Gate-A pass 22 — mandatory two-tell stop, findings hel…
dsnger Sep 11, 2026
d6052fe
docs(specs): apply Gate-A pass 22 by rolling back the attribution line
dsnger Sep 12, 2026
bb65f17
docs(context): Gate-A pass 23 — zero tells, findings open
dsnger Sep 12, 2026
0d7e4b4
docs(context): correct the pass-22 stop record; hold before any round 24
dsnger Sep 12, 2026
6913c35
docs(specs): apply Gate-A pass 23 under bounded authorisation
dsnger Sep 12, 2026
79f2eb2
docs(context): Gate-A pass 24 — cycle-low B+M, findings open, decisio…
dsnger Sep 12, 2026
31bbe8f
docs(specs): apply Gate-A pass 24; withdraw the restoration requirement
dsnger Sep 12, 2026
36e5fe2
docs(context): Gate-A pass 25 — B+M 2, cycle low, decision owed
dsnger Sep 12, 2026
8b8e146
docs(specs): apply Gate-A pass 25; dissolve the joint equality rule
dsnger Sep 12, 2026
56d8f5a
docs(context): Gate-A pass 26 — mandatory two-tell stop, findings hel…
dsnger Sep 12, 2026
5446a45
docs(context): park Gate-A cycle awsf1ec771 open at pass 26
dsnger Sep 12, 2026
d971ae7
docs(specs): split the ordering into gate-general and per-gate closure
dsnger Sep 13, 2026
4b00d44
docs(context): Gate-A pass 27 — one tell, B+M 6 to 4, findings held open
dsnger Sep 13, 2026
233e915
docs(specs): decide repeated-refuted findings; apply pass 27's three …
dsnger Sep 13, 2026
74e3ef0
docs(context): Gate-A pass 28 — mandatory two-tell stop, findings hel…
dsnger Sep 13, 2026
36db7f0
docs(specs): apply pass 28; carry the dismissal rule to every site th…
dsnger Sep 13, 2026
95439f8
docs(specs): apply pass 29; precedence turns on closing, not eligibility
dsnger Sep 13, 2026
e48259d
docs(specs): apply pass 30; a non-closing pass suspends before it con…
dsnger Sep 13, 2026
45b7d36
docs(specs): apply pass 31; shrink the failed-act rule instead of ext…
dsnger Sep 13, 2026
c7cb993
docs(context): Gate-A pass 32 — mandatory two-tell stop, repair colli…
dsnger Sep 13, 2026
3ee9132
docs(specs): cut the Gate-B tree condition; apply the four surviving …
dsnger Sep 13, 2026
6a2805e
docs(context): Gate-A pass 33 — mandatory two-tell stop, the cut did …
dsnger Sep 13, 2026
ea5e76c
docs(specs): finish the scope cut; drop the unsupported assurances
dsnger Sep 13, 2026
8847414
docs(specs): apply pass 34; five Majors, each verified before repair
dsnger Sep 13, 2026
701aa50
docs(specs): apply pass 35; four Majors, all wordings of earlier repairs
dsnger Sep 13, 2026
a37b5ab
docs(specs): apply pass 36; three Majors, two of the same assurance c…
dsnger Sep 13, 2026
cc7f6dd
docs(specs): apply pass 37; the unrepairable closing failure gets a t…
dsnger Sep 13, 2026
13005de
docs(specs): apply pass 38; dimensions follow the profile, components…
dsnger Sep 13, 2026
12cf247
docs(specs): apply pass 39; name the three-site fan-out every new rul…
dsnger Sep 13, 2026
d26d097
docs(specs): apply pass 40; the pre-pass fan-out check held
dsnger Sep 13, 2026
3b61fe3
docs(specs): apply pass 41; stop compressing cited rules, stop enumer…
dsnger Sep 13, 2026
95f8591
docs(specs): apply pass 42; §F item 4 stops counting answers
dsnger Sep 13, 2026
4a44007
docs(specs): apply pass 43; the branches are read once, before the act
dsnger Sep 13, 2026
1c858ac
docs(specs): apply pass 44; reword the branch leads, add the tenth st…
dsnger Sep 13, 2026
4b713dd
docs(specs): apply pass 45; classification stops referring to closing…
dsnger Sep 13, 2026
6c88db5
docs(specs): apply pass 46; source-block repair reopens the reading
dsnger Sep 13, 2026
4083ba6
docs(specs): apply pass 47; the Blocker/Major filter was the last hid…
dsnger Sep 13, 2026
935c8da
docs(specs): apply pass 48; stop keeping a second copy of §F's count
dsnger Sep 13, 2026
f6bca9b
docs(specs): apply pass 49; the design stops enumerating what §F owns
dsnger Sep 13, 2026
68eb365
docs(specs): apply pass 50; the design records decisions, the target …
dsnger Sep 13, 2026
2044147
docs(specs): apply pass 51; one source per rule, in both files
dsnger Sep 13, 2026
06152d1
docs(specs): reconcile pass 51 by content; apply pass 52
dsnger Sep 13, 2026
81fffd1
docs(context): bring every handoff surface current for a context clear
dsnger Sep 13, 2026
c73367f
docs(specs): apply pass 53; the §F sweep reaches the shipped hook
dsnger Sep 13, 2026
1940181
docs(specs): apply pass 54; a fourth hook string, and the scope state…
dsnger Sep 13, 2026
6b8854f
docs(specs): apply pass 55; the hook reminder class, swept to its edge
dsnger Sep 13, 2026
bb1ba03
docs(specs): apply pass 56; two count contradictions, eleven collected
dsnger Sep 14, 2026
ebe3aa7
docs(specs): apply pass 57; three pinned expectations, not one
dsnger Sep 14, 2026
fecb3aa
docs(specs): apply pass 58; the hook messages' openings, one layer de…
dsnger Sep 14, 2026
db9f70e
docs(specs): apply pass 59; §F's hook items carry complete messages now
dsnger Sep 14, 2026
e911b39
docs(specs): decision 6; a decline excludes its own finding and nothi…
dsnger Sep 14, 2026
5197b0c
docs(specs): apply pass 60; a backtick that would have run as a command
dsnger Sep 14, 2026
888d2d1
docs(specs): apply pass 61; the operator line item 12 had left standing
dsnger Sep 14, 2026
ef00b29
docs(specs): apply pass 62; item 12's long channel completes the tran…
dsnger Sep 14, 2026
38042c8
docs(specs): apply pass 63; stop counting what this text does not survey
dsnger Sep 14, 2026
0593083
docs(specs): apply pass 64; the deleted claim's second copy in the de…
dsnger Sep 14, 2026
ba15e83
docs(specs): close the Gate-A spec cycle; pass 65 returned NO FINDINGS
dsnger Sep 14, 2026
5e466f6
docs(plans): the loop-rule-consolidation implementation plan
dsnger Sep 14, 2026
5871d0a
docs(context): open Gate-A plan cycle om0bdd7udh
dsnger Sep 14, 2026
9f13a2c
docs(plans): apply Gate-A plan pass 1; one verified fragment table
dsnger Sep 14, 2026
b767a2a
docs(plans): apply Gate-A plan pass 2; the third fragment condition, …
dsnger Sep 14, 2026
6ace06f
docs(plans): apply Gate-A plan pass 3; fragments exist once, and are …
dsnger Sep 14, 2026
58b3660
docs(plans): apply Gate-A plan pass 4; delete the generator, guard th…
dsnger Sep 14, 2026
916ede2
docs(plans): apply Gate-A plan pass 5; stop pre-writing the checks
dsnger Sep 14, 2026
33cdfa8
docs(plans): complete the pass-5 method change through its dependencies
dsnger Sep 14, 2026
c21b45a
docs(context): durable Gate-A plan prompt, and a resume block in the …
dsnger Sep 14, 2026
05ffbd4
docs(context): note that the plan prompt is untracked and how to rebu…
dsnger Sep 14, 2026
34250be
docs(plans): apply Gate-A plan pass 6; derive OLD fragments before in…
dsnger Sep 14, 2026
54e793b
docs(plans): apply Gate-A plan pass 7; stop pre-assigning fragment ids
dsnger Sep 14, 2026
41d73a5
docs(context): record passes 6 and 7 in the Gate-A plan working record
dsnger Sep 14, 2026
ebb371b
docs(plans): apply Gate-A plan pass 8; observe the moved and carried …
dsnger Sep 14, 2026
ba614f6
docs(plans): apply Gate-A plan pass 9; state what each disposition ow…
dsnger Sep 14, 2026
55a27c9
docs(plans): apply Gate-A plan pass 10; tasks read the disposition ta…
dsnger Sep 14, 2026
ff17edd
docs(context): record passes 8-10 in the Gate-A plan working record
dsnger Sep 14, 2026
9a79e01
docs(plans): apply Gate-A plan pass 11; bound each task by its own bl…
dsnger Sep 14, 2026
1d5a892
docs(plans): apply Gate-A plan pass 12; split the closing act into tw…
dsnger Sep 14, 2026
c1614ba
docs(plans): apply Gate-A plan pass 13; name the exact predicates the…
dsnger Sep 14, 2026
6a9cfc8
docs(plans): apply Gate-A plan pass 14; close both recovery holes in …
dsnger Sep 14, 2026
c6d0773
docs(plans): apply Gate-A plan pass 15; "changed" is not a disposition
dsnger Sep 14, 2026
d41ff5a
docs(plans): apply Gate-A plan pass 16; a13 is two sentences, c9 is o…
dsnger Sep 14, 2026
67a50e0
docs(plans): apply Gate-A plan pass 17; the fragment test is class-sp…
dsnger Sep 14, 2026
6d276fa
docs(plans): apply Gate-A plan pass 18; give spans a record shape and…
dsnger Sep 14, 2026
0b936eb
docs(plans): drop a stale shape count missed in pass 18
dsnger Sep 14, 2026
76cd2ce
docs(plans): apply Gate-A plan pass 19; every recording task stages t…
dsnger Sep 14, 2026
9aa1178
docs(plans): apply Gate-A plan pass 20; a fragment must lie inside wh…
dsnger Sep 14, 2026
3111985
docs(plans): state the fragment test as the post-edit region, and re-…
dsnger Sep 14, 2026
df1e9f5
docs(context): record passes 11-20 in the Gate-A plan working record
dsnger Sep 14, 2026
c51dce4
docs(context): record Gate-A plan pass 21 findings (2 Blockers, 3 Maj…
dsnger Sep 14, 2026
1d2f9db
docs(plans): replace Task 0 and Task 15's guarded shell with four pro…
dsnger Sep 15, 2026
9ced53c
docs(plans): apply Gate-A plan pass 22; the accounting table was itse…
dsnger Sep 15, 2026
b8b433d
docs(plans): apply Gate-A plan pass 23; phase the restore target, wid…
dsnger Sep 15, 2026
d1ec3cc
docs(context): record passes 21-23 and the method change in the worki…
dsnger Sep 15, 2026
892301e
docs(plans): apply Gate-A plan pass 24; order the close checks, captu…
dsnger Sep 15, 2026
f795bd2
docs(plans): apply Gate-A plan pass 25; the capture gets a function a…
dsnger Sep 15, 2026
a772083
docs(context): record passes 24-25 and the checkpoint in the working …
dsnger Sep 15, 2026
05ec1b2
docs(plans): drop the plan-added automatic restoration for a bounded …
dsnger Sep 15, 2026
f69db7d
docs(plans): apply Gate-A plan pass 26; Resume must recognise the han…
dsnger Sep 15, 2026
f2e5dda
docs(plans): apply Gate-A plan pass 27; remove a closure condition th…
dsnger Sep 15, 2026
58c49db
docs(plans): apply Gate-A plan pass 28; validate the commit that land…
dsnger Sep 15, 2026
f99607b
docs(plans): apply Gate-A plan pass 29; Resume gets its own validation
dsnger Sep 15, 2026
2b82702
docs(plans): apply Gate-A plan pass 30; rewrite Resume against all th…
dsnger Sep 15, 2026
1e1638f
docs(plans): apply Gate-A plan pass 31; run the loop through the orde…
dsnger Sep 15, 2026
e429008
docs(plans): apply Gate-A plan pass 32; the ordering decides before a…
dsnger Sep 15, 2026
b395da0
docs(plans): apply Gate-A plan pass 33; the post-close block re-reads…
dsnger Sep 15, 2026
8fc3c13
docs(context): record passes 26-33 and the stop in the working record
dsnger Sep 15, 2026
1849164
docs(plans): one home per closing condition; verify the close path en…
dsnger Sep 15, 2026
c7f4617
docs(context): record the bounded revision and pass 34 in the working…
dsnger Sep 15, 2026
4402260
docs(context): make the Gate-A plan working record a standalone handoff
dsnger Sep 15, 2026
c55b1bb
docs(context): anchor the handoff to the plan revision, not to HEAD
dsnger Sep 15, 2026
2d79ac8
docs(plans): check condition 3 before 8a moves; ask git for the dirty…
dsnger Sep 15, 2026
e4d2fba
docs(context): record Gate-A plan pass 35 and the second bounded repair
dsnger Sep 15, 2026
518121a
docs(plans): let Task 8 discharge carried h3, via the procedure not a…
dsnger Sep 16, 2026
1dc7990
docs(context): record Gate-A plan pass 36 and the third bounded repair
dsnger Sep 16, 2026
d7f2af8
docs(plans): a topology for a moved HEAD; Task 4 walks the table, not…
dsnger Sep 16, 2026
b231fc2
docs(context): record Gate-A plan pass 37 and the fourth bounded repair
dsnger Sep 16, 2026
b283250
docs(plans): Resume reads the repository; it stops classifying it
dsnger Sep 16, 2026
ab3cb8e
docs(context): record Gate-A plan pass 38 and the classification deci…
dsnger Sep 16, 2026
df9123a
docs(plans): Resume checks the branch; route by the check that rejected
dsnger Sep 16, 2026
c1fcdd1
docs(context): record Gate-A plan pass 39 and the sixth bounded revision
dsnger Sep 16, 2026
d4a87c6
docs(assessment): record the OpenWolf context and memory assessment
dsnger Sep 16, 2026
c5d39be
docs(plans): record, then read the ordering, then repair; 4b stages t…
dsnger Sep 16, 2026
0a15f6d
docs(context): record Gate-A plan pass 40 and the seventh bounded rev…
dsnger Sep 16, 2026
4c9ed3c
docs(plans): the baseline always reads $BASE; stage slot paths, not a…
dsnger Sep 16, 2026
eee9d4e
docs(context): record Gate-A plan pass 41 and the eighth bounded revi…
dsnger Sep 16, 2026
0bb1d5d
docs(plans): guard step 7's repair commit, and stop step one on a fai…
dsnger Sep 16, 2026
f4e0462
docs(context): record Gate-A plan pass 42 and the ninth bounded revision
dsnger Sep 16, 2026
8361f0a
docs(plans): guard the staging, pin the index, check the reviewed-hea…
dsnger Sep 16, 2026
ff708a1
docs(context): record Gate-A plan pass 43 and the tenth bounded revision
dsnger Sep 16, 2026
4752a35
docs(plans): guard every staging, and stop on a failed pin, extractio…
dsnger Sep 16, 2026
cdb6a23
docs(context): record Gate-A plan pass 44 and the eleventh bounded re…
dsnger Sep 16, 2026
fc12f25
docs(plans): stop reading failed operations as valid results
dsnger Sep 16, 2026
f9bd330
docs(plans): Resume checks ba15e83 against the base; Task 10 shows it…
dsnger Sep 16, 2026
221819c
docs(plans): step two reads the committed findings, not the worktree …
dsnger Sep 16, 2026
c2e4932
docs(plans): read the findings by object id; guard 8b's pin removal
dsnger Sep 16, 2026
16f8167
docs(context): record Gate-A plan passes 46 and 47
dsnger Sep 16, 2026
fe6bd6d
docs(context): stop cycle om0bdd7udh at pass 47, decided through a gate
dsnger Sep 17, 2026
1ba45be
docs(plans): resolve a commit once and use that id; wire the marker i…
dsnger Sep 17, 2026
5fb3b94
docs(context): record pass 48 and write the handoff for a fresh session
dsnger Sep 17, 2026
266ecf5
docs(plans): close the Gate-A plan cycle; pass 56 returned NO FINDINGS
dsnger Sep 26, 2026
47e2d94
Merge main (0.12.0, claude-init) into loop-rule-consolidation
dsnger Sep 26, 2026
d26de4b
docs: record parked sparring-side work (dark-factory vision, todos, s…
dsnger Sep 26, 2026
52a7aed
Install the §5 closure ordering and replace what it falsifies (dev-wo…
dsnger Sep 26, 2026
bf4d2cf
docs: describe the hook's new output and the closure ordering in the …
dsnger Sep 26, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
# Gate A — plan — CLOSURE RECORD

**Cycle:** a supersession convention for the hardening ledger.
**Plan:** `docs/superpowers/plans/2026-08-12-hardening-ledger-supersession.md`
**Spec:** `docs/superpowers/specs/2026-08-05-hardening-ledger-supersession-design.md` (its own Gate A
closed at pass 23 — `gate-a-spec-CLOSURE.md`).
**Branch:** `ledger-supersession`. **Closed 2026-08-12 on plan pass 7.**

**Gate A (plan) is CLOSED.** `superpowers:executing-plans` is open — sequential, mirror edits in the
same commit. Passes 1–7 applied in full; nothing is held.

Reviewer for all seven passes: `mcp-codex-dev@1.0.1`, `codex-cli 0.144.5`, model `gpt-5.6-sol`.
Every pass satisfied the file-first protocol: terminator exact, count matching, no non-finding body
lines. No pass was INCOMPLETE; the recovery budget was never spent.

## Why it closed here

Pass 7 returned **two findings, both Minor, zero Blocker and zero Major**. §5's loop is a
Blocker/Major loop — Minor and Nit are collected, never iterated — so a pass with none is its exit
condition, and both Minors were applied rather than collected because each was a one-line
cross-reference fix.

## Trend

| Pass | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
|---|---|---|---|---|---|---|---|
| Findings | 18 | 11 | 9 | 8 | 6 | 2 | 2 |
| Blocker | 2 | 1 | 4 | 3 | 1 | – | – |
| Major | 12 | 8 | 2 | 4 | 3 | 2 | – |
| Minor | 4 | 2 | 3 | 1 | 2 | – | 2 |

Monotone in the count from pass 2. The Blocker spike at pass 3 was not a regression: those four had
been latent since pass 1 and surfaced only once the surrounding defects cleared. Both severity
columns reach zero together.

## Two cuts applied before pass 1, by the sweep

- **428 lines of shell** across 31 fences, against spec §6's own "the executable form is written at
execution time, carried in the plan with one label per check" → cut to labels, properties and
oracles. Zero lines of shell remain.
- **Check 1's candidates were never bounded** to the label-to-`Columns:` interval, contradicting
§6's own 1d oracle — which is also §8 held item 4's trace.

## What the passes actually caught

**Two Blockers about the Gate-B mechanics** (pass 1): the consolidation reset to *the parent of the
first WIP* and then reviewed an empty range, with the closing `--amend` set to rewrite `BASE`
itself; and a Gate-B fix was to be "re-reviewed" without being amended into the WIP commit, so
`mcp__codex__review` would have re-read the **stale** committed range and reported a clean pass on
code it never saw.

**Two Blockers where the validation violated the convention it validates** (pass 3): `C1b`'s
counter-check mutated the real 2026-07-20 row and `C3`'s moved the real block and added and removed
a complete entry — operations §2.1 and §2.2 forbid the moment the text exists, committed or not, in
the very file the convention is being added to. Every such mutation now runs on a scratch copy, with
the boundary stated: *prose* mutations are covered by neither rule and stay in place.

**Two staging Blockers** (passes 2 and 4): `git add -A` would have swept the untracked
`docs/research/` tree and the executor's fixtures into a commit or an amend; and `git reset --soft`
cannot be repaired by adding paths, because an explicit `add` does not *unstage* an extra one — so
the equality assertion would have halted execution with no route forward. Now `--mixed`, five named
paths, and an asserted cached set.

**One Blocker per pass, 3 through 5, of one shape: a fix that landed in one site and not in its
mirror.** §8's held-not-fixed intro still said Gate B reviews the checks after §6 had been corrected
to say the opposite; the plan promised the reviewer a paste of the check source that
`additionalContext` did not carry; `BASE` contained the plan while §8 claimed the plan was inside the
reviewed range. Naming that failure mode in the pass-5 and pass-6 prompts is what drove it to zero.

## Settled decisions

| Decision | Settled at |
|---|---|
| **The plan carries labels, properties and oracles; no executable form** | pre-pass sweep |
| **Eight labels** — `C1a`–`C1d`, `C1f`, `C2a`, `C2b`, `C3`; **spec 1e is not implemented**, recorded in §8 | pass 1 |
| **Gate B compares the implementation range only** — neither the plan nor the checks are inside it; both reach the reviewer as context | passes 3–5 |
| **Spec §6 governs, except on the four §8 held-not-fixed items**, where the plan's remedies are authoritative | pass 1 |
| **No counter-check may mutate a row or a complete entry in the real ledger**; prose mutations may stay in place | pass 3 |
| **Never a pathspec broader than the step's file list**, with the staged set asserted before every commit and amend | passes 2, 4 |
| **The evidence entry is one artifact**, composed before the first Gate-B call, carrying the story path inside it | passes 4, 6 |
| **One baseline, one advertised mutation per fixture**; seventeen rows with expected outcomes, PASS rows as well as FAIL | passes 2, 6 |
| **Five labels fail on the untouched tree** — `C1a`, `C1d`, `C2a`, `C2b`, `C3`; `C1b` and `C1c` are protective | pass 1 |

## The four §8 held-not-fixed items, traced

1. **row-date equality** → `C1d`.4 plus the `entry-wrong-rowdate` fixture — executable.
2. **the pre-narrowing "prose-only" claim** → the Global Constraint stating §2.2 governs — wording,
which is all this one admits.
3. **plural scope** → `C1d`.1 plus `entry-good`'s second inert entry — executable, as of pass 2.
4. **the format-example guard** → `C3` plus Task 5's below-the-table counter-check — executable. Not
`C1d`.2, which *ignores* a line outside the interval rather than detecting one; that
mis-attribution was itself a pass-4 finding.

## Spec edits made during the plan cycle

Five, each from a plan-pass finding: §6's "reviewed by Gate B against the real diff" corrected to
*supplied to the reviewer alongside* it; §8's held-not-fixed intro brought into line; a new §8
residual recording that the checks are never fingerprinted and that `battery+check` evidence is
produced by unfingerprinted code; the §8 record that check 1e is not implemented; and the §6 anchor
oracle's false "two begin with `-`" corrected to one.

## Where everything lives

- **Uncommitted at closure:** the spec, the story and this plan. Task 1 of the plan commits all
three and pins `BASE`.
- **On disk only, gitignored:** `.context/codex-reviews/` — seven plan pass files, their
dispositions, this record, and the spec cycle's twenty-three. `.gitignore:13` ignores `.context/*`;
a push does not back these up.
69 changes: 69 additions & 0 deletions .context/codex-reviews/gate-a-plan-CLOSURE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
# Gate A — plan — **CLOSED on dispositions, with four post-pass fixes**

Closed 2026-08-16 by Daniel's decision, after pass 6.

| Pass | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| Findings | 18 | 20 | 17 | 15 | 9 | 9 |
| Blockers | 1 | 0 | 1 | 1 | 1 | 1 |

**88 findings, none dismissed.** Six passes; the floor was met at pass 3 and the loop continued
because no pass was clean.

## Why this closes on dispositions rather than a clean pass

**The checker's verification channel is execution, not review.** Every defect check 4c ever
had was found by running it, and none by reading it:

| Defect | Found by |
|---|---|
| Fence-mode parser returned `MULTIEND` on the real file — the check could never pass | running the `awk` against `workflow-init.md` |
| `checklist parser failure fires` had stopped testing 4b (its grep matched 4c's diagnostic too) | the mutation run — 21 flips against a recorded 22 |
| Whole-file counting silently dropped the placement guarantee | planting the line in the command file's prose and watching the battery stay green |
| Placement failed open when its terminator moved | renaming `### 2.2` and planting a line in the widened gap |

Four review passes read the first as prose without finding it. The last two were found in
minutes by executing the thing.

**So the remaining assurance comes from the tools and from Gate B, not from a seventh pass.**
The scripts are in the reviewed range: `baseSha` = `c0a6ed2`, and the WIP snapshot carries
`scripts/check-invariants.{sh,test.sh}` along with the spec and this plan. Gate B reads them
**as code**, which is the review they should have had all along.

## The four post-pass fixes

1. **Terminator validation.** The placement range's end must be `### 2.2`; anything else fails
loudly, naming what it found. Three fixtures, including the verified exploit — rename the
terminator, plant the line in the widened gap. Confirmed rejected.
2. **Mutation re-measured.** 4c flips **19** (18 rejects + the parser case), no accept case
moved. It read 13 before the placement fixtures and 16 before the terminator ones; each
superseded number was replaced by re-running, never extrapolated. The block now says so.
3. **Task 0 deleted.** It committed the spec, plan and scripts immediately before the WIP —
making that commit the WIP *parent*, which `baseSha..HEAD` excludes, so Gate B would have
excluded exactly what it existed to include. It was also a non-WIP commit of executable
code with a red battery and no Gate-B loop. The one-line fix it should have been: the WIP
snapshot carries those four files, `baseSha` = `c0a6ed2`.
4. **Self-review and inventory rewritten from the code as built** — `severity_rule_scan <file>`
returning four integers, not the withdrawn `severity_rule_count(file, mode)` sentinel API;
24 `sev_case` cases, not 15. And Task 4 Step 4 now follows §6's settled **TRIGGER FIRED**
rather than reopening it.

## State at closure

- **148 assertions** green under `sh` and `dash` (123 before), shellcheck clean on both scripts.
- **The counterfactual is observed, not asserted:** with 4c present and the canonical line not
yet in either prompt copy, `sh scripts/check-invariants.sh` exits 1 naming only 4c on both
files. The battery is **red by design** until Task 1's prose edits land.
- Uncommitted: the twice-amended spec, this plan, both scripts. `c0a6ed2` is the only commit.

## What Gate A did not settle

The plan's prose has been the slow part, not the design: passes 5 and 6 were dominated by
descriptions going stale as the code changed under them. Gate B reviews the code and the
shipped prompt text; it does **not** re-review this plan. A reader following the plan should
treat the built scripts as authoritative where the two disagree.

## Next

Execution: test-first, battery green before the Gate-B loop, §5 cited rather than restated,
evidence per `battery+check` with the observed counterfactual.
Loading