Files
hack-house/docs/rq2p3-mechanism-prereg.md
T
leetcrypt 1c6063248f docs(sor): follow-up plan — RQ2-P3 mechanism prereg + RQ3 run-brief + unique-bridge artifact note
RQ2-P3 mechanism study (NEW prereg, approved-path/params-locked, not yet frozen):
pool-based willing-bridge instrument, concentration swept as a manipulated IV
(B∈{2,4,8}×α∈{0,1,2}), two-sided/direction-agnostic, run-level cluster bootstrap.
RQ3 companion run-brief (execution-freeze for the already-frozen RQ3): agent=qwen2.5:3b
local Ollama, churn kill_prob=30/steps=20, baselines + Holm-7 completion pinned.
note-unique-bridge-artifact.md: on-record analysis that the lead RQ2-P1 shrink is plausibly
a fresh-bridge-per-circuit artifact (unique exit-signature -> singleton set -> H~0), and that
realistic bridge reuse (a mix) may raise anonymity -> the mechanism study may qualify the lead
RQ2 headline. No edit to the frozen prereg or committed lead paper.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-21 17:54:05 -07:00

157 lines
9.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Pre-registration (DRAFT) — RQ2-P3 funnelling-mechanism study
> **STATUS: APPROVED-PATH, PARAMS LOCKED — NOT YET FROZEN.** Design + parameters
> operator-approved 2026-07-21 (grid B∈{2,4,8}×α∈{0,1,2}; run-level cluster bootstrap;
> two-sided/direction-agnostic). Remaining step before any confirmatory cell: **human freeze
> checkpoint** — record the SHA-256 of the final text in §10 and the operator freeze sign-off.
> Build + synthetic tests + the §7 calibration gate MAY proceed now; the confirmatory battery
> MUST wait for the freeze.
> This is a **new study with its own slug** (`sor-consent-rq2p3`). It **does not modify**
> the frozen lead prereg (`sor-consent-prereg.md`, SHA
> `f22331a72e0d0ccf38b787e63acabbe9d666456ec76076787a6d545c3193425b`), whose RQ2-P3
> result stands as reported ("inconclusive — not testable as-instrumented").
## 0. Why this study exists
The lead paper found federation **shrinks** the per-circuit anonymity set (RQ2-P1,
ΔH = 0.96 bits, Holm-significant) but could **not** test the *mechanism* (RQ2-P3): the
bridge-federated instrument assigns a **fresh willing bridge per circuit seed**
(`assembler.py:131`, `_bridge_label(seed)`), so every circuit routes through a distinct
bridge, top-3 concentration is constant (`c_i = 1/C`), the covariate has **zero variance**,
and Spearman ρ is undefined (`stats.spearman` returns 0.0 by construction). The lead paper
reported this honestly as an as-instrumented degeneracy, not a null of a well-posed test.
**The mechanical insight this study exists to test (see `note-unique-bridge-artifact.md`).**
The adversary's observation is `exit_signature = (exit_house, bridge_label)`, and the
per-circuit anonymity set `m_i` = the distinct entry nodes among circuits sharing that
signature (`confirm_load_rq2.py`). A **fresh bridge per circuit ⇒ every signature is unique
⇒ group size 1 ⇒ m_i = 1 ⇒ H ≈ 0.** That — not funnelling — is why bridge-federated produced
H ≈ 0 and drove the lead ΔH negative. Introduce a **finite shared pool** and many circuits
share a bridge ⇒ shared signature ⇒ larger set ⇒ **higher H**. Under this posterior a bridge
is a **mix**: more concentration plausibly *raises* anonymity, the opposite of the naive
funnel story. So this study is, honestly, **a test of whether the lead paper's "shrink" is a
unique-bridge artifact** — and it may *qualify or correct* the lead RQ2-P1 headline.
This study re-instruments the willing-bridge layer with a **finite pool + skewed
willingness** so concentration genuinely varies, and — the key upgrade — treats
concentration as a **manipulated independent variable** (a dose-response design) rather than
a passive covariate. The direction is left **two-sided**: the naive prediction is funnel
(ρ < 0); the mechanical prediction under the ratified posterior is mix (ρ > 0). We pre-commit
to reporting whichever the data shows, including a correction to the lead result if warranted.
The analysis code (`bridge_concentration`, `rq2_p3_funnel`) is already correct; only the
*instrument* and this *prereg* are new.
## 1. Blinding & integrity posture (read first)
- **This study is NOT blind to the RQ2-P1 shrink direction** (the lead paper is published).
Mitigations that keep it honest: (a) the funnelling hypothesis was **pre-stated as a live
mechanism** in the lead paper's introduction, not invented post-hoc; (b) the confirmatory
targets below are **two-sided**; (c) concentration is a *manipulated* IV, so the test is a
designed dose-response, not a re-slice of the lead data.
- **The lead RQ2-P1 result is NOT re-litigated here.** Any ΔH this pool instrument produces
is labeled **EXPLORATORY / replication**, never a re-run of the frozen RQ2-P1.
- **No detector retuning.** The entropy estimator, posterior construction, and Spearman path
are inherited **unchanged** from the frozen lead pipeline; only bridge assignment changes.
## 2. Research question & hypotheses
**RQ2-P3.** Within the consent-gated bridge-federated topology, does willing-bridge
**concentration** causally reduce the per-circuit anonymity set (funnelling)?
- **H1 (within-cell association, two-sided).** Spearman ρ between per-circuit top-3 willing-
bridge concentration `c_i` and per-circuit entropy `H_i`. **Funnel** iff BCa 95% CI < 0;
**mix** iff CI > 0; **inconclusive** iff CI spans 0. Direction is *not* presumed.
- **H2 (dose-response, two-sided).** OLS slope β of H on realized top-3 concentration, over
**per-run mean points** (9 cells × 30 runs = 270 clustered points), cell-level BCa CI.
**Funnel** iff slope CI < 0; **mix** iff slope CI > 0.
- **H3 (joint, direction-agnostic).** Mechanism **RESOLVED** iff H1 and H2 agree in sign and
both exclude 0; the *sign* is the finding (funnel vs mix). **Unresolved** if either spans 0.
## 3. Instrument change (the only new code)
Replace the per-seed fresh bridge with a **willing-bridge pool** of size `B` and a fixed
skewed willingness weight vector, under a **new topology factor** so lead-paper cells stay
bit-reproducible:
```
# new assembler branch: topology == "bridge-federated-pool"
weights = zipf_weights(B, alpha) # fixed from the CELL seed; stable per run
idx = weighted_draw(sha256(f"sor-bridge-pool|{circuit_seed}"), weights)
bridge = f"bridge#{idx:02d}" # B distinct labels, REUSED across circuits
```
- Weights derive from the **cell** seed (not the circuit seed) so the willingness profile is
fixed within a run and circuits genuinely share bridges → concentration varies.
- Everything else (hop structure, houses, exit-signature grouping, posterior, MillerMadow H,
BCa) is **identical to the frozen lead pipeline**.
- Touchpoints: `assembler.py` (new branch + pool helper), `battery.enumerate_cells()` (sweep).
`confirm_load_rq2.py`, `confirm.py`, `stats.py` are **unchanged**.
## 4. Design matrix (concentration as IV)
Bridge-federated-pool, selector `static`, matched-N, bridge willingness the only manipulation:
- **Pool size** `B ∈ {2, 4, 8}` — 3 levels.
- **Willingness skew** `alpha ∈ {0 (uniform), 1.0 (moderate Zipf), 2.0 (heavy Zipf)}` — 3 levels.
- Full 3×3 = 9 concentration cells (each realizes a distinct mean top-3 concentration).
Run order randomized within cell; deterministic from an ordering seed distinct from data seeds.
## 5. Dependent variables
- **Per-circuit H_i** — MillerMadow entropy of the uniform posterior over the observation-
consistent anonymity set (inherited **verbatim** from the frozen lead pipeline).
- **Per-circuit top-3 concentration c_i** — `confirm_load_rq2.bridge_concentration` (unchanged).
## 6. Sampling, seeds, stopping rule
- **R = 30** seeded runs/cell, **C = 50** circuits/run (matched to the lead study).
- Base seed **S0 = 20260719**; per-cell seed = `SHA256(S0 ‖ cell_id ‖ run_index)` (matched).
- **Fixed stopping rule:** all 9 cells × R run to completion. No optional stopping, no interim
looks. An uninformative cell is reported **inconclusive**, never extended.
## 7. Instrument-validation gate (boolean; blocks the confirmatory run)
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.
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).
If any gate item fails → STOP, do not report; surface as NEEDS-OPERATOR.
## 8. Analysis plan
- Effect size + BCa 95% CI for every test; p never reported alone; 10,000 resamples; α = 0.05.
- **H1:** `confirm.rq2_p3_funnel(c, H)` per cell + pooled, but resampled with a **run-level
cluster bootstrap** (resample whole runs, not individual circuits). Rationale: circuits
sharing a bridge have identical `c_i` and correlated `H_i`, so per-circuit resampling
pseudo-replicates and falsely narrows the CI (the same defect noted for lead RQ1-P1). The
run is the independent unit.
- **H2:** OLS slope of per-run mean-H on per-run mean top-3 concentration (270 clustered
points); BCa CI resampling **over runs within cells** (cluster bootstrap).
- **Multiplicity:** HolmBonferroni over **this study's own family** {H1-pooled, H2-slope}
(the lead study's family-of-7 is closed and not reopened).
- **Confirmatory vs exploratory:** the 9-cell sweep is confirmatory; any per-cell ρ contrast or
ΔH replication is labeled EXPLORATORY.
- **Data exclusion (pre-data):** quarantine only on integrity failure (SHA/pcap mismatch,
non-reproducing seed). No performance-based exclusions.
## 9. Rails (immutable, inherited)
Prereg frozen after approval — never edited (deviations only in a stage-05-style log; no
HARKing; nulls are results). Containment: isolated docker only, self-generated fixture traffic,
lab-only. Budget $0. Worktree only on `feat/sor-consent-relay`. Raw data immutable + SHA-256.
## 10. Freeze block (to complete at approval)
```
FROZEN: <date>
PREREG SHA-256: <hash of final text>
APPROVED BY: <operator>
POOL/ SKEW LEVELS LOCKED: B∈{2,4,8}, alpha∈{0,1.0,2.0}
```