From 65e96e5d5a9900caef6dac2a44e224289361fcea Mon Sep 17 00:00:00 2001 From: Drew T <50529377+Druthulu@users.noreply.github.com> Date: Wed, 15 Jul 2026 22:37:19 -0600 Subject: [PATCH] =?UTF-8?q?feat(phase-28=20T2):=20purge=20the=20poisoned?= =?UTF-8?q?=20grinder=20blacklist=20=E2=80=94=208=20of=20its=2022=20had=20?= =?UTF-8?q?MATCHED=20anyway?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The blacklist recorded "permuter won, byte-gate rejected => plumbing-bound, never re-permute" for 22 fns. It was manufactured by a gate that no longer exists. - R14 ON THE PREMISE, TWICE (before touching anything): * The roadmap's two named grinder bugs are ALREADY FIXED (commit:0327, commit:0200) — stale line. * docs/tooling-audit.md:933-937 DOWNGRADED ITS OWN FINDING with three corrections: the prescribed fix is a NO-OP (deleting the scanner banks zero fns — harvest_verify was single-TU BY CONSTRUCTION, the defect was mislocalized to it); nothing is being discarded now (grinder STOPPED since 2026-07-02 — confirmed via .run/auto/STOP); queue magnitude inflated (1252, not 1298). T2's only real content was the persisted artifact. - AND THE AUDIT'S SNAPSHOT IS ITSELF STALE (verified in code): harvest_verify is now fully multi-TU — _stubs derives every stub across every TU from the corpus oracle (:122), render() splices "each draft into the TU that actually holds its stub", _write() writes multiple paths, un-stubbed drafts are REPORTED not silently dropped (R32). The gate that manufactured the blacklist is gone. No harvest_verify change was needed or made. - THE PROOF IT WAS MANUFACTURED, NOT OBSERVED: of the 22 entries, 8 have since MATCHED anyway (func_80131D68/80149374/8014FE60/80150528/8016BBE0/80171C64/80174684/8017F290); the other 14 are still stubs and would have been skipped FOREVER on a dead gate's verdict. (16 of 22 were split-hosted, so harvest_verify never compiled them — the permuter's byte-matches were discarded UNBUILT. The audit predicted 5 matched-anyway; it is 8.) - DONE: blacklist -> [] (poisoned copy preserved at grinder_blacklist.json.poisoned-pre-T2); grinder.py now carries the RULE (R35): a blacklist entry is a verdict from a SPECIFIC GATE and EXPIRES when that gate changes — purge and re-derive from the fixed gate, never inherit. A persisted negative verdict is only as good as the instrument that produced it. - No byte claim (analysis tooling + a scratch artifact only) -> no R22 cycle owed. --- phase-ends/CURRENT_PHASE.md | 8 +++++++- tools/grinder.py | 12 ++++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md index 750552185..56764f42c 100644 --- a/phase-ends/CURRENT_PHASE.md +++ b/phase-ends/CURRENT_PHASE.md @@ -40,7 +40,7 @@ Two further roadmap premises are stale (verified): the **parallel gate farm alre - Add `jtbl_` to `symbol_map`'s keys, belt-and-braces, on the file's own documented rationale. - Re-probe via `tools/jtbl_family_bank.py` (carve ladder `raw→scoped→recovered→reconciled`, `:116-193`) — **not** `family_sweep` (no carve step). `--raw` first (a reconciled body is TU-specific and poisons the template). - Bounded ~8 members, byte-gated, R22-clean. **Either outcome is the deliverable.** Correct `calibration.md` + `decision-log.md` (R31) in-session (R30). -- [ ] **T2 — Purge the poisoned grinder blacklist** · xHigh (small) +- [x] **T2 — Purge the poisoned grinder blacklist** · xHigh · ✅ purged (8 of 22 had MATCHED anyway) - 22 permanent never-retry entries built from a known-broken gate (`tooling-audit.md:927-931`: 16/22 never compiled, 5 absent); `worklist.md:50,56` marks two of them **"none — MATCH"**. Purge; fix `harvest_verify`'s `--src`/`--asm-subdir` split coupling that poisoned it; re-derive only from the fixed gate. - [ ] **T3 — The stratified templatability re-probe: THE swing number** · Max · 🚩 **milestone report to Drew** · blocked by T0,T1 - Strata: **PURE non-jr** (96 fam / 7,148 members) · **IMM** (35 fam, `imm_map_tier1`) · **MIXED** (30 fam). ~8–12 members/class, byte-gated, R22-clean. @@ -113,5 +113,11 @@ Whole-binary byte-gate = sole arbiter (G3/P9) · R22 clean-fleet per banked batc - **The comparison that matters:** this is the family recorded as **0/8 → "≈0%, structural families do not template"** — the number that rewrote P29's arithmetic. Run with the carve its own exemplar required: **88.7%**. - **Scope (P9, unchanged):** still **n=1 family**, and jr is the rarest class (3/163). This demonstrates the mechanism at family scale; it does **not** give a rate for the PURE/IMM mass (98% of the population). **T3 is the swing number.** +- **2026-07-15 — T2 ✅ blacklist purged; the tool fix was already in, the audit's own premise was stale.** + - **R14 on the premise first (twice):** (1) the roadmap's two named grinder bugs are **already fixed** (`commit:0327`, `commit:0200`) — stale line. (2) `docs/tooling-audit.md:933-937` **downgraded its own finding** with three corrections: *the prescribed fix is a NO-OP* (deleting the scanner banks zero fns; harvest_verify was single-TU **by construction**, the defect was mislocalized), *nothing is being discarded now* (grinder STOPPED since 2026-07-02 — confirmed, `.run/auto/STOP`), and *the queue magnitude was inflated* (1252, not 1298). So T2's only real content was the **realized-and-persisted** artifact. + - **And the audit's snapshot is itself now stale (verified in code):** `harvest_verify` is **fully multi-TU** today — `_stubs` derives every stub across every TU from the `corpus` oracle (`:122`), `render()` splices "each draft into the TU that actually holds its stub", `_write()` writes multiple paths, un-stubbed drafts are "REPORTED, never silently dropped (R32)". **The gate that manufactured the blacklist no longer exists.** + - **The proof the verdict was manufactured, not observed:** of the 22 entries — recorded as "permuter won, gate rejected ⇒ plumbing-bound, never re-permute" — **8 have since MATCHED anyway** (`func_80131D68/80149374/8014FE60/80150528/8016BBE0/80171C64/80174684/8017F290`); the other **14 are still stubs** and would have been skipped **forever** on a verdict from a gate that no longer exists. (The audit predicted 5 such; it is 8.) + - **Done:** blacklist → `[]` (poisoned copy kept at `.run/auto/grinder_blacklist.json.poisoned-pre-T2`); `grinder.py` carries the **rule** (R35): *a blacklist entry is a verdict from a specific gate and EXPIRES when that gate changes — purge and re-derive; never inherit.* No `harvest_verify` change was needed or made. + - **T3 strata (honest, from the fixed map):** SC07-only **1,255 fam / 6,268 mem / 230,612 ins** · legacy PURE non-jr **95 / 7,993 / 478,379** · legacy IMM **36 / 6,644 / 212,707** · legacy MIXED **30 / 968 / 10,462** · legacy PURE w/ jr **2 / 16 / 5,088** (T1's jtbl territory — note B2's family is far smaller here than the roadmap's "×112 ≈ 106k ins"; T1 re-derives it). **Total addressable = 937,248 ins = 21.7% of all remaining weight = 7.16pp of fleet instr if it all banked.** This is the prize the roadmap declared dead. It stays a prediction until T3's gate. diff --git a/tools/grinder.py b/tools/grinder.py index 241c89d1c..f7175c83a 100644 --- a/tools/grinder.py +++ b/tools/grinder.py @@ -26,6 +26,18 @@ STOP = f"{AUTODIR}/STOP" HB = f"{AUTODIR}/grinder_heartbeat.json" DRAFTS = f"{AUTODIR}/grinder_drafts" BLACKLIST = f"{AUTODIR}/grinder_blacklist.json" # fns the permuter wins but the byte-gate rejects = plumbing-bound; never re-permute +# A BLACKLIST ENTRY IS A VERDICT FROM A SPECIFIC GATE, AND IT EXPIRES WHEN THAT GATE CHANGES. +# Purged 2026-07-15 (Phase-28 T2). The 22 entries were recorded when harvest_verify was single-TU: it +# spliced only into `src//.c`, so a SPLIT-hosted fn's stub literal was never found, the draft +# was never compiled, and the permuter's byte-match was discarded UNBUILT — which this file then recorded +# permanently as "plumbing-bound, never re-permute". 16 of 22 were split-hosted (docs/tooling-audit.md +# :931). The proof it was manufactured, not observed: **8 of the 22 have since MATCHED anyway** +# (func_80131D68/80149374/8014FE60/80150528/8016BBE0/80171C64/80174684/8017F290), and the other 14 would +# have been skipped forever on a verdict from a gate that no longer exists. harvest_verify now derives +# each stub's home TU from the corpus oracle and splices into whichever TU holds it (:122, render()), so +# the mechanism that manufactured these is gone. +# RULE (R35): when the gate changes, purge this file — a persisted negative verdict is only as good as the +# instrument that produced it. Re-derive from the fixed gate; never inherit. def stop_requested():