# WAVE2B M1-LONG — Michigan SCA same-person pilot RESULTS

**Agent:** grok · **Hub job:** `b73c292a-16e2-4f11-9370-1337d0239791`  
**Research job:** `c4daef50-b988-45df-b064-f4f035cd2ad1`  
**Status:** **RESEARCH ONLY** — **no production scoring** · **no formula freeze**  
**Date:** 2026-09-09 ~10:15 AM PT  
**L1:** `L1-US-v0.1` frozen/unchanged · **`score_authorized(M1)=0`**  
**Plan:** `docs/m1/WAVE2B_M1_LONG_PILOT_PLAN.md`  
**Builder:** `srp/m1/build_m1_long_pilot.py`

---

## 0. Explicit gates (read first)

| Gate | Status |
|------|--------|
| Research-only person-level pilot | **YES** |
| Production M1 scoring / Hub `/srp` formula | **NO — not touched** |
| Formula freeze | **NO** |
| `score_authorized(M1)` | **remains false / 0** |
| L1-US-v0.1 | **unchanged** |
| Aggregate A2 / M1-D | **remain RETIRED** — not restored |
| Aggregate A2 as substitute construct | **FORBIDDEN** (diagnostic comparator only if used later) |
| ID-only / CASEID-only linkage | **REJECTED** in code + unit tests |

This memo is evidence for Claude review of **diagnostics**, not authorization to score M1.

---

## 1. Microdata provenance

| Field | Value |
|-------|-------|
| File | `data/raw/michigan_sca/microdata/sca_micro_2015_2023_pilot.csv` |
| Rows | 63,748 |
| YYYYMM | 201501–202312 |
| SHA-256 | `8f74769178d2918818906ac41a99d795131af4592b17beefa4b1d2ef05771dcf` |
| Source | SDA customized subset (public UI) — see `microdata/PROVENANCE.md` |
| METHOD in extract | **all 1 (telephone CATI)** |
| SAMPLE in extract | 2, 3, 4, 5 only (no ABS web 6/7/8) |

**IDPREV2 / DATEPR2:** empty for all rows in this extract (`nonnull=0`).  
Official fields exist in SDA codebook and were requested; export values are blank.  
**Linkage used:** `(IDPREV, DATEPR)` **two-step chain** interview 3 → 2 → 1.  
IDPREV2 shortcut path retained in code for future extracts.

**2024 phone→web break:** extract ends **202312**. Official mix starts 202404 / web-only ≥202407 → **out of sample**. All pairs are `phone→phone`.

---

## 2. Linkage procedure (executed)

1. Destination: `SAMPLE ∈ {5, 8}` (here: **5** = Cell RDD Second Reinterview; N=5,079).  
2. Chain: dest `(IDPREV, DATEPR)` → mid `(ID, YYYYMM)`; mid `(IDPREV, DATEPR)` → origin `(ID, YYYYMM)`.  
3. Require origin `SAMPLE ∈ {1,3,6}` fresh (here: **3**), `PEXP ∈ {1,3,5}`, dest `PAGO ∈ {1,3,5}`.  
4. Treat codes 8/9 as missing.  
5. Record `gap_months`; primary analysis H ∈ [11,13].  
6. **No ID-only matches.** Unit tests in `srp/m1/test_m1_long_linkage.py` remain green (10 passed).

### Link QC

| Outcome | N |
|---------|---|
| Paired | **4,907** |
| Dest PAGO missing (8/9) | 1 |
| Origin PEXP missing (8/9) | 171 |
| Duplicate person keys | 0 |
| Chain vs IDPREV2 disagreement | 0 (IDPREV2 absent) |
| Link method | `idprev_chain` × 4,907 |

---

## 3. Pair counts & horizon

| Metric | Value |
|--------|-------|
| **N_pair (any gap)** | **4,907** |
| **N_pair H∈[11,13]** | **4,907** (100%) |
| Horizon median | **12** months |
| Horizon mean / min / max | 12 / 12 / 12 |
| Origin YYYYMM range | 201810–202212 |
| Dest YYYYMM range | 201910–202312 |
| Mode pair | phone→phone 4,907 |
| Success vs plan threshold (≥200) | **PASS** (≫200) |

---

## 4. Attrition funnel (research accounting)

| Step | N | Rate |
|------|---|------|
| N1 fresh (`SAMPLE∈{1,3,6}`) with PEXP∈{1,3,5} | 37,153 | — |
| N2 of which appear as reint-2 prior | 18,466 | 49.7% of N1 |
| N3 linked pairs with valid PAGO | 4,907 | 13.2% of N1 |
| Eligible primary (H∈[11,13]) | 4,907 | 13.2% of N1 |

**Notes:** Selective attrition into interview 3 is expected. No custom attrition weights / IPW in v1. Report both unweighted counts and `WT` (dest) weighted miss sums in artifacts. Mid rows in this extract are exclusively `SAMPLE=4` (Cell RDD Reinterview).

---

## 5. Person-level miss table (expectation vs realization)

**Coding (predeclared, not frozen):** 1→+1, 3→0, 5→−1; 8/9 missing.  
**Sketch:** \(\mathrm{error}_i = s(\mathrm{PEXP}_i(t)) - s(\mathrm{PAGO}_i(t+H))\).

### Contingency (unweighted counts), H=12, N=4,907

| PEXP \\ PAGO | better (1) | same (3) | worse (5) | Row |
|-------------|------------|----------|-----------|-----|
| **better (1)** | 935 | 300 | 362 | 1,597 |
| **same (3)** | 904 | 760 | 710 | 2,374 |
| **worse (5)** | 164 | 192 | 580 | 936 |
| **Col** | 2,003 | 1,252 | 1,652 | **4,907** |

### Signed error distribution

| error | N | Share |
|------:|--:|------:|
| −2 | 164 | 3.3% |
| −1 | 1,096 | 22.3% |
| **0** | **2,275** | **46.4%** |
| +1 | 1,010 | 20.6% |
| +2 | 362 | 7.4% |

| Indicator (research defs) | Share |
|---------------------------|------:|
| Disappointed (exp better → got worse) | 7.4% |
| Pleasantly surprised (exp worse → got better) | 3.3% |

**Do not** interpret these as production M1 scores or authorize thresholds.

---

## 6. METHOD / mode stratum

| Stratum | N |
|---------|---|
| phone→phone (`METHOD` 1→1) | 4,907 |
| web→web | 0 |
| cross-mode / transition | 0 |

**2024 break annotation:** out of sample (extract ≤202312). Expand to Stratum B/C only when post-2023 microdata with populated `METHOD` mix / web SAMPLE codes lands.

---

## 7. Artifacts (`data/m1/`)

| File | Role |
|------|------|
| `m1long_pairs_pilot_stratumA.csv` | Linked pairs |
| `m1long_pilot_miss_table.csv` | Contingency + shares |
| `m1long_pilot_horizon_months.csv` | Gap histogram |
| `m1long_pilot_attrition.json` | Funnel |
| `m1long_pilot_summary.json` | Machine-readable summary |
| `m1long_pilot_protocol.json` | Protocol (research-only flags) |
| `m1long_pilot_SHA256SUMS.txt` | Checksums |

Builder: `srp/m1/build_m1_long_pilot.py`  
Tests: `pytest srp/m1/test_m1_long_linkage.py` → **10 passed** (includes `score_authorized(M1) is False`).

---

## 8. What this does *not* claim

- No M1 0–4 scores; no L1 interaction; no PRD merge.  
- No restoration of aggregate A2 identity on different people.  
- No predictive skill claim; descriptive pilot only.  
- No formula freeze; signed map is predeclared research sketch only.  
- Holdout / web-era / cross-mode work deferred until later extracts.

---

## 9. Recommended next (for Claude review / James)

1. **Claude:** review linkage QC, miss table, attrition interpretation; confirm research-only gate language.  
2. Optional: rebuild aggregate A2 shape from Tables 6/8 as **contamination diagnostic only** (caption required).  
3. Optional: obtain extract with populated `IDPREV2`/`DATEPR2` + 2024+ months for mode-break sensitivity.  
4. **Do not** flip `score_authorized(M1)` without a separate James decision after review.

---

## 10. Success criteria checklist (plan §7)

| Criterion | Result |
|-----------|--------|
| Access + provenance | **PASS** |
| Linkage QC / reject ID-only | **PASS** |
| N_pair hundreds+ (≥200) | **PASS (4,907)** |
| Deliverable under `data/m1/` | **PASS** |
| Governance research-only language | **PASS** |
| No production leakage | **PASS** |
