diff --git a/config/near_match_negatives.tsv b/config/near_match_negatives.tsv index 1db8977..4f7aca3 100644 --- a/config/near_match_negatives.tsv +++ b/config/near_match_negatives.tsv @@ -24,7 +24,6 @@ 0x8002515C - near-match - 0x80025C08 - near-match - 0x8002622C - near-match - -0x800263A8 - near-match - 0x800266A8 68 near-match byte-replication alloc (first sll register; fresh-context re-spelling 3B; named-locals regresses) 0x8002D014 - near-match - 0x8002D060 72 near-match - @@ -137,15 +136,10 @@ 0x8006F95C - near-match - 0x800FC280 - near-match - 0x800259DC - near-match - -0x8005789C - near-match - 0x800179E0 - near-match - 0x800C1E54 - near-match - -0x800AA01C - near-match - 0x800AAC44 - near-match - 0x8003EB18 - near-match - 0x80012834 - near-match - 0x8007A114 - near-match - 0x800A8AEC - near-match - -0x80057950 - near-match - -0x80057A40 - near-match - -0x80057B30 - near-match - diff --git a/phase-ends/CURRENT_PHASE.md b/phase-ends/CURRENT_PHASE.md new file mode 100644 index 0000000..ed07a93 --- /dev/null +++ b/phase-ends/CURRENT_PHASE.md @@ -0,0 +1,107 @@ +# CURRENT_PHASE — Phase 10: Matching the Remaining Pool (Goal A — tail squeeze) + +**Status:** ACTIVE (P10-T1 complete; P10-T2 ready to dispatch) +**Created:** 2026-09-24 (coordinating session `01a0d302-0201`, after developer approval) +**Plan:** `phase-ends/Phase10_PLAN.md` — approved 2026-09-24, **Goal A: 475 distinct +matched bodies** from the Phase 9 close state of **400** (i.e. **+75 new bodies**), +measured as bodies on the coordinator's clean whole-binary gate. + +## Sessions + +| Role | Short id | Alias | State | +|---|---|---|---| +| **Coordinator** | `01a0d302-0201` | subagent-chat-01a0d302-0201-72d6 | this session | +| Worker A | `01a0d302-18e3` | subagent-chat-01a0d302-18e3-76ec | probed, recruited | +| Worker B | `01a0d302-8a6f` | subagent-chat-01a0d302-8a6f-747c | probed, recruited | +| Worker C | `01a0d302-fad3` | subagent-chat-01a0d302-fad3-758e | probed, recruited | + +All three answered the capability probe (cwd `/media/christopherwilliams/Data/Projects/decomp/Syphon_Filter_3`, +git head `25bf4a3`, worklist 1343 rows, shell yes, `sf3_match`/`sf3_diff`/`sf3_triage`/`sf3_merge` +all executable, ghidra MCP available). None had read `PROJECT_CONTEXT.md`, the digest, the Phase 10 +plan, `PHASE9_PROTOCOL.md` or `MATCHING_COOKBOOK.md` at probe time; `AGENTS.md` was present in each +session only via harness project-instruction injection. Charters are therefore self-contained, per +the Phase 8 protocol. + +## Rulings made this phase (coordinator decisions) + +1. **Roster deviation from the approved plan — developer-approved.** The plan's section 5 specifies + "one coordinator + two workers", but the developer started **three** fresh sessions in this + repository. Asked and answered at P10-T1: **use all three as workers** (Phase 9's proven + three-worker configuration). The deviation and its approval are recorded here and in the ledger. + +## Baseline revalidation (P10-T1) + +Revalidated at head `25bf4a3` (the Phase 9 closure commit), before any Phase 10 change: + +| Check | Result | +|---|---| +| `make check` (test + extents-verify + gate) | exit 0; `regions=409 disagreements=0 result=AGREE`; `c_regions=409 differing_bytes=0 result=MATCH` | +| Rebuilt/original SHA-1 | `e173426c157384ebf1b6caf8c6fea18a85a14af9` (both) | +| Synthetic suite | 229 tests, `OK` | +| Registry | **409 regions / 400 distinct bodies** / 392 symbols | +| Firewall | 0 tracked paths under any prohibited root (506 tracked files) | + +## Worklist state (regenerated at P10-T1) + +``` +listed=1343 +tier_0=0 tier_1=190 tier_2=1151 tier_3=2 +shape: frame=1152 leaf=191 duplicate rows in worklist=0 +excluded_already_registered=409 excluded_bad_extent_start=8 +excluded_degenerate_body=252 excluded_delay_slot_start=5 +excluded_header_entry=0 excluded_low_confidence_grade=90 +excluded_named_exclusion=8 excluded_no_extent=0 +excluded_recorded_negative=115 excluded_trapping_arith=54 +``` + +`excluded_already_registered` equals the registry size (409) — closing-checklist item 5 holds. +The regenerated `config/match_worklist.tsv` is **byte-identical** to the tracked file (no drift). +The named-exclusion count moved 3 → 8 during the Phase 9 close (the primitive-init family +`0x80012A10`/`0x80012AE0`/`0x80012CFC`/`0x80012B20` and the maspsx-blocker row `0x8008A198`), +which explains `listed=1343` against Phase 9's recorded 1342. + +## Negatives index reconciliation (P10-T1) + +Found and fixed one hygiene defect: **6 rows in `config/near_match_negatives.tsv` were already +registered** (`0x800263A8`, `0x8005789C`, `0x800AA01C`, `0x80057950`, `0x80057A40`, `0x80057B30`), +contradicting the index's own header ("Every row is an UNREGISTERED candidate"). Dropped them; +the index now holds **139 rows, 0 registered**. The worklist regenerates byte-identically after +the fix (the `already_registered` exclusion took precedence either way, so this is record hygiene, +not a behaviour change). + +The exclusion arithmetic now reconciles exactly. Of the 139 unregistered negatives: +`recorded_negative=115` + `named_exclusion=7` + `trapping_arith=8` + `bad_extent_start=2` + +`delay_slot_start=1` + 6 with no derived extent (never candidates) = 139, and **0 survive into +the worklist**. + +## Partitions (P10-T1) + +3-way, generated by interleaving worklist ranks (tier mix preserved by construction). Files under +`.run/p10/` (ignored). + +| Partition | Rows | Disjointness | +|---|---|---| +| `.run/p10/worklist-a.tsv` | 448 | pairwise ∩ = 0, 0, 0 | +| `.run/p10/worklist-b.tsv` | 448 | union == the 1343-row worklist | +| `.run/p10/worklist-c.tsv` | 447 | (proved at generation) | + +## Cumulative progress ledger + +| Cycle | New bodies | Total bodies | New regions | Total regions | Result | +|---|---|---|---|---|---| +| (baseline) | — | 400 | — | 409 | green, head `25bf4a3` | + +## Open protocol notes + +- Every negative in the tracked index is absent from the worklist, so the per-partition + "known negatives" list is **empty by construction** this phase — the queue fix is doing its job. + Charters instead carry the *class* exclusions and the named-exclusion addresses. +- Carried rules in force for every charter: `git ls-files --error-unmatch` before any `rm` under + `src/`; the dependent-claim rule; exact symbol-name spelling (the gp marker is name-keyed); + compute-don't-eyeball (lui high halves, gp offsets, two-piece constants); the leading-indicator + rule (a per-batch cluster of sub-8-byte residuals with no new mechanism = band exhaustion); + the three-encoding-trap habit (count right + 1–8 byte residual → diff the ENCODING, not the + mnemonic). +- Budget discipline is measured, not felt: a worker re-flags budget only on two consecutive + zero-match cycles with attempts-per-match quoted, or by quoting its context figure from + `intercom list`. The coordinator holds below the 70–80% cap to protect the gate/merge role. diff --git a/phase-ends/Phase10_PLAN.md b/phase-ends/Phase10_PLAN.md index 1fcf05b..44db8b8 100644 --- a/phase-ends/Phase10_PLAN.md +++ b/phase-ends/Phase10_PLAN.md @@ -1,8 +1,24 @@ # Phase 10 Plan — Matching the Remaining Pool and Closing the Library Boundary -**Status:** DRAFT — requires explicit developer approval before activation. Do not -begin any task until the developer approves this plan. +**Status:** **APPROVED** (2026-09-24) — Goal A with a 475-body milestone and a +70–80% context budget cap. The developer will start fresh sessions for Phase 10; +do not begin Phase 10 execution in the Phase 9 session. **Prepared:** 2026-09-24, immediately after Phase 9 closure (400/500 bodies). +**Approved decisions (developer, 2026-09-24):** + +1. **Goal:** A — tail squeeze. Milestone: **475 distinct bodies** (from 400). +2. **Budget cap:** sessions run to **70–80% context**, then stop matching and + hand off cleanly (measured, quoted from `intercom list`). The coordinator + stays within the same cap for its gate/merge/ledger role. +3. **Sessions:** the developer starts new sessions for Phase 10; the protocol's + capability probe is run before any charter, and recruited ids are recorded + in the Phase 10 ledger. +4. **Structural work:** deferred (Goal B is not active); the blocked classes + remain excluded. Harness-limitation decisions stay developer-owned if a + worker hits them. + +The milestone is stated precisely and measured: **475 bodies on the clean +whole-binary gate**, never "keep matching". **Carried forward from Phase 9:** the tier-2 pivot, the family-set lever, the class exclusions, the hardened merge flow, the three-encoding-trap habit, and the honest pool analysis below. @@ -34,21 +50,19 @@ out of scope and recording why. ## 1. Goal -Either (developer chooses): +**Goal A — tail squeeze, approved.** Reach **475 distinct matched bodies** from +the Phase 9 close state of 400 (i.e. **+75 new bodies**) by matching the +remaining non-blocked pool, concentrating on the tier-2 frame band, the +family-set lever against registered callee targets, and the fresh low-size +tier-1 leaves that carry named levers. The milestone is measured as bodies on +the coordinator's clean whole-binary gate, never as "keep matching". -- **Goal A (tail squeeze):** reach **450–475 distinct bodies** by matching the - non-blocked remainder at the measured tier-2/leaf boundary, concentrating on - the family-set lever and the fresh-band volume; or -- **Goal B (library boundary):** close the **trapping-arithmetic class** and the - **rare-epilogue class** by identifying the actual compiler/source story for - them (the plausible candidates are Sony/SN toolchain or a different PsyQ - build), which — if confirmed — re-opens hundreds of rows at once; or -- **Goal C (hybrid):** A as the primary throughput, B as the bounded - investigation (Phase 9's P9-T5 style), with the explicit understanding that - B's success is the only route past ~475 under the current toolchain. - -The milestone is stated precisely and measured (bodies on the clean whole- -binary gate), never as "keep matching". +Goals B (the library-boundary investigation) and C (hybrid) are **deferred, not +cancelled**: the blocked classes (trapping arithmetic, rare-epilogue, +primitive-init) stay excluded under the current toolchain, and the harness +limitations (`0x8008A198` maspsx load-delay, the maspsx/`move` mutual exclusion) +stay developer-owned. A future phase may pick up Goal B; Phase 10 is the tail +squeeze only. ## 2. The carried machinery (do not re-derive; verify before relying) @@ -98,11 +112,16 @@ binary gate), never as "keep matching". | `0x8008A198` maspsx load-delay | blocked, excluded | newer pinned maspsx or a tracked post-pass — developer-owned | | GTE loader allocation (`0x80102FE4` family) | load-use-nop, allocation-pinning untried | register-binding lever named but failed on the counter case; pointer-live-range variant untried | -## 5. Structure — coordinator + workers, scaled down or up +## 5. Structure — coordinator + workers, fresh sessions -- **Session count:** depends on Goal. A/C hybrid wants one coordinator + two - workers (fresh context beats exhausted context — Phase 9's strongest lesson); - a pure B investigation needs only the coordinator + one investigator. +- **Session count (approved Goal A):** one coordinator + **two workers**, all + fresh sessions started by the developer. Fresh context beats exhausted + context — Phase 9's strongest lesson. +- **Budget cap (approved):** every session — workers AND the coordinator — + stops matching at **70–80% context** and hands off cleanly, measured and + quoted from `intercom list`, never felt. The coordinator's gate/merge/ledger + role is the one that cannot be delegated, so the coordinator holds below the + cap and absorbs only until its own budget is at risk. - The Phase 8/9 protocol applies verbatim (roles, hard rules, staging formats, merge workflow, per-cycle verification). Phase 9's additions — 3-way partition regeneration per merge, the negatives import, the request-file @@ -121,12 +140,20 @@ binary gate), never as "keep matching". | Every 3rd merge | `make clean && make all`, cmp, SHA-1, registry audit, `git status --short src/`, firewall count | | Phase close | full clean gates, worklist regen with `excluded_already_registered` = registry size, negatives metadata extracted, milestone confirmation requested | -## 7. Explicit decisions needed from the developer before activation +## 7. Decisions — RESOLVED by the developer (2026-09-24) -1. **Goal choice (A / B / C)** and the milestone number (450 / 475 / class-closed - definitions). -2. **The harness-limitation questions** if Goal B is chosen: whether a per-region - transform (post-pass emitting the trapping encodings, or suppressing +1. **Goal: A (tail squeeze). Milestone: 475 distinct bodies** (from 400). +2. **Harness-limitation questions: not active.** Goal B is deferred; the + trapping/rare-epilogue/primitive-init classes stay excluded under the + current toolchain, and a worker that independently hits a harness + limitation reports it rather than working around it — any per-region + transform remains a developer decision. +3. **Session budget: fresh sessions, 70–80% context cap** for workers and the + coordinator alike; the protocol's capability probe runs before any charter + and recruited ids go in the Phase 10 ledger. +4. **Scoring honesty: confirmed.** The milestone is bodies on the clean + whole-binary gate; a classified-but-not-matched residual counts as a + recorded negative, not progress. maspsx's jump-slot nop) is acceptable as a documented convention, or whether the classes stay excluded as "different-compiler evidence" — this is the Phase 8-era inline-asm-style decision, and it is the developer's call, not