Files
BFM-decomp/rules/L1.md
T
2026-09-29 18:59:02 -06:00

2.3 KiB

L1 — offline-tooling-first

id: L1 · group: - · status: active · tags: legacy,memory · origin: legacy memory offline-tooling-first.md · added: 2026-09-29

Standing goal (Drew, 2026-07-21): get as much as possible working as offline tooling. When a recovery, diagnosis, or integration step is computable, it belongs in a deterministic tool that runs with zero tokens on every future draft — not in an agent prompt, and not in a search.

Why: the measured economics keep pointing the same way. Phase 15: a 50-agent wave added +0.36% while deterministic recovery added +2.67% for ~0 agent tokens. Phase 29 (2026-07-21): the permuter's problem was targeting, not a missing transform — ~92% of its CPU was aimed at residuals a search provably cannot close, fixed for free by a deterministic classifier (matching-is-solved-integration-is-the-bottleneck). Every hour of agent drafting is spent once; every ladder stage is spent once and paid forever.

The two engines — keep them separate:

  1. Deterministic recovery (tools/gate_stage.py's ladder): computable fixes — decl/arity/cast reconciliation, type-lift, jtbl isolate+re-carve. Applied always, free, byte-gate arbitrated.
  2. Search (decomp-permuter / ILS): only for residuals that are NOT computable — regalloc and schedule permutations where the answer must be explored. Putting a computable fix into the search is a category error: it burns CPU rediscovering a derivable answer. And per cookbook §60b, raising a search-closer's yield is at least as often about refusing it unreachable work as widening its mutation set.

How to apply: when a draft fails to bank, ask "is this residual computable?" before reaching for agents or the permuter. If yes → a ladder stage (and check whether the logic already exists elsewhere — normalize_self_decls and jtbl auto-isolate both existed in family_sweep/jtbl_family_bank while gate_stage lacked them; R33 says one implementation, two callers). Any ladder stage that mutates SHARED state must undo by snapshot-restore, never an inverse transform, and be verified fleet-wide (R22) — a single-binary gate cannot validate a fleet-wide edit (cookbook §61; it cost 138 broken binaries once). Track the LLM-free fraction and make raising it the objective (docs/hindsight-study.md §7, tools/burndown.py).