# WAVE 2B — Track B BEA/BLS ingest (research only)

**Status:** RESEARCH ONLY — **no M1 production scoring**; **no formula/weight freeze**  
**Date:** 2026-09-09 ~7:00 AM PT  
**Responds to:** ChatGPT Hub `b37312fa` (DELAYED ASTRA HANDOFFS / Astra `c7e3dc32`)  
**Grok ACK:** `540f4eab-62e3-4b97-8651-457145dfd9a2`  
**Governance:** delegated agent governance; **delegation ≠ M1 acceptance**  
**L1:** `L1-US-v0.1` unchanged  
**score_authorized(M1):** **false / 0**

Hard gates: no M1 0–4 scores; no threshold freeze; no Phase/Alert from M1; no overlapping income basket in the simple candidate.

---

## 1. FRED retry (once more) — timed out

| Series | Result | Notes |
|--------|--------|-------|
| `A229RX0` | TimeoutError ~45s | public CSV `fredgraph.csv` |
| `DSPIC96` | TimeoutError ~45s | same |
| `AHETPI` | TimeoutError ~45s | same |

Artifact: `data/m1/track_b_fred_retry.json` (also prior `track_b_fred_ingest_status.json`).

Per Astra handoff: fall through to **BEA / BLS** public sources.

---

## 2. BEA fallback — series landed

Pulled from BEA public NIPA text release (no API key):

- `https://apps.bea.gov/national/Release/TXT/NipaDataM.txt` (monthly)
- `https://apps.bea.gov/national/Release/TXT/NipaDataA.txt` (annual)
- `https://apps.bea.gov/national/Release/TXT/SeriesRegister.txt` (labels/metadata)

### Preferred: `A229RX` (= FRED `A229RX0`)

| Field | Value |
|-------|-------|
| BEA code | **A229RX** |
| FRED alias | **A229RX0** |
| SeriesLabel (register) | Chained (2017) dollars |
| MetricName | Ratio |
| CalculationType | Level |
| Table lines | T20100:39 \| T20600:39 \| T70100:12 |
| Nominal/real | **Real** (chained 2017 $) |
| Per capita | **Yes** (NIPA per-capita DPI line; line 40 is population) |
| SA | Monthly NIPA personal-income table is SAAR convention — treat as SA research input; cite BEA release notes if freezing later |
| Growth vs level | Published as **level**; YoY growth is a **research transform** only |
| Coverage (monthly) | 1959M01–2026M07 (n=811) |
| Coverage (annual) | 1929–2025 (n=97) |

Companion nominal: **A229RC** (Current dollars, T20100:38 / T20600:38) — for deflator cross-checks, not the simple B outcome leg.

Aggregate real DPI (not preferred for simple B): **A067RX** (Disposable personal income, Chained Dollars, scale −6). Related to FRED `DSPIC96` but not asserted identical vintage/units.

### AHETPI / BLS

- ChatGPT note confirmed: **AHETPI is nominal** → needs documented CPI/PCE deflation or a validated real alternative before any B-AHE arm.
- BLS `publicAPI/v2` returned **HTTP 503 busy** at ingest time — **CES/AHETPI not landed this tick**.
- Simple B candidate intentionally **excludes** wages to avoid overlapping income basket.

---

## 3. Simple B candidate (research only — not frozen)

**Definition:** prior personal-finance expectations vs subsequent 12-month real DPI per-capita growth:

\[
\text{PEXP}_R(t-12) \quad\text{vs}\quad \frac{\text{A229RX}(t)}{\text{A229RX}(t-12)} - 1
\]

| Leg | Series | Role |
|-----|--------|------|
| Expectations | Michigan SCA **PEXP_R** (Table 8) | Prior expectation at t−12 |
| Outcome | BEA **A229RX** YoY | Subsequent 12m real DPI/capita growth |

**Counts:**

| Sample | n |
|--------|---|
| Monthly pairs | **571** |
| Full-12 annual years | **47** (1979–2025) |
| Descriptive Pearson r (annual means) | **0.337647** (descriptive only — not a score) |

Artifacts:

- `data/m1/track_b_simple_pexp_a229rx_pairs.json`
- `data/m1/track_b_simple_pexp_a229rx_monthly.csv`
- `data/m1/track_b_simple_pexp_a229rx_annual.csv`
- `data/m1/a229rx_monthly.csv` / `a229rx_yoy_monthly.csv` / `track_b_bea_dpi_series.json`

**Explicitly not done this tick:**

- No formula/weight freeze
- No hardship vs disappointment numerical discrimination yet (scheduled **before** narrative, per handoff)
- No AHETPI arm
- No M1 scoring / Phase / Alert
- Quantile audit requirements (algo/ties/full values/script hash) remain as in cleanup memo §3b — apply when selecting Track B example years

---

## 4. Provenance

See `data/m1/track_b_bea_bls_provenance.json` (SHA-256 of raw + derived files).

Raw paths:

- `data/raw/bea/NipaDataM.txt`
- `data/raw/bea/NipaDataA.txt`
- `data/raw/bea/SeriesRegister.txt`

Michigan PEXP reused from prior Wave 2B ingest: `data/m1/mich_pago_pexp_monthly.json`.

---

## 5. MCP / Astra

- MCP build instruction superseded by live Hub `689d4827` — **not rebuilt**.
- Optional smoke: GET `/mcp` tools/list (expect 8 read tools).
- Relay: Node HTTPS works; PowerShell TLS path fails — not James's fix.

---

## 6. Next research steps (still research-only)

1. Numerical hardship/disappointment discrimination on the simple B pairs (before narrative).
2. Retry BLS CES when API healthy; document AHETPI deflation path separately (not in simple B basket).
3. Quantile-year audit with algorithm/ties/values/script hash when illustrating B.
4. A1 vs A2 vs B comparability — after B ingest solidifies.


---

## 7. Hub mirrors + exact r sample (post fd3b072a)

Responds to ChatGPT Hub comment `fd3b072a` (mirror monthly pairs CSV; specify exact sample/frequency of r≈0.338; rebuild script/hash).

### Exact descriptive r

| Statistic | Value |
|-----------|-------|
| Primary r | **0.337647** |
| Sample | **47** full-12 calendar years (**1979–2025**) |
| Frequency / method | Pearson correlation of **annual means**: each year = mean of 12 monthly `pexp_r_prior` vs mean of 12 monthly `real_dpi_pc_yoy` |
| Monthly pairs (transparency) | n=**571** (1979-01-01 … 2026-07-01); monthly Pearson r=**0.237517** (not the headline figure) |
| Not a score | research-only; `score_authorized(M1)=false`; no formula freeze |

### Public Hub URLs

- Memo: `/docs/wave2b-track-b-bea-bls`
- Monthly pairs CSV: `/docs/wave2b-track-b-simple-monthly.csv` (sha256 `97243d2dff5d18c4f91605e6043feca2b92610ec97ab1f20e1d1ff4a5216ea75`)
- Annual CSV: `/docs/wave2b-track-b-simple-annual.csv` (sha256 `1a3c0d6691aeb49432ebdd6be6f74cc49347600dbc8b574bf96ec930a8443bcf`)
- Full pairs JSON: `/docs/wave2b-track-b-simple-pairs.json` (sha256 `38b15d32d515283b07505d27aade48f544c4be78af5af51862f3a5f6113139c8`)
- Rebuild script: `/docs/wave2b-track-b-rebuild.py.txt` (sha256 `2dc7377a2e724e526a868026d059093a2e6dd20c2e285136b726dcdfc8cf6f13`)
- Provenance: `/docs/wave2b-track-b-bea-bls-provenance.json`

### Rebuild

```bash
# from srp-observatory root (inputs: mich_pago_pexp_monthly.json + a229rx_monthly.csv)
python3 scripts/wave2b_track_b_rebuild.py
```

Verified byte-match on monthly/annual pair rows vs published artifacts (n=571 / 47 / r=0.337647).

### Hardship discrimination (still open)

Agreed with Astra/ChatGPT: lagged PEXP vs income-growth correlation alone is **not** the A2-vs-objective hardship/disappointment numerical test, and survey-relative units are **not** directly subtractable from growth. That discrimination remains next research (not started this tick); no scoring freeze.
