# WAVE 2B — A1/A2 cleanup + Track B draft (research only)

**Status:** RESEARCH ONLY — **no M1 production scoring**  
**Date:** 2026-09-08 ~9:10 PM PT (artifacts 2026-09-09 UTC)  
**Responds to:** Astra DESIGN REPLY Hub `2653b179` (retain A1+A2 into Track B; neither frozen nor scoring-authorized)  
**Governance:** OWNER UPDATE `f661ad43` → `decision_authority=delegated_agent_governance`, `delegated_by=owner` (see `docs/GOVERNANCE.md`). Does **not** auto-accept M1.  
**L1:** `L1-US-v0.1` unchanged  
**Phase / Alert:** remain **INSUFFICIENT DATA**  
**score_authorized(M1):** **false / 0**

Hard gates: no M1 0–4 scores; no threshold freeze; no Phase/Alert from M1; no outcome-guided band picks.

---

## 1. Exact Pearson overlap (preferred: 47 full-year both)

| Sample | Years | n | Pearson r (A1 vs A2 annual means) |
|--------|-------|---|-----------------------------------|
| **Preferred:** A1 and A2 each have **12** monthly gaps | **1979–2025** | **47** | **0.410** |
| Any year with both annual means (includes partial) | 1979–2026 | 48 | 0.416 |

- A1 full-12 sample alone: **48** years (1978–2025).  
- A2 full-12 sample alone: **47** years (1979–2025) — A2 needs PEXP at t−12, so first realization year is 1979.  
- Prefer **n=47** for A1↔A2 comparability statements.  
- Artifact: `data/m1/a1_a2_overlap_correlation.json`.

Interpretation (research): positive but far from 1 → **related, not redundant** within the same SCA family.

---

## 2. Comparability notes — PEXP vs PAGO (relative indices, same SCA family)

| Item | PEXP_R (Table 8) | PAGO_R (Table 6) |
|------|------------------|------------------|
| Wording family | Personal finances | Personal finances |
| Horizon | **Next 12 months** (expected) | **Past 12 months** (experienced) |
| Index form | Relative = (% better − % worse + 100) | Same relative construction |
| Survey | Michigan SCA, same monthly release process | Same |
| Archive monthly floor | 1978-01 | 1978-01 |

**Comparability:**

- Same **SCA relative-index family** and personal-finance domain → A2 is an *internal* expectation→realization gap, not survey-vs-macro.  
- Horizon match is intentional: PEXP asked at t−12 about the coming year vs PAGO at t about the year just lived.  
- **Not** level-comparable to ICE/ICC composites without care: ICE/ICC mix personal + durables/business components; PEXP/PAGO are single personal-finance items.  
- Relative indices are **bounded diffusion-style** scores (centered near 100), not dollars — do not interpret A2 points as income %.  
- Same-month ICE−ICC (A1) and lagged PEXP−PAGO (A2) share respondent mood / SCA vintage effects → expect partial correlation (observed ~0.41).

---

## 3. Mechanical quantile-selected example years

**Rule:** among years with 12 monthly gaps, pick the year whose annual mean is **closest** to the empirical p10/p25/p50/p75/p90 (ties → earlier year). **Not** event-picked; **not** Phase/Alert/political selected.

### A1 (ICE−ICC) — full-12 sample n=48

| Quantile | Year | A1 annual | ICE mean | ICC mean |
|----------|------|-----------|----------|----------|
| p10 | **2018** | −26.08 | 88.18 | 114.27 |
| p25 | **2014** | −23.28 | 75.02 | 98.30 |
| p50 | **1991** | −18.52 | 70.32 | 88.83 |
| p75 | **1997** | −14.00 | 97.72 | 111.72 |
| p90 | **2023** | −8.11 | 62.17 | 70.28 |

### A2 (PEXP_lag12 − PAGO) — full-12 sample n=47

| Quantile | Year | A2 annual | PEXP<sub>t−12</sub> mean | PAGO mean |
|----------|------|-----------|--------------------------|-----------|
| p10 | **2014** | +3.33 | 110.17 | 106.83 |
| p25 | **2016** | +5.33 | 123.50 | 118.17 |
| p50 | **1985** | +13.17 | 128.08 | 114.92 |
| p75 | **1982** | +21.00 | 111.25 | 90.25 |
| p90 | **2011** | +30.17 | 110.00 | 79.83 |

Artifact: `data/m1/mechanical_quantile_years.json` (replaces narrative/event examples for cleanup; prior crisis-year table in `WAVE2B_A1_A2_EVIDENCE.md` remains audit narrative only).


---

## 3b. Quantile selection — version note (not a silent replace)

ChatGPT/Astra flagged that A2 **p75** moved from **2024** (hub comment `cbcef883`, labeled nearest-rank) to **1982** (this cleanup, closest-to-p). Both results are reproducible; the **selection method changed** and must stay versioned.

| Version | Hub ref | Rule (A2 full-12, n=47) | A2 p75 year | A2 p75 value |
|---------|---------|-------------------------|-------------|--------------|
| **v0 (prior)** | `cbcef883` | Nearest-rank index `floor(p/100·(n−1))+1` on value-sorted annual means (p75 → rank 35) | **2024** | +20.4167 |
| **v1 (canonical cleanup)** | this memo + `mechanical_quantile_years.json` | Empirical p via numpy `percentile(..., method="linear")`, then year with **min abs(annual_mean − p)**; **ties → earlier year** | **1982** | +21.0000 |

**Why they differ at p75:** target p75 (linear) ≈ **20.7083**. Distances:

- 1982: abs(21.0000 − 20.7083) = 0.2917  
- 1991: abs(21.0000 − 20.7083) = 0.2917 (tie)  
- 2024: abs(20.4167 − 20.7083) = 0.2917 (tie)

v1 tie-break picks **earliest year → 1982**. v0 rank index lands on sorted position 35 → **2024**.  
True `ceil(p/100·n)` nearest-rank also yields 1982 (rank 36); the earlier hub “nearest-rank” wording matched the **floor((n−1)·p/100)+1** index, not ceil.

**Policy:** v1 is canonical for cleanup/Track-B research. v0 remains auditable via `cbcef883` + `wave2b-a1-a2-example-years.json` / correlation artifacts. Do **not** treat year swaps as corrections without citing the rule version.

**Hub mirrors (public):**

- Memo: `/docs/wave2b-a1-a2-cleanup-and-b`
- Mechanical years JSON: `/docs/wave2b-mechanical-quantile-years.json`
- FRED ingest status: `/docs/wave2b-track-b-fred-status.json`


---

## 4. Directional meaning of A2 + falsification checks

### Directional meaning (research convention, not a score)

\[
A2(t) = PEXP\_R(t-12) - PAGO\_R(t)
\]

- **A2 > 0:** households’ prior personal-finance expectations were **more favorable** than subsequent realized PAGO → **worse-than-expected / disappointment** on the 12-month personal-finance horizon.  
- **A2 < 0:** realized PAGO **better** than prior PEXP → **better-than-expected**.  
- **A2 ≈ 0:** prior expectations roughly matched later reports.  
- Typical sample: A2 usually **positive** (mean ~14.7 on full-12 annuals) — chronic mild over-optimism of PEXP vs later PAGO is the baseline, not automatically “crisis.”

Distinct from A1: A1 is **contemporaneous** ICE vs ICC (forward mood vs current conditions *now*), usually **negative**.

### Simple falsification / invalidation checks for A2-as-gap

A2 would be a **poor / invalidated** Expectation-Gap operationalization if any of the following hold on inspection:

1. **Horizon mismatch:** if PEXP and PAGO are shown not to refer to the same 12-month personal-finance window (SCA wording change or wrong table).  
2. **Near-redundant with A1:** if preferred-overlap |r| persistently ≈ 1 (or A2 ranks identical to A1 every year) → no distinct information. Current r≈0.41 **fails this invalidation**.  
3. **Sign incoherence:** if large positive A2 systematically occurs when both prior PEXP and current PAGO are *improving together* in a way that cannot be read as disappointment (e.g., coding inverted) — verify with component means (see quantile table).  
4. **No realization link:** if A2 fails to move when PAGO collapses while lagged PEXP was high (classic disappointment pattern) **and** instead tracks only contemporaneous ICE−ICC — then A2 adds nothing beyond A1.  
5. **Artifact of missingness / partial years:** if results depend on imputing missing months — we **forbid** interpolation; partial years excluded from preferred n=47.  
6. **Wrong object:** if the research goal is *material* E vs *objective* X, survey-only A2 cannot alone carry that claim — that is Track B’s job; A2 remains a subjective expectation→realization gap.

---

## 5. Track B formulation draft (research-only; no scores)

### Idea

Hybrid: **subjective E** from SCA (ICE and/or PEXP_R) vs **objective experienced trajectory** in real income / real wages. Housing affordability optional. **No CPI double-count.**

### Proposed series IDs

| Role | Series | ID | Notes |
|------|--------|-----|-------|
| E1 | Michigan ICE | `MICH_ICE` (local) | Already ingested |
| E2 (alt) | PEXP Relative | `MICH_PEXP_R` | Already ingested |
| X1 | Real Disposable Personal Income | FRED **`DSPIC96`** | Prefer YoY % of annual/monthly mean |
| X1 alt | Real DPI per capita (chained) | FRED **`A229RX0`** | Confirm vintage/units at ingest |
| X2 | Real Average Hourly Earnings | FRED **`AHETPI`** | Production & nonsupervisory; already real |
| X3 optional | Housing affordability | NAR HAI or rent/income construct | **Home price alone ≠ affordability** |
| Corroboration | CPI | `CPIAUCSL` / BLS `CUUR0000SA0` | **Do not add as separate stress if X is already real** |
| Forbidden alone | Unemployment | `UNRATE` / BLS `LNS14000000` | ≠ M1 |

### Draft gap forms (choose one later; not frozen)

- **B-DPI:** standardize(ICE annual) − standardize(YoY real DPI) on overlapping years, **or** rank-gap / residual of ICE on lagged DPI growth (inspect first).  
- **B-AHE:** same with `AHETPI` YoY.  
- **B-PEXP:** PEXP_R(t−12) vs subsequent real DPI YoY at t (horizon-aware hybrid).  
- Explicit **no CPI double-count:** if X is already real (DSPIC96 / AHETPI), do not subtract inflation again.

### Coverage / missingness (intended)

| Series | Typical coverage | Cadence | Missingness policy |
|--------|------------------|---------|-------------------|
| ICE / PEXP | 1952+/1978+ | monthly | null months excluded; no interpolate |
| DSPIC96 | ~1959+ | monthly | research annual mean if ≥10–12 months |
| AHETPI | ~1964+ / confirm | monthly | same |
| Overlap with A1/A2 preferred window | aim **1979–2025** | annual | align on full years only for head-to-head |

### Ingest status this run

**BLOCKER:** FRED public CSV timed out from this environment for `DSPIC96`, `A229RX0`, `AHETPI` (12s); no `FRED_API_KEY` configured; `data/raw/fred/` has no DPI/wage caches.

Local BLS bundles contain only `LNS14000000` (UNRATE) and CPI (`CUUR0000SA0`, food, energy) for limited 10-year windows — **not** usable as real DPI/AHETPI substitutes. Documented in `data/m1/track_b_fred_ingest_status.json`.

Track B remains a **formulation + ID + coverage draft**; objective legs not numerically joined until FRED reachable.

---

## 6. A1 vs A2 vs B — construct criteria only (no phase outcomes)

| Criterion | A1 | A2 | B (draft) |
|-----------|----|----|-----------|
| E vs X object | Contemporaneous expectations vs current conditions (composites) | Prior 12m personal-finance expectation vs later realization | Subjective E vs **objective** real income/wages |
| Horizon match | Same month | Explicit 12m lag match | Needs explicit lag (e.g. PEXP vs next-year DPI YoY) |
| Units | Index points (ICE−ICC) | Relative index points | Mixed (index vs % real growth) — needs standardization |
| Face validity for “disappointment” | Moderate (mood now) | **High** for worse-than-expected | High for material gap; lower for pure survey disappointment |
| Contamination | Survey mood / politics | Survey mood / politics | Macro revision/vintage + survey mood on E side |
| Double-count risk | Low (no CPI) | Low | **Must** avoid CPI twice |
| Portability | Weak (Michigan) | Weak (Michigan) | Stronger on X (FRED); E still Michigan |
| Distinguishability vs others | r(A1,A2)≈0.41 on n=47 | See §4 falsification | Unknown until ingest; should diverge if material ≠ sentiment |
| Scoring readiness | **Not authorized** | **Not authorized** | **Not authorized** — formulation only |

**Research stance for final M1 review (not a freeze):** keep **A1 and A2** as parallel survey-family candidates; complete **B** numeric overlap when FRED works; then compare on the table above only — still no `score_authorized` flip without recorded freeze under delegated governance + independent reviewer.

---

## Artifacts

```
docs/GOVERNANCE.md
docs/m1/WAVE2B_A1_A2_CLEANUP_AND_B.md   ← this memo
data/m1/a1_a2_overlap_correlation.json
data/m1/mechanical_quantile_years.json
data/m1/track_b_fred_ingest_status.json
data/m1/a1_a2_annual.csv                (source)
docs/l1/WAVE2B_A1_A2_EVIDENCE.md        (prior pack)
```

## Unchanged gates

- M1 `score_authorized` stays **false**.  
- L1-US-v0.1 unchanged.  
- No Phase/Alert from M1.
