# L1 PIT Reconstruction Verify v0.1

**STATUS:** VERIFY_ONLY (no L1 redesign)  
**DECISION:** `L1_PIT_PARTIAL`  
**rule_id:** `L1-US-v0.1` (FROZEN / live)  
**MODEL_CHANGE:** NO  
**SCORING_CHANGE:** NO (no scores beyond existing L1 authorization)  
**Sealed challenge:** PARKED  
**Workstream:** MVM Closure D (James `5baebbdc`)  
**Hub job:** `b73c292a-16e2-4f11-9370-1337d0239791`  
**Written:** 2026-09-10 ~2:50 PM PT / `2026-09-10T21:52:38Z`

## Scope

Preserve current frozen/live L1. Verify **only** what is necessary for point-in-time historical reconstruction of L1 as-of a cutoff `T`. Do **not** redesign bands, aggregation, or authorization.

Two reconstructibility senses are distinguished:

| Sense | Meaning | Outcome here |
|-------|---------|--------------|
| **Identity / regression replay** | Rebuild L1 from the **pinned** raw revision + frozen rule and match `production_scores` / NULL masks | **READY** (verified) |
| **Knowledge-cutoff PIT** | Rebuild L1 as it would have been knowable at arbitrary historical `T` (release/availability vintages) | **PARTIAL** — residual gaps below |

## Located frozen / live artifacts

| Role | Path | sha256 |
|------|------|--------|
| Frozen rule | `docs/l1/L1-US-v0.1.md` | `c49fb9ec9d848e9a9e35739e95075e7cbac23f1ca129900baf171c8b250a7bd3` |
| Registry snapshot | `data/l1/measurement_registry.json` | `11841038d8dbd3015d9e5bbdbf38e331bce9c86754805448c39fe7a1f8392c98` |
| Replay pin / manifest | `docs/hist/L1_REPLAY_REFERENCE_PIN.json` (= `data/hist/l1_replay_reference_pin.json`) | `5b437391ff16a2d5a763da762266f2594fb3519de4a69d41d449930997b4f1b9` |
| Production scores | `data/l1/production_scores.json` | `0d202bc1a15296920e9293d8bba221aca4d3497d58a7d739f4ca87039acb83b3` |
| Production report | `docs/l1/L1_PRODUCTION_REPORT.md` | `eecf3ce0ce48593e03d80816362f14864a8da9633b57eaf37bfd86e5e48a330e` |
| Audit example | `data/l1/production_audit_example.json` | `ed06d075a645dc2a4ab26b4bb223f1b33bf42742f8686e5ec5006e534827065b` |
| Pinned raw CSV | `data/raw/l1/pew_individual_and_smoothed.csv` | `c32f7f02ceed3fc647f14e3afa2c09e9d6affff07887c5c240641d902705de9d` |
| Pinned raw meta | `data/raw/l1/pew_individual_and_smoothed_meta.json` | `3a3e747ec2732730f8f3cda5f310f5a8acb208f6ba88b7fa505a5ebc350cdb82` |
| Scorer (extra) | `srp/constructs/l1_us.py` | `bb3ea4890bf9fb0c6f4a06c0ff764558ca29220887f73c0515062cd7ab3d5fe1` |
| Scorer series JSON (extra) | `data/l1/historical_series.json` | `21093215d27b29a26a9cf23407a84639749780506975d25f828286bb0e1bf296` |
| PIT/replay infra memo | `docs/hist/WAVE2C_HIST_BACKTEST_INFRA.md` | `eab6e6427e88a591209351c2977cd113fb988b66e9d084afd9c98764caefba07` (not replay reference) |
| Source lineage | `docs/l1/SOURCE_LINEAGE.md` | `2cc06602727cb81011d7387d202cb11f1604ca09e4b63c779e48cac9ef422ea1` |

**Pin verify:** all 7 `artifacts[]` hashes in `L1_REPLAY_REFERENCE_PIN.json` match bytes on disk (`ALL_PIN_OK`).  
**CSV ≡ historical_series:** 163 individual poll keys set-equal.  
**Identity rebuild:** `score_l1_us_year` vs `production_scores.annual_scores` → **0 mismatches**.

## PIT reconstructibility checklist

Inputs / vintages / release dates / scripts / hashes required to rebuild L1 as-of historical cutoff `T`:

| # | Input | Vintage / release | Status |
|---|-------|-------------------|--------|
| 1 | Frozen rule `L1-US-v0.1.md` | freeze 2026-09-08 PT | **AVAILABLE** |
| 2 | `measurement_registry.json` bands + aggregation | FROZEN | **AVAILABLE** |
| 3 | Replay pin + artifact sha256 manifest | pin_id `l1-us-v0.1-replay-reference-2026-09-10` | **AVAILABLE** |
| 4 | Pinned raw individual polls CSV + meta | Pew page 2025-12-04; retrieved 2026-09-09 | **AVAILABLE** |
| 5 | Per-poll `field_date` | in CSV / series JSON | **AVAILABLE** |
| 6 | Expected `production_scores.json` + report (oracle) | generated 2026-09-08/09 | **AVAILABLE** |
| 7 | Scorer `srp/constructs/l1_us.py` | on disk; identity PASS | **AVAILABLE** |
| 8 | Documented identity replay procedure | WAVE2C hist infra + pin | **AVAILABLE** |
| 9 | Publisher **release** dates ≠ field_date | — | **MISSING** |
| 10 | Multi-vintage raw archive as-of earlier `T` | only one revision pinned | **MISSING** |
| 11 | Authorized knowledge-cutoff filter API | `as_of_year` = freshness only | **MISSING** |
| 12 | Frozen policy: field_date vs release for PIT `T` | temporal research notes only | **UNKNOWN** |

## Minimum rebuild recipe (identity / pinned vintage)

1. Load rule + registry: `docs/l1/L1-US-v0.1.md`, `data/l1/measurement_registry.json`.
2. Load pinned polls: `data/raw/l1/pew_individual_and_smoothed.csv` **or** equivalent `data/l1/historical_series.json` (`series.pew_individual_polls.points`).
3. Run `srp/constructs/l1_us.py` annual arithmetic mean of construct-compatible individual polls; apply frozen bands; **no interpolation / no carry-forward**.
4. Compare to `data/l1/production_scores.json` (scores + NULL mask for missing years e.g. 2016, 2018).
5. Confirm pin hashes via `docs/hist/L1_REPLAY_REFERENCE_PIN.json`.

For a **calendar-year** as-of `T=YYYY-12-31` using the pinned vintage, restrict to polls with `year <= YYYY` (or `field_date <= T`) — data supports this; scorer today aggregates by calendar year when called per year.

For a **knowledge-cutoff** as-of arbitrary historical `T`, items 9–12 remain residual gaps (do **not** invent release dates or multi-vintage history in this tick).

## Decision

**`L1_PIT_PARTIAL`**

- **Blockers:** none (freeze preservation + identity replay unblocked).
- **Residual gaps (non-blocking for live L1 preserve):** `publisher_release_dates, multi_vintage_raw_archive, asof_knowledge_filter_api, explicit_pit_policy_field_date_vs_release`.
- Sealed historical challenge remains **PARKED** — this verify does not unpark or execute it.

## Explicit non-actions

- No L1 redesign / band retune / MODEL_CHANGE.
- No new constructs scored.
- No sealed-challenge case/outcome access.
- No claim that knowledge-cutoff PIT for arbitrary past `T` is fully solved.
