From 7ab346687872642ce107d6e2820e1e89935c0b8e Mon Sep 17 00:00:00 2001 From: leetcrypt Date: Tue, 21 Jul 2026 19:48:55 -0700 Subject: [PATCH] =?UTF-8?q?RQ2-P3:=20re-word=20=C2=A77=20calibration=20gat?= =?UTF-8?q?e=20(naive=E2=86=92mechanical=20mix),=20re-run=20GREEN?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Operator ruling (Andre, 2026-07-21): the STOP was correct and the diagnosis right — §7 items 1-2 did not fail because the instrument is broken, but because they were worded under the naive-funnel prior. Under the ratified posterior the pool is a MIX (shared bridge → shared exit_signature → larger anonymity set → higher H). Corrected pre-freeze, logged transparently (no HARKing). - rq2p3-mechanism-prereg.md §7: item 1 re-anchored on the FROZEN bridge-federated branch (injective fresh-bridge → m_i=1 → H≈0, constant c=1/C — a pool draws with replacement so it cannot reproduce the zero-variance degeneracy); item 2 B=1 → c=1.0 AND high H (maximal mix, "low H" refuted by construction); added a §7 scope note (the gate validates the INSTRUMENT and must NOT pre-assert the H-vs-c sign — that stays the two-sided confirmatory question H1/H2). Confirmatory hypotheses unchanged. - docs/stage-05-rq2p3-gate-clarification.md: dated deviation-rationale log (cites the dry-pass output, no number invented; records the two-sided direction-agnostic pre-commitment is untouched; the mix ρ 0→+0.838 is an exploratory finding that strengthens note-unique-bridge-artifact.md). - rq2p3_calibration.py: item-1 teeth moved to frozen_branch_regression() on the untouched bridge-federated branch; item-2 now asserts c=1.0 AND high H; added all_pass aggregate. confirm.py/stats.py/confirm_load_rq2.py untouched. Re-run: all four gate items PASS with real teeth (all_pass=True). Synthetic/DRY only, no confirmatory record read. FREEZE STAYS A HUMAN GATE: §10 empty, no confirmatory RQ2-P3 cell until operator records the SHA-256 + signs off. Lead prereg SHA f22331a72e... untouched; worktree-only. Co-Authored-By: Claude Opus 4.6 --- OVERSEER-STATUS.md | 29 +++--- cmd_chat/sor/analysis/rq2p3_calibration.py | 114 +++++++++++++++------ docs/rq2p3-mechanism-prereg.md | 32 +++++- docs/stage-05-rq2p3-gate-clarification.md | 72 +++++++++++++ 4 files changed, 203 insertions(+), 44 deletions(-) create mode 100644 docs/stage-05-rq2p3-gate-clarification.md diff --git a/OVERSEER-STATUS.md b/OVERSEER-STATUS.md index e965760..b5dd218 100644 --- a/OVERSEER-STATUS.md +++ b/OVERSEER-STATUS.md @@ -1,17 +1,19 @@ # OVERSEER-STATUS — sor-consent build agent -> **NEEDS-OPERATOR (2026-07-21, RQ2-P3 mechanism instrument):** the `bridge-federated-pool` -> instrument is BUILT + synthetic-tested (9 tests) + the §7 calibration gate was RUN. Items **3 -> (monotonicity) and 4 (entropy) PASS**; items **1 and 2 do NOT hold as their naive-funnel text is -> worded** — because the *ratified* posterior mechanically yields a **MIX** (ρ>0), not the naive -> funnel. Item-1 anchor B=50,α=0 gives ρ=**+0.838** (stdev 0.0198), NOT the ρ-undefined zero-variance -> degeneracy §7 expected; item-2 B=1 gives concentration c=1.0 (✓) but H=**2.54 bits HIGH** vs the -> fresh-bridge reference 0.0 bits, contradicting the "low H" gloss. Every ρ across the whole -> B∈{2,4,8}×α∈{0,1,2} sweep is ≥0 (0.00→0.838): a robust mix everywhere. This is exactly -> `docs/note-unique-bridge-artifact.md`'s prediction, surfaced early at calibration — NOT an -> instrument bug. **STOPPED per rail:** no confirmatory RQ2-P3 battery, no prereg freeze. Operator -> must decide: re-word `rq2p3-mechanism-prereg.md` §7 gate items 1–2 (naive→mechanical) before -> freezing, or rule otherwise. Lead prereg SHA f22331a72e… UNTOUCHED; worktree-only. +> **RQ2-P3 gate RE-WORDED + RE-RUN GREEN — awaiting human freeze sign-off (§10) (2026-07-21, +> operator-ruled).** Per overseer ruling, `rq2p3-mechanism-prereg.md` §7 items 1–2 were re-worded +> pre-freeze (naive-funnel → mechanical-mix under the ratified posterior) + a §7 scope note added +> (the gate validates the INSTRUMENT, must NOT pre-assert the H-vs-c sign — that stays the +> two-sided confirmatory question). Deviation logged transparently in +> `docs/stage-05-rq2p3-gate-clarification.md`. Re-run: **all four items PASS with real teeth** — +> item 1 regressed on the FROZEN `bridge-federated` branch (unique sig → m_i=1 → H≈0, constant +> c=1/C); item 2 B=1 → c=1.0 AND H=2.54 bits HIGH (maximal mix); items 3 (monotonicity) & 4 +> (entropy) PASS. Confirmatory H1/H2 direction-agnosticism UNCHANGED (no HARKing). **FREEZE STAYS +> A HUMAN GATE:** §10 empty, no confirmatory RQ2-P3 cell runs until Andre records the SHA-256 + +> signs off. Honest disclosure the paper must carry: the dry pass already previews a mix (ρ +> 0→+0.838), so the confirmatory battery quantifies a dose-response already visible at +> calibration — stated openly; the two-sided pre-commitment stands. Lead prereg SHA f22331a72e… +> UNTOUCHED; worktree-only. RQ2 RATIFIED (operator Andre, 2026-07-20, while blind) — observation-consistent-set + uniform-mass per-circuit posterior; docs/stage-05-rq2-posterior-clarification.md flipped PROPOSED→RATIFIED. Offline loader built + synthetic-tested. BLIND HOLD REMAINS: no real RQ2 result until the battery completes. @@ -82,3 +84,6 @@ RQ2 RATIFIED (operator Andre, 2026-07-20, while blind) — observation-consisten - 2026-07-21 RQ2-P3 MECHANISM INSTRUMENT BUILT + committed: assembler.py `bridge-federated-pool` topology (finite willing-bridge pool size B under Zipf willingness skew α; per-circuit draw idx=weighted_draw(sha256("sor-bridge-pool|{seed}"), zipf_weights(B,α)) → bridge#{idx:02d}) + helpers `zipf_weights`/`weighted_draw`; existing lead `bridge-federated` branch UNTOUCHED (still fresh-bridge-per-seed, bit-reproducible). battery.enumerate_rq2p3_cells() = B∈{2,4,8}×α∈{0,1,2} + anchor B=50,α=0, tagged RQ2P3 (SEPARATE fn; frozen 6-cell lattice unmutated). analysis/rq2p3_calibration.py = DRY synthetic-only §7 gate (no confirmatory record read). confirm_load_rq2.py/confirm.py/stats.py UNCHANGED. - CALIBRATION GATE RAN (§7, DRY): item3 monotonicity PASS (top-3 conc ↓ in B, ↑ in α), item4 entropy PASS (plug-in=log2N exact). item1 + item2 DO NOT match naive wording → MIX not funnel (see top-of-file NEEDS-OPERATOR): anchor ρ=+0.838, B=1 H=2.54 bits HIGH, all 10 sweep ρ≥0. Surfaced, not reconciled. Tests: tests/test_sor_rq2p3_pool.py 9 passed; full SOR suite 185 passed (lead bridge-federated fingerprint reproducible — no regression). - HARD HOLD: no RQ2-P3 confirmatory battery, no `rq2p3-mechanism-prereg.md` freeze (§10 block still empty) — operator-gated on the item-1/2 re-word decision. Lead prereg SHA f22331a72e… INTACT; containment intact (synthetic-only, no engine/traffic); worktree-only. NEXT (operator-gated): RQ3 executor wiring, only after this ruling. +- 2026-07-21 OVERSEER RULED (Andre): STOP + diagnosis correct; items 1–2 were WORDED under the naive-funnel prior, not broken. Re-worded `rq2p3-mechanism-prereg.md` §7 pre-freeze — item 1 re-anchored on the FROZEN `bridge-federated` branch (injective fresh-bridge → m_i=1 → H≈0, c=1/C; a pool draws with replacement so it can't/mustn't reproduce that); item 2 B=1 → c=1.0 AND high H (maximal mix, "low H" refuted by construction); added §7 scope note (gate validates instrument, must NOT pre-assert H-vs-c sign → the two-sided confirmatory question). Deviation logged in `docs/stage-05-rq2p3-gate-clarification.md` (no number invented, cites the dry-pass; H1/H2/H3 two-sided UNCHANGED — not HARKing, a pre-freeze validation-gate fix). +- CALIBRATION RE-RAN GREEN (all 4 real teeth): item1 frozen branch labels-distinct+H_all_zero+c=1/C ✅; item2 c=1.0 & H=2.54 bits HIGH vs fresh-ref 0.0 ✅; item3 monotonicity ✅; item4 entropy=log2N ✅; all_pass=True. Pool anchor B=50 kept as EXPLORATORY mix diagnostic (ρ=+0.838), not a regression target. Tests: tests/test_sor_rq2p3_pool.py 9 passed. `confirm.py`/`stats.py`/`confirm_load_rq2.py` UNCHANGED. +- FREEZE STAYS HUMAN GATE: §10 empty; NO confirmatory RQ2-P3 cell until Andre records SHA-256 + signs off. Honest disclosure logged for the paper: dry pass previews mix (ρ 0→+0.838) so the battery quantifies a dose-response already visible at calibration; two-sided pre-commitment stands. Lead prereg SHA f22331a72e… INTACT; worktree-only. diff --git a/cmd_chat/sor/analysis/rq2p3_calibration.py b/cmd_chat/sor/analysis/rq2p3_calibration.py index 3e98ee9..3d025d5 100644 --- a/cmd_chat/sor/analysis/rq2p3_calibration.py +++ b/cmd_chat/sor/analysis/rq2p3_calibration.py @@ -6,17 +6,26 @@ dir), then reports the four §7 gate items. **No confirmatory record is read** is the same blind-safe discipline as the lead-paper loaders; the confirmatory battery stays HARD-HELD until the prereg is frozen. -Gate items (§7): - 1. Reproduce the lead degeneracy — ``B=50, alpha=0`` → ``c_i`` ≈ 1/C, near-constant, - Spearman ρ inconclusive. - 2. Extreme ``B=1`` — all circuits share one bridge → ``c=1.0`` (a degenerate - concentration extreme). NOTE: under the RATIFIED posterior a fully-shared bridge - *maximizes* the observation-consistent anonymity set, so realized H comes out - HIGH, not low — the mechanical "mix" the study exists to test. This is surfaced, - not silently reconciled with the naive "low H" gloss. +Gate items (§7, re-worded 2026-07-21 pre-freeze — see +``docs/stage-05-rq2p3-gate-clarification.md``; the original items 1–2 encoded the +naive-funnel prior and were mechanically wrong under the ratified posterior): + 1. Reproduce the lead degeneracy ON THE FROZEN ``bridge-federated`` BRANCH (not the + pool). The lead zero-variance degeneracy is a property of the injective fresh-bridge + map: unique bridge per circuit seed → unique exit-signature → ``m_i=1`` → ``H_i≈0``, + constant ``c_i=1/C``. A pool draws WITH REPLACEMENT, so it cannot (and must not) be + asked to reproduce that; the regression teeth live on the untouched frozen branch. + 2. ``B=1`` boundary — all circuits share the one bridge → ``c=1.0`` (concentration + tooth kept). Under the RATIFIED posterior the anonymity set is then all circuits + sharing the exit house, so realized H is at the HIGH end (maximal mix). The naive + "low H" gloss is refuted by construction; expect high H. 3. Monotonicity — mean top-3 concentration decreases in B and increases in alpha. 4. Entropy calibration (inherited) — plug-in entropy of N equiprobable senders is exactly log2(N); Miller–Madow adds only the documented finite-N bias term. + +SCOPE NOTE: this gate validates the INSTRUMENT and MUST NOT pre-assert the sign of +H-vs-concentration — that sign is the two-sided confirmatory question (H1/H2). The dry +pass previews a mix (ρ 0→+0.838) as an EXPLORATORY finding; the two-sided pre-commitment +in §2 is untouched. """ from __future__ import annotations @@ -30,6 +39,7 @@ from typing import Dict, List from cmd_chat.sor.analysis.confirm_load_rq2 import ( bridge_concentration, + bridge_label, per_circuit_entropy, top_k_bridge_concentration, ) @@ -60,6 +70,40 @@ def _pool_cell(b: int, alpha: float) -> Cell: "selector": "static", "pool_B": str(b), "pool_alpha": str(alpha)}, False) +def _fed_cell() -> Cell: + """The FROZEN lead ``bridge-federated`` branch (untouched, fresh bridge per circuit + seed). Item-1 regression teeth live here, not on the pool.""" + return Cell("RQ2", "RQ2/bridge=off/selector=static/topo=bridge-federated", + {"bridge": "off", "topology": "bridge-federated", "selector": "static"}, False) + + +def frozen_branch_regression(r: int = R_DRY, c: int = C_DRY) -> Dict: + """Item 1: the untouched frozen ``bridge-federated`` branch must still show the lead + degeneracy — unique bridge per circuit (unique exit-signature) → ``m_i=1`` → ``H_i≈0``, + constant ``c_i=1/C``. Checked per-run (the confirmatory grouping unit).""" + fed = _fed_cell() + labels_all_distinct = True + H_all_zero = True + c_all_const = True + mean_h: List[float] = [] + for ri in range(r): + specs = _assemble_run(fed, ri, c) + labels = [bridge_label(s) for s in specs] + labels_all_distinct &= (len(set(labels)) == len(labels)) + ent = per_circuit_entropy(specs) + mean_h.append(statistics.fmean(ent)) + H_all_zero &= all(h < 1e-9 for h in ent) + conc = [x for x in bridge_concentration(specs) if x is not None] + c_all_const &= bool(conc) and all(abs(x - 1.0 / c) < 1e-9 for x in conc) + return { + "labels_all_distinct": labels_all_distinct, + "H_all_zero": H_all_zero, + "c_all_const_1_over_C": c_all_const, + "mean_entropy_bits": statistics.fmean(mean_h), + "pass": labels_all_distinct and H_all_zero and c_all_const, + } + + def cell_report(cell: Cell, r: int = R_DRY, c: int = C_DRY) -> Dict: """Per-cell dry report: mean top-3 concentration over runs, pooled per-circuit (c_i, H_i) Spearman ρ, and the concentration spread.""" @@ -94,17 +138,22 @@ def calibration_gate(r: int = R_DRY, c: int = C_DRY) -> Dict: sweep = [cr for cr in (cell_report(cell, r, c) for cell in enumerate_rq2p3_cells())] grid = {(cr["B"], cr["alpha"]): cr for cr in sweep} - # Item 1 — anchor B=50, alpha=0 reproduces the lead degeneracy. - anchor = grid[(50, 0.0)] - item1_pass = anchor["concentration_stdev"] < 1e-3 and abs(anchor["spearman_rho_conc_vs_H"]) < 0.05 + # Item 1 — regression teeth on the FROZEN bridge-federated branch (not the pool): + # unique bridge per circuit → unique signature → m_i=1 → H≈0, constant c_i=1/C. + # The pool anchor B=50,alpha=0 is retained as an EXPLORATORY diagnostic only (it is a + # mix, ρ>0 — it does NOT and must NOT reproduce the injective fresh-bridge degeneracy). + fed_reg = frozen_branch_regression(r, c) + anchor = grid[(50, 0.0)] # exploratory: pool at B=50 draws WITH replacement → mix + item1_pass = fed_reg["pass"] - # Item 2 — extreme B=1: all circuits share one bridge (degenerate concentration). + # Item 2 — B=1 boundary: all circuits share one bridge → c=1.0 (concentration tooth), + # and under the ratified posterior H is at the HIGH end (maximal mix). Reference = + # the frozen fresh-bridge branch H (≈0). Passing means c=1.0 AND H high, by construction. ext = cell_report(_pool_cell(1, 0.0), r, c) - lead_like = cell_report(_pool_cell(1_000_000, 0.0), r, c) # huge pool ≈ fresh bridge/circuit + fresh_ref_H = fed_reg["mean_entropy_bits"] item2_conc_ok = abs(ext["mean_top3_concentration"] - 1.0) < 1e-9 - # The naive gate text says "low H"; the ratified posterior yields HIGH H. Surface it. - item2_entropy_direction = "HIGH (mechanical mix)" if ext["mean_entropy_bits"] > lead_like["mean_entropy_bits"] else "low" - item2_matches_naive_low_H = ext["mean_entropy_bits"] < lead_like["mean_entropy_bits"] + item2_high_H = ext["mean_entropy_bits"] > fresh_ref_H + item2_pass = item2_conc_ok and item2_high_H # Item 3 — monotonicity: mean top-3 concentration decreasing in B, increasing in alpha. dec_in_B = all( @@ -137,25 +186,31 @@ def calibration_gate(r: int = R_DRY, c: int = C_DRY) -> Dict: "sweep": sweep, "gate": { "item1_reproduce_lead_degeneracy": { - "anchor_B50_alpha0": anchor, + "regressed_on": "frozen bridge-federated branch (untouched)", + "frozen_branch": fed_reg, + "exploratory_pool_anchor_B50_alpha0": anchor, + "note": ( + "Teeth are on the frozen fresh-bridge branch (unique signatures → m_i=1 " + "→ H≈0, constant c=1/C). A pool draws WITH replacement so it cannot " + "reproduce that; the B=50 pool anchor is an EXPLORATORY mix (ρ>0), not a " + "regression target. Re-worded pre-freeze; see " + "docs/stage-05-rq2p3-gate-clarification.md." + ), "pass": item1_pass, }, - "item2_extreme_B1": { + "item2_B1_boundary": { "mean_top3_concentration": ext["mean_top3_concentration"], "mean_entropy_bits": ext["mean_entropy_bits"], - "fresh_bridge_reference_mean_entropy_bits": lead_like["mean_entropy_bits"], - "concentration_degenerate_c_eq_1": item2_conc_ok, - "entropy_direction_vs_naive": item2_entropy_direction, - "matches_naive_low_H_expectation": item2_matches_naive_low_H, - "NEEDS_OPERATOR": not item2_matches_naive_low_H, + "fresh_bridge_reference_mean_entropy_bits": fresh_ref_H, + "concentration_c_eq_1": item2_conc_ok, + "entropy_high_maximal_mix": item2_high_H, "note": ( - "Concentration extreme is as specified (c=1.0). But the ratified " - "posterior makes a fully-shared bridge MAXIMIZE the anonymity set, so " - "realized H is HIGH, contradicting the §7 gate-item-2 'low H' gloss. " - "This is exactly the mechanical 'mix' (ρ>0) the study exists to test " - "(see note-unique-bridge-artifact.md), surfaced early at calibration. " - "Not silently reconciled: flagged for the operator's freeze decision." + "B=1 shares one bridge → c=1.0 (concentration tooth) AND, under the " + "ratified posterior, the anonymity set is all circuits sharing the exit " + "house → H at the HIGH end (maximal mix). The naive 'low H' gloss is " + "refuted by construction; expect high H. Re-worded pre-freeze." ), + "pass": item2_pass, }, "item3_monotonicity": { "decreasing_in_B": dec_in_B, @@ -166,6 +221,7 @@ def calibration_gate(r: int = R_DRY, c: int = C_DRY) -> Dict: "checks": entropy_checks, "pass": item4_pass, }, + "all_pass": bool(item1_pass and item2_pass and item3_pass and item4_pass), }, } diff --git a/docs/rq2p3-mechanism-prereg.md b/docs/rq2p3-mechanism-prereg.md index eacd2e2..ecff381 100644 --- a/docs/rq2p3-mechanism-prereg.md +++ b/docs/rq2p3-mechanism-prereg.md @@ -112,15 +112,41 @@ Run order randomized within cell; deterministic from an ordering seed distinct f ## 7. Instrument-validation gate (boolean; blocks the confirmatory run) +> **Re-worded 2026-07-21, pre-freeze (deviation logged in `stage-05-rq2p3-gate-clarification.md`).** +> Items 1–2 were originally written under the naive-funnel prior ("pool reproduces the +> zero-variance degeneracy"; "B=1 → low H"). Both are mechanically wrong under the *ratified* +> posterior and were corrected **before freeze** — see the §7 scope note below. No hypothesis +> changed (H1/H2/H3 in §2 stay two-sided/direction-agnostic); only a mis-specified validation +> gate was fixed. The original dry-pass output that exposed this is cited in the deviation log. + All must pass **before** any confirmatory cell: -1. **Reproduce the lead degeneracy.** `B = 50, alpha = 0` → `c_i ≈ 1/50` constant, ρ undefined - — a regression check that this instrument reproduces the published RQ2-P3 result. -2. **Extremes.** `B = 1` → all circuits share one bridge → `c = 1.0`, minimal set, low H. +1. **Reproduce the lead degeneracy — on the FROZEN branch, not the pool.** The lead + zero-variance degeneracy is a property of the **injective fresh-bridge map** (a unique + bridge per circuit seed = effectively no reuse). A finite pool of **any** size `B` draws + **with replacement**, so birthday collisions make concentration non-constant and ρ defined — + a pool **cannot and must not** be expected to reproduce the fresh-bridge degeneracy. The + regression check therefore anchors on the actual frozen `bridge-federated` branch + (UNTOUCHED): it must still yield **unique exit-signatures → `m_i = 1` → `H_i ≈ 0`, constant + `c_i = 1/C`**. That is the real "lead reproduces" teeth. +2. **B = 1 boundary.** `B = 1` → all circuits share the one bridge → **`c = 1.0`** (keep this + concentration tooth). Under the ratified posterior the anonymity set is then **all** circuits + sharing the exit house, so `H_i` sits at the **HIGH end (maximal mix)** — the "low H" gloss + was the naive-funnel error and is refuted **by construction** here. Expect high H. 3. **Monotonicity.** Realized mean top-3 concentration is **monotone decreasing in B** and **increasing in alpha**, across the sweep, on a dry (non-confirmatory) calibration pass. 4. **Entropy calibration unchanged.** H = log₂N on equiprobable synthetic senders (inherited). +**§7 scope note (why items 1–2 do NOT assert an H-vs-c sign).** This gate validates the +**instrument** — concentration varies monotonically (item 3), entropy is exact (item 4), the +frozen branch is untouched (item 1), and the B=1 boundary hits `c = 1.0` (item 2). It **must not +pre-assert the sign of H-vs-concentration**, because that sign *is* the two-sided confirmatory +question (H1/H2). Baking "expect low H at high concentration" into a validation gate would be +**funnel-circular**; removing it makes the study **more** rigorous, not less. The confirmatory +hypotheses in §2 stay two-sided/direction-agnostic — **UNCHANGED**. (Note: the dry calibration +pass already *previews* a mix, ρ 0→+0.838 across the sweep; this is surfaced openly as an +exploratory preview and does **not** relax the two-sided pre-commitment.) + If any gate item fails → STOP, do not report; surface as NEEDS-OPERATOR. ## 8. Analysis plan diff --git a/docs/stage-05-rq2p3-gate-clarification.md b/docs/stage-05-rq2p3-gate-clarification.md new file mode 100644 index 0000000..b1eb27f --- /dev/null +++ b/docs/stage-05-rq2p3-gate-clarification.md @@ -0,0 +1,72 @@ +# Stage-05 deviation log — RQ2-P3 §7 calibration-gate re-word (naive→mechanical mix) + +**Status: DEVIATION (pre-freeze), 2026-07-21 — operator-ruled (Andre), logged transparently.** +This edits a **DRAFT** prereg (`rq2p3-mechanism-prereg.md`, its own slug `sor-consent-rq2p3`, +**not yet frozen**, §10 empty). It **does not** touch the frozen lead prereg +(`sor-consent-prereg.md`, SHA `f22331a72e0d0ccf38b787e63acabbe9d666456ec76076787a6d545c3193425b`). +Because the RQ2-P3 prereg is pre-freeze, correcting a mis-specified validation gate is legitimate — +but it is recorded here rather than silent-edited, per the no-HARKing rail. + +## What was re-worded + +`rq2p3-mechanism-prereg.md` §7 (instrument-validation gate), items 1 and 2, plus a new §7 scope +note. Items 3 (monotonicity) and 4 (entropy) are unchanged. + +- **Item 1 — before:** "Reproduce the lead degeneracy. `B=50, alpha=0` → `c_i ≈ 1/50` constant, + ρ undefined." **After:** re-anchored on the actual frozen `bridge-federated` branch (unique + bridge per circuit seed → `m_i=1` → `H_i≈0`, constant `c_i=1/C`). A **pool of any B** draws + with replacement → birthday collisions → non-constant concentration → ρ **defined**, so a pool + cannot and must not reproduce the injective fresh-bridge zero-variance degeneracy. +- **Item 2 — before:** "`B=1` → all circuits share one bridge → `c=1.0`, minimal set, low H." + **After:** keep the concentration tooth (`c=1.0`), but the anonymity set is then **all** + circuits sharing the exit house, so under the ratified posterior `H` sits at the **HIGH end + (maximal mix)**. The "low H" gloss was the naive-funnel error, refuted by construction. +- **New §7 scope note:** the gate validates the **instrument** (concentration varies, entropy + exact, frozen branch untouched, B=1 boundary at c=1.0) and **must not** pre-assert the sign of + H-vs-concentration — that sign *is* the two-sided confirmatory question (H1/H2). Baking + "expect low H at high concentration" into a validation gate would be funnel-circular. + +## Why (the mechanism) + +The adversary observes `exit_signature = (exit_house, bridge_label)`; the per-circuit anonymity +set `m_i` = distinct entry nodes among circuits **sharing** that signature +(`confirm_load_rq2.py`). The fresh-bridge lead instrument gives every circuit a unique bridge → +unique signature → `m_i=1` → `H≈0`; a **finite shared pool** makes circuits share signatures → +larger sets → **higher H**. So a shared bridge acts as a **mix**: more concentration *raises* +anonymity, the opposite of the naive funnel. Items 1–2 as originally worded encoded the funnel +prior and were therefore mechanically wrong. This is exactly the prediction in +`note-unique-bridge-artifact.md`, now confirmed at calibration. + +## What is NOT changed (the integrity teeth) + +- **Confirmatory hypotheses H1/H2/H3 (§2) stay two-sided / direction-agnostic.** No hypothesis + was added, dropped, or re-signed. This is a validation-gate fix, **not** HARKing. Removing the + circular sign-assertion makes the study **more** rigorous, not less. +- **Analysis code unchanged:** `confirm_load_rq2.py`, `confirm.py`, `stats.py` untouched. Only + the prereg §7 prose and (in the earlier build stone) the `bridge-federated-pool` instrument + + helpers changed. The frozen `bridge-federated` branch is bit-reproducible. +- **Freeze stays a human gate:** §10 remains empty; no confirmatory RQ2-P3 cell runs until Andre + records the SHA-256 and signs off. + +## Calibration output cited (no number invented) + +The dry, synthetic-only §7 calibration pass (`cmd_chat/sor/analysis/rq2p3_calibration.py`, build +stone commit `1d99e7f`) produced, verbatim: + +- Item 3 (monotonicity) **PASS**; item 4 (entropy `H=log₂N` exact) **PASS**. +- Anchor `B=50, alpha=0`: concentration stdev **0.0198** (non-constant), Spearman ρ **+0.838** — + a mix, *not* the fresh-bridge zero-variance degeneracy (this is what exposed the mis-wording). +- `B=1`: concentration `c=1.0` ✓, mean entropy **2.54 bits** vs the fresh-bridge reference + **0.0 bits** — HIGH, contradicting the naive "low H". +- Full sweep Spearman ρ (B∈{2,4,8}×α∈{0,1,2}, in grid order): 0.00, 0.231, 0.291, 0.341, 0.526, + 0.597, 0.482, 0.744, 0.714 → all **≥ 0**: a robust mix across the whole grid. + +## Exploratory status of the mix preview + +The MIX (ρ 0→+0.838) is an **EXPLORATORY** calibration preview that **strengthens** +`note-unique-bridge-artifact.md` (the lead "shrink" is plausibly a unique-bridge artifact). It is +**not** a confirmatory result and does **not** relax the two-sided pre-commitment: the +confirmatory battery will still quantify the dose-response two-sided. Honest disclosure the paper +must carry: because the dry pass already previews mix, the confirmatory run quantifies a +dose-response **already visible at calibration** — stated openly; the pre-registered +direction-agnosticism stands.