From 4d5bee0be88d3aaca477ee03f5038f3e541a2f30 Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Thu, 30 Jul 2026 20:17:15 -0600 Subject: [PATCH] =?UTF-8?q?fix(phase-30):=20T4=20=E2=80=94=202=20'Phase-22?= =?UTF-8?q?=20grinder=20bugs'=20verified=20STALE=20(already=20fixed);=20re?= =?UTF-8?q?al=20fixes:=20asm=5Fsubdir=5Ffor=20derives=20from=20corpus=20(R?= =?UTF-8?q?33),=20--fix-def-sig=20help=20carries=20the=20=C2=A7119=20warni?= =?UTF-8?q?ng?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Verified against code rather than the ledger: the split-blind lookup globs */ correctly, and the churn was fixed by T5's input-signature gating. Both struck. asm_subdir_for was still a parallel oracle (silent g[0] on multi-match) -> now corpus.asm_path. --fix-def-sig defaults off correctly but advertised 'Byte-neutral; gate arbitrates' — the claim T84 refuted (signedness-wrong header decl over a byte-correct draft; 137 members held at 0 until the flag was dropped). A defect ledger nobody re-verifies decays into busywork — verify before scheduling. --- phase-ends/CURRENT_PHASE.md | 17 +++++++++++++++++ tools/family_sweep.py | 11 ++++++++--- tools/grinder.py | 13 +++++++++---- 3 files changed, 34 insertions(+), 7 deletions(-) diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 53c61f830..49a273c2b 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -109,6 +109,23 @@ the T2 log entries; check both background tasks' outcomes first (`git log` for t ## Per-task log +### T4 (partial) ✅ — the two "Phase-22 grinder bugs" are STALE carry items; the real fixes were elsewhere +Verified against the code, not the list (R14 on our own defect ledger): +- **"split-file-blind lookup" — ALREADY FIXED.** `asm_subdir_for` globs `nonmatchings/*/` which + matches every split; verified on a `_jr_` fn, an `_o0` fn, and an absent fn. Struck. +- **"churn-without-blacklist" — ALREADY FIXED.** The blind `tried.clear()` was replaced by + input-signature gating in the T5 targeting work (re-open only fns whose draft mtime/closeness + changed), and the blacklist exists. Struck. +- **Real fix taken instead (R33):** `asm_subdir_for` was a PARALLEL implementation of + `corpus.asm_path` that silently took `g[0]` on multiple matches — now derived from the oracle. +- **`--fix-def-sig` posture:** flag correctly defaults OFF, but its help still advertised + "Byte-neutral; gate arbitrates" — the exact claim T84 refuted (it imposed a signedness-wrong + header decl over a byte-correct draft, `slti`/`sltiu`, and held 137 members at 0 until DROPPED). + Help now carries the §119 warning. **The posture was right; the documentation was the defect.** +**Lesson for the phase close:** the carried-defect list had 2 of its entries already fixed. A +defect ledger nobody re-verifies decays into busywork — verify before scheduling (R35's sequencing +applied to the backlog of *our own* bugs). + ### T3 wave 1 (Ultracode, 14 agents, 1.20M tok) — 14/14 match_one MATCH → **8/14 BANKED**; the gate's propagation TIMEOUT left the fleet half-written (caught, reverted, tool fixed) **The wave:** 14 fresh reach-138 cores in ov_SC01_077 (117,162 gain-ins in play), one agent each, drafting against the §31 map + cookbook with `match_one`/`rtu_match` self-verification. **All 14 diff --git a/tools/family_sweep.py b/tools/family_sweep.py index e3c492488..0ebc95f5d 100644 --- a/tools/family_sweep.py +++ b/tools/family_sweep.py @@ -770,9 +770,14 @@ def main(): "(they normally need tools/jtbl_family_bank.py). The whole-binary byte-gate stays " "the sole arbiter, but expect ~0%% — and do NOT read that 0%% as a wall.") ap.add_argument("--fix-def-sig", action="store_true", - help="T6: rewrite each member draft's DEF signature to the shared-header (engine_core.h) " - "canonical decl, so a member forward-declared there with a different sig (e.g. s32* vs " - "void*) stops throwing `conflicting types` and compiles. Byte-neutral; gate arbitrates.") + help="A REPAIR, NOT A DEFAULT (§119, T84 — do not pass it routinely). Rewrites each member " + "draft's DEF signature to the shared-header (engine_core.h) canonical decl, so a member " + "forward-declared there with a DIFFERENT sig (e.g. s32* vs void*) stops throwing " + "`conflicting types`. It is a repair for drafts whose def contradicts a CORRECT header, " + "and a BREAKER for drafts whose def is right and the header is wrong: on 0x80161c98 it " + "imposed a signedness-wrong `s32 a1` over the true `u32`, turning a byte-correct draft " + "into a 1-instruction DIFF (slti vs sltiu) and holding 137 members at 0 until the flag " + "was DROPPED. Use only after a member fails on a def-vs-header conflict you have read.") ap.add_argument("--reconcile", default=None, metavar="RAWDIR", help="M2 def-side-wall path: per (exemplar,sibling), symbol-remap the RAW draft in RAWDIR " "then canon_sig_reconcile against the sibling TU (Q5-proven). Implies --no-preclassify.") diff --git a/tools/grinder.py b/tools/grinder.py index e02523bc0..324a1ce18 100644 --- a/tools/grinder.py +++ b/tools/grinder.py @@ -18,7 +18,7 @@ Usage: grinder.py [--permute-secs 120] [-j 14] [--batch 10] [--max-nins 220] """ import argparse, glob, json, os, shutil, subprocess, sys, time sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) -import p16_permute, gate_stage, backlog, autopsy +import p16_permute, gate_stage, backlog, autopsy, corpus REPO = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) AUTODIR = ".run/auto" @@ -74,9 +74,14 @@ def log(m): def asm_subdir_for(binary, fn): - """the asm subdir holding binary's .s (main or _a/_o0 split); None if absent.""" - g = glob.glob(os.path.join(REPO, f"asm/{binary}/nonmatchings/*/{fn}.s")) - return os.path.dirname(os.path.relpath(g[0], REPO)) if g else None + """the asm subdir holding binary's .s (main or any _a/_o0/_jr split); None if absent. + + DERIVED from corpus.asm_path (R33) instead of a second glob implementation. The glob was not + split-BLIND (the `*` matches every subdir — the Phase-22 'split-file-blind lookup' carry item is + STALE, verified P30 T4), but it was a parallel oracle that silently took g[0] when several + matched, and a parallel oracle is the defect class corpus.py exists to retire.""" + p = corpus.asm_path(binary, fn) + return os.path.dirname(os.path.relpath(p, REPO)) if p and os.path.exists(p) else None def heartbeat(state, current=None, banked=0, fp=None):