# Data audit (P1) All SHA-256 below were computed and match data/README.md and bundle.json (first 16 hex shown; full hashes recomputed in analysis is unnecessary — checked here with hashlib). | file | sha256 | rows | cols | columns | date range | missing | duplicate dates | month gaps | |---|---|---|---|---|---|---|---|---| | data/RSAFS_current.csv | 627d8bb386ac80f4… | 417 | 2 | ['observation_date', 'RSAFS'] | 1992-01-01..2026-09-01 | NA=0 | dup=0 | gaps=0 | | data/UMCSENT.csv | 3076277f9f21f4bd… | 887 | 2 | ['observation_date', 'UMCSENT'] | 1952-11-01..2026-09-01 | NA=210 | dup=0 | gaps=0 | | data/first_release.csv | 1d1ae8b3cacf7799… | 28 | 5 | ['target_month', 'first_release_vintage', 'level_first_release', 'level_prev_year_same_vintage', 'yoy_first_release'] | 2024-06-01..2026-09-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2025-10-31.csv | d4b4c909ed321fbf… | 1040 | 2 | ['observation_date', 'PAYEMS_20251031'] | 1939-01-01..2025-08-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2025-11-30.csv | a05ef7fc50cfc339… | 1041 | 2 | ['observation_date', 'PAYEMS_20251130'] | 1939-01-01..2025-09-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2025-12-31.csv | 829dae087af61916… | 1043 | 2 | ['observation_date', 'PAYEMS_20251231'] | 1939-01-01..2025-11-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-01-31.csv | 8fd01c5d2740e869… | 1044 | 2 | ['observation_date', 'PAYEMS_20260131'] | 1939-01-01..2025-12-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-02-28.csv | 4a913e67ac5ffbb4… | 1045 | 2 | ['observation_date', 'PAYEMS_20260228'] | 1939-01-01..2026-01-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-03-31.csv | 919de86b07be9046… | 1046 | 2 | ['observation_date', 'PAYEMS_20260331'] | 1939-01-01..2026-02-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-04-30.csv | 06a8d663d9aaa61c… | 1047 | 2 | ['observation_date', 'PAYEMS_20260430'] | 1939-01-01..2026-03-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-05-31.csv | e2a152e874139acd… | 1048 | 2 | ['observation_date', 'PAYEMS_20260531'] | 1939-01-01..2026-04-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-06-30.csv | 19fbc6cd3547ffad… | 1049 | 2 | ['observation_date', 'PAYEMS_20260630'] | 1939-01-01..2026-05-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/PAYEMS_vintage_2026-07-31.csv | 3a3a6603fcc31c6e… | 1050 | 2 | ['observation_date', 'PAYEMS_20260731'] | 1939-01-01..2026-06-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2025-10-31.csv | 3ecb0832a391e726… | 404 | 2 | ['observation_date', 'RSAFS_20251031'] | 1992-01-01..2025-08-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2025-11-30.csv | 4a683d85374690f1… | 405 | 2 | ['observation_date', 'RSAFS_20251130'] | 1992-01-01..2025-09-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2025-12-31.csv | 436df4b5509b1dfe… | 406 | 2 | ['observation_date', 'RSAFS_20251231'] | 1992-01-01..2025-10-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-01-31.csv | b92ab6a5c1dbdc56… | 407 | 2 | ['observation_date', 'RSAFS_20260131'] | 1992-01-01..2025-11-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-02-28.csv | 2af0a3aaeeba81ef… | 408 | 2 | ['observation_date', 'RSAFS_20260228'] | 1992-01-01..2025-12-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-03-31.csv | 0316fdf238d55d9f… | 409 | 2 | ['observation_date', 'RSAFS_20260331'] | 1992-01-01..2026-01-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-04-30.csv | 02dcc697a1db3475… | 411 | 2 | ['observation_date', 'RSAFS_20260430'] | 1992-01-01..2026-03-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-05-31.csv | 8c3fe35302135896… | 412 | 2 | ['observation_date', 'RSAFS_20260531'] | 1992-01-01..2026-04-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-06-30.csv | 2f103157f4a9b7a3… | 413 | 2 | ['observation_date', 'RSAFS_20260630'] | 1992-01-01..2026-05-01 | NA=0 | dup=0 | gaps=0 | | data/vintages/RSAFS_vintage_2026-07-31.csv | 52c04a8fce2effa7… | 414 | 2 | ['observation_date', 'RSAFS_20260731'] | 1992-01-01..2026-06-01 | NA=0 | dup=0 | gaps=0 | All 23 CSV SHA-256 hashes match `data/README.md` (23 OK, 0 mismatch; shasum check run in P1). Row counts match README. ## Units RSAFS: millions of USD, SA. PAYEMS: thousands of persons, SA. UMCSENT: index 1966Q1=100. first_release.yoy_first_release: percent (100·log ratio). ## Real-time design: last(V) per origin (publication delays) | origin V | last(V) RSAFS | lag (months before V's month) | h=1 target | h=3 target | PAYEMS last | |---|---|---|---|---|---| | 2025-10-31 | 2025-08 | 2 (publication delay) | 2025-09 | 2025-11 | 2025-08 | | 2025-11-30 | 2025-09 | 2 | 2025-10 | 2025-12 | 2025-09 | | 2025-12-31 | 2025-10 | 2 | 2025-11 | 2026-01 | 2025-11 | | 2026-01-31 | 2025-11 | 2 | 2025-12 | 2026-02 | 2025-12 | | 2026-02-28 | 2025-12 | 2 | 2026-01 | 2026-03 | 2026-01 | | 2026-03-31 | 2026-01 | 2 | 2026-02 | 2026-04 | 2026-02 | | 2026-04-30 | 2026-03 | 1 (caught up: two months added at once) | 2026-04 | 2026-06 | 2026-03 | | 2026-05-31 | 2026-04 | 1 | 2026-05 | 2026-07 | 2026-04 | | 2026-06-30 | 2026-05 | 1 | 2026-06 | 2026-08 | 2026-05 | | 2026-07-31 | 2026-06 | 1 | 2026-07 | 2026-09 | 2026-06 | All 20 targets (2025-09 … 2026-09) exist in first_release.csv. ## Anomalies 1. Irregular RSAFS publication timing (table above): last(V) lags V by 2 months for the first six origins, 1 month thereafter. Handled by defining targets relative to last(V) as TASK requires. 2. first_release vintages: 2025-09 first appears only in the 2025-11-30 vintage; 2026-02 and 2026-03 both first appear in 2026-04-30 (so 2026-02's "first release" is its second Census estimate, not the advance). Handled: used as provided (task definition), documented. 3. Large level revision: RSAFS levels in the current file are ≈4.7–4.9% below the 2026-07-31 vintage for 2025–2026 (ratio ≈1.0000 for 1992 and 2015). first_release rows for 2026-08/2026-09 use prev-year levels on the revised basis (e.g. 2025-08: 700218 vs 732010 earlier). Because YoY growth is computed within a single vintage, levels are never mixed across vintages; the revision only enters estimand (d). 4. UMCSENT: 210 empty values, all before 1978 (quarterly survey era); none after 1978-01. UMCSENT is not used by my model (decision in log), so no handling needed. 5. PAYEMS vintages were checked for gaps/missing only (none); PAYEMS is not used by my model, so its revisions were not analysed. 6. No duplicate dates, no gaps, no missing values in RSAFS/PAYEMS vintages or first_release. ## Information-availability RSAFS_current.csv violates the forecast-time availability rule by construction; it is read only in the revision block (estimand d). UMCSENT current vintage: allowed with months <= month(V); not used. No other violations.