{
  "schema_version": "1.0.0",
  "methodology_version": "2026-07-10.v1",
  "name": "AI Supply-Demand Thermometer",
  "fixture": false,
  "frozen_by": "owner director freeze for #1838",
  "frozen_at": "2026-07-10",
  "min_axis_coverage": 0.4,
  "demand": {
    "label": "Demand intensity",
    "components": [
      {
        "id": "usage_growth",
        "label": "Inference usage / spend growth",
        "weight": 0.2,
        "max_age_days": 21,
        "normalization": {
          "kind": "linear",
          "cold": -0.2,
          "neutral": 0.0,
          "hot": 1.0,
          "unit": "trailing-vs-prior fractional growth"
        },
        "description": "OpenRouter token-spend tracer; historical replays use the closest dated end-demand usage proxy."
      },
      {
        "id": "adoption_breadth",
        "label": "Open-model adoption breadth",
        "weight": 0.2,
        "max_age_days": 14,
        "normalization": {
          "kind": "linear",
          "cold": -0.2,
          "neutral": 0.0,
          "hot": 0.5,
          "unit": "median model-download growth"
        },
        "description": "Median download growth across a frozen Hugging Face model panel; replay uses a dated adoption-breadth proxy."
      },
      {
        "id": "unit_cost_deflation",
        "label": "Provider unit-cost deflation",
        "weight": 0.2,
        "max_age_days": 14,
        "normalization": {
          "kind": "linear",
          "cold": 0.1,
          "neutral": 0.0,
          "hot": -0.5,
          "unit": "median blended price change"
        },
        "description": "Falling published price per token is the Jevons elasticity input; cheaper is hotter only while usage also grows."
      },
      {
        "id": "capital_commitment",
        "label": "Hyperscaler capital commitment",
        "weight": 0.2,
        "max_age_days": 140,
        "normalization": {
          "kind": "linear",
          "cold": -0.1,
          "neutral": 0.1,
          "hot": 0.6,
          "unit": "TTM capex YoY growth"
        },
        "description": "Point-in-time aggregate MSFT/GOOGL/AMZN/META capex growth from SEC filings."
      },
      {
        "id": "committed_pipeline",
        "label": "Committed data-center pipeline",
        "weight": 0.2,
        "max_age_days": 45,
        "normalization": {
          "kind": "linear",
          "cold": 0.0,
          "neutral": 7.5,
          "hot": 15.0,
          "unit": "average announced GW arriving per year over the next three years"
        },
        "description": "Source-cited dc_projects ledger phased into a near-term annual power-arrival schedule."
      }
    ]
  },
  "supply": {
    "label": "Supply tightness",
    "components": [
      {
        "id": "supply_cycle_gate",
        "label": "Fused component-cycle gate",
        "weight": 0.3333333333333333,
        "max_age_days": 45,
        "normalization": {
          "kind": "mapping",
          "mapping": {
            "BREAKING": 10.0,
            "EARLY-CRACK": 55.0,
            "INTACT": 85.0,
            "OVERSUPPLY": 10.0,
            "BALANCED": 50.0,
            "TIGHT": 90.0
          },
          "unit": "categorical gate state"
        },
        "description": "The live fused memory gate; episode replay uses the equivalent point-in-time component-cycle state."
      },
      {
        "id": "chokepoint_tension",
        "label": "Chokepoint tension",
        "weight": 0.3333333333333333,
        "max_age_days": 45,
        "normalization": {
          "kind": "linear",
          "cold": 0.2,
          "neutral": 0.5,
          "hot": 0.85,
          "unit": "0-1 measured/curated tension"
        },
        "description": "Highest current supply-chain stranglehold/tightness score, with its source and relief clock."
      },
      {
        "id": "relief_window_tension",
        "label": "Capacity relief-window tension",
        "weight": 0.3333333333333333,
        "max_age_days": 45,
        "normalization": {
          "kind": "linear",
          "cold": 0.2,
          "neutral": 0.5,
          "hot": 0.9,
          "unit": "share of committed demand landing inside the relief window"
        },
        "description": "Power-vertical relief tension live; equivalent announced-capacity relief evidence in historical episodes."
      }
    ]
  },
  "thresholds": {
    "low_below": 40.0,
    "high_at_or_above": 60.0
  },
  "verdicts": {
    "low:loose": "SUPPLY_GLUT",
    "low:balanced": "DEMAND_CRACK",
    "low:tight": "DEMAND_CRACK_WITH_BOTTLENECKS",
    "neutral:loose": "SUPPLY_AHEAD",
    "neutral:balanced": "BALANCED",
    "neutral:tight": "SUPPLY_CONSTRAINED",
    "high:loose": "CAPACITY_CATCHUP",
    "high:balanced": "DEMAND_LED_EXPANSION",
    "high:tight": "DEMAND_LED_TIGHTNESS"
  },
  "feedback_rule": "A public print may enter the private supply_demand gate only with knowledge_time >= that print's original archive date; it may never be joined retroactively or used to revise its own inputs."
}
