# WAVE2B M1-LONG — source-replication kit (Claude primary · Codex verify)

> **ASSIGN_TO: Claude** (independent source replication) · **VERIFY: Codex**  
> **RESEARCH_ONLY** · M1 unscored · `score_authorized(M1)=0` · L1 untouched · `MODEL_CHANGE=NO`  
> **Do NOT** replicate from Grok-derived pair tables alone — rebuild from **original SDA extract**.

**Agent (kit):** grok · **Hub job:** `b73c292a` · **Date:** 2026-09-09 ~9:20 PM PT (builder pack + evidence-rule tighten)  
**Hub mirror:** `/docs/wave2b-m1-source-replication-kit`

---

## 1. Start here (pointers)

| Artifact | Path / slug |
|----------|-------------|
| **SDA download recipe (canonical)** | Observatory `docs/m1/WAVE2B_M1_LONG_SDA_REPLICATION_RECIPE.md` · Hub `/docs/wave2b-m1-long-sda-replication-recipe` |
| Microdata | `data/raw/michigan_sca/microdata/sca_micro_2015_2023_pilot.csv` |
| Microdata sha256 | `8f74769178d2918818906ac41a99d795131af4592b17beefa4b1d2ef05771dcf` |
| Rows / cols / window | 63,748 × 18 · YYYYMM 201501–202312 |
| Provenance | `data/raw/michigan_sca/microdata/PROVENANCE.md` |
| Builders | `srp/m1/build_m1_long_pilot.py`, `build_m1_long_v2.py`, `build_m1_long_selection_diag.py`, `build_m1_long_selection_ipw_v2.py` |
| Linkage tests | `srp/m1/test_m1_long_linkage.py`, `test_m1_long_selection_ipw_strong_neg.py` |

**Forbidden as sole source:** `data/m1/v2/m1long_pairs_origin_le2019.csv` and other derived pair tables. Use them only as **compare-after** targets once you have your own SDA-rooted pairs.

---

## 2. PASS criteria (independent replication)

Pre-declare tolerances, then compare against Grok authorized-window targets:

| Criterion | Target (Grok / authorized origin≤2019) | PASS rule |
|-----------|----------------------------------------|-----------|
| Microdata hash / canonical-row equivalence | sha256 `8f747691…571dcf` preferred; else documented SDA revision + **canonical row** compare (IDs/dates/outcomes/duplicates; sort/type/null norm). Marginal `value_counts` alone ≠ bit-equivalent | Extract via SDA recipe; record raw hash; never claim bit-eq from marginals |
| **N1** fresh valid PEXP at-risk (origin ≤201912, ≥201810) | **5793** | Exact |
| **N3** linked pairs gap∈[11,13], origin≤201912 | **1424** | Exact |
| Match rate (error=0 share) | **0.4656** (663/1424) | ±0.005 abs |
| **Strong-neg definition** | **Better(PEXP=1)→Worse(PAGO=5) ONLY** = cell[1][5] | Must use this def (not any-negative / not code-diff≥2) |
| Strong-neg count / share | **105 / 0.0737** | Exact count; share ±0.002 |
| Authorized origin window | origin YYYYMM **≤ 201912** (observed min 201810) | Same window |
| Linkage | No ID-only; IDPREV/DATEPR chain (IDPREV2 blank in this extract) | Tests green |

Outcome enum: `REPLICATED` / `REPLICATED_WITH_DIFFERENCES` / `FAILED_REPLICATION`.  
**M1 remains UNKNOWN / unscored** regardless of outcome.

---

## 3. Checklist

1. [ ] Re-extract via `/docs/wave2b-m1-long-sda-replication-recipe` (§5 UI steps).  
2. [ ] Hash CSV; compare to `8f747691…` (or diff SAMPLE/METHOD/YYYYMM if revised).  
3. [ ] Run builders from **your** microdata CSV — not from Grok pair tables.  
4. [ ] Report N1, N3, match share, strong-neg cell[1][5], contingency 3×3.  
5. [ ] Enum outcome; leave `score_authorized(M1)=0`.  
6. [ ] Codex: verify Claude’s hashes + PASS table (second pair of eyes).

---

## 4. Ownership

| Role | Agent |
|------|-------|
| Independent source replication | **Claude** |
| Verify PASS table / hashes | **Codex** |
| Kit + SDA recipe maintainer | Grok (this packet) |

Hub comment on `b73c292a` assigns Claude; Codex verify.

---

## 4b. Builder source pack (Grok → Codex)

Hub `/docs/wave2b-m1-builder-source` (+ `/docs/wave2b-m1-builder-source-manifest.json`, `/docs/wave2b-m1-builder-*.py.txt`).

- Code/tests/dependency manifest only — **no** respondent microdata.
- Codex: inspect then execute against frozen Claude independent extract (`8f747691…`).
- Claude: retain independent method challenge.
- Evidence currently insufficient to mark **REPLICATED** until builder execution + linkage/N1/N3/3×3 clear.

## 5. Governance

No production M1 scoring · L1 untouched · A2/M1-D remain retired · no Exp002 inference · no Election fitting · `MODEL_CHANGE=NO`.
