{
  "name": "Cook Inlet Gas Watch",
  "description": "A daily numeric record of Southcentral Alaska's natural gas position. Measured storage inventory and deliverability from the CINGSA public dashboard, modeled regional demand from Anchorage degree days, and the derived non CINGSA supply that falls out of the mass balance. It publishes no safety verdict of any kind.",
  "version": "1.0",
  "updated": "2026-08-05",
  "canonical": "https://alaskaaihq.com/gas-watch.json",
  "documentation": "https://alaskaaihq.com/gas-watch/",
  "license": "https://creativecommons.org/licenses/by/4.0/",
  "license_label": "CC BY 4.0",
  "attribution": "Alaska AI, https://alaskaaihq.com",
  "publisher": "Alaska AI",
  "spatial_coverage": "Southcentral Alaska, United States",
  "temporal_coverage": "2026-08-05/2026-08-05",
  "count": 1,
  "related_docket_item": "https://alaskaaihq.com/docket/enstar-cook-inlet-gas-storage/",
  "warning": "This dataset must not be used to state or imply whether the region will make it through a cold snap. Supply side deliverability is not public, so no adequacy conclusion can be drawn from these numbers.",
  "model": {
    "_spec": {
      "purpose": "Demand model for Cook Inlet Gas Watch. The coefficients live here as data rather than as constants inside scripts/gaswatch_collect.py, so a refit is a data change with its own commit and never a code change. Every collected record carries a copy of this block, so a record always states the model that produced its numbers.",
      "refit_procedure": "scripts/gaswatch_fit.py refits on the monthly EIA workflow. It bumps the version, rewrites the coefficients, recomputes every backtest expectation and appends a model_history entry naming the month count and the error before and after. A fit is rejected unless it has enough months behind it, lands inside physically sane bounds and beats the model it would replace by more than rounding, and a rejected fit leaves the model alone and prints why. To move the coefficients by hand instead, edit them, run python3 scripts/gaswatch_collect.py --self-test, paste the recomputed figures into the backtests below and append the history entry yourself. Either way that self-test recomputes every backtest from config/gaswatch_hdd_history.json and fails if a recorded expectation disagrees, so a typed number that nothing produced cannot survive a commit. Backtest notes carry no numerals, because a refit cannot recompute prose.",
      "honesty_note": "This model is fitted by least squares to observed EIA Alaska deliveries to residential, commercial and electric power consumers, and refitted whenever another month is published. The published design day and average day are external reference points, not fit targets, so a gap against them is expected and is published rather than tuned away. Nothing derived from this model may be published as a safety verdict, a shortfall prediction, or an all clear.",
      "no_typed_numbers_rule": "Every figure in backtests below is reproduced by code from the committed HDD record. Nothing here is an estimate, a recollection, or a figure copied from prose.",
      "not_public_note": "not_public lists what no source reports DAILY for this region. not_public_monthly_source names the ones that do have a monthly statewide figure, and the page counts them rather than stating a number in prose, so moving an item between these two changes the sentence automatically."
    },
    "version": "2.0",
    "formula": "MMcf/d = 80.868 + 3.439 * HDD65",
    "base_mmcfd": 80.868,
    "slope_mmcfd_per_hdd": 3.439,
    "hdd_base_f": 65,
    "calibration": "fitted to observed EIA Alaska deliveries; the published design day and average day are kept as external reference points, not as fit targets",
    "fit_source": "least squares against 131 months of observed EIA Alaska deliveries to residential, commercial and electric power consumers",
    "hdd_history": "config/gaswatch_hdd_history.json",
    "calibration_anchors": {
      "published_design_day_mmcfd": 390,
      "published_design_day_hdd65": 75,
      "published_average_day_mmcfd": 190,
      "published_season_consumption_bcf": 75,
      "source_label": "published Cook Inlet design day and average day figures",
      "role": "External reference points, not fit targets. The model is fitted to observed EIA deliveries, so a gap against these published planning figures is expected and is published rather than tuned away. Only an implausible gap is a fault."
    },
    "measured": [
      "cingsa_inventory",
      "cingsa_capacity",
      "observed_hdd"
    ],
    "modeled": [
      "demand",
      "non_cingsa_supply"
    ],
    "not_public": [
      "hilcorp_storage_inventory",
      "daily_field_deliverability",
      "enstar_realtime_sendout"
    ],
    "mass_balance": {
      "identity": "D = P + W, therefore P = D - W",
      "note": "D is modeled demand, W is the measured CINGSA inventory draw. What falls out of P is field production plus any Hilcorp storage draw combined, which is why the field is named non_cingsa_supply_mmcfd and is never called production."
    },
    "backtests": [
      {
        "id": "published-design-day",
        "description": "The model evaluated at the temperature behind the published design day, for comparison against that planning figure.",
        "computed_from": "coefficients",
        "input": {
          "hdd65": 75
        },
        "expect_mmcfd": 338.8,
        "compare_to_anchor": "published_design_day_mmcfd",
        "sanity_gap_pct": 40,
        "gap_note": "Reported, not enforced. A gap beyond sanity_gap_pct means the fit is broken, not that the anchor moved."
      },
      {
        "id": "record-maximum-day",
        "description": "The coldest day in the committed Anchorage record, and what the model asks of the system on that day. Recomputed from the HDD history, never typed.",
        "computed_from": "hdd_history",
        "expect_date": "2024-02-02",
        "expect_hdd65": 77,
        "expect_mmcfd": 345.7,
        "expect_days_at_or_above_design_day": 0,
        "note": "A fact about the weather record, not a claim about whether the system coped, and it must never be published as one. The count of days at or above the published design day is recomputed from the coefficients, so it moves when the model is refitted."
      },
      {
        "id": "season-integral",
        "description": "The 2025 to 2026 gas year integrated day by day from the committed record. Season bounds are July 1st through June 30th.",
        "computed_from": "hdd_history",
        "input": {
          "start": "2025-07-01",
          "end": "2026-06-30"
        },
        "expect_days": 365,
        "expect_season_hdd65": 10545.0,
        "expect_bcf": 65.8,
        "compare_to_anchor": "published_season_consumption_bcf",
        "note": "The gap against stated regional consumption across a full gas year is published rather than hidden. The published figure is a planning total and this one is modeled consumption, so they are close relatives and not the same measurement.",
        "sanity_gap_pct": 40,
        "gap_note": "Reported, not enforced. A gap beyond sanity_gap_pct means the fit is broken, not that the anchor moved."
      },
      {
        "id": "record-average-day",
        "description": "Mean modeled demand across every day in the committed record, against the published average day figure.",
        "computed_from": "hdd_history",
        "expect_mean_hdd65": 25.9,
        "expect_mmcfd": 169.8,
        "compare_to_anchor": "published_average_day_mmcfd",
        "note": "The gap against the published average day is published rather than tuned away. A planning average carries margin that a fit to observed deliveries does not, so the model is expected to sit under it.",
        "sanity_gap_pct": 40,
        "gap_note": "Reported, not enforced. A gap beyond sanity_gap_pct means the fit is broken, not that the anchor moved."
      }
    ],
    "model_history": [
      {
        "version": "1.0",
        "effective": "2026-08-05",
        "reason": "First hypothesis. Two point calibration against the published average day and design day figures, standing in until enough observed sendout exists to fit against.",
        "changed": [
          "base_mmcfd",
          "slope_mmcfd_per_hdd"
        ]
      },
      {
        "version": "1.1",
        "effective": "2026-08-05",
        "reason": "Coefficients unchanged. Backtests rebuilt to recompute from a committed twelve year Anchorage HDD record rather than quote figures from prose. This corrected a factual error carried in from the build brief, which described 2026-01-08 at HDD 76 as the coldest day in the twelve year record. It is the coldest day of that season; the record maximum is 2024-02-02 at HDD 77. It also resolved the season integral to 71.7 Bcf, since the gas year measures 365 days.",
        "changed": [
          "backtests",
          "calibration_anchors",
          "hdd_history"
        ]
      },
      {
        "version": "1.2",
        "effective": "2026-08-05",
        "reason": "Coefficients unchanged. Records which not-public items gained a monthly public source, so the page can count them instead of asserting a number that a later edit would strand.",
        "changed": [
          "not_public_monthly_source"
        ]
      },
      {
        "version": "2.0",
        "effective": "2026-08-05",
        "reason": "Automatic refit against 131 months of observed EIA Alaska deliveries through 202605. Mean monthly error 11.52 to 6.82 percent. Backtests recomputed.",
        "changed": [
          "base_mmcfd",
          "slope_mmcfd_per_hdd",
          "formula",
          "fit_source",
          "backtests"
        ]
      }
    ],
    "not_public_monthly_source": {
      "hilcorp_storage_inventory": "EIA Alaska underground storage, monthly, statewide, lags about two months",
      "enstar_realtime_sendout": "EIA Alaska deliveries by sector, monthly, statewide, lags about two months"
    },
    "fit": {
      "method": "least squares, consumption = base * days + slope * HDD65",
      "months": 131,
      "through": "202605",
      "mean_error_pct": 6.82,
      "geography": "EIA reports Alaska statewide. Residential and commercial gas is overwhelmingly Enstar in Southcentral and gas fired power is overwhelmingly Railbelt, so statewide heating and power deliveries stand in for the region. Industrial load is excluded, because Kenai plant demand does not track the weather.",
      "refit_by": "scripts/gaswatch_fit.py, on the monthly EIA workflow"
    },
    "hdd_history_days": 4599,
    "hdd_history_start": "2014-01-01",
    "hdd_history_end": "2026-08-04"
  },
  "model_history": [
    {
      "version": "1.0",
      "effective": "2026-08-05",
      "reason": "First hypothesis. Two point calibration against the published average day and design day figures, standing in until enough observed sendout exists to fit against.",
      "changed": [
        "base_mmcfd",
        "slope_mmcfd_per_hdd"
      ]
    },
    {
      "version": "1.1",
      "effective": "2026-08-05",
      "reason": "Coefficients unchanged. Backtests rebuilt to recompute from a committed twelve year Anchorage HDD record rather than quote figures from prose. This corrected a factual error carried in from the build brief, which described 2026-01-08 at HDD 76 as the coldest day in the twelve year record. It is the coldest day of that season; the record maximum is 2024-02-02 at HDD 77. It also resolved the season integral to 71.7 Bcf, since the gas year measures 365 days.",
      "changed": [
        "backtests",
        "calibration_anchors",
        "hdd_history"
      ]
    },
    {
      "version": "1.2",
      "effective": "2026-08-05",
      "reason": "Coefficients unchanged. Records which not-public items gained a monthly public source, so the page can count them instead of asserting a number that a later edit would strand.",
      "changed": [
        "not_public_monthly_source"
      ]
    },
    {
      "version": "2.0",
      "effective": "2026-08-05",
      "reason": "Automatic refit against 131 months of observed EIA Alaska deliveries through 202605. Mean monthly error 11.52 to 6.82 percent. Backtests recomputed.",
      "changed": [
        "base_mmcfd",
        "slope_mmcfd_per_hdd",
        "formula",
        "fit_source",
        "backtests"
      ]
    }
  ],
  "crosscheck": {
    "eia_latest_month": "202605",
    "eia_months_checked": 131,
    "eia_model_ratio": 1.0,
    "eia_model_gap_pct": 0,
    "eia_model_runs": "high",
    "eia_ak_working_gas_bcf": 30.0,
    "eia_ak_capacity_bcf": 69.9,
    "eia_storage_fields": 5
  },
  "crosscheck_source": {
    "publisher": "US Energy Information Administration",
    "url": "https://api.eia.gov/bulk/NG.zip",
    "documentation": "https://www.eia.gov/opendata/",
    "note": "Monthly, Alaska statewide, lags about two months. It checks the demand model and the storage picture. It is not a refit and it does not close the daily gap."
  },
  "series": [
    {
      "date": "2026-08-05",
      "collected_utc": "2026-08-05T15:47:47Z",
      "collector_version": "1.0",
      "verified": true,
      "cingsa": {
        "fetch_status": "ok",
        "source_timestamp": "2026-08-05T05:00:00",
        "source_timestamp_utc": "2026-08-05T13:00:00Z",
        "inventory_mcf": 6456905,
        "inventory_delta_mcf": 28668,
        "storage_design_mcf": 13000000,
        "inventory_pct_of_design": 49.7,
        "withdrawal_design_mcfd": 215000,
        "withdrawal_operating_mcfd": 132117,
        "withdrawal_available_mcfd": 130450,
        "withdrawal_restriction_mcfd": 0,
        "injection_design_mcfd": 225000,
        "injection_operating_mcfd": 206320,
        "injection_available_mcfd": 175985,
        "injection_in_progress_mcfd": 30335,
        "injection_restriction_mcfd": 0,
        "operational_note": "CINGSA will be performing required semiannual shut-in field balance & maintenance from 14; Sept. 2026 until 21 Sept. 2026. No nominations will be accepted during this time.",
        "source_age_hours": 2.8
      },
      "forecast": [
        {
          "date": "2026-08-06",
          "hours": 24,
          "mean_temp_f": 59.0,
          "min_temp_f": 56,
          "hdd65": 6.0,
          "modeled_demand_mmcfd": 100
        },
        {
          "date": "2026-08-07",
          "hours": 24,
          "mean_temp_f": 58.4,
          "min_temp_f": 53,
          "hdd65": 6.6,
          "modeled_demand_mmcfd": 103
        },
        {
          "date": "2026-08-08",
          "hours": 24,
          "mean_temp_f": 59.7,
          "min_temp_f": 53,
          "hdd65": 5.3,
          "modeled_demand_mmcfd": 97
        },
        {
          "date": "2026-08-09",
          "hours": 24,
          "mean_temp_f": 60.1,
          "min_temp_f": 54,
          "hdd65": 4.9,
          "modeled_demand_mmcfd": 96
        },
        {
          "date": "2026-08-10",
          "hours": 24,
          "mean_temp_f": 60.0,
          "min_temp_f": 54,
          "hdd65": 5.0,
          "modeled_demand_mmcfd": 96
        }
      ],
      "forecast_source_updated": "2026-08-05T14:36:48+00:00",
      "derived": {
        "peak_forecast_date": "2026-08-07",
        "peak_forecast_hdd": 6.6,
        "peak_modeled_demand_mmcfd": 103,
        "forecast_window_demand_bcf": 0.49,
        "storage_withdrawal_mmcfd": -28.7,
        "non_cingsa_supply_mmcfd": null,
        "days_cover_at_peak": 62.7,
        "days_cover_note": "Inventory divided by modeled peak demand. It is arithmetic on storage alone and takes no account of the withdrawal capacity ceiling, field supply, or deliverability. It is not a measure of adequacy."
      },
      "reconciliation": {
        "date": "2026-08-04",
        "forecast_hdd65": null,
        "actual_hdd65": 5.0,
        "error": null,
        "modeled_demand_mmcfd": 96,
        "storage_withdrawal_mmcfd": null,
        "non_cingsa_supply_mmcfd": null,
        "basis": "observed HDD from ACIS PANC, measured inventory draw from the CINGSA record committed for that date"
      },
      "model": {
        "version": "1.0",
        "formula": "MMcf/d = 75 + 4.20 * HDD65",
        "base_mmcfd": 75.0,
        "slope_mmcfd_per_hdd": 4.2,
        "hdd_base_f": 65,
        "calibration": "average day 190 MMcf/d, design day 390 MMcf/d at HDD 75",
        "fit_source": "published figures, not fit to observed sendout",
        "measured": [
          "cingsa_inventory",
          "cingsa_capacity",
          "observed_hdd"
        ],
        "modeled": [
          "demand",
          "non_cingsa_supply"
        ],
        "not_public": [
          "hilcorp_storage_inventory",
          "daily_field_deliverability",
          "enstar_realtime_sendout"
        ],
        "mass_balance": {
          "identity": "D = P + W, therefore P = D - W",
          "note": "D is modeled demand, W is the measured CINGSA inventory draw. What falls out of P is field production plus any Hilcorp storage draw combined, which is why the field is named non_cingsa_supply_mmcfd and is never called production."
        }
      },
      "sources": [
        {
          "name": "cingsa_dashboard",
          "url": "https://cingsa.com/operations/PublicDashBoard.html",
          "method": "GET",
          "fetch_status": "ok",
          "fetched_utc": "2026-08-05T15:47:48Z",
          "http_status": 200,
          "attempts": 1
        },
        {
          "name": "nws_hourly_forecast",
          "url": "https://api.weather.gov/gridpoints/AER/143,236/forecast/hourly",
          "method": "GET",
          "fetch_status": "ok",
          "fetched_utc": "2026-08-05T15:47:48Z",
          "http_status": 200,
          "attempts": 1
        },
        {
          "name": "acis_panc_hdd",
          "url": "https://data.rcc-acis.org/StnData",
          "method": "POST",
          "fetch_status": "ok",
          "fetched_utc": "2026-08-05T15:47:48Z",
          "http_status": 200,
          "attempts": 1
        }
      ],
      "flags": [],
      "supersedes_unverified": "2026-08-05T15:47:14Z"
    }
  ]
}