mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-03 16:16:50 -04:00
T9: story §10 + retrospective §7 for P37 close, PA3 migration, P38; timeline regenerated
This commit is contained in:
+39
-4
@@ -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.
|
||||
|
||||
@@ -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
@@ -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
@@ -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
|
||||
|
||||
| | |
|
||||
|
||||
@@ -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).
|
||||
@@ -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 | -
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user