# RESULT — 095 bayesian-ledger: posterior-odds tracker for the campaign's core claims

**Tier: T3-exploratory. DONE + SELF-HARVESTED in-session.** BUILD/tooling row (block L,
instruments). Pure-stdlib CPU build (CVD=""), deterministic, milliseconds — no GPU/box/tmux.
Built `bayesian_ledger.py` + 34 self-tests, POPULATED it with the campaign's 9 core claims and
their evidence rows (extracted from ~40 RESULT.md files), and emitted a ranked, auditable ledger.

## What ran
- `src/bayesian_ledger.py` — the library: `Claim(prior, evidence)`, `Evidence(row, direction,
  strength, brier, instrument_failure)`, log-odds accumulation of per-row likelihood ratios,
  `shuffle_null` + `prior_sensitivity` controls, markdown/json output. Pure stdlib.
- `src/test_bayesian_ledger.py` — **34/34 self-tests PASS** (LR math, sign, clamp, reliability,
  instrument-failure skip, monotonicity, logit/sigmoid round-trip, shuffle-null-regresses-to-prior,
  IF-excluded-from-counts, validation errors).
- `src/populate_ledger.py` — the REAL claims + evidence; regenerates `BAYESIAN_LEDGER.md` +
  `out/ledger.json`. Mirrored to `campaign100/shared/` (lib+tests+populate+README); ledger copied
  to `campaign100/BAYESIAN_LEDGER.md` (root, for visibility).

## Method (conservative, see PREREG_LITE)
base_LR: weak 1.6 / moderate 2.5 / strong 4.0 (odds). reliability = clip(1 − brier/0.25, 0.2, 1.0)
shrinks a row's LR by how well-calibrated it was (feeds off 094's Brier discipline). logLR =
direction · reliability · ln(base_LR). posterior log-odds = logit(prior) + Σ logLR, clamped ±5
(credence ∈ [0.0067, 0.9933]) for single-model / correlated-row honesty. instrument_failure ⇒ LR=1.

## Ranked ledger (the aggregate posterior on each core claim)
| rank | claim | prior | posterior | +sup/−con | conf |
|---|---|---|---|---|---|
| 1 | **C1 NO-LINEAR-BINDING** — pooled z does not linearly bind agent/patient | 0.55 | **0.993** (clamped) | 11/3 | HIGH |
| 2 | **C3 OPERATORS-COMPOSE** — morphosyntactic offsets are causal, composable | 0.40 | **0.955** | 10/0 | HIGH |
| 3 | **C2 CAPACITY-460BIT** — z holds ~460 sentence-specific bits, saturates ~4 rows | 0.45 | **0.886** | 8/0 | HIGH |
| 4 | **C9 SAFETY-LEAK** — z leaks propositional content (RAG/canary risk) | 0.50 | **0.810** | 4/0 | MED |
| 5 | **C7 NORM-MAGNITUDE** — ‖z‖ = length/specificity, not thematic semantics | 0.50 | **0.690** | 4/0 | LOW |
| 6 | **C6 ATOMS-SEMANTIC** — SAE atoms are semantic/cross-lingual (frequent core) | 0.45 | **0.620** | 4/1 | LOW |
| 7 | **C4 ORDER-CODE-MIDTRAIN** — order code forms mid-training (atoms/ops earlier) | 0.40 | **0.568** | 4/2 | LOW |
| 8 | **C8 MULTILINGUAL-BINDING-FAILS** — no universal crosslingual role code | 0.45 | **0.484** | 1/1 | LOW |
| 9 | **C5 FABRICATION-OFFMANIFOLD** — fabrication is gate-catchable off-manifold | 0.45 | **0.436** | 1/1 | LOW |

**Reading.** Three HIGH-confidence aggregate conclusions: the campaign most strongly supports
**no linear role-binding** (11 supporting rows incl. power-certified 016/018 and best-calibrated
003; only fragile case-marking (061/062) and cosine-level (084) evidence cuts the other way →
clamped to the 0.993 ceiling), **operator composition** (10/0, all decode-gated), and the
**~460-bit capacity** (8/0, block-H confirmed 5 ways). Mid-confidence: **safety-leak** (4/0, no
contradiction). The two claims the ledger correctly keeps **uncertain** are C8 multilingual (mixed
061-vs-062, posterior 0.484) and C5 fabrication-off-manifold (087's near-manifold blind spot
contradicts, posterior 0.436) — exactly where the science is genuinely open.

## Controls / gates — all PASS
- **G-shuffle** (shuffled-evidence null, 500 trials): every claim's mean posterior regresses to
  within **0.05** of its prior (largest |mean_post − prior| = 0.016). PASS.
- **G-prior-sens** (prior swept over {0.25,0.35,0.45,0.55,0.60} applied to all claims): top claim
  = C1 and the top-3 set {C1,C3,C2} are **invariant** across the whole sweep. PASS.
- **G-monotone**: unit-tested (support strictly raises, contradict strictly lowers, equal pair
  cancels to prior). PASS.
- **G-selftest**: 34/34. PASS.

## Predictions & Brier (scored against the built ledger)
| id | prob | claim | outcome | Brier |
|---|---|---|---|---|
| P1 | 0.82 | top claim = C1 NO-LINEAR-BINDING | TRUE (0.993, rank 1) | 0.0324 |
| P2 | 0.97 | update is monotone | TRUE (self-test) | 0.0009 |
| P3 | 0.70 | C8 multilingual stays uncertain [0.35,0.65] | TRUE (0.484) | 0.0900 |
| P4 | 0.90 | shuffle null → within ±0.05 of prior, all claims | TRUE (max dev 0.016) | 0.0100 |
| P5 | 0.72 | top-3 survives prior sweep [0.25,0.60] | TRUE (set invariant) | 0.0784 |

**Mean Brier = 0.0423** (5/5 predictions TRUE; all gates PASS → SCORED, not INSTRUMENT_FAILURE).

## Limitations / honesty (T3 ceiling — non-negotiable)
- Posteriors are **bookkeeping of the campaign's own T3 evidence, NOT a promotion**. No claim is
  advanced above T3 by this ledger; the highest (C1) is displayed at the 0.9933 clamp ceiling
  precisely to avoid manufacturing certainty from correlated rows.
- **Non-independence**: rows on one claim share a model (SONAR) and stimuli; the conservative LRs
  (max ln4≈1.39/row) + the ±5 clamp are the mitigation, but the true effective evidence is less
  than the row count suggests. C1's 0.993 should be read as "strongly supported", not "99.3% true".
- **System mixing**: C2 mixes SONAR (066/068-072) with one ladder family (067); C4 is ladder-TAE
  ontogeny, not SONAR. Caveated per claim in the ledger.
- **Strength/direction are my reading** of each RESULT's verdict (an analyst judgment), though
  anchored to the published effect sizes/gate outcomes and shrunk by each row's own Brier. The
  shuffle-null and prior-sensitivity controls guard the *ranking*, not the strength assignments.
- The 460-bit ceiling (C2) is itself POST-HOC/not-frozen in its origin row (066) — reflected in
  066's high Brier (0.295) shrinking its contribution.
- Two claims (C5 fabrication, C8 multilingual) rest on ≤2 rows — LOW confidence, correctly near prior.

## Follow-up worth funding? (Y — narrow)
Y: (1) wire the ledger into harvest so each new row auto-appends its Evidence (row + Brier +
one-line direction) and the posteriors update mechanically — the campaign's live scoreboard.
(2) Replace analyst strength labels with a rule that reads effect size + gate outcome directly
from `out/results.json` (removes the one subjective step). (3) A proper independence discount
(down-weight correlated rows within a block) would let C1 report an honest sub-clamp posterior.
