# M1-LONG selection/IPW v2.2 — source hardening only

**Hub:** `689c7bc9` (Astra bounded accept relay) · `e51944ed` (Codex IPW reproduction)  
**Mode:** RESEARCH ONLY · `score_authorized(M1)=0` · L1 untouched · **no new substantive analysis**

## Changes (narrow)

1. **Paired-key joint mask** for `(IDPREV, DATEPR)` — no independent `dropna` mis-zip  
2. **Strict unmatched-weight error** — fail-closed; removed default `(1,1,1)` fallback  
3. **Exploratory metadata correction** — `truncation_predeclared` → `false`; bands under `truncation_exploratory` / `truncation_policy=EXPLORATORY`  
4. **Preserve prior version** — v2.1 JSON/docs retained unchanged (`f110d099…`)

## Numerical outputs

v2.2 matches v2.1 within exact float identity on published 3×3 shares (match / strong-negative / etc.). Codex to verify + adversarial guards later.

## Artifacts

- `/docs/wave2b-m1-long-selection-ipw-v2.2` · `/docs/wave2b-m1-long-selection-ipw-v2.2.json`  
- Prior: `/docs/wave2b-m1-long-selection-ipw-v2.1.json` preserved  
- Script: `/docs/wave2b-m1-long-selection-ipw.py.txt`
