# MAKER round 9 — behavioral MERGED validation (the last scoring hole), closed + measured **Date:** 2026-07-02. **Work order:** close the MERGED-claim scoring hole (maker-r8 §5 / breaker-r7): the harness graded a `kind=merged` claim by NAME-MATCH with no subspace check, so a launderer that null-names every clause-indexed pair merged banked free credit — the only route leaving `distill_verify` technically positive. **Code (canonical, source of truth):** `night8/harness/{scoring.py, nulls.py, selftest.py}` (artifact.py unchanged). Board driver + merged-name-flood champion in `night8/maker_r9/`; `distill_verify/dv.py` given a matched-launderer merged move. **Selftest:** `harness/selftest.py` **19/19** — the 16 prior tests kept verbatim + green, plus (xvi) name-only/garbage merged → 0, (xvii) honest merged passes (1)+(2) → credit, (xviii) merged on a genuinely-separable pair → fails part (2) → 0. **Box:** `4l:/workspace/HOME/guest/night8/maker_r9/` (v2, 209 s, GPU 0) and `.../maker_r8_v1/` overlaid with the r9 harness (v1). selftest 19/19 in each. --- ## HEADLINE **After r9, there is NO zero-understanding path to a positive CI-clearing premium on ANY board. The loop has reached a fixed point.** `distill_verify` — the program's only ever-positive candidate — has premium **+0.000, CI95 [−0.167, +0.222], NOT headline-eligible** against the corrected basis once that basis prices the A1 launderer's merged move. Its single surviving behavioral merged pass (`obj_first+obj_second`) is **replicated exactly, sym-accuracy 0.802 vs 0.802, by the zero-understanding matched launderer `distill_launder`** (same surface↔decode co-occurrence mining, no verify step). P9 UNMET, now airtight. | board | best zero-understanding-reachable premium | CI95 | headline? | P9 | |---|---|---|:--:|:--:| | **v2-dz64** | distill_verify **+0.000** vs basis_full+ | [−0.167,+0.222] | no | UNMET | | **v1-dz64** | distill_verify (no merged certs; unchanged from r8) | CI through 0 | no | UNMET | --- ## THE FIX — behavioral MERGED validation (`scoring.merged_behavioral_verdict`) A MERGED certificate asserts two DGP factors A,B are ENTANGLED in z: an order-SYMMETRIC function of them is present, but the clause-indexed components are NOT separately recoverable. r9 replaces the free name-match with a two-part behavioral test the CLAIM's shared subspace must pass on held-out items, graded like a positive axis (commit·accuracy vs the random+margin floor): 1. **SYMMETRIC-PRESENT.** The claimed directions must PREDICT an order-symmetric function of {A,B} above the dimension-matched-random + margin floor. The target is the order-invariant **median-split multiset** of the pair (each component median-split lo/hi, then the SORTED bin pair → ≤3 classes {lo-lo, lo-hi, hi-hi}) — precisely the {min,max}-style structure a MERGED cert says is kept. Cannot read it ⇒ no merged structure there ⇒ 0. 2. **CLAUSE-INSEPARABLE.** The directions must FAIL to recover the ANTISYMMETRIC clause-order bit (among strictly-ordered items, "did clause 1 hold the smaller value") beyond its floor. Recover it ⇒ the subspace SEPARATES A from B ⇒ the pair is not merged (two present features / a hallucination) ⇒ 0. **CORRECT iff (1) AND NOT (2); anything else scores 0** (abstain-equivalent, no penalty). Component values and the symmetric/order labels are derived by the harness from the private eval labels (the same privilege the validator already has for present axes); the claim never sees them. Rule + rationale documented in the block comment above `merged_behavioral_verdict` in scoring.py, and indexed in the module docstring ("New in maker r9"). **Basis completion (nulls.py + dv.py).** The symmetric multiset is SURFACE/DECODE-mineable with zero understanding, so the corrected basis must price it: - `input_surface_mining_null(claim_merged=True)` now attaches, per pair, the best SURFACE-mined order-symmetric shared subspace (min/max/sum/absdiff of the input number tokens; sorted name/content/**object-after-number** pairs), with the pair's true-label multiset used ONLY to attribute the best column (the documented input-surface-mining privilege). - `DistillLaunder` (the A1 launderer, dv.py) now makes distill_verify's OWN merged move WITHOUT the verify gate: the identical min/max/sum/absdiff/sorted-pair/**decode-co-occurrence-mapped-pair** miner, column chosen by self-consistency (no private labels). It is folded into the premium basis (`basis_full+`). --- ## RE-SCORE — distill_verify + launderers, before → after (v2, real harness) ### Behavioral MERGED verdicts (6 000 held-out items, decorrelated eval) | party | count_first+second | obj_first+second | verb_first+second | |---|---|---|---| | **distill_verify** | abstain (sym .774<.844) | **CORRECT (sym .802>.793)** | abstain (not claimed) | | **distill_launder** (A1 twin, no verify) | abstain (sym .814<.844) | **CORRECT (sym .802>.793)** | abstain (sym .365) | | input_surface_mining+ | abstain (.834<.844) | abstain (.568<.793) | abstain (.375) | | **champ_merged_name_flood** (garbage dirs) | abstain (.326) | abstain (.334) | abstain (.293) | | supervised_ridge / distill_launder(sep) | wrong (claims components separate) | — | — | Two findings: (a) the garbage/name-only merged flood scores **0 on every pair** — the free name-match is gone; (b) distill_verify's ONLY merged pass, obj, is matched byte-for-byte (sym 0.802) by the zero-understanding A1 launderer — it is a surface↔decode co-occurrence read (object token → decoded category taxonomy = the category multiset), not understanding. ### distill_verify premium vs the bases | basis | premium | CI95 | headline-eligible? | |---|---:|---:|:--:| | decoder_readout (old, broken) | +0.583 | [+0.208,+1.028] | YES (broken basis) | | basis_min = MAX{decoder, ISM} | +0.194 | [−0.014,+0.431] | no | | basis_full = MAX{decoder, ISM+} | +0.111 | [−0.057,+0.333] | no | | **basis_full+ = MAX{decoder, ISM+, distill_launder(merged)}** | **+0.000** | **[−0.167,+0.222]** | **no** | The residual +0.111 vs basis_full is entirely the obj-merged (+1 for distill_verify, 0 for the input-only ISM+ null which cannot reach the decode taxonomy). Once the basis includes the matched A1 launderer's merged move — which reaches the identical subspace with zero understanding — the premium is **exactly +0.000**. distill_verify's "verify" step buys nothing a launderer cannot; P9 UNMET, airtight. --- ## REGRESSION (v2, real harness) | row | verdict | |---|---| | **champ_merged_name_flood** (NEW, garbage-dir merged flood) | all 3 merged → abstain (0); final **+0.000**, INELIGIBLE_LOW_COVERAGE; premium vs basis_full+ **−0.472** [−0.681,−0.292]. The name-match is dead. | | champ_A1b (r7 selective-surface champion) | final +0.375; premium vs basis_full+ **−0.097** [−0.292,+0.097] — non-headline | | null:distill_launder (A1) | final −1.251; premium vs every basis deeply negative (−1.6) | | honest ref sae_topk_mlp | final −0.181; premium vs basis_min −0.458 — correctly no premium | | honest refs (v1) diff_means / ica / sae / kmeans | ≤ 0 vs bases (v1 run, unchanged from r8 — no merged certs) | Board eligibility unchanged: v2 HEADLINE_ELIGIBLE (nothing to headline). --- ## v1 — no MERGED certificates → behavioral validation is a no-op The v1-dz64 key has **0 MERGED certificates** and offers no clause-indexed X_first/X_second pairs, so `merged_behavioral_verdict` never fires and the null merged moves emit nothing. The r9 harness is a strict no-op on v1; numbers match r8. Verified by re-running the v1 board on the r9 harness (selftest 19/19 in the v1 stack): distill_verify premium **−0.083 [−0.367,+0.183]** vs basis_min, **−0.133 [−0.400,+0.133]** vs basis_full (both CI through 0, non-headline) — byte-identical to r8. --- ## FIXED POINT — is there ANY zero-understanding positive CI-clearing premium? **No, on any board.** The three previously-identified launder routes are all closed and each scores 0/flagged: - **input-surface / decode reading** (breaker-r7) → priced by the input-surface and decoder nulls (basis_min/basis_full). - **probe-failure absence** → down-weighted (ABSENCE_CREDIT_WEIGHT) and priced. - **MERGED name-match** (this round) → replaced by the behavioral test; a name/garbage merged flood scores 0. The only behavioral merged pass anyone achieves (distill_verify / distill_launder obj-merged) is a zero-understanding surface↔decode co-occurrence read, priced by the matched launderer → net premium +0.000, CI through 0. Every technique on every board is non-headline against the corrected basis. **The TRACE loop has reached a fixed point: no zero-understanding strategy clears its CI as a positive premium.** --- ## Honest remaining holes for r10 1. **The merged behavioral test is intentionally strict (median-split multiset + 0.5 margin over a dimension-matched-random JL baseline).** On v2 it credits only obj (sym 0.80); count (sym 0.77–0.83) and verb (0.37) fall below threshold for everyone — uniformly applied, so fair, but a genuinely-merged structure whose symmetric read sits at 0.77–0.84 is demoted from the validatable set (the same uniform consequence as count_max's r8 demotion). r10 could tier the merged symmetric target (min-only / max-only / sum) rather than the single median-split multiset, if a finer merged certificate is wanted — but only with a matching null, or the hole reopens. 2. **basis choice for the merged move relies on the A1 launderer being in the basis.** basis_full+ (with distill_launder's merged) is the airtight one; basis_full (input-surface only) leaves +0.111 because a pure input-reader cannot mine the decode co-occurrence taxonomy. r10 should canonise the null set so the "strongest zero-understanding merged move" (surface AND decode-co-occurrence) is a first-class basis null, not carried by distill_launder. 3. **Merged verdicts are held FIXED in the premium bootstrap** (the item bootstrap resamples present axes; the certificate bootstrap resamples the merged certs). Bootstrapping the merged threshold decision per resample would tighten the CI attribution but is second-order. 4. **True-label attribution privilege** (input-surface / launderer merged move uses true labels only to pick which surface column to attach) — inherited from r8's ISM null; conservative for P9 but worth a name-only-heuristic hardening. 5. Single seed / organism, bootstrap approximation (per r6/r7, unchanged). --- ## Files Local (canonical, edited): `night8/harness/{scoring.py, nulls.py, selftest.py}`, `night8/distill_verify/dv.py`; driver + champion `night8/maker_r9/{run_r9_v2.py, champions_r9.py, MAKER_R9_REPORT.md, results/*}`. Box: `4l:/workspace/HOME/guest/night8/maker_r9/` (v2 stack + r9 harness, selftest 19/19) and `.../maker_r8_v1/` (v1 stack overlaid with r9 harness, selftest 19/19).