# WAVE 2B — A2 vs Track B (A229RX YoY) discrimination (research only)

**Status:** RESEARCH ONLY — **no M1 production scoring**; **no formula/weight freeze**  
**Date:** 2026-09-09 ~7:54 AM PT  
**Responds to:** Astra DESIGN Hub `6a76a430` (direction `8b4a9c0b`) on job `b73c292a`  
**Governance:** delegated agent governance; **delegation ≠ M1 acceptance**  
**L1:** `L1-US-v0.1` unchanged  
**score_authorized(M1):** **false / 0**  
**Phase / political-event tuning:** **none** (not used)

Hard gates: no M1 0–4 scores; no threshold freeze; no Phase/Alert from M1; **do not subtract** survey-relative A2 units from percent income growth.

---

## Recommendation (Astra menu)

**`hardship-proxy reject-or-modify`**

A2 (`PEXP(t−12)−PAGO(t)`) shows **material negative whole-sample dependence** on 12-month real DPI per-capita growth (BEA **A229RX** / FRED **A229RX0** YoY). Concordant hardship-style cells dominate; the key discordant cell **weak-income / low-disappointment is empty (n=0)**. Treat A2 as hardship-proxy-like: **reject as distinct primary** or **modify** (e.g. residualize vs B / redesign) **before** any M1 formula recommendation. **B remains comparator/validator only.** Formula not frozen; scoring not authorized.

---

## 0. Predeclared mechanical rules (`discrimination_rules_v1`)

Locked **before** labeling cases. Artifact: `data/m1/a2_b_discrimination_rules_v1.json`.

| Rule | Definition |
|------|------------|
| Primary sample | Calendar years with **12** monthly A2 gaps **and** **12** monthly A229RX YoY obs; annual mean = mean of those 12 months |
| Partial years | **Excluded** from primary (2026 partial excluded) |
| A2 coding | Higher A2 = larger **disappointment** (prior expectation above realization) |
| Favorable surprise | Low/negative A2 **not penalized** (no theory for penalty) |
| B role | Comparator/validator only — **never** `A2 − B%` or similar unit mix |
| Income weak | annual B ≤ sample **p25** |
| Income normal-or-strong | annual B ≥ sample **p50** |
| Disappointment low | annual A2 ≤ sample **p25** |
| Disappointment high | annual A2 ≥ sample **p75** |
| Discordant cells | weak∧low ; normal/strong∧high |
| Standardized discordant | `z_B≤−0.75 ∧ z_A2≤−0.75` ; `z_B≥+0.25 ∧ z_A2≥+0.75` (pstdev z on primary sample) |
| Recommendation thresholds | hardship if `(r<−0.35 ∨ ρ<−0.45) ∧ concordant≥max(3×discordant,9) ∧ (weak∧low==0 ∨ disc_share<0.10)`; distinct if `disc_share≥0.15 ∧ n_disc≥6 ∧ r>−0.20`; else ambiguous |

No Phase/Alert outcomes and no political-event year picking entered rule design or examples.

---

## 1. Exact common years / n / filters / frequency (every correlation)

### 1a. Preferred — full-12 annual means

| Item | Value |
|------|-------|
| **Common years** | **1979–2025** (contiguous) |
| **n** | **47** |
| **Full-12-month filter** | A2: 12 monthly `PEXP_R(t−12)−PAGO_R(t)`; B: 12 monthly `A229RX(t)/A229RX(t−12)−1` |
| **Partial-year exclusion** | **Yes** — 2026 excluded (incomplete) |
| **Frequency / method** | Pearson of **annual means** (each year = mean of 12 months) |
| **Pearson r** | **−0.454003** |
| **Spearman ρ** | **−0.564383** |

Years list: 1979,1980,…,2025 (n=47). See `data/m1/a2_b_discrimination.json` → `sample_summary.common_full12_years`.

### 1b. Any-annual (includes partial) — transparency only

| Item | Value |
|------|-------|
| Years | 1979–2026 |
| n | **48** |
| Partial included | **2026** |
| Partial exclusion | **No** |
| Frequency | Annual mean over available months |
| Pearson r | **−0.460460** |

### 1c. Monthly pairs — transparency only (not headline)

| Item | Value |
|------|-------|
| Window | 1979-01 … 2026-07 |
| n | **571** |
| Filter | months with both A2 gap and A229RX YoY |
| Frequency | monthly |
| Pearson r | **−0.252311** |

### 1d. What was **not** done

- No subtraction of A2 index points from B percent growth.
- No outcome-guided band picks; no Phase/political tuning.

---

## 2. Comparator construction (units kept separate)

| Leg | Series | Units | Role |
|-----|--------|-------|------|
| A2 | Michigan SCA `PEXP_R(t−12) − PAGO_R(t)` | relative index points | Candidate disappointment gap |
| B | BEA **A229RX** YoY (= FRED **A229RX0**) | decimal growth (×100 = %) | **Comparator / validator only** |

Compare via correlation, joint quantiles, and standardized scores — **not** by mixing units into one gap formula.

---

## 3. Quantile cross-tab (primary n=47)

Thresholds on primary sample:

- A2: p25=**5.167**, p50=**13.167**, p75=**20.708**
- B YoY: p25=**0.010739** (~1.07%), p50=**0.019495** (~1.95%), p75=**0.026314**

| income \\ disappointment | low (≤p25) | mid | high (≥p75) | row n |
|--------------------------|------------|-----|-------------|-------|
| **weak (≤p25)** | **0** | 7 | **5** | 12 |
| mid | 0 | 6 | 5 | 11 |
| **normal/strong (≥p50)** | **12** | 10 | **2** | 24 |

**Discordant (joint-quantile):** n=**2** (share 4.3%) — both `normal/strong ∧ high`: **1992**, **2002**.  
**Concordant:** n=**17** — `weak∧high` (5) + `normal/strong∧low` (12).  
**weak∧low:** **0**.

Artifact CSV: `data/m1/a2_b_discrimination_crosstab.csv`.

---

## 4. Standardized comparison

z = (x − mean) / pstdev on primary sample (A2 mean 14.663, sd 11.104; B mean 0.01839, sd 0.01930).

Predeclared discordant labels found:

| Year | A2 | B YoY | z_A2 | z_B | Label |
|------|----|-------|------|-----|-------|
| **1992** | 25.00 | 0.02607 | +0.93 | +0.40 | normal/strong income ∧ high disappointment |

Only **n=1** standardized discordant year under the predeclared z-rule (2002 is joint-quantile discordant but z_B=+0.14 < +0.25).

---

## 5. Mechanical examples (not event-picked)

### 5a. Nearest-to-quantile years (A2)

| Quantile | Year | A2 | B YoY |
|----------|------|----|-------|
| p10 | 2014 | 3.33 | 0.0264 |
| p25 | 1984 | 5.00 | 0.0576 |
| p50 | 1985 | 13.17 | 0.0218 |
| p75 | 1982 | 21.00 | 0.0124 |
| p90 | 2011 | 30.17 | 0.0136 |

### 5b. Cell exemplars (nearest to cell mean in z-space)

| Cell | Year | A2 | B YoY | Notes |
|------|------|----|-------|-------|
| weak ∧ low (discordant) | — | — | — | **empty** |
| normal/strong ∧ high (discordant) | **2002** | 24.50 | 0.0211 | mechanical cell exemplar |
| weak ∧ high (concordant) | **2009** | 40.58 | −0.0063 | |
| normal/strong ∧ low (concordant) | **2015** | 0.25 | 0.0312 | favorable-surprise side not penalized |

---

## 6. Directional coding confirmation

- **Higher A2** = greater disappointment (lagged expectation above realized PAGO).
- **Lower / negative A2** = favorable surprise relative to prior expectation — **not penalized** absent theory.
- **Higher B** = stronger real DPI per-capita YoY.
- Coding does **not** invert A2 to “reward” weakness; hardship-proxy reading arises from empirical negative dependence, not from flipping signs.

---

## 7. Sensitivity

| Spec | n | Pearson r |
|------|---|-----------|
| Primary full-12 | 47 | **−0.454** |
| Drop NBER-approx years {1980,1981,1982,1990,1991,2001,2008,2009,2020} | 38 | **−0.454** |
| Drop top/bottom 2 A2 years {2008,2009,2017,2018} | 43 | **−0.420** |
| Spearman (primary) | 47 | **ρ=−0.564** |
| Monthly (transparency) | 571 | −0.252 |

Sign and magnitude of annual dependence are stable.

---

## 8. Independent-reviewer note

**Discordant cases alone ≠ construct validation.**

- **Whole-sample dependence:** r=−0.454 / ρ=−0.564 on the preferred n=47 sample — consistent with **partial hardship overlap** (weaker income ↔ higher A2 disappointment).
- **Sensitivity:** dependence persists after recession-year drops and A2-tail trim.
- **Population / aggregation limits:**
  - A2 is a national SCA diffusion-style relative index, not household micro hardship.
  - A229RX is national real DPI per capita — averages over distributional stress.
  - Annual means collapse within-year path; monthly association is weaker.
  - Survey vs NIPA frames/weights differ; BEA revision/vintage risk remains.
- The **two** discordant years (1992, 2002) illustrate non-identity of constructs but **do not** validate A2 as a distinct M1 disappointment measure given empty weak∧low and concordant dominance.

---

## 9. Artifacts + script hash

| Path | Role | sha256 |
|------|------|--------|
| `scripts/wave2b_a2_b_discrimination.py` | rebuild | `c9cd729acb74241194174414e2f06218874e014a13fab1ada7b15a1333e57210` |
| `data/m1/a2_b_discrimination.json` | full results | `ce3628d1e49e5004364dcf0f0ee9fdb3a1504f15384dc441184cb9fce54b54a3` |
| `data/m1/a2_b_discrimination_annual.csv` | year-level pairs + bins | `98d8444b966d70fea36444db537652fbf2ae2d2b0aaa393f1251f08e0401289d` |
| `data/m1/a2_b_discrimination_crosstab.csv` | joint quantile counts | `b51454d4853d8704a1291cfa57f728244f17fde7ce259a372fd4277fb833308e` |
| `data/m1/a2_b_discrimination_rules_v1.json` | predeclared rules | `10b4052bcc6653fbdc44d387ed235fa2dd3ed67818eccb3c49385c64f99f6e24` |
| `data/m1/a2_b_discrimination_provenance.json` | provenance | (regenerated with run) |
| `data/m1/a2_gap_monthly.csv` | A2 input | `ae14d30de08d016c07e2940fd428c9d2321f263a476f9788dab365d50ab49471` |
| `data/m1/a229rx_yoy_monthly.csv` | B input (prior BEA ingest) | `484c96b6025e8caaab5a21ce645e771b28aa4717007881434707949c2c74cf04` |

Inputs reused from prior Wave 2B Michigan + BEA ingest; Track B rebuild script hash remains `2dc7377a2e724e526a868026d059093a2e6dd20c2e285136b726dcdfc8cf6f13` (`scripts/wave2b_track_b_rebuild.py`).

### Hub mirrors (after deploy)

- Memo: `/docs/wave2b-a2-b-discrimination`
- Annual CSV: `/docs/wave2b-a2-b-discrimination-annual.csv`
- Crosstab CSV: `/docs/wave2b-a2-b-discrimination-crosstab.csv`
- JSON: `/docs/wave2b-a2-b-discrimination.json`
- Rules: `/docs/wave2b-a2-b-discrimination-rules-v1.json`
- Rebuild: `/docs/wave2b-a2-b-discrimination.py.txt`

---

## 10. Gates restated

- **score_authorized(M1) = false**
- **Formula not frozen**; no M1 recommendation beyond this discrimination outcome
- **L1-US-v0.1** unchanged
- Phase / Alert remain outside this analysis
