Files
hack-house/docs/stage-05-rq2-posterior-clarification.md
T
leetcrypt bd7e3764dc SS3: RQ2 rule RATIFIED + offline sender-posterior loader (synthetic-tested)
Flip docs/stage-05-rq2-posterior-clarification.md PROPOSED->RATIFIED (operator
Andre, 2026-07-20, ratified while BLIND to RQ2 data — honest prereg-completion of
a gap the freeze left, not HARKing). Substance of the construction unchanged.

Add cmd_chat/sor/analysis/confirm_load_rq2.py: reconstructs each circuit's spec
OFFLINE from the persisted per_circuit_seeds via deterministic assemble(), derives
the observation-consistent anonymity set A_i (uniform / max-entropy -> [1]*m_i),
per-circuit Miller-Madow H_i, and the willing-bridge concentration series — the
exact inputs confirm.rq2_p1_delta_h (ΔH, two-sided) and rq2_p3_funnel (Spearman ρ)
consume. Grounded only in the ratified rule ([Serjantov2002]/[Diaz2002]).

BLINDING preserved (prereg §2): ratification unblocks CODE, not results. The
collect_* real-data entrypoints are BLIND-GATED and NOT run; the reconstruction is
unit-tested on SYNTHETIC specs/seeds only (test_sor_confirm_load_rq2.py, 6 passed;
full SOR suite 172 passed). Frozen prereg untouched; no RQ2 statistic computed.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-07-20 08:49:51 -07:00

7.7 KiB
Raw Blame History

Stage-05 analysis clarification — RQ2 per-circuit adversary sender-posterior

Status: RATIFIED by operator (Andre) 2026-07-20, while BLIND to RQ2 data (battery mid-collection, 0 RQ2 stats computed). Does NOT edit the frozen prereg (sor-consent-prereg.md, SHA f22331a72e0d0ccf38b787e63acabbe9d666456ec76076787a6d545c3193425b).

Pre-specified BLIND to RQ2 outcomes — drafted 2026-07-20, while the confirmatory battery is still running and no RQ2 confirmatory statistic (RQ2-P1/P2/P3) has been computed, inspected, or reported. This is honest pre-registration completion of a specification gap the frozen prereg left open — not HARKing (no RQ2 result has been seen; the rule is fixed before any RQ2 number exists).

Distinction from the Holm clarification: that note restated a decision the prereg already fixes (family size 7). This note fills a genuine gap — the prereg pins the RQ2 DV as a per-circuit adversary posterior but gives no explicit construction formula. It therefore requires operator ratification before any RQ2 confirmatory number may be computed.

The gap

The frozen prereg fixes the RQ2 dependent variable as a per-circuit quantity:

  • §3 (Variables), RQ2 DV: "Shannon entropy of the adversary's posterior over candidate senders per circuit; effective set size S = 2^H per [Serjantov2002], normalized d = H/log2(N) per [Diaz2002]. Estimator: plug-in (MLE) entropy with MillerMadow bias correction; 95% CI by bootstrap over circuits."
  • §4 (Sampling), unit of analysis: "RQ2 — the circuit (entropy of the per-circuit sender posterior)."
  • §6 (Analysis), RQ2-P3: Spearman ρ between top-k=3 bridge concentration and per-circuit H — which requires a per-circuit H value to exist.

What the prereg does not give is the construction rule: how, from one observed confirmatory circuit, the adversary's posterior over candidate senders is formed. The cited papers supply the metric (entropy of the posterior) and the normalizations (S = 2^H, d = H/log2 N) — not the posterior itself. The built instrument (executor ce68d41) currently records only a per-run Shannon entropy of the realized entry-node frequency, which is a different quantity and yields no per-circuit H (so RQ2-P3 is uncomputable as-collected). This note proposes the missing construction, grounded in the cited literature only.

Proposed construction (adversary sender-posterior, per circuit)

Adversary model (as in [Serjantov2002], a global passive adversary over the lab grid). For each confirmatory circuit i, the adversary observes the circuit's exit segment and the federation-path structure it implies — i.e. the exit-bridge / exit-house through which the circuit leaves the federation. It does not observe the true entry node (that is the anonymity the metric quantifies).

Candidate senders = the observation-consistent anonymity set (A_i): the set of consenting entry-node candidates whose paths are consistent with the observed exit-bridge/house under the cell's topology. Concretely:

  • 1-house-N arm: no federation observation narrows the pool — every one of the (N) consenting nodes in the single house is consistent ⇒ (A_i) = all (N).
  • bridge-federated / directory-federated arms: the observed exit bridge/house partitions candidates — (A_i) is the subset of consenting senders whose federation path can reach the observed exit under the split-knowledge topology (R6 select_federated_path / directory constraints). Bridge concentration (few willing bridges carrying many circuits) narrows (A_i); a well-spread federation widens it. The sign of this effect is not presumed (§6 two-sided).

Mass rule (the §-consistent default): uniform over (A_i). With no side information distinguishing candidates in (A_i), the maximum-entropy posterior is uniform — the standard [Serjantov2002]/[Diaz2002] anonymity-set assumption. The per-circuit posterior count vector is therefore ([1,1,\dots,1]) of length (m_i = |A_i|).

Per-circuit entropy (MillerMadow, bits): [ H_i = \widehat{H}{\mathrm{MM}}\big(\underbrace{[1,\dots,1]}{m_i}\big) = \log_2 m_i + \frac{m_i-1}{2,m_i\ln 2}, ] using the existing stats.miller_madow_entropy_bits. Effective set size (S_i = 2^{H_i}) [Serjantov2002]; normalized degree (d_i = H_i / \log_2 N) [Diaz2002], (N) = matched total consenting nodes. Variation in (H_i) across circuits (different circuits route through different bridges/houses ⇒ different (m_i)) is the distribution that the frozen "bootstrap over circuits" resamples.

This makes the two frozen RQ2 confirmatory tests computable offline from the immutable raw records (no re-run, no new traffic):

  • RQ2-P1 (ΔH, two-sided): (\Delta H = \mathrm{mean}_i H_i(\text{federated}) - \mathrm{mean}_i H_i(\text{single-house, matched } N)), BCa 95% CI by bootstrap over circuits (confirm.rq2_p1_delta_h). grow if CI > 0, honest-shrink (reported with equal prominence) if CI < 0, inconclusive if it spans 0.
  • RQ2-P3 (mechanism): Spearman ρ between per-circuit top-3 bridge concentration (c_i) and per-circuit (H_i), BCa 95% CI (confirm.rq2_p3_funnel); negative ρ quantifies funnelling.

Offline recomputability (why the running battery is not wasted)

Every input above is recoverable from the immutable raw records the executor already writes — the rule is applied after the fact, not during collection:

  • battery-results.jsonruns[].per_circuit_seeds gives each circuit's seed;
  • assemble(cell, cseed) is deterministic ⇒ reproduces each circuit's CircuitSpec (path hops, house labels, bridge used, topology, consenting pool);
  • from that spec the observation-consistent set (A_i) and top-3 concentration (c_i) are derived by the (proposed) offline loader — no live circuit needed.

So under this rule RQ2-P1/P3 are computed once, post-battery, from the sealed data.

Honesty / anti-HARKing safeguards

  1. Blind: fixed 2026-07-20 with the battery still running and zero RQ2 confirmatory numbers computed or seen. The rule cannot be reverse-engineered from a result that does not yet exist.
  2. Frozen prereg untouched: the rule lives only here, PROPOSED, until sign-off.
  3. Sign not presumed: ΔH is two-sided; a shrink (federation reduces the anonymity set) is a publishable honest null, reported as prominently as growth.
  4. Detectors unchanged: reuses the §5-calibrated miller_madow_entropy_bits (gate item 4: H = log2(N) for N equiprobable senders); no per-cell tuning.
  5. Cited-literature grounding only: entropy-as-anonymity [Serjantov2002], normalized degree [Diaz2002]; uniform-over-anonymity-set is their standard model.

Operator decision required

RATIFIED (operator Andre, 2026-07-20, while BLIND): the observation-consistent-set + uniform-mass construction above is adopted as the RQ2 per-circuit posterior. The offline RQ2 loader (mirroring confirm_load.py's RQ1 path) computes RQ2-P1/P3 once from the sealed records. Ratification unblocks the CODE only — RQ2 stays BLIND until the battery completes: no real RQ2 confirmatory statistic is computed, inspected, or reported until all data has landed (battery-results.json present, or 180 cell-runs each with metrics.json).

Citations