T9: story §10 + retrospective §7 for P37 close, PA3 migration, P38; timeline regenerated

This commit is contained in:
Drew T
2026-09-30 19:29:23 -06:00
parent 6745f68671
commit 3752a7cea5
7 changed files with 250 additions and 71 deletions
+39 -4
View File
@@ -152,10 +152,12 @@ hand-offs to be replayed; and keep the game's bytes out of the repository from t
binaries, the 363,214 functions, the 4,000 commits — follows from those, at a cost that is mostly the diagnosis of
one's own instruments.
## 7. After 100 % — what the readability generation has taught so far (Gen3, Phases 35–37; advanced at the end of every session)
## 7. After 100 % — what the readability generation has taught so far (Gen3, Phases 35–38; advanced by every phase's closing work, R121)
*From `PhaseEnd_Phase35.md` and `PhaseEnd_Phase36.md` (their "what we believed, what failed, what we would do sooner" sections) and
decision log "P35", "P36 S99/S101/S104/S105", "P37 S106". Same four questions as §1–§4, for the work that began when the bytes were done.*
*From `PhaseEnd_Phase35.md`, `PhaseEnd_Phase36.md` and `PhaseEnd_Phase37.md` (their "what we believed, what failed, what we would do
sooner" sections), decision log "P35", "P36 S99/S101/S104/S105", "P37 S106"; for the migration and Phase 38, the Phase 38 plan's change
lines, task summaries and logs, and git. Same four questions as §1–§4, for the work that began when the bytes were done. Where the
record is thin it says so; inferences are marked.*
**What we believed, and what was true.** (P35) That sotn writes duplicate functions explicitly, so ~12,000 duplicate copies were the normal
end state — read from its tree, sotn shares stage code once by an include; the belief rested on one remembered parenthetical (→ R106).
@@ -170,6 +172,13 @@ same tree said the opposite, and a 165-body probe measured it: 91 % neutral, the
could carry the mapped parameter types "in one pass" — a parameter cannot be typed while its body still adds offsets to it (pointer
arithmetic scales), so widths and arity come first and the typed signature is a per-callee unit after the sites are members. That a new base
symbol wanted a linker fragment — the binary's splat symbol file is the one curated source (R15) and already feeds the link.
(P37 close) That the lying-declaration count measured the work — it went 13,832 → 8,830 → 2,367 → 2,171 → 1,796 through instrument
repairs as much as rewrites. (Migration) That moving to a new working method was a harness change — the product's own tools read four of
the documents it retired, and 36 links pointed at them. (P38) That the milestone's counts were reachable as written — the census defined
a zero duplicate count as one name per layout (293 opaque eight-byte structs would have become one), a zero outside-canon count as moving
1,774 function-local stack frames, and a zero dead count as deleting 114 of 134 names that live types use as members. That equal layout
hashes meant one type — attributes, member-type twins and same-name members at other offsets all break it. That classes with matching
names would fold without respelling members — true only where the names were meaningful, not placeholders.
**What failed, and why it looked right.** A session died at 91 % context with 35 minutes of state only in its transcript, after refreshing
its checkpoint five times — two bank commits inside a task had no log line (→ R101). A tool's restore path was `git checkout`, which wiped
@@ -184,12 +193,33 @@ in `build/`, and the snapshot refresh copied it in; the fix is a refresh that re
forked from inside a worker thread deadlocked a batch at 0 % CPU with no message. A selftest's inflight probe used the live path and deleted
a real batch's restore snapshot. And the first audit of the legacy type header read 1,013 violations, 987 of them the audit's own — it paired
a trailing comment with the next field.
(P37 close) A judge stopped with `kill` and restored eight seconds later consumed its own snapshot and left six files with no restore —
it looked stopped; it was finishing its in-flight units. (Migration) The new launcher's PhaseEnd sort crashed on the id `3_5`, filed with
an underscore beside `33.5` and `37.5`: the migration copied the ids without normalising them, and the sort met a number and a string
only when a plan was approved. A bare `.run/` line in the new ignore file overrode the older re-includes, so per-phase evidence under
`.run/` could from then on be committed only by force. And the duty to advance story §10 and this section at every session end lived in
the old method's memory and checkpoint routine, which the migration did not carry; neither document moved between 09-12 and 09-30, and
R121 restored the duty on 09-30. (P38) The phase gate asked for counts its own census defined as impossible, found only at T5, after
the work was planned; it looked right because T2's known-true case passed — the gate failed on the starting tree with exactly the
baseline counts — but that case proved the instrument reads, not that the target is reachable. The census counted a struct's tag and its
typedef as two names, and T5 split nine pairs to satisfy the instrument before T5.1 fixed the instrument. The layout hash ignored
`packed`/`aligned`, so two definitions looked like one type; the byte gate proved packed is not natural twice, 142 and 148 of 218
binaries red, before the hash learned the attributes. Eighteen "conflicting types" rows outlived their fix because the engine writes no
row for a unit with nothing left to do, so the census over-counted from a stale ledger. The reasoning behind the gate-reading decision
was spoken, not written: the plan holds one change line and the discussion record opened that day is an empty template.
**What it cost.** P35: three sessions (one a recovery) and ~2.5 h of gates; no model tokens beyond the coordinator and three gate-1 agents.
P36: nine sessions, 575 commits, ~200 agent draws, roughly 15–20 M agent tokens — the mechanical rungs took 37 % of the sites for ~20
CPU-hours and no tokens, the search another 6 % for ~5 CPU-hours, the agents the rest, at 1 close per agent rising to 4–7 as the TU batch and
the method file matured. P37 so far: two sessions; four reconnaissance agents (~1 M tokens), a fleet census that runs in 3.5 minutes, and an
engine of ~2,300 new lines built in one session with no agents — three clean fleet runs and two byte-gated batches on the way.
P37 in all: three sessions and 115 commits; the kill/restore race was its one real incident. The migration: one commit, then a day of
repairs inside the next phase's first task. P38: planned, worked and gated in about a day and a half (09-29 → 09-30); T5 stopped once on
the gate question and was reopened as T5.1, which took two expert attempts and ten coder runs (one red and reverted); every batch passed
the 218-binary gate before its commit. Start to end: struct definitions 7,255 → 1,650; duplicate classes 206 → 53, all listed twins;
file-scope definitions in `.c` files 4,085 → 0; variant camps 40 → 0; dead canonical names 141 → 0 (3 kept with cause); padding names
26 → 0; hidden-type declarations ~1,106 → 0; lying declarations 1,796 / 76 callees → 229 / 24 (the census's `decls.lying`, printed by the
gate as `types_floor_lying` — not the 98,648-based Phase 37 series, nor the plan's 1,537 "types floor"); levers 3,730, flat.
**What we would do sooner.** Read the target project's TREE before setting a policy on its precedent. Make every commit that advances a task
carry its log line, and checkpoint before any long wait past ~85 % context. Price a residue by distinct SHAPES, never by bodies. Put a
@@ -205,4 +235,9 @@ that skips a sibling's includes, a name where an identity was needed, an anchore
snapshot that stamps an empty build), and every repair moved the count by thousands while no rung got smarter — so a "stalling" number is
first a question about the instrument, then about the population, and only then about the method; and the stop rule for a mechanical
campaign is the remainder bucketed by its recorded cause, never the yield of the last two batches. In one line, the
generation's rule so far: *the byte gate is still the only judge, and after 100 % it judges spelling.*
generation's rule so far: *the byte gate is still the only judge, and after 100 % it judges spelling.* From the migration and
Phase 38: in the migration itself, grep the tools and the build for every path it retires, and normalise every id it inherits; keep a
published narrative's duty in a rule a task executes, not in a session habit. Test each milestone count against its instrument on the
planning tree before approval — both directions: the starting tree fails it, and the target the plan describes can pass it — and write
the gate's reading into the plan rather than discovering it at the fifth task. Put every attribute the compiler reads into a layout
hash before the first fold, and let the byte gate, not a hash, say two types are one.
+2 -1
View File
@@ -99,5 +99,6 @@
| 2026-09-10 | 146 | | 218 | 100.0% | 100.0% | 100.0% | 100.0% | 0 | — | 4,603 | 414,148 |
| 2026-09-11 | 371 | P36 (v2.2.0) | 218 | 100.0% | 100.0% | 100.0% | 100.0% | 0 | — | 4,010 | 503,016 |
| 2026-09-12 | 111 | | 218 | 100.0% | 100.0% | 100.0% | 100.0% | 0 | 789 / 2091 | 3,730 | 502,985 |
| 2026-09-29 | 40 | P37 (v2.3.0) | 218 | 100.0% | 100.0% | 100.0% | 100.0% | 0 | 789 / 2091 | 3,730 | — |
78 dated rows · phase ticks from the 38 PhaseEnds · the chart: `docs/story-timeline.svg`.
79 dated rows · phase ticks from the 38 PhaseEnds · the chart: `docs/story-timeline.svg`.
+65 -62
View File
@@ -6,56 +6,57 @@
<line x1="60" y1="195.0" x2="980" y2="195.0" stroke="#ddd"/><text x="54" y="199.0" text-anchor="end" font-size="11" fill="#555">50%</text>
<line x1="60" y1="112.5" x2="980" y2="112.5" stroke="#ddd"/><text x="54" y="116.5" text-anchor="end" font-size="11" fill="#555">75%</text>
<line x1="60" y1="30.0" x2="980" y2="30.0" stroke="#ddd"/><text x="54" y="34.0" text-anchor="end" font-size="11" fill="#555">100%</text>
<line x1="233.8" y1="30" x2="233.8" y2="360" stroke="#eee"/><text x="233.8" y="376" text-anchor="middle" font-size="11" fill="#555">Jul 2026</text>
<line x1="550.7" y1="30" x2="550.7" y2="360" stroke="#eee"/><text x="550.7" y="376" text-anchor="middle" font-size="11" fill="#555">Aug 2026</text>
<line x1="867.6" y1="30" x2="867.6" y2="360" stroke="#eee"/><text x="867.6" y="376" text-anchor="middle" font-size="11" fill="#555">Sep 2026</text>
<line x1="206.2" y1="30" x2="206.2" y2="360" stroke="#eee"/><text x="206.2" y="376" text-anchor="middle" font-size="11" fill="#555">Jul 2026</text>
<line x1="472.7" y1="30" x2="472.7" y2="360" stroke="#eee"/><text x="472.7" y="376" text-anchor="middle" font-size="11" fill="#555">Aug 2026</text>
<line x1="739.3" y1="30" x2="739.3" y2="360" stroke="#eee"/><text x="739.3" y="376" text-anchor="middle" font-size="11" fill="#555">Sep 2026</text>
<line x1="60.0" y1="360" x2="60.0" y2="352" stroke="#888"/>
<line x1="60.0" y1="360" x2="60.0" y2="352" stroke="#888"/>
<line x1="60.0" y1="360" x2="60.0" y2="352" stroke="#888"/>
<line x1="60.0" y1="360" x2="60.0" y2="352" stroke="#888"/>
<line x1="60.0" y1="360" x2="60.0" y2="352" stroke="#888"/>
<line x1="70.2" y1="360" x2="70.2" y2="352" stroke="#888"/>
<line x1="70.2" y1="360" x2="70.2" y2="352" stroke="#888"/>
<text x="70.2" y="390" text-anchor="middle" font-size="10" fill="#333">P7</text>
<line x1="70.2" y1="360" x2="70.2" y2="352" stroke="#888"/>
<line x1="70.2" y1="360" x2="70.2" y2="352" stroke="#888"/>
<line x1="80.4" y1="360" x2="80.4" y2="352" stroke="#888"/>
<line x1="80.4" y1="360" x2="80.4" y2="352" stroke="#888"/>
<line x1="80.4" y1="360" x2="80.4" y2="352" stroke="#888"/>
<line x1="100.9" y1="360" x2="100.9" y2="352" stroke="#888"/>
<text x="100.9" y="390" text-anchor="middle" font-size="10" fill="#333">P15</text>
<line x1="111.1" y1="360" x2="111.1" y2="352" stroke="#888"/>
<line x1="121.3" y1="360" x2="121.3" y2="352" stroke="#888"/>
<line x1="121.3" y1="360" x2="121.3" y2="352" stroke="#888"/>
<line x1="121.3" y1="360" x2="121.3" y2="352" stroke="#888"/>
<line x1="131.6" y1="360" x2="131.6" y2="352" stroke="#888"/>
<line x1="182.7" y1="360" x2="182.7" y2="352" stroke="#888"/>
<line x1="213.3" y1="360" x2="213.3" y2="352" stroke="#888"/>
<line x1="244.0" y1="360" x2="244.0" y2="352" stroke="#888"/>
<text x="244.0" y="390" text-anchor="middle" font-size="10" fill="#333">P23</text>
<line x1="305.3" y1="360" x2="305.3" y2="352" stroke="#888"/>
<line x1="336.0" y1="360" x2="336.0" y2="352" stroke="#888"/>
<line x1="376.9" y1="360" x2="376.9" y2="352" stroke="#888"/>
<text x="376.9" y="390" text-anchor="middle" font-size="10" fill="#333">P26</text>
<line x1="376.9" y1="360" x2="376.9" y2="352" stroke="#888"/>
<line x1="387.1" y1="360" x2="387.1" y2="352" stroke="#888"/>
<line x1="530.2" y1="360" x2="530.2" y2="352" stroke="#888"/>
<text x="530.2" y="390" text-anchor="middle" font-size="10" fill="#333">P29</text>
<line x1="683.6" y1="360" x2="683.6" y2="352" stroke="#888"/>
<text x="683.6" y="390" text-anchor="middle" font-size="10" fill="#333">P30</text>
<line x1="908.4" y1="360" x2="908.4" y2="352" stroke="#888"/>
<text x="908.4" y="390" text-anchor="middle" font-size="10" fill="#333">P31</text>
<line x1="918.7" y1="360" x2="918.7" y2="352" stroke="#888"/>
<text x="918.7" y="390" text-anchor="middle" font-size="10" fill="#333">P32</text>
<line x1="928.9" y1="360" x2="928.9" y2="352" stroke="#888"/>
<line x1="939.1" y1="360" x2="939.1" y2="352" stroke="#888"/>
<line x1="939.1" y1="360" x2="939.1" y2="352" stroke="#888"/>
<line x1="939.1" y1="360" x2="939.1" y2="352" stroke="#888"/>
<line x1="969.8" y1="360" x2="969.8" y2="352" stroke="#888"/>
<line x1="448.4" y1="30" x2="448.4" y2="360" stroke="#c33" stroke-dasharray="4,3"/><text x="452.4" y="44" font-size="11" fill="#c33">2026-07-22: main enters the denominators</text>
<polyline fill="none" stroke="#1f77b4" stroke-width="2" points="336.0,169.4 346.2,152.3 356.4,149.5 366.7,133.5 376.9,135.5 387.1,125.8 397.3,122.1 407.6,111.7 417.8,108.2 428.0,102.6 438.2,102.5 448.4,100.5 458.7,98.1 468.9,96.3 479.1,94.1 489.3,90.4 499.6,81.5 509.8,74.4 520.0,72.3 530.2,68.9 540.4,65.8 550.7,55.0 571.1,50.8 581.3,48.1 591.6,46.5 601.8,49.7 612.0,50.5 642.7,48.7 652.9,47.0 663.1,46.0 673.3,45.9 683.6,45.5 693.8,44.8 704.0,44.6 714.2,43.6 724.4,42.9 775.6,42.8 796.0,38.6 806.2,34.9 816.4,34.2 836.9,33.6 847.1,33.3 857.3,32.1 867.6,31.6 877.8,31.0 888.0,30.9 898.2,30.1 908.4,30.0 918.7,30.0 928.9,30.0 939.1,30.0 949.3,30.0 959.6,30.0 969.8,30.0 980.0,30.0"/><text x="70" y="352" font-size="12" fill="#1f77b4">instruction-weighted (all binaries)</text>
<polyline fill="none" stroke="#2ca02c" stroke-width="2" points="336.0,263.2 346.2,230.9 356.4,225.5 366.7,197.6 376.9,196.8 387.1,184.2 397.3,181.7 407.6,159.9 417.8,152.9 428.0,140.5 438.2,140.4 448.4,136.8 458.7,136.7 468.9,136.7 479.1,134.8 489.3,131.5 499.6,114.5 509.8,106.2 520.0,103.4 530.2,100.4 540.4,94.4 550.7,77.8 571.1,69.5 581.3,65.5 591.6,64.8 601.8,70.9 612.0,72.4 642.7,69.1 652.9,65.6 663.1,63.7 673.3,63.3 683.6,62.7 693.8,61.3 704.0,60.8 714.2,58.5 724.4,57.0 775.6,56.9 796.0,47.8 806.2,40.3 816.4,38.8 836.9,37.9 847.1,37.4 857.3,34.8 867.6,33.8 877.8,32.2 888.0,32.0 898.2,30.3 908.4,30.1 918.7,30.0 928.9,30.0 939.1,30.0 949.3,30.0 959.6,30.0 969.8,30.0 980.0,30.0"/><text x="70" y="338" font-size="12" fill="#2ca02c">distinct code (each body once)</text>
<polyline fill="none" stroke="#999" stroke-width="2" points="80.4,276.3 90.7,190.3 100.9,180.2 111.1,176.8 121.3,167.4 131.6,163.1 141.8,158.2 152.0,154.4 162.2,151.7 172.4,151.5 182.7,149.9 213.3,149.9 223.6,148.1 233.8,146.8 244.0,146.0 254.2,143.4 264.4,143.0 295.1,142.1 305.3,122.3 315.6,121.4 325.8,114.5 336.0,113.9 346.2,88.6 356.4,88.1 366.7,81.9 376.9,87.3 387.1,75.2 397.3,74.3 407.6,72.8 417.8,71.4 428.0,69.9 438.2,69.8 448.4,68.9 458.7,67.4 468.9,66.4 479.1,65.7 489.3,64.6 499.6,62.5 509.8,59.3 520.0,57.3 530.2,54.5 540.4,52.3 550.7,45.1 571.1,42.9 581.3,41.5 591.6,41.1 601.8,43.3 612.0,44.2 642.7,42.5 652.9,41.8 663.1,41.5 673.3,41.3 683.6,40.9 693.8,40.4 704.0,40.2 714.2,39.8 724.4,39.5 775.6,39.5 796.0,35.3 806.2,32.1 816.4,31.6 836.9,31.2 847.1,30.9 857.3,30.4 867.6,30.2 877.8,30.1 888.0,30.0 898.2,30.0 908.4,30.0 918.7,30.0 928.9,30.0 939.1,30.0 949.3,30.0 959.6,30.0 969.8,30.0 980.0,30.0"/><text x="70" y="324" font-size="12" fill="#999">function count</text>
<line x1="68.6" y1="360" x2="68.6" y2="352" stroke="#888"/>
<line x1="68.6" y1="360" x2="68.6" y2="352" stroke="#888"/>
<text x="68.6" y="390" text-anchor="middle" font-size="10" fill="#333">P7</text>
<line x1="68.6" y1="360" x2="68.6" y2="352" stroke="#888"/>
<line x1="68.6" y1="360" x2="68.6" y2="352" stroke="#888"/>
<line x1="77.2" y1="360" x2="77.2" y2="352" stroke="#888"/>
<line x1="77.2" y1="360" x2="77.2" y2="352" stroke="#888"/>
<line x1="77.2" y1="360" x2="77.2" y2="352" stroke="#888"/>
<line x1="94.4" y1="360" x2="94.4" y2="352" stroke="#888"/>
<text x="94.4" y="390" text-anchor="middle" font-size="10" fill="#333">P15</text>
<line x1="103.0" y1="360" x2="103.0" y2="352" stroke="#888"/>
<line x1="111.6" y1="360" x2="111.6" y2="352" stroke="#888"/>
<line x1="111.6" y1="360" x2="111.6" y2="352" stroke="#888"/>
<line x1="111.6" y1="360" x2="111.6" y2="352" stroke="#888"/>
<line x1="120.2" y1="360" x2="120.2" y2="352" stroke="#888"/>
<line x1="163.2" y1="360" x2="163.2" y2="352" stroke="#888"/>
<line x1="189.0" y1="360" x2="189.0" y2="352" stroke="#888"/>
<line x1="214.8" y1="360" x2="214.8" y2="352" stroke="#888"/>
<text x="214.8" y="390" text-anchor="middle" font-size="10" fill="#333">P23</text>
<line x1="266.4" y1="360" x2="266.4" y2="352" stroke="#888"/>
<line x1="292.1" y1="360" x2="292.1" y2="352" stroke="#888"/>
<line x1="326.5" y1="360" x2="326.5" y2="352" stroke="#888"/>
<text x="326.5" y="390" text-anchor="middle" font-size="10" fill="#333">P26</text>
<line x1="326.5" y1="360" x2="326.5" y2="352" stroke="#888"/>
<line x1="335.1" y1="360" x2="335.1" y2="352" stroke="#888"/>
<line x1="455.5" y1="360" x2="455.5" y2="352" stroke="#888"/>
<text x="455.5" y="390" text-anchor="middle" font-size="10" fill="#333">P29</text>
<line x1="584.5" y1="360" x2="584.5" y2="352" stroke="#888"/>
<text x="584.5" y="390" text-anchor="middle" font-size="10" fill="#333">P30</text>
<line x1="773.6" y1="360" x2="773.6" y2="352" stroke="#888"/>
<text x="773.6" y="390" text-anchor="middle" font-size="10" fill="#333">P31</text>
<line x1="782.2" y1="360" x2="782.2" y2="352" stroke="#888"/>
<text x="782.2" y="390" text-anchor="middle" font-size="10" fill="#333">P32</text>
<line x1="790.8" y1="360" x2="790.8" y2="352" stroke="#888"/>
<line x1="799.4" y1="360" x2="799.4" y2="352" stroke="#888"/>
<line x1="799.4" y1="360" x2="799.4" y2="352" stroke="#888"/>
<line x1="799.4" y1="360" x2="799.4" y2="352" stroke="#888"/>
<line x1="825.2" y1="360" x2="825.2" y2="352" stroke="#888"/>
<line x1="980.0" y1="360" x2="980.0" y2="352" stroke="#888"/>
<line x1="386.7" y1="30" x2="386.7" y2="360" stroke="#c33" stroke-dasharray="4,3"/><text x="390.7" y="44" font-size="11" fill="#c33">2026-07-22: main enters the denominators</text>
<polyline fill="none" stroke="#1f77b4" stroke-width="2" points="292.1,169.4 300.7,152.3 309.3,149.5 317.9,133.5 326.5,135.5 335.1,125.8 343.7,122.1 352.3,111.7 360.9,108.2 369.5,102.6 378.1,102.5 386.7,100.5 395.3,98.1 403.9,96.3 412.5,94.1 421.1,90.4 429.7,81.5 438.3,74.4 446.9,72.3 455.5,68.9 464.1,65.8 472.7,55.0 489.9,50.8 498.5,48.1 507.1,46.5 515.7,49.7 524.3,50.5 550.1,48.7 558.7,47.0 567.3,46.0 575.9,45.9 584.5,45.5 593.1,44.8 601.7,44.6 610.3,43.6 618.9,42.9 661.9,42.8 679.1,38.6 687.7,34.9 696.3,34.2 713.5,33.6 722.1,33.3 730.7,32.1 739.3,31.6 747.9,31.0 756.4,30.9 765.0,30.1 773.6,30.0 782.2,30.0 790.8,30.0 799.4,30.0 808.0,30.0 816.6,30.0 825.2,30.0 833.8,30.0 980.0,30.0"/><text x="70" y="352" font-size="12" fill="#1f77b4">instruction-weighted (all binaries)</text>
<polyline fill="none" stroke="#2ca02c" stroke-width="2" points="292.1,263.2 300.7,230.9 309.3,225.5 317.9,197.6 326.5,196.8 335.1,184.2 343.7,181.7 352.3,159.9 360.9,152.9 369.5,140.5 378.1,140.4 386.7,136.8 395.3,136.7 403.9,136.7 412.5,134.8 421.1,131.5 429.7,114.5 438.3,106.2 446.9,103.4 455.5,100.4 464.1,94.4 472.7,77.8 489.9,69.5 498.5,65.5 507.1,64.8 515.7,70.9 524.3,72.4 550.1,69.1 558.7,65.6 567.3,63.7 575.9,63.3 584.5,62.7 593.1,61.3 601.7,60.8 610.3,58.5 618.9,57.0 661.9,56.9 679.1,47.8 687.7,40.3 696.3,38.8 713.5,37.9 722.1,37.4 730.7,34.8 739.3,33.8 747.9,32.2 756.4,32.0 765.0,30.3 773.6,30.1 782.2,30.0 790.8,30.0 799.4,30.0 808.0,30.0 816.6,30.0 825.2,30.0 833.8,30.0 980.0,30.0"/><text x="70" y="338" font-size="12" fill="#2ca02c">distinct code (each body once)</text>
<polyline fill="none" stroke="#999" stroke-width="2" points="77.2,276.3 85.8,190.3 94.4,180.2 103.0,176.8 111.6,167.4 120.2,163.1 128.8,158.2 137.4,154.4 146.0,151.7 154.6,151.5 163.2,149.9 189.0,149.9 197.6,148.1 206.2,146.8 214.8,146.0 223.4,143.4 232.0,143.0 257.8,142.1 266.4,122.3 275.0,121.4 283.6,114.5 292.1,113.9 300.7,88.6 309.3,88.1 317.9,81.9 326.5,87.3 335.1,75.2 343.7,74.3 352.3,72.8 360.9,71.4 369.5,69.9 378.1,69.8 386.7,68.9 395.3,67.4 403.9,66.4 412.5,65.7 421.1,64.6 429.7,62.5 438.3,59.3 446.9,57.3 455.5,54.5 464.1,52.3 472.7,45.1 489.9,42.9 498.5,41.5 507.1,41.1 515.7,43.3 524.3,44.2 550.1,42.5 558.7,41.8 567.3,41.5 575.9,41.3 584.5,40.9 593.1,40.4 601.7,40.2 610.3,39.8 618.9,39.5 661.9,39.5 679.1,35.3 687.7,32.1 696.3,31.6 713.5,31.2 722.1,30.9 730.7,30.4 739.3,30.2 747.9,30.1 756.4,30.0 765.0,30.0 773.6,30.0 782.2,30.0 790.8,30.0 799.4,30.0 808.0,30.0 816.6,30.0 825.2,30.0 833.8,30.0 980.0,30.0"/><text x="70" y="324" font-size="12" fill="#999">function count</text>
<text x="500" y="446" text-anchor="middle" font-size="14" font-weight="bold">After 100 % — the Gen3 debts as a share of their first measurement (every lever increment; the two raw-cast instruments)</text>
<line x1="60" y1="686.0" x2="980" y2="686.0" stroke="#ddd"/><text x="54" y="690.0" text-anchor="end" font-size="11" fill="#555">0%</text>
<line x1="60" y1="630.5" x2="980" y2="630.5" stroke="#ddd"/><text x="54" y="634.5" text-anchor="end" font-size="11" fill="#555">25%</text>
@@ -63,26 +64,28 @@
<line x1="60" y1="519.5" x2="980" y2="519.5" stroke="#ddd"/><text x="54" y="523.5" text-anchor="end" font-size="11" fill="#555">75%</text>
<line x1="60" y1="464.0" x2="980" y2="464.0" stroke="#ddd"/><text x="54" y="468.0" text-anchor="end" font-size="11" fill="#555">100%</text>
<line x1="60.0" y1="464" x2="60.0" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="63.0" y="474" font-size="9" fill="#a00">the census (T1)</text>
<line x1="69.6" y1="464" x2="69.6" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="72.6" y="486" font-size="9" fill="#a00">mechanical strip — rung A/B (T4)</text>
<line x1="194.2" y1="464" x2="194.2" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="197.2" y="498" font-size="9" fill="#a00">the GTE header (T5)</text>
<line x1="213.3" y1="464" x2="213.3" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="216.3" y="510" font-size="9" fill="#a00">recipes + permuter — rungs R/D (T6)</text>
<line x1="242.1" y1="464" x2="242.1" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="245.1" y="474" font-size="9" fill="#a00">the guided search — rung G (S101)</text>
<line x1="299.6" y1="464" x2="299.6" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="302.6" y="486" font-size="9" fill="#a00">agents, one per class + the call-arity class (S102)</text>
<line x1="500.8" y1="464" x2="500.8" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="503.8" y="498" font-size="9" fill="#a00">agents, TU batches + regen (S103)</text>
<line x1="740.4" y1="464" x2="740.4" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="743.4" y="510" font-size="9" fill="#a00">agents, TU batches (S104)</text>
<line x1="845.8" y1="464" x2="845.8" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="848.8" y="474" font-size="9" fill="#a00">agents, TU batches (S105)</text>
<line x1="951.2" y1="464" x2="951.2" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="954.2" y="486" font-size="9" fill="#a00">P36</text>
<line x1="960.8" y1="464" x2="960.8" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="963.8" y="498" font-size="9" fill="#a00">P37</text>
<line x1="69.5" y1="464" x2="69.5" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="72.5" y="486" font-size="9" fill="#a00">mechanical strip — rung A/B (T4)</text>
<line x1="192.8" y1="464" x2="192.8" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="195.8" y="498" font-size="9" fill="#a00">the GTE header (T5)</text>
<line x1="211.8" y1="464" x2="211.8" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="214.8" y="510" font-size="9" fill="#a00">recipes + permuter — rungs R/D (T6)</text>
<line x1="240.2" y1="464" x2="240.2" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="243.2" y="474" font-size="9" fill="#a00">the guided search — rung G (S101)</text>
<line x1="297.1" y1="464" x2="297.1" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="300.1" y="486" font-size="9" fill="#a00">agents, one per class + the call-arity class (S102)</text>
<line x1="496.3" y1="464" x2="496.3" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="499.3" y="498" font-size="9" fill="#a00">agents, TU batches + regen (S103)</text>
<line x1="733.4" y1="464" x2="733.4" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="736.4" y="510" font-size="9" fill="#a00">agents, TU batches (S104)</text>
<line x1="837.7" y1="464" x2="837.7" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="840.7" y="474" font-size="9" fill="#a00">agents, TU batches (S105)</text>
<line x1="942.1" y1="464" x2="942.1" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="945.1" y="486" font-size="9" fill="#a00">P36</text>
<line x1="951.5" y1="464" x2="951.5" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="954.5" y="498" font-size="9" fill="#a00">P37</text>
<line x1="980.0" y1="464" x2="980.0" y2="686" stroke="#d62728" stroke-dasharray="2,3" opacity="0.6"/><text x="983.0" y="510" font-size="9" fill="#a00">other</text>
<line x1="60.0" y1="686" x2="60.0" y2="692" stroke="#888"/><text x="62.0" y="702" font-size="9" fill="#333">09-09</text>
<line x1="299.6" y1="686" x2="299.6" y2="692" stroke="#888"/><text x="301.6" y="702" font-size="9" fill="#333">09-10</text>
<line x1="788.3" y1="686" x2="788.3" y2="692" stroke="#888"/><text x="790.3" y="702" font-size="9" fill="#333">09-11</text>
<line x1="970.4" y1="686" x2="970.4" y2="692" stroke="#888"/><text x="972.4" y="702" font-size="9" fill="#333">09-12</text>
<polyline fill="none" stroke="#d62728" stroke-width="2" points="60.0,464.0 69.6,478.3 79.2,492.4 88.8,504.5 98.3,513.3 107.9,519.5 117.5,525.1 127.1,532.6 136.7,534.1 146.2,542.3 155.8,543.8 165.4,545.0 175.0,545.7 184.6,545.7 194.2,544.6 203.8,543.8 213.3,544.4 222.9,544.4 232.5,546.6 242.1,547.1 251.7,548.2 261.2,556.6 270.8,557.1 280.4,557.5 290.0,559.4 299.6,560.5 309.2,562.1 318.8,562.6 328.3,562.8 337.9,562.8 347.5,564.2 357.1,564.4 366.7,564.4 376.2,565.0 385.8,565.5 395.4,569.3 405.0,574.6 414.6,575.6 424.2,575.6 433.8,575.6 443.3,576.7 452.9,577.2 462.5,582.1 472.1,582.6 481.7,585.4 491.2,585.4 500.8,585.9 510.4,601.7 520.0,605.6 529.6,607.7 539.2,612.1 548.8,612.2 558.3,618.1 567.9,619.2 577.5,619.2 587.1,622.4 596.7,628.3 606.2,631.4 615.8,632.0 625.4,633.5 635.0,633.7 644.6,633.9 654.2,635.8 663.8,635.9 673.3,636.0 682.9,644.5 692.5,648.3 702.1,663.5 711.7,663.6 721.2,664.2 730.8,664.7 740.4,665.3 750.0,666.2 759.6,666.3 769.2,666.6 778.8,666.8 788.3,667.3 797.9,667.5 807.5,667.9 817.1,668.2 826.7,668.4 836.2,668.7 845.8,668.8 855.4,668.8 865.0,668.9 874.6,669.0 884.2,669.0 893.8,669.1 903.3,669.1 912.9,669.1 922.5,669.2 932.1,669.2 941.7,669.3 951.2,669.3 960.8,669.3 970.4,670.4 980.0,670.4"/>
<line x1="297.1" y1="686" x2="297.1" y2="692" stroke="#888"/><text x="299.1" y="702" font-size="9" fill="#333">09-10</text>
<line x1="780.8" y1="686" x2="780.8" y2="692" stroke="#888"/><text x="782.8" y="702" font-size="9" fill="#333">09-11</text>
<line x1="961.0" y1="686" x2="961.0" y2="692" stroke="#888"/><text x="963.0" y="702" font-size="9" fill="#333">09-12</text>
<line x1="980.0" y1="686" x2="980.0" y2="692" stroke="#888"/><text x="982.0" y="702" font-size="9" fill="#333">09-29</text>
<polyline fill="none" stroke="#d62728" stroke-width="2" points="60.0,464.0 69.5,478.3 79.0,492.4 88.5,504.5 97.9,513.3 107.4,519.5 116.9,525.1 126.4,532.6 135.9,534.1 145.4,542.3 154.8,543.8 164.3,545.0 173.8,545.7 183.3,545.7 192.8,544.6 202.3,543.8 211.8,544.4 221.2,544.4 230.7,546.6 240.2,547.1 249.7,548.2 259.2,556.6 268.7,557.1 278.1,557.5 287.6,559.4 297.1,560.5 306.6,562.1 316.1,562.6 325.6,562.8 335.1,562.8 344.5,564.2 354.0,564.4 363.5,564.4 373.0,565.0 382.5,565.5 392.0,569.3 401.4,574.6 410.9,575.6 420.4,575.6 429.9,575.6 439.4,576.7 448.9,577.2 458.4,582.1 467.8,582.6 477.3,585.4 486.8,585.4 496.3,585.9 505.8,601.7 515.3,605.6 524.7,607.7 534.2,612.1 543.7,612.2 553.2,618.1 562.7,619.2 572.2,619.2 581.6,622.4 591.1,628.3 600.6,631.4 610.1,632.0 619.6,633.5 629.1,633.7 638.6,633.9 648.0,635.8 657.5,635.9 667.0,636.0 676.5,644.5 686.0,648.3 695.5,663.5 704.9,663.6 714.4,664.2 723.9,664.7 733.4,665.3 742.9,666.2 752.4,666.3 761.9,666.6 771.3,666.8 780.8,667.3 790.3,667.5 799.8,667.9 809.3,668.2 818.8,668.4 828.2,668.7 837.7,668.8 847.2,668.8 856.7,668.9 866.2,669.0 875.7,669.0 885.2,669.1 894.6,669.1 904.1,669.1 913.6,669.2 923.1,669.2 932.6,669.3 942.1,669.3 951.5,669.3 961.0,670.4 970.5,670.4 980.0,670.4"/>
<text x="976.0" y="664.4" text-anchor="end" font-size="10" fill="#d62728">3,730</text>
<text x="970" y="557.2" text-anchor="end" font-size="12" fill="#d62728">register pins + asm statements (the lever series, 97 increments): 53,221 → 3,730</text>
<polyline fill="none" stroke="#9467bd" stroke-width="2" stroke-dasharray="5,4" points="778.8,464.0 960.8,465.2"/>
<text x="970" y="557.2" text-anchor="end" font-size="12" fill="#d62728">register pins + asm statements (the lever series, 98 increments): 53,221 → 3,730</text>
<polyline fill="none" stroke="#9467bd" stroke-width="2" stroke-dasharray="5,4" points="771.3,464.0 951.5,465.2"/>
<text x="970" y="526.2" text-anchor="end" font-size="12" fill="#9467bd">raw pointer-cast dereferences — the one-form regex count (until the census, 2026-09-12): 414,148 → 411,850</text>
<polyline fill="none" stroke="#9467bd" stroke-width="2" stroke-dasharray="" points="960.8,464.0 980.0,464.0 980.0,464.0 980.0,464.0"/>
<polyline fill="none" stroke="#9467bd" stroke-width="2" stroke-dasharray="" points="951.5,464.0 970.5,464.0 970.5,464.0 970.5,464.0"/>
<text x="970" y="541.7" text-anchor="end" font-size="12" fill="#9467bd">raw pointer-cast dereferences — the four-form census (2026-09-12 →; a new instrument, its own 100 %): 503,016 → 502,985</text>
<text x="980" y="726" text-anchor="end" font-size="10" fill="#777">generated by tools/timeline.py — keyed by date</text>
</svg>

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 13 KiB

+87 -4
View File
@@ -170,11 +170,13 @@ revision, old hashes in historical documents replaced by inert tokens and mapped
would have corrupted history), proven pair by pair, and force-pushed. This document, the retrospective, the wiki and the
tooling releases are the last block; the visibility flip waits for GitHub to purge the old objects.
## 10. After 100 %: making the code say what it means (Gen3 — Phases 35, 36, 37, 2026-09-08 →)
## 10. After 100 %: making the code say what it means (Gen3 — Phases 35, 36, 37, 38, 2026-09-08 →)
*From `PhaseEnd_Phase35.md`, `PhaseEnd_Phase36.md`, `phase-ends/CURRENT_PHASE.md` (Phase 37), decision log "P35", "P36 S99/S101/S104/S105",
"P37 S106", `docs/levers.md`, `docs/readability.md`. This chapter is advanced at the end of every session (the owner's rule, 2026-09-12); the
numbers are the two Gen3 series'.*
*From `PhaseEnd_Phase35.md`, `PhaseEnd_Phase36.md`, `PhaseEnd_Phase37.md` and its log (`phase-ends/logs/Phase37.md`), decision log "P35",
"P36 S99/S101/S104/S105", "P37 S106", `docs/levers.md`, `docs/readability.md`; for the migration and Phase 38, the Phase 38 plan's change
lines, its task summaries (T1, T5, T5.1, T6, T7) and logs, and git. This chapter was advanced at the end of every session (the owner's rule,
2026-09-12) until the migration of 2026-09-29 dropped that duty; since 2026-09-30 it is advanced by every phase's closing work (rule R121).
The numbers are the two Gen3 series'.*
A hundred percent is a byte statement, not a code statement. The tree that rebuilt 218 binaries byte for byte was still the tree a machine had
drafted at speed: every shared engine function lived as a macro instantiated per level, tens of thousands of register pins and inline-asm
@@ -269,6 +271,87 @@ compiler from stealing an instruction into a branch's delay slot. The levers cou
hundred and thirty. One mistake of the day was mine: a restore run against a judge that had not yet finished stopping, which split a
batch's bookkeeping — erased cleanly, and the rule written down: wait for the exit.
That night the declaration layer was called at its floor and the phase's fourth task closed: about 107,000 declarations made to say
what their definitions say, 1,796 lying declarations left over 76 callees (98,648 over 1,609 at the phase's start), 5,262 call sites
counted apart as the original's own calling convention and 418 as cross-binary calls, 133 of 149 alias-defined functions back under
their names, ten of twelve parked signatures landed, and the levers at 3,730. Of the 1,796, 1,537 were judged a floor only the types
could lower: a declaration cannot name a type its file cannot see. The checkpoint said the next task — one definition per struct type —
would open in a fresh session. It did not open for seventeen days. The record says only that the phase sat at that boundary with a clean
tree; it does not say why. On 2026-09-29 the owner re-scoped Phase 37 to the work already done (its tasks T0–T4) and carried the six
unstarted tasks to the next phase word for word, so that the repository could change its working method between phases rather than in
the middle of one. Phase 37 closed as v2.3.0 with the 218-binary gate green, and no tag.
**The migration (2026-09-29, recorded as Phase 37.5).** The new method, Project Architect 3.0, replaced the long session-start reading with
a written plan per phase, tasks that each run in a fresh context and end in a log and a short summary, and a one-page card of standing
facts. One commit of 777 files installed it and moved the old operating documents — the setup reference, the 3.5-megabyte matching
cookbook and its index, the effort map — into `docs/retired/`, where nothing loads them. Four things broke, and each was found only when
something used it. The project's own tools still read the retired documents: the health chain's tool census took its tool table from the
old setup file, a link checker and the wiki renderer pointed at it, and 36 links in the wiki, the README and the how-to pages led nowhere;
the next phase's first task found four red health items with this one cause and repaired them as one defect. The new launcher, which
sorts the closing reports by phase number, crashed: the half-phase from the first week is filed as `3_5`, with an underscore, beside
`33.5` and `37.5` with dots, and the sort ended up comparing a number with a string. The migration had normalised none of the ids; the
router could not build its starting state after the next plan was approved, and the fix — a sort that splits every id the same way — was
made outside the task loop and reported upstream. The migration's ignore file gained a bare `.run/` line, which overrides the older lines
that let chosen per-phase evidence under `.run/` be committed; from then on a census snapshot could be committed only by forcing it
(the next phase met this as a commit helper's refusal). And the duty to advance this chapter and the retrospective at the end of every
session had lived in the old method's memory and checkpoint routine; the migration carried it nowhere, and the next phase ran to its
milestone with neither document touched. It came back the day after as rule R121, which hands it to every phase's closing work; this
part of the chapter was written under it.
**Phase 38 (2026-09-29 → 09-30) took up the carried task: one canonical definition per struct type.** Its first task repaired the
migration (above), proved the gate green, re-took the byte oracle's baseline and measured the ground: 7,255 struct definitions — 1,179
in the canonical header, 4,085 at file scope in `.c` files, 1,904 inside functions, 87 in other headers — in 206 classes of duplicates
over 2,823 names, 40 "variant camps" (one name, several layouts), 141 canonical names nothing used, 26 legacy padding names, and the
1,796 lying declarations. The second built the instrument the milestone would be read by, a `--check-structs` mode of the census, and
its known-true case was that the starting tree fails with exactly those counts; it did, adding 1,106 declarations the engine had kept
because a type was not visible. The third and fourth designed the three largest types — the entity, a 0x10C-byte block and the player
block — into a new canonical header and folded their local copies onto it, every batch judged on the bytes.
The fifth task, the long tail, did the mechanical part in one night — 1,308 types lifted into the canonical header, the padding names to
0, the 40 variant camps to 0 by renaming each divergent local copy, 314 dead definitions deleted — and then stopped and asked, because
three of the gate's counts could not reach zero without breaking the plan's own words. The duplicate count included every opaque layout
twin: two placeholder-named structs with the same shape and no evidence that they are the same thing. Reaching 0 would have meant
folding, for one example, 293 opaque eight-byte structs into one — "one name per layout", which the project's naming law forbids — while
the same task said such twins stay apart and are listed. The outside-the-canonical-files count included 1,774 structs declared together
with a variable inside one function (a stack frame, local by nature), and the lifting tool could reach only one kind of file scope. The
dead-name count ignored uses inside the canonical header itself, so 114 of its 134 "dead" names were members of live types; deleting one
single-letter type had broken a level. The census defined the milestone's zero as impossible, and the plan had asked for it anyway: the
second task's known-true case had proved that the gate fails on the starting tree, and no one had asked whether it could pass on the
intended one.
The question went to the plan's critic, which reopened the task as T5.1 with the gate reading fixed, and the owner set that reading on
09-30: a duplicate class still counts if its names are meaningful, or if it is a placeholder class not listed in a new record,
`docs/struct-twins.md`, with per-class evidence from the struct map; a stack frame declared with its variable is reported, not counted;
a canonical type used only inside another canonical type is alive. The milestone's own line stayed as written. The reasoning between the
question and the answer was spoken rather than written: the plan keeps the decision as one change line, the fifth task's log keeps the
conflict, and the discussion record opened that day is an empty template. What is said here is what those support.
T5.1 took two attempts (the first handed off without leaving its progress file on disk) and ten coder runs, one of them red and
reverted, and three things that had looked right failed on the way. The census counted a struct's tag and its typedef as two names,
because C keeps them in two namespaces; the fifth task had split nine such pairs to satisfy it, and T5.1 taught the census that one
definition's tag and typedef are one name. The layout hash that defines "the same layout" ignored alignment attributes, and the gate
said so twice: folding a class whose members differed only by `packed` or `aligned` turned 142 of the 218 binaries red, and folding a
packed four-byte struct onto its natural twin turned 148 red; the hash now carries those attributes, and two definitions that differ only
in them are different types. And a fold by layout alone was not safe even then: a member name the canonical type spells at another
offset compiles without a word from the compiler and reads the wrong field — a trial fold of that kind failed 142 binaries, and only the
byte gate saw it. At the close every definition outside the canonical files had moved in (1,684 to 0), every meaningful-name class was
folded, 942 placeholder names whose uses showed them to be one type were folded, and 53 placeholder classes were listed — 44 with
evidence that they are separate, 9 with no use-site evidence either way, among them the shapes of Sony's `RECT`, `SVECTOR` and `DVECTOR`.
Six layouts took Sony's own SDK names, three unused names were kept with their reason, and the 0x10C block's split was confirmed, with no
unions.
The sixth task put the declarations on the canonical types: nine redraw cycles, each through the gate, took the 1,106 hidden-type
declarations to 0 and the "conflicting types" from 160 to 18 — all 18 stale rows of the engine's ledger whose source is already right,
because the engine writes no new row for a unit it finds nothing to fix in. The shared-body conflicts went from 44 (the plan's 45 had
counted a header line) to 40, each with its diagnostic. The seventh ran the gate on a fresh census on 09-30: exit 0, and 218 of 218
binaries identical. From the phase's start to its end, struct definitions went from 7,255 to 1,650; duplicate classes from 206 to 53, all
of them listed twins; file-scope definitions in `.c` files from 4,085 to 0; variant camps from 40 to 0; dead canonical names from 141 to 0
(three kept with their cause); legacy padding names from 26 to 0; hidden-type declarations from about 1,106 to 0. Lying declarations fell
from 1,796 over 76 callees to 229 over 24 — the census's `decls.lying` field at both ends, which the new gate prints as
`types_floor_lying`; it is not the 98,648-to-1,796 series quoted above for Phase 37, nor the plan's 1,537 "types floor", and it is a
different count from the hidden-type declarations, which are read from the engine's ledger. The levers stayed at 3,730: the phase moved no
compiler pins, and none was asked of it.
## 11. By the numbers
| | |
+24
View File
@@ -0,0 +1,24 @@
# T9 log — story §10 + retrospective §7 for P37 T5-close, PA3 migration, P38 (expert-opus55)
## Timeline
- Start: card slice, plan Context/Interfaces/Cookbook/Research, task T9, Changes lines (PHASE_PLAN.md:96-112 by range; whole read denied by guard), summaries T1/T5/T5.1/T6/T7.
- Read targets by range: docs/story.md:173-286 (§10 ended at P37 S108, 2026-09-12), docs/retrospective.md:155-208 (§7 Phases 35-37).
- Greps (no whole-log reads): logs/T5.1*.md for packed/aligned (c3b: attr fold DR_MODE 142 binaries red, member-at-other-offset trial B1 142 red; c5: a2e73 → packed_word 148 of 218 red; c6: lhash learns packed/aligned(N)); logs/T5.md:14-22 (stop: gate vs done-when, 293 opaque 8-byte names, 1,774 frames, 114+6+12 dead residual); logs/T6.md, T7.md, T2.md lying/types_floor lines.
- Code fact: tools/type_census.py:1924 prints `types_floor_lying={summary['decls']['lying']}` → 1,796 (T1/T2) and 229 (T7) are the same field; .run/P38/census/type_census.txt:10 = 229 / 24 callees {K&R-empty 216, narrow 13}.
- docs/levers.md:127-129, lever-progress.tsv:81-83: 3,730 at P37 T4, P37 close, P38 T7 → flat.
- git: last P37 commit bbe54b9cc3 2026-09-12 (T4 CLOSED); no commits 09-13..09-28; migration b8a6cbc548 2026-09-29 (777 files; docs/{SETUP,cookbook-index,effort-map,matching-cookbook}.md → docs/retired/; .gitignore +`.run/`, `__pycache__/`); T0 303c045edf (launch natural_key, Phase3_5 crash); PhaseEnd_Phase3_5.md added 3207d52491 2026-06-14 (phase 3.5 spike).
- `git check-ignore -v .run/giants/x.md` → .gitignore:595 `.run/` (older `!/.run/giants/` negations dead).
- Story duty: rules/R121.md (2026-09-30) restores it; story.md/retrospective.md last changed a671f0abe9 2026-09-12.
- Discussion record D1 (2026-09-29) is an empty template → the gate-reading reasoning is recorded only as Changes:104-105 + logs/T5.md.
- Wrote story §10: heading +38, source/duty note, 8 new paragraphs (P37 T4 close + 17-day gap + re-scope; migration's four breakages; P38 T1-T4; T5 wall; gate-reading decision + thin record; T5.1 failures; T6/T7 + start-to-end counts with metric names).
- Wrote retrospective §7: heading Phases 35-38 (R121), source line, believed/failed/cost(no tokens or dollars)/sooner additions.
- `tools/timeline.py` → 79 rows, self-check OK; `--check` fresh. `doc_links.py docs/story.md docs/retrospective.md` → OK (2 pre-existing WARNs).
## Retriever
- retriever-digest (bg): P37 close + PA3 migration from PhaseEnd_Phase37.md, PhaseEnd_Phase37.5.md, R3.38-001, AUDIT.md, logs/Phase37.md tail. No report file written (could not create pending file) → no id. Key: re-scope words "rescope p37 and defer remaining tasks to p38" (P37:2,9-11,123); T4-close figures P37:59-60; 1,537 types floor P37:108-110; gap = "sat at the T4/T5 boundary" (P37:7-11), no reason recorded; v2.3.0, no tag; P37 believed/failed P37:134-153 (lying count 13,832→8,830→2,367→2,171→1,796; kill/restore 8 s); 3 sessions/115 commits; PhaseEnd_Phase37.5.md is a 189-byte stub.
## Hypotheses rejected
- "1,796 → 229 is two different metrics": tool source shows one field (`decls.lying`); story names both printed names and contrasts with the P37 98,648 series and the plan's 1,537.
## Coder briefs
- none (CODER: none; docs-only edit by the expert).
+1
View File
@@ -9,3 +9,4 @@ T5.1 | done | long tail: one definition per type (gate reading fixed) | - | task
T6 | done | declaration layer on the canonical types | - | tasks/T6.md | logs/T6.md | -
T7 | done | milestone gate and record | - | tasks/T7.md | logs/T7.md | -
T8 | done | docs/formats.md: LIST.CD verified on US, runtime reader, repack note, LZSS ring + terminator rules | - | tasks/T8.md | logs/T8.md | -
T9 | review | story §10 + retrospective §7 for P37 T5-close, PA3 migration and P38 | - | tasks/T9.md | logs/T9.md | -
+32
View File
@@ -0,0 +1,32 @@
# T9 — story §10 + retrospective §7 for P37 T5-close, PA3 migration and P38
Status: review | expert: expert-opus55 | ctx-at-completion: n/a | commit: see COMMIT | coder runs: none
Done: story §10 and retrospective §7 now cover the end of old P37 (T4 close, the 17-day gap, the re-scope), the PA3 migration's four breakages, and P38 with start-to-end counts; §7 heading Phases 35-38; timeline regenerated (79 rows).
Files:
- docs/story.md — §10 heading/source note; 8 paragraphs after the S108 day
- docs/retrospective.md — §7 heading (Phases 35-38, R121), source line, believed/failed/cost/sooner additions
- docs/story-timeline.md, docs/story-timeline.svg — `tools/timeline.py` output
Decisions:
- §11 "By the numbers" left at its 2026-09-12 snapshot (not in T9's done-when; T10 publishes the P38 census).
- Cost paragraph carries sessions, commits, attempts and coder runs only; no tokens or dollars.
Deviations:
- Brief says lying 1,796 → 229 is "a different metric": tools/type_census.py:1924 shows `types_floor_lying` IS `decls.lying`, so both ends are one field. Text names both printed names and says what it is NOT (the 98,648-based P37 series, the plan's 1,537 "types floor", the ledger-read hidden-type count).
Findings:
- The record holds no reason for the 09-13..09-28 gap (PhaseEnd_Phase37 says only "sat at the T4/T5 boundary"); stated as such.
- Gate-reading reasoning: only Changes:104-105 and logs/T5.md:14-22; discussion D1 is an empty template; stated as thin.
- The `.run/` blanket ignore: `git check-ignore` confirms it overrides `!/.run/giants/` etc.; "ended committing per-phase evidence" written as "could be committed only by force" (T1 gotcha), not as a claim that nothing was committed.
Gotchas:
- harness: retriever-digest could not write its pending report file; findings came inline, no research id.
Next task needs: T10 may want §11's Gen3 row refreshed with the P38 census figures used here.
Verified: verify: — (none in plan); `tools/timeline.py` → 79 rows, self-check OK; `timeline.py --check` → fresh; `doc_links.py docs/story.md docs/retrospective.md` → OK
Review:
ran: tools/timeline.py, timeline.py --check, doc_links.py (local)
results: docs/story.md §10 (new paragraphs after "wait for the exit."), docs/retrospective.md §7
seen: story §10 and retrospective §7 now cover the end of old P37, the PA3 migration and P38
decisions:
- Lying-declaration wording: one field named twice (checked in source) vs the brief's "different metric" — Recommended: keep as written
- The 17-day gap and the decision reasoning are stated as unrecorded — Recommended: add the owner's own reason if wanted, else keep
- §11 snapshot left at 2026-09-12 — Recommended: refresh in T10
edits:
- none
Full log: phase-ends/current/logs/T9.md