Commit Graph

881 Commits

Author SHA1 Message Date
Drew T 1856524bec docs(report): regenerate the fleet scoreboard after t5m/t5n (1,968 -> 1,741 stubs; 98.7% instr / 97.3% distinct) 2026-08-27 14:05:55 -06:00
Drew T ba7afeed34 docs(cookbook): 2 NEW + 3 addenda from the t5j-t5m distill — §310 (a subu's dest ties only to the block-local operand), §311 (a same-lvalue if/else store must be DUPLICATED into both arms: sched1 runs before cross-jump, so a join-block store swallows the arm's load-delay nop; cross_jump refunds the duplicate so it is byte-free), + §220/§164-29/§164-39 addenda. NOTE: the §164-39 addendum REJECTS the drafting agent's 'integer width' claim — the byte-check shows comparison OPERAND ORDER is the lever. Index 917 -> 919 (P31 S64) 2026-08-27 13:47:39 -06:00
Drew T e5956d021f docs(report): progress.md regenerated with the S63 scoreboard 2026-08-27 11:33:02 -06:00
Drew T e268956de6 docs(report): regenerate the fleet scoreboard after t5g/t5i 2026-08-27 11:31:57 -06:00
Drew T 0edd7344c2 docs(cookbook): 3 NEW sections + 2 addenda from the t5e-t5i distill — §308/§308a (a target's lone j+nop over one self-terminating block survives ONLY behind a tautological re-test; a plain goto/polarity flip DELETES it — closeness EXPLODING after a polarity edit means an edge was removed; two overlays, independently derived), §309 (a frame-address equivalence rides through a -fcse-skip-blocks conditional; duplicating the call into both arms barriers it, cross-jump merges them back), §264 + §195-L addenda. Index 914 -> 917 2026-08-27 11:28:58 -06:00
Drew T 689bbc7c2f docs(report): regenerate the fleet scoreboard after t5b-t5h + the free lane (2,310 -> 2,068 stubs; 98.6% instr / 97.1% distinct) 2026-08-27 09:43:27 -06:00
Drew T 1180748502 docs(cookbook): 3 byte-proven addenda from the t5b-t5d distill — §211's guard-hoist INVERTS on a reg-reg copy (LENGTH-DRIFT -1; use the §164-36a fence instead, func_8017DD80); §194-M third instance + new residual shape (func_80182420); §176-B B1 sharpened (func_80180B44). 2 more verdicts COVERED. Index green at 914 (P31 S63 T5.5) 2026-08-26 21:42:47 -06:00
Drew T 926fc3f1c0 docs(cookbook): §307 — the brute-force-statement-orders lever has a BYTE-EVIDENCED BOUND (12/12 permutations byte-identical on func_8001BC6C, corroborated on func_80021284); a fan-out copy's priority is rank_for_schedule-internal, unreachable from source order — recognise the all-same-closeness tell and route to the permuter. Plus t5_distill_args --novel-only (P31 S63 T5.5) 2026-08-26 21:33:45 -06:00
Drew T 3ae63a9b2c docs(cookbook): §164-55 addendum from the t5a distill (byte-proven func_8017E2CC) — a single-constant arm written FIRST collapses into the branch delay slot; hoisting it instead pays §76's callee-saved pair; index rebuilt (P31 S63 T5.5) 2026-08-26 20:50:25 -06:00
Drew T 59bb3a23f8 docs(report): regenerate the fleet scoreboard after t5a + lane G (R32 digest describes the tree again) 2026-08-26 20:26:01 -06:00
Drew T 41b259e528 fix(wave): cards keyed by (binary,fn) — t5a received 48/48 ANOTHER binary's card (R48); t5_cards.py builds the target's OWN fuel (tu_ref 88% / decl_prior 98%) via wave_card_fuel.py extracted from build_wave_atlas (R33); t5_bank.sh recovers un-banked drafts via fix_tu_ret_decls (2/2 on t5a); distill workflow generalized (P31 S63 T5) 2026-08-26 20:19:41 -06:00
Drew T f8cc4c77d3 feat(tools): T5 wave draw/bank halves — t5_targets.py (routed, ledgered, band-stratified draw) + t5_bank.sh (judge → R22 sweep → commit); claude_wave_draft.js generalized; packs/judge refuse duplicate fn names (R43/R48); sweep #8 213/213 (P31 S63 T5.1) 2026-08-26 19:35:54 -06:00
Drew T 5962bb70ed fix(api_agent): prior_draft accepts a warm-start body only when its symbols overlap the target .s (law 1c) — 22/60 T4 agents had received another overlay's same-named function; fleet ledger regenerated (2,380 stubs) (P31 S62) 2026-08-26 19:02:07 -06:00
Drew T 74ec441d60 feat(tools): the Claude-subagent wave harness promoted from the T4 probe — claude_wave_packs.py (identical api_agent packs), workflows/claude_wave_draft.js + claude_wave_distill.js (the 60-agent draft and the R16 distill scripts), wave_judge.py (per-arm whole-binary gate with git-diff bank detection, tree reset, --union); SETUP row (P31 S62) 2026-08-26 19:01:41 -06:00
Drew T 194cce7570 docs(phase-31): T4 DONE — routing rule (<=50: Sonnet+DeepSeek parallel, Opus residue; 51-120: Sonnet, Opus escalation; >120: Opus; haiku retired; M-extend-tell -> wall); frontier-s61 Addendum 5; judge artifacts (P31 S62) 2026-08-26 18:32:51 -06:00
Drew T 05d13e52e7 docs(cookbook): §306 (hazard nop before a div-result store = statement order; maspsx --expand-div splices it) + §306a T4 distill addenda (case-body order at 3 nodes, narrow-cast copy+andi cell, dropped-edge sign rule, REGALLOC-PERM via a hoisted clamp local) + the warm-start homonym harness note — from 31 byte-proven T4 transcripts, 6 novel claims, 5 banked (P31 S62) 2026-08-26 17:07:12 -06:00
Drew T 16d1d01b56 docs(phase-31): T3 log (75 banks; six carve-lane defect classes fixed; residue named) + frontier-s61 Addendum 4 (P31 S62) 2026-08-26 15:57:18 -06:00
Drew T 5382025752 chore(docs): fleet ledger + backlog regenerated after T3 (2,397 stubs, 98.5% instr, 96.8% distinct) 2026-08-26 15:57:18 -06:00
Drew T 99f601d02a docs: cookbook §305 addendum — glued DEFINE carrier, attribute typedefs, leading-jr cut, the overlays.mk merge race closed at the root (P31 S62) 2026-08-26 15:49:08 -06:00
Drew T d7d8fdb50c docs+tools: cookbook §305 (gate-time CARVE-REFUSED = 3 deterministic classes: mangled definition, uncarried naming type -> lift_types, post-isolation BOTH-copies -> tail); jtbl_carve treats a full data-side overlap as tail (P31 S62 T3) 2026-08-26 15:24:41 -06:00
Drew T dfd42d4586 docs: cookbook §304 (self-defining rodata) + T3 log incl. fleet sweep #3 = 213/213 (P31 S62) 2026-08-26 14:56:06 -06:00
Drew T c71cd7edb5 docs: cookbook §303 (module island pads derived at build time; island-pads/island-blocked dissolve) + SETUP row (P31 S62 T3a) 2026-08-26 14:48:42 -06:00
Drew T d718cecf9d docs(phase-31): S62 log — clean fleet sweep found 6 hidden failures (5 healed, md_SC07_003 re-measured); R60 candidate (carve-state files); SETUP: interleave_check --fix 2026-08-26 14:35:06 -06:00
Drew T ab9e5770c7 feat(tools)+docs: T2 knowledge — interleave_check.py + pads_audit.py promoted (derive carve specs from the bytes; SETUP rows), cookbook §302 (the three carve-state invariants; five reds classified), frontier-s61 Addendum 3 (red list 5 -> 0, 39/40 held banks) (P31 S62) 2026-08-26 14:29:35 -06:00
Drew T 85b7577886 chore(docs): progress.fleet.md regenerated after T1 (2,511 stubs) 2026-08-26 14:05:15 -06:00
Drew T 3a5caa65b1 feat(tools)+docs(phase-31): T1 — resolver declfix wiring; masked_diff/rtu_match compare internal-j targets (jrel; §195 premise refuted, cookbook §301); diff_autopsy.sh + stub_invariant_audit.py promoted; frontier-s61 Addendum 2 (step-1 falsifier fired: 54 carve-refused, 2 DIFF autopsied+banked, 1 plumbing); S62 log 2026-08-26 14:04:54 -06:00
Drew T 528f543d84 chore(docs): progress.md regenerated at S61 close 2026-08-26 12:56:26 -06:00
Drew T f71cbbb53e chore(docs): sweep auto-rendered ledgers at S61 close 2026-08-26 12:56:10 -06:00
Drew T d7bfa03d92 docs(phase-31): frontier-analysis-s61 addendum — distill cross-check folded in (4 fns to deterministic via §295; §296 contamination quantified at 11 main fns; analyst's own R40 note) 2026-08-26 12:55:57 -06:00
Drew T aee82bb4da docs(cookbook): §294–§300 — S61 distill batch: 5 new laws + 10 addenda from 99 candidates (52 covered, 3+1 refuted, all byte-verified); DeepSeek-vs-ox calibration notes 2026-08-26 12:52:28 -06:00
Drew T bd37b7eb7b docs(phase-31): frontier-analysis-s61 — the post-ox finish-plan ground truth (2,520 open instances fully classed, zero unassigned; wall = 86 fns; done-denominator reconciled; engines measured per class) 2026-08-26 12:45:16 -06:00
Drew T 04e685e8dc docs(phase-31): correction — true morning fleet numbers 98.4% iw / 96.6% dc / 2,540 stubs (the earlier line quoted a stale file; --fleet was required) 2026-08-26 09:06:46 -06:00
Drew T 96847afcf0 docs(phase-31): S61 overnight close — 378+ net stubs; gen0 goal beaten (392/421 drafted, 196 banked); ox window closed 07:55; fleet regenerated 2026-08-26 09:05:05 -06:00
Drew T 0488903e57 feat(tools): decl_from_use — negative-controlled extern inference for the no-seed-decl class (Fable agent build, verified); SETUP.md rows for it + the baseline-red gate input (R21)
42-case first run: 39 were one uncompilable TU (ov_SC04_018_jr_8017AE2C.c), not draft defects —
the resolver's 'undeclared' classification needs a TU-alone compile probe first (open follow-up).
2026-08-26 00:47:38 -06:00
Drew T eb132b719a docs(phase-31): S61 interim checkpoint + cookbook §293 (the sibling law decomposed: the baseline, not the siblings) + decision-log entries + accelerator #12
R30/R31 capture while hot: the resolver pivot (63 zero-token banks of 245 staged of 424 judged of
1,352 nominated), the RED-fleet finding (15/214 baseline-RED refusing 174/182 doubly-verified
drafts), the three byte-proven repairs so far, and rule candidates R56–R58.
2026-08-26 00:32:08 -06:00
Drew T 433c7cd8ef feat(resolver): the integration-resolver lane — zero-token re-judging of the ledgers' shape-correct stock at the real TU (P31 S61 T10+/S61-1)
frontier-analysis-s60 §4 measured that ~571 open functions had FINISHED drafting (closeness-0 backlog
rows / reloc shape-MATCH rejects) and were being re-drafted wave after wave. tools/integration_resolver.py
treats those ledgers as an index: still-open? -> rtu_match at the real split TU (CC1: the gate ladder's
draft-side transforms, one retry) -> reloc_identity as the disagreeing oracle (rtu masks reloc fields)
-> aprop_symfix on MISMATCH/shape-MATCH -> stage -> sweep_parallel (whole-binary SHA, sole arbiter)
-> commit at once (R42). Refuses main by name (gate_main owns it), //@EDIT drafts, dirty trees, collapsed
registries; every drop is counted (R32); a negative control over recently-banked functions must pass
N/N before any verdict is trusted (R35/R39 — its first form picked carve moves as banks, 9/12 FAIL,
and was fixed before a single stock verdict was read). Ledger .run/resolver/verdicts.jsonl keyed by
(binary, fn, draft-sha, split-TU-sha) so unchanged rejects are never re-judged.

First pass (commit:2991): 1,352 nominated -> 901 already banked, 27 main -> 424 judged in 41 s ->
245 staged (57.8%; 242 raw, 3 via transforms) -> 63 banked (net INCLUDE_ASM delta; that commit's
subject says 72 = gross incl. 9 carve moves), 182 gate-refused, zero model tokens, ~10 min total.
Lane wrapper tools/lanes/resolver_lane.sh (holds .run/auto/draw.lock for judge+gate: rtu reads the
TUs a gate splices into).
2026-08-25 23:50:26 -06:00
Drew T 07a167516d docs(s60): the Fable frontier audit + corrections it forced to my own checkpoint
The audit's headline, measured: THE WALL IS AN INTEGRATION WALL, NOT A CODEGEN WALL. Of the 292
functions the gate has refused 6+ times, 178 (61%) have ALREADY produced a closeness-0 draft —
match_one byte-equality, whole-binary gate rejection. The blocker is symbols/decls/TU plumbing,
and the fleet keeps re-drafting them: 10,049 reject rows over 574 distinct functions. Highest-EV
build is a zero-token integration-resolver lane, not more drafting.

CORRECTIONS TO MY OWN NUMBERS, verified against the tree before accepting:
* siblings are 1,334 behind 480 multi-member groups, NOT ~3,900. 1,292 groups are SINGLETONS
  carrying 57% of open instruction mass. I conflated the never-drafted stub count with the sibling
  count and overstated remap leverage ~3x, in this checkpoint and repeatedly in conversation.
* 'everything drawable is gen6+' holds only for the collapsed wave-eligible view; whole-pool
  generation is 53% gen0/1, 25% gen6+, and only 292 fns are 6+ GATE-refused.
* '30-67 min gates at 8% CPU' conflated wall_min (includes drafting/queue) with gate wall (12-31
  min healthy). Gate cost is proportional to FAILURES, not drafts: ~3 whole-binary builds per
  failing draft, so banks/gate-min fell 17.5 -> 0.10 as conversion fell.
* the 5,388 closeness<=2 rows de-dupe to ~543 open functions; my own 19:40 re-measure found 290
  still open, down from its 470 — the re-gate and grinder are draining that pool now.
* campaign_status's 'banked today' undercounts: the stub invariant says ~2,644 net, because the
  A-prop lane's 357 rode in a chore commit its regex cannot see.

One documented counterexample to 'model quality is not a bottleneck': func_80181714, where
ox-alpha plateaued at closeness 4 while Opus/GLM/DeepSeek each reached reloc-verified MATCH —
argues for a small escalation tier AFTER the resolver drains the fake walls.

Taken on trust and flagged as such: the A-prop residual split (169 STRUCT / 121 no-seed-decl /
73 IMM / 12 void) — the refusal mechanisms exist in aprop_autodraft.py but no file carries those
counts; re-derive before building the decl-inference tool.
2026-08-25 19:36:51 -06:00
Drew T 2094ee04a0 docs(cookbook): §283-§292 — the 36-wave batch distilled, 1,216 candidates reviewed
Five reviewers on disjoint wave groups (D1 dd/de/df · D2 dg-dm · D3 cg-cm · D4 cn-cw ·
D5 cx-dt): 859 COVERED · 46 ADDENDUM · 9 NEW · 289 REJECT. Index now 888 sections.

  §283  the 46 sharpenings, one block per target section
  §284  combine can reassociate two sequential bitwise-AND masks against the PRE-mask value;
        an asm fence at the mask's definition point stops it
  §285  pre-initializing a variable with a shared constant BEFORE a branch makes both arms of
        the following if/else destructively reuse one register
  §286  fold a statement's side effect into a comma-expression in an argument position to
        place its RTL relative to a call's own delay slot
  §287  a stack-frame hole below two address-taken aggregate locals is a LEADING PAD MEMBER of
        one combined struct, not separate locals
  §288  a register pin declared UNINITIALIZED and assigned only at its late sole use still
        forces the fixed register's save/restore
  §289  an array local's decayed base keeps EVERY element's store alive under DSE, though only
        one pointer value escapes
  §290  one strength-reduced giv can drive stores to several distinct relocatable symbols,
        each keeping its own %hi/%lo anchor
  §291  the delay-slot false-value: a conditional branch's zero arm must be a fall-through
        adjacent block ending in an explicit goto
  §292  declaring a symbol upstream of an already-banked sibling that relies on its implicit
        (K&R) declaration silently reprototypes the sibling's call site

VERIFICATION CAUGHT SIX BAD CLAIMS, recorded in §283 as refuted rather than laundered in:
three independent "the harvester leaked an unbanked NEAR into a banked-only harvest" reports
(all three functions are genuinely banked per corpus.stubs — the notes predate their gate and
read as harvester bugs hours later); a "match_one resolves targets by bare symbol name" claim
(it resolves an explicit path, and api_draft always passes it — the real hazard is its
resident-defaulting --asm-subdir, hardened separately in commit:2917); and two idiom claims
whose mechanism is absent from the banked code. §284's fence was described as NON-volatile
and the banked code uses `__asm__ volatile` — corrected in the text, since that is a detail
readers copy verbatim.

THE STRONGEST SIGNAL IS NOT A SECTION: eight cards across four waves independently
re-derived that the whole-object gate needs every sibling matched. It is implicit in the
corpus and has never been stated as its own law. Recorded in §283 as the batch's clearest
missing-section signal.

PROCESS, for the next batch: forked sub-reviewers exceeded their brief in three of five
groups — one re-derived five waves it was not assigned and self-merged over the shared output
path, one silently dropped 11 rows including a whole function, one produced nothing. Each
parent caught its own fork. Tell forks not to spawn forks (they infer it from the parent's
inherited context) and give each a private output path.
2026-08-25 18:10:29 -06:00
Drew T 98085269b1 docs(cookbook): §278-§282 — wave cf distilled, 4 new laws from the post-429-fix wave
34 candidates: 13 COVERED · 8 ADDENDUM · 4 NEW · 9 REJECT.

  §278  the 8 sharpenings (§17, §20, §74, §162p, §164-56, §172b-4, §237, §265)
  §279  a do/while (p < end) under an entry guard — the GUARD decides the compare
  §280  the cursor's declared type picks sltu vs slt: a `T*` bound test is unsigned by
        C rule, an integer cursor is signed — confirmed twice in one wave by unrelated
        functions, which is why it generalizes to the corpus's scan-loop residuals
  §281  group copy-then-RMW by OPERATION KIND, not field by field; sched1 does the
        interleaving. §213 explicitly disclaimed this shared-pseudo case — a named gap now filled
  §282  gcc's own loop reversal places the reversed counter's init AFTER the hoisted
        movables, a position no hand-written down-count loop can reach — resolves a class of
        "prologue order" residuals that looked unfixable from the C side

VERIFICATION, both directions (R14/G3). Two reviewer claims were REFUTED at byte-check and
recorded as refuted rather than laundered in: func_800CAE74's note described a "parameter
reassignment" idiom absent from the banked C (the real law became §280), and func_800CBCD4's
named the wrong register ($v1 where the bytes use $v0). I re-verified §280 independently at
merge: the target carries one `slt` and zero `sltu`, and the banked C drives the bound test
with a plain s32 cursor beside a separate s32* — the direction the law predicts.

Section titles were rewritten at merge: the reviewer put each law in the body and left the
heading as "(func_X, ov_Y)", which is unfindable. A section is written to be GREPPED, so the
title states the law.

Three harness suspicions recorded in §278, NOT acted on — func_8017F39C suspects a
binary-registration mixup with a same-named function in ov_SC01_009, which is a gate-side
question, not a drafting one.

Index: 824 sections. Distill state updated, cf marker consumed; the lane is free to raise the
next batch.
2026-08-25 14:42:01 -06:00
Drew T 32eafed7b2 docs(cookbook): §274-§277 — the 18-wave distill backlog lands, 315 candidates reviewed
The ore that piled up behind a stale READY marker for 10.5 h (waves be..ce). Three Sonnet
reviewers on disjoint wave groups read all 315 harvested notes against the corpus:

  255 COVERED · 21 ADDENDUM · 3 NEW · 26 REJECT

255 already-covered is the flywheel working, not waste — §193-§273 are earlier rounds of
this same cycle, so a note restating a law we own is the corpus doing its job.

  §274  the 21 sharpenings, one block per target section (§8, §20, §82, §134, §164-51,
        §164-64, §172a, §172b-1, §172b-4, §176-F5, §179-C, §179-D, §211, §219+§1-I5,
        §224, §225, §225/§256, §226, §229, §244, §136d-1)
  §275  THE LEFTOVER-REGISTER READ — an entry block that consumes $v0/$v1 with no earlier
        write in the function is reading the CALLER's return value; reproduce with an
        unassigned `register s32 v __asm__("$2")`, and stop hunting for a dropped call
  §276  MIXED ADDRESS-EXPRESSION SPELLING as a CSE-unification dial — spell one occurrence
        of a repeated symbol as offset arithmetic on its neighbour ((&D_X)[1]) and cse
        cannot unify them; found twice, independently, on the same function
  §277  RETURN-TAIL C SPELLING picks the delay-slot-fill vs trailing-move topology

VERIFIED AT MERGE, not taken on trust (R14/G3): the leftover-register read, the CSE-defeat
spelling, the compound-rounding pair (live in ov_SC03_095), and func_801846F0's delay-slot
`addu $v0,$zero,$zero`. Two reviewer claims did NOT survive and are corrected in place:
§275's law was stated as "no call anywhere in the body" when the function has five jal's —
what makes it true is that no write to the register PRECEDES the read; and a claimed
harness defect (func_800CE004 "will not bank") is false, it has a real body at
src/md_MAIN_044/md_MAIN_044.c:443 and corpus.stubs does not list it as open.

B and C reached the same CSE lever from different waves and the §1-I5 / §219 rounding law
arrived twice on three overlays — both unified into one entry rather than duplicated.

Index regenerated: 806 sections. The lane immediately raised its next batch (cf, 34
candidates), which is the proof it is unblocked.
2026-08-25 01:17:28 -06:00
Drew T 75bfb04226 fix(maintenance): restore the S59 lane logic a stale second copy had reverted
.run/maintenance.sh (what runs) and tools/lanes/maintenance.sh (a pre-S59 copy) had
diverged. The 150->50 threshold tune landed on the stale copy and was then copied over
the live one, silently reverting five S59 fixes:

* the R47 shape filter (staging fell back to status=='AGREE' alone — the exact defect
  that staged 82 hopeless drafts every 45 minutes)
* the R48 (binary, fn) keying (bare-fn keys collide across overlays)
* reloc --fix MISMATCH auto-repair (measured 4/4 repaired to AGREE)
* rtu_second_chance (re-judges standalone COMPILE-FAILs against the real TU)
* fix_tu_ret_decls (the return-type half of the stale-decl wall)

Rebuilt from the S59 lineage with the 150->50 threshold and the periodic fleet R22
re-applied, both paths now byte-identical, `bash -n` clean, and the two-path hazard
documented in the header so the next edit cannot repeat it.

Also: relaunch_drafter_shell.sh 30s -> 5s ready-marker poll; regenerated backlog and
fleet progress artifacts.
2026-08-25 00:35:27 -06:00
Drew T 65fe4a81d4 docs(aprop-s59): final numbers — 64 banked exactly; sweep 3 honest 0/9 with the residual hypotheses named 2026-08-24 23:39:16 -06:00
Drew T b5c422168a docs(decision-log): S59 A-prop decomposition — consume every verdict layer; never key by bare fn name 2026-08-24 23:34:37 -06:00
Drew T 90efcc5e87 docs(accelerators): #7 — wire the full verdict ladder into template lanes from day one 2026-08-24 23:32:27 -06:00
Drew T 586916732c docs(aprop-s59): the measured decomposition + honest ceiling; cookbook §270-§273; lane wiring complete
docs/tool-designs/aprop-lane-s59.md: baseline (117 staged / 0 banked = 82
shape-DIFF + 19 standalone-fail + 16 near-0, none invisible), the defect
classes with byte-proofs, the fixed pipeline's end-to-end numbers (64+ banked,
zero tokens), the near-miss taxonomy (11 IMM tier-2, 8 wrong-family), the
ceiling with every refusal named and sized, and the two pre-existing RED
binaries the scoped R22 surfaced (SC07_010 fixed green; SC07_002 named for the
jtbl owner).

Cookbook: §270 the four-verdict law (instructions/symbols/TU/whole-binary —
stage on fewer and burn a build per missing layer forever), §271 ordinal
candidate pairing, §272 K&R the definition, §273 the wrong-oracle law.

maintenance.sh now runs the full recovered pipeline unattended: shape-gated
(binary,fn)-keyed staging, reloc --fix repair+recheck, rtu second chance,
fix_tu_ret_decls on fresh near-0 rejects.
2026-08-24 23:32:06 -06:00
Drew T e6bb079a2f docs(s59): the proof run — 40 drafts, 32 banked, one rebuild, SHA green (m05 = commit:2717) 2026-08-24 19:23:29 -06:00
Drew T 1432dba125 docs(accelerators): 6 — the null-input control belongs in the failure path 2026-08-24 19:09:47 -06:00
Drew T 78a377f38b docs(ops): runbook carries the S59 main-lane baseline guard and the one-writer rule 2026-08-24 19:09:13 -06:00
Drew T e40fe9c116 fix(main-lane): the baseline was RED — guard every gate with a no-draft control (S59)
PROVEN: from 14:57:01 to 18:43:23 today HEAD built main to 307aa45d… against the
expected 143dbb89…, with NO draft substituted (measured under gate.main.lock, no
gate_main alive). Auto-commit commit:2693 had adopted a mid-flight gate_main
substitution — its carve-out reverted main's TUs, gate_main re-wrote them, and
`git add -A src/` swept the unverified bodies in (a TOCTOU race, 14 s after a
bisect chunk banked). Every main batch after it was doomed before its first
draft was judged: m00–m03 card cycles drafted ~737, slated 160, banked 0, and
burned ~50 clean rebuilds bisecting innocent slates. commit:2712 restored the
green content by accident (it swept this investigation's diagnostic checkout).

gate_main: on any batch failure, ONE try_batch([]) control runs first — if HEAD
itself is red it prints BASELINE RED, leaves the slate reusable, exits 3 (R40).
clean_build no longer reports a linked-but-mismatched build as "no binary" (the
build target embeds the SHA check), the compile-conflict shortcut fires only on
error-shaped lines naming a symbol some draft in the slate actually uses (the
baseline's own func_800143AC implicit-decl WARNING was matching — every m04
chunk died with "drafts declaring it: []"), reverts narrow to top-level src/*.c
(main_tus) so a main gate can never destroy overlay lanes' in-flight work, and
--assert-baseline is a first-class mode.

main_lane: every cycle opens with gate_main --assert-baseline and REFUSES to
draft or gate against a red baseline (R43) — BaselineRed parks nothing, burns
no tries, writes .run/main_lane.BASELINE_RED, re-checks every 30 min.

Adopters (ox_campaign ×3, maintenance.sh, gate_stage, gate_lane, idiom_serial):
main's TUs (top-level src/*.c) are never staged and never reverted by an
overlay/maintenance lane — one writer (gate_main), one committer (main_lane,
after the whole-EXE SHA re-checks green). Unstage-after-add is race-free where
the old revert-then-add was the losing half of the TOCTOU.

Diagnosis, evidence and the full timeline: docs/tool-designs/main-lane-fix-s59.md
2026-08-24 19:08:47 -06:00
Drew T 6f5eb90844 docs(ops): correct the truncation numbers — the denominator was wrong
I reported 240 of 244 turn-finishes truncated in wave bk and called it ~100%. That
count came from grepping lines containing 'finish=', which api_agent only prints when
a turn ends WITHOUT a tool call — so the denominator was not all turns, it was all
anomalous turns. I compared a subset against itself.

Counting every turn:
  bk (8k / 420s):   240 truncated of 3,222 turns = 7.4%
  bt (16k / 700s):   16 truncated of 1,210 turns = 1.3%

Still a ~6x improvement and the change stands on its own evidence, but it is a tax
reduction, not the collapse I described. Recorded alongside: a truncated turn is one
turn of 24, not a lost agent — the logs show the agent emitting its tool call on the
very next turn.

Both docs keep the wrong figure explicitly, with why it was wrong, so the next reader
does not re-derive it from the same grep.
2026-08-24 17:11:46 -06:00