phase10: P10-T1 — control records, baseline revalidation, negatives reconciliation, partitions

- Phase10_PLAN.md status DRAFT -> APPROVED (Goal A, 475 bodies, 70-80% ctx cap)
- phase-ends/CURRENT_PHASE.md: Phase 10 control record
- config/near_match_negatives.tsv: drop 6 rows that were already registered
  (index header says every row is UNREGISTERED); index 145 -> 139 rows, 0 registered.
  Worklist regenerates byte-identically after the fix.
- Baseline revalidated at 25bf4a3: make check exit 0, regions=409 disagreements=0
  AGREE, c_regions=409 differing_bytes=0 MATCH, 229 tests OK, SHA-1 stable.
- Worklist regen: listed=1343, excluded_already_registered=409 (= registry size).
- 3-way partitions in .run/p10 (448/448/447, pairwise intersection 0, union == worklist).
- Roster deviation recorded and developer-approved: 3 workers, not the plan's 2.
This commit is contained in:
Christopher Williams
2026-09-24 06:48:00 -04:00
parent 25bf4a30ec
commit 0557281ed4
3 changed files with 159 additions and 31 deletions
-6
View File
@@ -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 -
1 # Syphon Filter 3 (USA) open negatives index.
24 0x8002515C
25 0x80025C08
26 0x8002622C
0x800263A8
27 0x800266A8
28 0x8002D014
29 0x8002D060
136 0x8006F95C
137 0x800FC280
138 0x800259DC
0x8005789C
139 0x800179E0
140 0x800C1E54
0x800AA01C
141 0x800AAC44
142 0x8003EB18
143 0x80012834
144 0x8007A114
145 0x800A8AEC
0x80057950
0x80057A40
0x80057B30
+107
View File
@@ -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.
+52 -25
View File
@@ -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