mirror of
https://github.com/Druthulu/BFM-decomp
synced 2026-10-04 00:20:10 -04:00
f78ea55b3e
THE GATE WAS A BLACK BOX. sweep_parallel's stdout was captured and dropped, so a gate logged "reloc_identity -> gating 216" and then THIRTY MINUTES OF SILENCE before its bank line — no worker count, no per-binary progress, no phase-A/phase-B split. Gate times went 31 -> 37 -> 50 -> 67 min across ej/ek/en/eo with nothing to diagnose from, and I twice asserted things about phase B that the log could not support (its absence measured LOG CAPTURE, not behaviour). A lane that must run unattended has to leave evidence. MEASURED WHILE DIAGNOSING, and it rules out the obvious suspects: load average 2.6 on 32 cores with 1-3 concurrent builds during a gate — the gate is NOT CPU-bound and is not saturating its own -j 24. Raising to 32 is cheap given ~8% utilisation, but the real answer will come from the log this change adds. TAIL_DONE_FRAC 0.85 -> 0.80. 0.85 overcorrected: the fleet fell to 15 agents / 11 req/min because the drafter parks between waves while the gater drains a deep queue. 0.75 was too deep (26% 429s, draft completion sliding 94->91->73->47% across eq/er/es/et). Neither number is really the lever: the drafter cannot start a wave the gater has no room for, so the gate throughput is what bounds the campaign now. Generational tiering confirmed already correct: the top-off orders by generation at both assembly levels (group ranking and within-group) without FILTERING any tier out, so every generation stays eligible and the scarce never-drafted work simply goes first.
Autonomous lanes (P31 S58)
The unattended campaign architecture. These are the RUNNING copies' source of truth — the live
lanes execute from .run/, which is gitignored, so a fresh clone would otherwise have none of it.
Copy back with cp tools/lanes/*.sh .run/ before launching.
| lane | role | rule |
|---|---|---|
drafter.sh |
draw → shard → draft → queue a ready marker, forever | NEVER stop it to ship a code change. Measured 2026-08-23: 139 of 162 idle minutes were exactly that |
gater.sh |
reloc pre-filter → gate → commit → harvest → ledger | safe to kill/restart at will |
maintenance.sh |
the free A-prop sibling lane | triggers on 150+ newly banked functions, not a timer |
stallguard.sh |
60s: revive dead lane shells, kill agents silent >20min, kill gates >90min | the only thing that works at 3am |
Start: setsid nohup .run/<lane>.sh >> .run/<lane>.log 2>&1 </dev/null &
Stop everything: touch .run/ox_campaign.stop
Editing a lane requires replacing its SHELL, not just its python — bash has the loop body parsed, so killing the python restarts it with the old arguments. Verify from the startup banner, never from the file.