{
  "status": "RESEARCH ONLY \u2014 no M1 production scoring; score_authorized=false; no formula freeze",
  "generated_at": "2026-09-09T14:53:33.140897+00:00",
  "responds_to": {
    "hub_comment": "6a76a430-3b19-4ec6-9a99-e950a082b212",
    "job": "b73c292a-16e2-4f11-9370-1337d0239791",
    "astra_design": "8b4a9c0b-33f6-4249-8e78-c600c1414b7c"
  },
  "l1_unchanged": "L1-US-v0.1",
  "score_authorized_m1": false,
  "predeclared_rules": {
    "id": "discrimination_rules_v1",
    "declared_before_labeling": true,
    "sample_primary": "calendar years where A2 has 12 monthly gaps AND A229RX YoY has 12 monthly observations; annual means = mean of those 12 months; partial years excluded",
    "coding": {
      "A2": "PEXP_R(t-12) - PAGO_R(t); higher = larger disappointment (expectations above realization)",
      "B_income": "A229RX(t)/A229RX(t-12)-1; higher = stronger 12m real DPI per-capita growth",
      "favorable_surprise": "A2 low/negative (realization above prior expectation) is NOT penalized; no theory for penalty",
      "units_note": "A2 is survey-relative index points; B is percent growth \u2014 NEVER subtract one from the other"
    },
    "joint_quantile": {
      "method": "numpy-equivalent linear percentile on the primary full-12 annual sample, then year nearest to target; ties \u2192 earlier year (same as cleanup v1)",
      "income_weak": "annual B mean <= sample p25",
      "income_normal_or_strong": "annual B mean >= sample p50",
      "disappointment_low": "annual A2 mean <= sample p25",
      "disappointment_high": "annual A2 mean >= sample p75",
      "discordant_cells": [
        "weak_income_AND_low_disappointment",
        "normal_or_strong_income_AND_high_disappointment"
      ],
      "concordant_cells_for_context": [
        "weak_income_AND_high_disappointment",
        "normal_or_strong_income_AND_low_disappointment"
      ],
      "cross_tab_bins": {
        "income": [
          "weak(<=p25)",
          "mid(p25<p50)",
          "strong(>=p50)"
        ],
        "a2": [
          "low(<=p25)",
          "mid(p25<p75)",
          "high(>=p75)"
        ]
      }
    },
    "standardized": {
      "method": "z = (x - mean) / sample_sd (population sd / pstdev) on primary full-12 annual sample",
      "discordant": [
        "z_B <= -0.75 AND z_A2 <= -0.75  \u2192 weak_income_low_disappointment",
        "z_B >= +0.25 AND z_A2 >= +0.75 \u2192 normal_or_strong_income_high_disappointment"
      ],
      "note": "thresholds predeclared; +0.25 on income approximates 'at/above typical' without requiring top-tail only"
    },
    "sensitivity_predeclared": [
      "drop_recession_nber_approx_years_1980_1982_1991_2001_2008_2009_2020",
      "drop_top_bottom_2_A2_years",
      "spearman_rank_on_same_primary_sample",
      "monthly_pairs_transparency_only"
    ],
    "recommendation_thresholds_v1": {
      "hardship_proxy_reject_or_modify": "(pearson_r < -0.35 OR spearman_rho < -0.45) AND concordant_jq >= max(3*discordant_jq, 9) AND (weak_income_low_disappointment_n == 0 OR discordant_share < 0.10)",
      "a2_distinct_primary_with_b_validation": "discordant_share >= 0.15 AND discordant_jq_n >= 6 AND pearson_r > -0.20",
      "ambiguous_continue": "otherwise / mixed",
      "note": "thresholds locked with discrimination_rules_v1 before labeling; research-only"
    }
  },
  "inputs": {
    "a2_csv": "data/m1/a2_gap_monthly.csv",
    "a2_csv_sha256": "ae14d30de08d016c07e2940fd428c9d2321f263a476f9788dab365d50ab49471",
    "yoy_csv": "data/m1/a229rx_yoy_monthly.csv",
    "yoy_csv_sha256": "484c96b6025e8caaab5a21ce645e771b28aa4717007881434707949c2c74cf04",
    "a2_formula": "PEXP_R(t-12) - PAGO_R(t)",
    "b_formula": "A229RX(t)/A229RX(t-12) - 1  (=FRED A229RX0 YoY)",
    "comparator_role": "B is comparator/validator only \u2014 not subtracted from A2"
  },
  "rebuild_script": {
    "path": "scripts/wave2b_a2_b_discrimination.py",
    "sha256": "c9cd729acb74241194174414e2f06218874e014a13fab1ada7b15a1333e57210"
  },
  "sample_summary": {
    "a2_full12_years_n": 47,
    "a2_full12_span": [
      1979,
      2025
    ],
    "b_full12_years_n": 66,
    "b_full12_span": [
      1960,
      2025
    ],
    "common_full12_n": 47,
    "common_full12_years": [
      1979,
      1980,
      1981,
      1982,
      1983,
      1984,
      1985,
      1986,
      1987,
      1988,
      1989,
      1990,
      1991,
      1992,
      1993,
      1994,
      1995,
      1996,
      1997,
      1998,
      1999,
      2000,
      2001,
      2002,
      2003,
      2004,
      2005,
      2006,
      2007,
      2008,
      2009,
      2010,
      2011,
      2012,
      2013,
      2014,
      2015,
      2016,
      2017,
      2018,
      2019,
      2020,
      2021,
      2022,
      2023,
      2024,
      2025
    ],
    "partial_years_excluded_from_primary": [
      2026
    ]
  },
  "correlations": {
    "preferred_full12_annual_means": {
      "frequency": "annual (mean of 12 monthly observations)",
      "filter": "A2 n_months==12 AND A229RX YoY n_months==12",
      "partial_year_exclusion": true,
      "years": [
        1979,
        1980,
        1981,
        1982,
        1983,
        1984,
        1985,
        1986,
        1987,
        1988,
        1989,
        1990,
        1991,
        1992,
        1993,
        1994,
        1995,
        1996,
        1997,
        1998,
        1999,
        2000,
        2001,
        2002,
        2003,
        2004,
        2005,
        2006,
        2007,
        2008,
        2009,
        2010,
        2011,
        2012,
        2013,
        2014,
        2015,
        2016,
        2017,
        2018,
        2019,
        2020,
        2021,
        2022,
        2023,
        2024,
        2025
      ],
      "n": 47,
      "first_year": 1979,
      "last_year": 2025,
      "pearson_r_a2_vs_b_yoy": -0.454003,
      "spearman_rho": -0.564383,
      "variables": {
        "x": "A2 annual mean = mean_t in year of [PEXP_R(t-12)-PAGO_R(t)]",
        "y": "B annual mean = mean_t in year of [A229RX(t)/A229RX(t-12)-1]"
      },
      "not_done": "do not subtract A2 index points from B percent growth"
    },
    "any_annual_means_includes_partial": {
      "frequency": "annual means over available months (may be <12)",
      "filter": "at least 1 month each",
      "partial_year_exclusion": false,
      "years": [
        1979,
        1980,
        1981,
        1982,
        1983,
        1984,
        1985,
        1986,
        1987,
        1988,
        1989,
        1990,
        1991,
        1992,
        1993,
        1994,
        1995,
        1996,
        1997,
        1998,
        1999,
        2000,
        2001,
        2002,
        2003,
        2004,
        2005,
        2006,
        2007,
        2008,
        2009,
        2010,
        2011,
        2012,
        2013,
        2014,
        2015,
        2016,
        2017,
        2018,
        2019,
        2020,
        2021,
        2022,
        2023,
        2024,
        2025,
        2026
      ],
      "n": 48,
      "partial_years_included": [
        2026
      ],
      "pearson_r": -0.46046,
      "note": "transparency only; prefer full-12"
    },
    "monthly_pairs_transparency": {
      "frequency": "monthly",
      "filter": "months with both A2 gap and A229RX YoY",
      "partial_year_exclusion": "n/a (monthly)",
      "n": 571,
      "first": "1979-01",
      "last": "2026-07",
      "pearson_r": -0.252311,
      "note": "not the headline figure"
    },
    "sensitivity": {
      "drop_nber_approx_years": {
        "dropped_years": [
          1980,
          1981,
          1982,
          1990,
          1991,
          2001,
          2008,
          2009,
          2020
        ],
        "n": 38,
        "pearson_r": -0.45419
      },
      "drop_top_bottom_2_a2_years": {
        "dropped_years": [
          2008,
          2009,
          2017,
          2018
        ],
        "n": 43,
        "pearson_r": -0.420023
      }
    }
  },
  "quantiles_primary_sample": {
    "a2": {
      "p10": 3.3,
      "p25": 5.166667,
      "p50": 13.166667,
      "p75": 20.708333,
      "p90": 30.166667
    },
    "b_yoy": {
      "p10": -0.00011788,
      "p25": 0.01073904,
      "p50": 0.01949467,
      "p75": 0.02631392,
      "p90": 0.04042525
    },
    "means": {
      "a2": 14.663121,
      "b_yoy": 0.01839149
    },
    "pstdev": {
      "a2": 11.10425,
      "b_yoy": 0.01930109
    }
  },
  "quantile_crosstab": {
    "weak": {
      "low": 0,
      "mid": 7,
      "high": 5
    },
    "mid": {
      "low": 0,
      "mid": 6,
      "high": 5
    },
    "normal_or_strong": {
      "low": 12,
      "mid": 10,
      "high": 2
    }
  },
  "discordant_joint_quantile_years": [
    {
      "year": 1992,
      "a2": 25.0,
      "b_yoy": 0.02606725,
      "cell": "normal_or_strong_income__high_disappointment"
    },
    {
      "year": 2002,
      "a2": 24.5,
      "b_yoy": 0.02110992,
      "cell": "normal_or_strong_income__high_disappointment"
    }
  ],
  "concordant_joint_quantile_years": [
    {
      "year": 1984,
      "a2": 5.0,
      "b_yoy": 0.05763667,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 1986,
      "a2": 3.25,
      "b_yoy": 0.02875417,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 1988,
      "a2": 4.666667,
      "b_yoy": 0.04118175,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 1991,
      "a2": 21.0,
      "b_yoy": -0.00481483,
      "cell": "weak_income__high_disappointment"
    },
    {
      "year": 1997,
      "a2": 4.5,
      "b_yoy": 0.02333917,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 1998,
      "a2": 4.166667,
      "b_yoy": 0.04672775,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 1999,
      "a2": 3.416667,
      "b_yoy": 0.02072192,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2000,
      "a2": 4.416667,
      "b_yoy": 0.03746933,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2008,
      "a2": 43.5,
      "b_yoy": 0.00626617,
      "cell": "weak_income__high_disappointment"
    },
    {
      "year": 2009,
      "a2": 40.583333,
      "b_yoy": -0.00630667,
      "cell": "weak_income__high_disappointment"
    },
    {
      "year": 2010,
      "a2": 34.333333,
      "b_yoy": 0.01040433,
      "cell": "weak_income__high_disappointment"
    },
    {
      "year": 2014,
      "a2": 3.333333,
      "b_yoy": 0.02637875,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2015,
      "a2": 0.25,
      "b_yoy": 0.03123042,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2017,
      "a2": -3.166667,
      "b_yoy": 0.02405475,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2018,
      "a2": -3.416667,
      "b_yoy": 0.030124,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2019,
      "a2": -0.666667,
      "b_yoy": 0.02598692,
      "cell": "normal_or_strong_income__low_disappointment"
    },
    {
      "year": 2022,
      "a2": 30.166667,
      "b_yoy": -0.05864483,
      "cell": "weak_income__high_disappointment"
    }
  ],
  "standardized_discordant_years": [
    {
      "year": 1992,
      "a2": 25.0,
      "b_yoy": 0.02606725,
      "z_a2": 0.930894,
      "z_b": 0.397685,
      "label": "normal_or_strong_income_high_disappointment"
    }
  ],
  "counts": {
    "n_primary": 47,
    "n_discordant_joint_quantile": 2,
    "n_concordant_joint_quantile": 17,
    "discordant_share_of_primary": 0.0426,
    "n_standardized_discordant": 1,
    "weak_low_n": 0,
    "strong_high_n": 2,
    "weak_high_n": 5,
    "strong_low_n": 12
  },
  "mechanical_quantile_examples": {
    "a2_quantiles": {
      "p10": {
        "target": 3.3,
        "year": 2014,
        "a2": 3.3333333333333335,
        "b": 0.02637875
      },
      "p25": {
        "target": 5.166666666666666,
        "year": 1984,
        "a2": 5.0,
        "b": 0.05763666666666667
      },
      "p50": {
        "target": 13.166666666666666,
        "year": 1985,
        "a2": 13.166666666666666,
        "b": 0.021829916666666668
      },
      "p75": {
        "target": 20.708333333333336,
        "year": 1982,
        "a2": 21.0,
        "b": 0.012391416666666667
      },
      "p90": {
        "target": 30.166666666666668,
        "year": 2011,
        "a2": 30.166666666666668,
        "b": 0.013638083333333334
      }
    },
    "b_quantiles": {
      "p10": {
        "target": -0.00011788333333333017,
        "year": 2005,
        "b": 0.002473083333333333,
        "a2": 16.333333333333332
      },
      "p25": {
        "target": 0.010739041666666668,
        "year": 2010,
        "b": 0.010404333333333333,
        "a2": 34.333333333333336
      },
      "p50": {
        "target": 0.019494666666666667,
        "year": 1989,
        "b": 0.019494666666666667,
        "a2": 12.333333333333334
      },
      "p75": {
        "target": 0.026313916666666666,
        "year": 1983,
        "b": 0.026249083333333333,
        "a2": 9.666666666666666
      },
      "p90": {
        "target": 0.040425249999999996,
        "year": 2021,
        "b": 0.03992091666666667,
        "a2": 12.166666666666666
      }
    }
  },
  "mechanical_cell_examples": {
    "weak_income_low_disappointment": null,
    "normal_or_strong_income_high_disappointment": {
      "year": 2002,
      "a2": 24.5,
      "b_yoy": 0.02110992,
      "z_a2": 0.885866,
      "z_b": 0.140843,
      "joint_cell": "normal_or_strong_income__high_disappointment",
      "selection": "nearest to cell mean in (z_a2,z_b); ties earlier year"
    },
    "weak_income_high_disappointment_concordant": {
      "year": 2009,
      "a2": 40.583333,
      "b_yoy": -0.00630667,
      "z_a2": 2.334261,
      "z_b": -1.279625,
      "joint_cell": "weak_income__high_disappointment",
      "selection": "nearest to cell mean in (z_a2,z_b); ties earlier year"
    },
    "normal_or_strong_income_low_disappointment_concordant": {
      "year": 2015,
      "a2": 0.25,
      "b_yoy": 0.03123042,
      "z_a2": -1.297982,
      "z_b": 0.665192,
      "joint_cell": "normal_or_strong_income__low_disappointment",
      "selection": "nearest to cell mean in (z_a2,z_b); ties earlier year"
    }
  },
  "directional_coding_confirmation": {
    "higher_A2": "greater disappointment (PEXP_lag > PAGO)",
    "lower_A2_favorable_surprise": "NOT penalized absent theory",
    "B_higher": "stronger real DPI per-capita YoY",
    "no_unit_subtraction": true
  },
  "independent_reviewer_note": {
    "discordant_cases_alone_not_construct_validation": true,
    "whole_sample_dependence": {
      "pearson_r_full12": -0.454003,
      "spearman_rho_full12": -0.564383,
      "interpretation_hint": "Negative r is consistent with partial hardship overlap (weak income \u2194 higher disappointment), but magnitude and discordant cells matter for distinctness claims."
    },
    "sensitivity": {
      "drop_nber_approx_years": {
        "dropped_years": [
          1980,
          1981,
          1982,
          1990,
          1991,
          2001,
          2008,
          2009,
          2020
        ],
        "n": 38,
        "pearson_r": -0.45419
      },
      "drop_top_bottom_2_a2_years": {
        "dropped_years": [
          2008,
          2009,
          2017,
          2018
        ],
        "n": 43,
        "pearson_r": -0.420023
      }
    },
    "population_aggregation_limitations": [
      "A2 is national SCA survey aggregate (diffusion-style relative index), not household micro hardship.",
      "A229RX is national real DPI per capita \u2014 averages over distributional stress.",
      "Annual means collapse within-year dynamics; monthly r is weaker/noisier.",
      "Survey vs NIPA population/weighting differ; vintage/revision risk on BEA.",
      "Discordant years illustrate non-identity of constructs; they do not alone validate A2 as the M1 construct."
    ]
  },
  "recommendation": "hardship-proxy reject-or-modify",
  "recommendation_detail": "Whole-sample dependence is materially negative (Pearson and/or Spearman), concordant hardship cells dominate discordant cells, and weak-income/low-disappointment is empty or rare. Treat A2 as hardship-proxy-like: reject as distinct primary OR modify (e.g., residualize vs B / redesign) before any M1 formula freeze. B remains comparator/validator only.",
  "gates": {
    "score_authorized_m1": false,
    "formula_frozen": false,
    "phase_political_tuning": false,
    "l1": "L1-US-v0.1 unchanged"
  }
}
