{
 "as_of": "2026-11-05",
 "first_date": "2026-11-04",
 "generated": "2026-11-05T07:34:48Z",
 "generator": "scripts/how_we_know/extract.py",
 "facts": {
  "hpmon.considered": {
   "value": 150.0,
   "text": "150",
   "source": "validation/hpmon/analyze.after-fitfixes.out:1"
  },
  "hpmon.homes": {
   "value": 93.0,
   "text": "93",
   "source": "validation/hpmon/analyze.after-fitfixes.out:1"
  },
  "hpmon.dhw_split": {
   "value": 72.0,
   "text": "72",
   "source": "validation/hpmon/analyze.after-fitfixes.out:2"
  },
  "hpmon.refused_before": {
   "value": 21.0,
   "text": "21",
   "source": "validation/hpmon/analyze.out:5"
  },
  "hpmon.refused_after": {
   "value": 0.0,
   "text": "0",
   "source": "validation/hpmon/analyze.after-fitfixes.out:5"
  },
  "hpmon.ratio_after": {
   "value": 1.11,
   "text": "1.11",
   "source": "validation/hpmon/analyze.after-fitfixes.out:9"
  },
  "hpmon.within20_after": {
   "value": 75.0,
   "text": "75%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:10"
  },
  "hpmon.cold_monthly_after": {
   "value": 1.082,
   "text": "1.08",
   "source": "validation/hpmon/analyze.after-fitfixes.out:18"
  },
  "hpmon.cold_daily_after": {
   "value": 1.022,
   "text": "1.02",
   "source": "validation/hpmon/analyze.after-fitfixes.out:18"
  },
  "hpmon.cover_after": {
   "value": 98.9,
   "text": "99%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:22"
  },
  "hpmon.ratio_before": {
   "value": 1.194,
   "text": "1.19",
   "source": "validation/hpmon/analyze.out:9"
  },
  "hpmon.within20_before": {
   "value": 52.8,
   "text": "53%",
   "source": "validation/hpmon/analyze.out:10"
  },
  "hpmon.cold_monthly_before": {
   "value": 1.197,
   "text": "1.20",
   "source": "validation/hpmon/analyze.out:18"
  },
  "hpmon.cold_daily_before": {
   "value": 1.084,
   "text": "1.08",
   "source": "validation/hpmon/analyze.out:18"
  },
  "hpmon.cover_before": {
   "value": 88.9,
   "text": "89%",
   "source": "validation/hpmon/analyze.out:22"
  },
  "hpmon.ratio_p10": {
   "value": 1.01,
   "text": "1.01",
   "source": "validation/hpmon/analyze.after-fitfixes.out:9"
  },
  "hpmon.ratio_p90": {
   "value": 1.329,
   "text": "1.33",
   "source": "validation/hpmon/analyze.after-fitfixes.out:9"
  },
  "hpmon.weekly_daily": {
   "value": 1.004,
   "text": "1.00",
   "source": "validation/hpmon/analyze.after-fitfixes.out:15"
  },
  "hpmon.monthly_weekly": {
   "value": 1.102,
   "text": "1.10",
   "source": "validation/hpmon/analyze.after-fitfixes.out:15"
  },
  "hpmon.cold_temp_c": {
   "value": 3.2,
   "text": "3.2",
   "source": "validation/hpmon/analyze.after-fitfixes.out:18"
  },
  "hpmon.within_pct": {
   "value": 20.0,
   "text": "20%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:10"
  },
  "hpmon.cold_days": {
   "value": 5.0,
   "text": "5",
   "source": "validation/hpmon/analyze.after-fitfixes.out:18"
  },
  "hpmon.cold_temp_f": {
   "value": 37.76,
   "text": "38°F",
   "source": "validation/hpmon/analyze.after-fitfixes.out:18"
  },
  "hpmon.width": {
   "value": 81.7,
   "text": "82%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:23"
  },
  "hpmon.tilt_oct": {
   "value": 19.0,
   "text": "+19%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:19"
  },
  "hpmon.tilt_apr": {
   "value": -20.0,
   "text": "-20%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:19"
  },
  "hpmon.oos_homes": {
   "value": 19.0,
   "text": "19",
   "source": "validation/hpmon/analyze.after-fitfixes.out:35"
  },
  "hpmon.oos_model": {
   "value": 8.3,
   "text": "8.3%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:37"
  },
  "hpmon.oos_naive": {
   "value": 7.4,
   "text": "7.4%",
   "source": "validation/hpmon/analyze.after-fitfixes.out:37"
  },
  "hpmon.designer_n": {
   "value": 84.0,
   "text": "84",
   "source": "validation/hpmon/analyze.after-fitfixes.out:29"
  },
  "hpmon.designer_med": {
   "value": 1.03,
   "text": "1.03",
   "source": "validation/hpmon/analyze.after-fitfixes.out:29"
  },
  "hpmon.designer_p10": {
   "value": 0.73,
   "text": "0.73",
   "source": "validation/hpmon/analyze.after-fitfixes.out:29"
  },
  "hpmon.designer_p90": {
   "value": 1.49,
   "text": "1.49",
   "source": "validation/hpmon/analyze.after-fitfixes.out:29"
  },
  "hpmon.cop_seasons": {
   "value": 116.0,
   "text": "116",
   "source": "validation/hpmon/analyze.after-fitfixes.out:46"
  },
  "hpmon.cop_median": {
   "value": 4.02,
   "text": "4.02",
   "source": "validation/hpmon/analyze.after-fitfixes.out:46"
  },
  "ideal.all_homes": {
   "value": 255.0,
   "text": "255",
   "source": "validation/ideal/out_main.after-fitfixes.txt:1"
  },
  "ideal.homes": {
   "value": 108.0,
   "text": "108",
   "source": "validation/ideal/out_main.after-fitfixes.txt:1"
  },
  "ideal.ratio_after": {
   "value": 0.999,
   "text": "1.00",
   "source": "validation/ideal/out_main.after-fitfixes.txt:6"
  },
  "ideal.ratio_before": {
   "value": 1.12,
   "text": "1.12",
   "source": "validation/ideal/out_main.txt:6"
  },
  "ideal.within20": {
   "value": 77.0,
   "text": "77%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:7"
  },
  "ideal.monthly_weekly": {
   "value": 1.0,
   "text": "1.00",
   "source": "validation/ideal/out_main.after-fitfixes.txt:14"
  },
  "ideal.monthly_weekly_within20": {
   "value": 79.0,
   "text": "79%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:14"
  },
  "ideal.cover_after": {
   "value": 100.0,
   "text": "100%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:18"
  },
  "ideal.cover_before": {
   "value": 97.0,
   "text": "97%",
   "source": "validation/ideal/out_main.txt:18"
  },
  "ideal.width_after": {
   "value": 126.0,
   "text": "126%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:18"
  },
  "ideal.width_before": {
   "value": 368.0,
   "text": "368%",
   "source": "validation/ideal/out_main.txt:18"
  },
  "ideal.base_clamped": {
   "value": 38.0,
   "text": "38",
   "source": "validation/ideal/out_main.after-fitfixes.txt:11"
  },
  "ideal.oos_homes": {
   "value": 13.0,
   "text": "13",
   "source": "validation/ideal/out_main.after-fitfixes.txt:27"
  },
  "ideal.oos_model": {
   "value": 20.0,
   "text": "20%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:32"
  },
  "ideal.oos_naive": {
   "value": 15.0,
   "text": "15%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:32"
  },
  "ideal.oos_signed": {
   "value": 20.0,
   "text": "+20%",
   "source": "validation/ideal/out_main.after-fitfixes.txt:34"
  },
  "ideal.indoor": {
   "value": 64.4,
   "text": "64.4°F",
   "source": "validation/ideal/out_indoor.txt:2"
  },
  "ideal.tb": {
   "value": 58.0,
   "text": "58°F",
   "source": "validation/ideal/out_indoor.txt:3"
  },
  "ideal.tb_corr": {
   "value": 0.14,
   "text": "0.14",
   "source": "validation/ideal/out_indoor.txt:5"
  },
  "sweep.scenarios": {
   "value": 193.0,
   "text": "193",
   "source": "validation/sweep/analyze.after-cutover.out:1"
  },
  "sweep.rows": {
   "value": 148996.0,
   "text": "148,996",
   "source": "validation/sweep/analyze.after-cutover.out:1"
  },
  "sweep.products": {
   "value": 772,
   "text": "772",
   "source": "validation/sweep/results.json electricLosing[0].of"
  },
  "sweep.generated": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "validation/sweep/results.json generated"
  },
  "sweep.coprange_after": {
   "value": 4518.0,
   "text": "4,518",
   "source": "validation/sweep/analyze.after-cutover.out:3"
  },
  "sweep.below_tested_after": {
   "value": 1178.0,
   "text": "1,178",
   "source": "validation/sweep/analyze.after-cutover.out:8"
  },
  "sweep.coprange_before": {
   "value": 34495.0,
   "text": "34,495",
   "source": "validation/sweep/analyze.out:3"
  },
  "sweep.below_tested_before": {
   "value": 3816.0,
   "text": "3,816",
   "source": "validation/sweep/analyze.out:8"
  },
  "sweep.cop.miami.before": {
   "value": 4.91,
   "text": "4.91",
   "source": "validation/sweep/analyze.out:16"
  },
  "sweep.cop.miami.after": {
   "value": 3.74,
   "text": "3.74",
   "source": "validation/sweep/analyze.after-cutover.out:16"
  },
  "sweep.copmax.miami.before": {
   "value": 8.65,
   "text": "8.65",
   "source": "validation/sweep/analyze.out:19"
  },
  "sweep.copmax.miami.after": {
   "value": 5.36,
   "text": "5.36",
   "source": "validation/sweep/analyze.after-cutover.out:19"
  },
  "sweep.cop.phoenix.before": {
   "value": 5.23,
   "text": "5.23",
   "source": "validation/sweep/analyze.out:24"
  },
  "sweep.cop.phoenix.after": {
   "value": 3.76,
   "text": "3.76",
   "source": "validation/sweep/analyze.after-cutover.out:24"
  },
  "sweep.copmax.phoenix.before": {
   "value": 9.27,
   "text": "9.27",
   "source": "validation/sweep/analyze.out:27"
  },
  "sweep.copmax.phoenix.after": {
   "value": 5.59,
   "text": "5.59",
   "source": "validation/sweep/analyze.after-cutover.out:27"
  },
  "sweep.cop.houston.before": {
   "value": 4.39,
   "text": "4.39",
   "source": "validation/sweep/analyze.out:32"
  },
  "sweep.cop.houston.after": {
   "value": 3.64,
   "text": "3.64",
   "source": "validation/sweep/analyze.after-cutover.out:32"
  },
  "sweep.copmax.houston.before": {
   "value": 7.6,
   "text": "7.60",
   "source": "validation/sweep/analyze.out:35"
  },
  "sweep.copmax.houston.after": {
   "value": 5.33,
   "text": "5.33",
   "source": "validation/sweep/analyze.after-cutover.out:35"
  },
  "sweep.cop.atlanta.before": {
   "value": 4.06,
   "text": "4.06",
   "source": "validation/sweep/analyze.out:40"
  },
  "sweep.cop.atlanta.after": {
   "value": 3.43,
   "text": "3.43",
   "source": "validation/sweep/analyze.after-cutover.out:40"
  },
  "sweep.copmax.atlanta.before": {
   "value": 6.72,
   "text": "6.72",
   "source": "validation/sweep/analyze.out:43"
  },
  "sweep.copmax.atlanta.after": {
   "value": 4.97,
   "text": "4.97",
   "source": "validation/sweep/analyze.after-cutover.out:43"
  },
  "sweep.cop.denver.before": {
   "value": 3.67,
   "text": "3.67",
   "source": "validation/sweep/analyze.out:48"
  },
  "sweep.cop.denver.after": {
   "value": 3.19,
   "text": "3.19",
   "source": "validation/sweep/analyze.after-cutover.out:48"
  },
  "sweep.copmax.denver.before": {
   "value": 6.56,
   "text": "6.56",
   "source": "validation/sweep/analyze.out:51"
  },
  "sweep.copmax.denver.after": {
   "value": 5.32,
   "text": "5.32",
   "source": "validation/sweep/analyze.after-cutover.out:51"
  },
  "sweep.cop.seattle.before": {
   "value": 4.42,
   "text": "4.42",
   "source": "validation/sweep/analyze.out:56"
  },
  "sweep.cop.seattle.after": {
   "value": 3.67,
   "text": "3.67",
   "source": "validation/sweep/analyze.after-cutover.out:56"
  },
  "sweep.copmax.seattle.before": {
   "value": 7.72,
   "text": "7.72",
   "source": "validation/sweep/analyze.out:59"
  },
  "sweep.copmax.seattle.after": {
   "value": 5.24,
   "text": "5.24",
   "source": "validation/sweep/analyze.after-cutover.out:59"
  },
  "sweep.cop.chicago.before": {
   "value": 3.47,
   "text": "3.47",
   "source": "validation/sweep/analyze.out:64"
  },
  "sweep.cop.chicago.after": {
   "value": 3.05,
   "text": "3.05",
   "source": "validation/sweep/analyze.after-cutover.out:64"
  },
  "sweep.copmax.chicago.before": {
   "value": 6.81,
   "text": "6.81",
   "source": "validation/sweep/analyze.out:67"
  },
  "sweep.copmax.chicago.after": {
   "value": 5.59,
   "text": "5.59",
   "source": "validation/sweep/analyze.after-cutover.out:67"
  },
  "sweep.cop.boston.before": {
   "value": 3.72,
   "text": "3.72",
   "source": "validation/sweep/analyze.out:72"
  },
  "sweep.cop.boston.after": {
   "value": 3.3,
   "text": "3.30",
   "source": "validation/sweep/analyze.after-cutover.out:72"
  },
  "sweep.copmax.boston.before": {
   "value": 6.34,
   "text": "6.34",
   "source": "validation/sweep/analyze.out:75"
  },
  "sweep.copmax.boston.after": {
   "value": 4.87,
   "text": "4.87",
   "source": "validation/sweep/analyze.after-cutover.out:75"
  },
  "sweep.cop.minneapolis.before": {
   "value": 3.25,
   "text": "3.25",
   "source": "validation/sweep/analyze.out:80"
  },
  "sweep.cop.minneapolis.after": {
   "value": 2.82,
   "text": "2.82",
   "source": "validation/sweep/analyze.after-cutover.out:80"
  },
  "sweep.copmax.minneapolis.before": {
   "value": 8.19,
   "text": "8.19",
   "source": "validation/sweep/analyze.out:83"
  },
  "sweep.copmax.minneapolis.after": {
   "value": 5.49,
   "text": "5.49",
   "source": "validation/sweep/analyze.after-cutover.out:83"
  },
  "sweep.cop.burlington.before": {
   "value": 3.36,
   "text": "3.36",
   "source": "validation/sweep/analyze.out:88"
  },
  "sweep.cop.burlington.after": {
   "value": 2.97,
   "text": "2.97",
   "source": "validation/sweep/analyze.after-cutover.out:88"
  },
  "sweep.copmax.burlington.before": {
   "value": 5.97,
   "text": "5.97",
   "source": "validation/sweep/analyze.out:91"
  },
  "sweep.copmax.burlington.after": {
   "value": 5.04,
   "text": "5.04",
   "source": "validation/sweep/analyze.after-cutover.out:91"
  },
  "sweep.cop.fairbanks.before": {
   "value": 2.63,
   "text": "2.63",
   "source": "validation/sweep/analyze.out:96"
  },
  "sweep.cop.fairbanks.after": {
   "value": 2.41,
   "text": "2.41",
   "source": "validation/sweep/analyze.after-cutover.out:96"
  },
  "sweep.copmax.fairbanks.before": {
   "value": 29.95,
   "text": "29.95",
   "source": "validation/sweep/analyze.out:99"
  },
  "sweep.copmax.fairbanks.after": {
   "value": 5.79,
   "text": "5.79",
   "source": "validation/sweep/analyze.after-cutover.out:99"
  },
  "sweep.climates": {
   "value": 11,
   "text": "11",
   "source": "validation/sweep/results.json copDist"
  },
  "sweep.api_n": {
   "value": 111,
   "text": "111",
   "source": "validation/sweep/results.json apiCompare"
  },
  "sweep.api_max": {
   "value": 2.5,
   "text": "2.5",
   "source": "validation/sweep/results.json apiCompare[].diff"
  },
  "sweep.api_fossil_max": {
   "value": 1.3,
   "text": "1.3",
   "source": "validation/sweep/results.json apiCompare[].diff (non-electric)"
  },
  "sweep.inv.nonfinite": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.nonfinite"
  },
  "sweep.inv.savingsExceedBaseline": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.savingsExceedBaseline"
  },
  "sweep.inv.negativeRunningCost": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.negativeRunningCost"
  },
  "sweep.inv.paybackFormula": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.paybackFormula"
  },
  "sweep.inv.picksMismatch": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.picksMismatch"
  },
  "sweep.inv.sizeNotMonotonic": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.sizeNotMonotonic"
  },
  "sweep.inv.climateNotMonotonic": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.climateNotMonotonic"
  },
  "sweep.inv.verdictOverclaim": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json violations.verdictOverclaim"
  },
  "fix.lg.id": {
   "value": 2404,
   "text": "2404",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.lg.picks_after": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json scenarioSummaries[].picks"
  },
  "fix.bestvalue.after": {
   "value": 0,
   "text": "0",
   "source": "validation/sweep/results.json scenarioSummaries[].picks"
  },
  "fix.fairbanks.best_cover": {
   "value": 93,
   "text": "93%",
   "source": "validation/sweep/results.json scenarioSummaries[fairbanks electric 1600].picks[0]"
  },
  "fix.fairbanks.best_name": {
   "value": "Fujitsu AirStage H-Series 14k BTU Wall Mount",
   "text": "Fujitsu AirStage H-Series 14k BTU Wall Mount",
   "source": "validation/sweep/results.json scenarioSummaries[fairbanks electric 1600].picks[0]"
  },
  "fix.bestvalue.before": {
   "value": 31.0,
   "text": "31",
   "source": "validation/sweep/REPORT.md:22"
  },
  "example.sqft": {
   "value": 1600.0,
   "text": "1,600",
   "source": "validation/sweep/REPORT.md:3"
  },
  "example.stories": {
   "value": 2,
   "text": "2",
   "source": "validation/sweep/REPORT.md:3"
  },
  "example.era": {
   "value": "1990-09",
   "text": "1990-09",
   "source": "validation/sweep/REPORT.md:3"
  },
  "fix.bestvalue.city_eff": {
   "value": 96.0,
   "text": "96%",
   "source": "validation/sweep/REPORT.md:22"
  },
  "fix.flat.margin": {
   "value": 10.0,
   "text": "10",
   "source": "validation/sweep/REPORT.md:17"
  },
  "sweep.coprange_lo": {
   "value": 1.3,
   "text": "1.3",
   "source": "validation/sweep/analyze.js:75"
  },
  "sweep.coprange_hi": {
   "value": 4.5,
   "text": "4.5",
   "source": "validation/sweep/analyze.js:75"
  },
  "fix.lg.cop": {
   "value": 21.39,
   "text": "21.39",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.lg.cop_lo": {
   "value": 1.73,
   "text": "1.73",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.lg.cop_hi": {
   "value": 4.35,
   "text": "4.35",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.lg.saves": {
   "value": 10462.0,
   "text": "$10,462",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.lg.best_in": {
   "value": 23.0,
   "text": "23",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.lg.of": {
   "value": 36.0,
   "text": "36",
   "source": "validation/sweep/REPORT.md:15"
  },
  "fix.flat.claims": {
   "value": 2682.0,
   "text": "2,682",
   "source": "validation/sweep/REPORT.md:17"
  },
  "fix.flat.design": {
   "value": -45.0,
   "text": "−45°F",
   "source": "validation/sweep/REPORT.md:17"
  },
  "fix.null.products": {
   "value": 76.0,
   "text": "76",
   "source": "validation/sweep/REPORT.md:20"
  },
  "fix.cop.rows_above": {
   "value": 34281.0,
   "text": "34,281",
   "source": "validation/sweep/REPORT.md:24"
  },
  "fix.days.scen": {
   "value": 193.0,
   "text": "193",
   "source": "validation/sweep/REPORT.md:29"
  },
  "fix.days.houston_days": {
   "value": 346.2,
   "text": "346.2",
   "source": "validation/sweep/REPORT.md:29"
  },
  "fix.days.low": {
   "value": 5.0,
   "text": "5%",
   "source": "validation/sweep/REPORT.md:29"
  },
  "sweep.api_claimed": {
   "value": 111.0,
   "text": "111",
   "source": "validation/sweep/REPORT.md:10"
  },
  "specs.engine.boston.ductless.v1": {
   "value": 3.5,
   "text": "3.50",
   "source": "validation/specs/seasonal_boston.out:39"
  },
  "specs.engine.boston.ductless.perf": {
   "value": 3.4,
   "text": "3.40",
   "source": "validation/specs/seasonal_boston.after-perf.out:39"
  },
  "specs.engine.boston.ductless.now": {
   "value": 3.13,
   "text": "3.13",
   "source": "validation/specs/seasonal_boston.after-ducts.out:39"
  },
  "specs.engine.boston.ducted.v1": {
   "value": 3.26,
   "text": "3.26",
   "source": "validation/specs/seasonal_boston.out:25"
  },
  "specs.engine.boston.ducted.perf": {
   "value": 3.18,
   "text": "3.18",
   "source": "validation/specs/seasonal_boston.after-perf.out:25"
  },
  "specs.engine.boston.ducted.now": {
   "value": 2.71,
   "text": "2.71",
   "source": "validation/specs/seasonal_boston.after-ducts.out:25"
  },
  "specs.engine.mn.ductless.v1": {
   "value": 2.66,
   "text": "2.66",
   "source": "validation/specs/seasonal_mn.out:39"
  },
  "specs.engine.mn.ductless.perf": {
   "value": 2.59,
   "text": "2.59",
   "source": "validation/specs/seasonal_mn.after-perf.out:39"
  },
  "specs.engine.mn.ductless.now": {
   "value": 2.39,
   "text": "2.39",
   "source": "validation/specs/seasonal_mn.after-ducts.out:39"
  },
  "specs.engine.mn.ducted.v1": {
   "value": 2.61,
   "text": "2.61",
   "source": "validation/specs/seasonal_mn.out:25"
  },
  "specs.engine.mn.ducted.perf": {
   "value": 2.5,
   "text": "2.50",
   "source": "validation/specs/seasonal_mn.after-perf.out:25"
  },
  "specs.engine.mn.ducted.now": {
   "value": 2.17,
   "text": "2.17",
   "source": "validation/specs/seasonal_mn.after-ducts.out:25"
  },
  "example.lat": {
   "value": 42.36,
   "text": "42.36",
   "source": "validation/specs/seasonal_boston.after-ducts.out:1"
  },
  "example.lng": {
   "value": -71.06,
   "text": "-71.06",
   "source": "validation/specs/seasonal_boston.after-ducts.out:1"
  },
  "field.cadmus22.ductless": {
   "value": 3.23,
   "text": "3.23",
   "source": "validation/specs/field_studies.md:12"
  },
  "field.cadmus22.ducted": {
   "value": 2.25,
   "text": "2.25",
   "source": "validation/specs/field_studies.md:12"
  },
  "field.cee.ducted_hi": {
   "value": 1.9,
   "text": "1.9",
   "source": "validation/specs/field_studies.md:7"
  },
  "field.cee.ducted_lo": {
   "value": 1.8,
   "text": "1.8",
   "source": "validation/specs/field_studies.md:7"
  },
  "field.cee.ductless_hi": {
   "value": 2.3,
   "text": "2.3",
   "source": "validation/specs/field_studies.md:7"
  },
  "field.cee.ductless_lo": {
   "value": 2.2,
   "text": "2.2",
   "source": "validation/specs/field_studies.md:7"
  },
  "field.cadmus22.year": {
   "value": 2022,
   "text": "2022",
   "source": "validation/specs/field_studies.md:12"
  },
  "field.range.ductless.lo": {
   "value": 2.2,
   "text": "2.2",
   "source": "validation/specs/REPORT.md:82"
  },
  "field.range.ductless.hi": {
   "value": 3.2,
   "text": "3.2",
   "source": "validation/specs/REPORT.md:82"
  },
  "field.range.ducted.lo": {
   "value": 1.6,
   "text": "1.6",
   "source": "validation/specs/REPORT.md:83"
  },
  "field.range.ducted.hi": {
   "value": 2.5,
   "text": "2.5",
   "source": "validation/specs/REPORT.md:83"
  },
  "field.range.subzero.lo": {
   "value": 1.5,
   "text": "1.5",
   "source": "validation/specs/REPORT.md:84"
  },
  "field.range.subzero.hi": {
   "value": 2.4,
   "text": "2.4",
   "source": "validation/specs/REPORT.md:84"
  },
  "field.studies_n": {
   "value": 10.0,
   "text": "10",
   "source": "validation/specs/REPORT.md:80"
  },
  "neep.triples": {
   "value": 8330.0,
   "text": "8,330",
   "source": "validation/specs/REPORT.md:5"
  },
  "neep.agree": {
   "value": 1244.0,
   "text": "1,244",
   "source": "validation/specs/REPORT.md:72"
  },
  "neep.fields": {
   "value": 1365.0,
   "text": "1,365",
   "source": "validation/specs/REPORT.md:72"
  },
  "neep.agree_pct": {
   "value": 91.1,
   "text": "91.1",
   "source": "validation/specs/REPORT.md:72"
  },
  "neep.revised": {
   "value": "2026-08-24",
   "text": "2026-08-24",
   "source": "validation/specs/REPORT.md:73"
  },
  "neep.served": {
   "value": "2026-03-17",
   "text": "2026-03-17",
   "source": "validation/specs/REPORT.md:73"
  },
  "neep.sample": {
   "value": 40.0,
   "text": "40",
   "source": "validation/specs/REPORT.md:71"
  },
  "field.studies_listed": {
   "value": 10,
   "text": "10",
   "source": "validation/specs/field_studies.md"
  },
  "engine.derate_f": {
   "value": 30.0,
   "text": "30",
   "source": "static/perf.js:21"
  },
  "engine.cycling_cd": {
   "value": 0.25,
   "text": "0.25",
   "source": "static/perf.js:22"
  },
  "engine.cop_cold_max": {
   "value": 17.0,
   "text": "17",
   "source": "static/perf.js:28"
  },
  "engine.cop_cold_cap": {
   "value": 5.0,
   "text": "5",
   "source": "static/perf.js:28"
  },
  "engine.cop_cap": {
   "value": 7.0,
   "text": "7",
   "source": "static/perf.js:28"
  },
  "engine.cop_min": {
   "value": 1.0,
   "text": "1",
   "source": "static/perf.js:27"
  },
  "engine.cee_share": {
   "value": 20.0,
   "text": "20%",
   "source": "static/perf.js:14"
  },
  "engine.test_temps": {
   "value": [
    5.0,
    17.0,
    47.0
   ],
   "text": "5°F, 17°F and 47°F",
   "source": "static/perf.js:65"
  },
  "engine.t_rated_cold": {
   "value": 5.0,
   "text": "5°F",
   "source": "static/perf.js:65"
  },
  "engine.t_warm": {
   "value": 47.0,
   "text": "47°F",
   "source": "static/perf.js:65"
  },
  "engine.ach50_div": {
   "value": 17.0,
   "text": "17",
   "source": "templates/next.html:1561"
  },
  "engine.hot_water": {
   "value": 20.0,
   "text": "20%",
   "source": "templates/next.html:3460"
  },
  "engine.dse.none": {
   "value": 100.0,
   "text": "100%",
   "source": "templates/next.html:3465"
  },
  "engine.dse.inside": {
   "value": 100.0,
   "text": "100%",
   "source": "templates/next.html:3465"
  },
  "engine.dse.basement": {
   "value": 70.0,
   "text": "70%",
   "source": "templates/next.html:3465"
  },
  "engine.dse.crawl": {
   "value": 78.0,
   "text": "78%",
   "source": "templates/next.html:3465"
  },
  "engine.dse.attic": {
   "value": 72.0,
   "text": "72%",
   "source": "templates/next.html:3465"
  },
  "engine.field.ductless": {
   "value": 92.0,
   "text": "92%",
   "source": "templates/next.html:3472"
  },
  "engine.field.sized": {
   "value": 95.0,
   "text": "95%",
   "source": "templates/next.html:3472"
  },
  "engine.field.reuse": {
   "value": 85.0,
   "text": "85%",
   "source": "templates/next.html:3472"
  },
  "engine.gains_base": {
   "value": 17900.0,
   "text": "17,900",
   "source": "calculator.py:30"
  },
  "engine.gains_area": {
   "value": 23.8,
   "text": "23.8",
   "source": "calculator.py:30"
  },
  "engine.gains_bed": {
   "value": 4104.0,
   "text": "4,104",
   "source": "calculator.py:30"
  },
  "engine.cee_lo": {
   "value": -20.0,
   "text": "−20°F",
   "source": "static/perf.js:14"
  },
  "engine.cee_hi": {
   "value": -25.0,
   "text": "−25°F",
   "source": "static/perf.js:14"
  },
  "fix.lg.temp": {
   "value": -4.0,
   "text": "−4°F",
   "source": "static/perf.js:9"
  },
  "era.pre-1950.wallR": {
   "value": 4.0,
   "text": "4",
   "source": "calculator.py:20"
  },
  "era.pre-1950.ceilingR": {
   "value": 4.0,
   "text": "4",
   "source": "calculator.py:20"
  },
  "era.pre-1950.windowU": {
   "value": 0.9,
   "text": "0.90",
   "source": "calculator.py:20"
  },
  "era.pre-1950.ach50": {
   "value": 14.5,
   "text": "14.5",
   "source": "calculator.py:20"
  },
  "era.1950-69.wallR": {
   "value": 5.0,
   "text": "5",
   "source": "calculator.py:21"
  },
  "era.1950-69.ceilingR": {
   "value": 9.0,
   "text": "9",
   "source": "calculator.py:21"
  },
  "era.1950-69.windowU": {
   "value": 0.9,
   "text": "0.90",
   "source": "calculator.py:21"
  },
  "era.1950-69.ach50": {
   "value": 11.0,
   "text": "11",
   "source": "calculator.py:21"
  },
  "era.1970-89.wallR": {
   "value": 14.0,
   "text": "14",
   "source": "calculator.py:22"
  },
  "era.1970-89.ceilingR": {
   "value": 16.0,
   "text": "16",
   "source": "calculator.py:22"
  },
  "era.1970-89.windowU": {
   "value": 0.55,
   "text": "0.55",
   "source": "calculator.py:22"
  },
  "era.1970-89.ach50": {
   "value": 8.5,
   "text": "8.5",
   "source": "calculator.py:22"
  },
  "era.1990-09.wallR": {
   "value": 16.0,
   "text": "16",
   "source": "calculator.py:23"
  },
  "era.1990-09.ceilingR": {
   "value": 30.0,
   "text": "30",
   "source": "calculator.py:23"
  },
  "era.1990-09.windowU": {
   "value": 0.35,
   "text": "0.35",
   "source": "calculator.py:23"
  },
  "era.1990-09.ach50": {
   "value": 5.0,
   "text": "5",
   "source": "calculator.py:23"
  },
  "era.2010+.wallR": {
   "value": 22.0,
   "text": "22",
   "source": "calculator.py:24"
  },
  "era.2010+.ceilingR": {
   "value": 44.0,
   "text": "44",
   "source": "calculator.py:24"
  },
  "era.2010+.windowU": {
   "value": 0.3,
   "text": "0.30",
   "source": "calculator.py:24"
  },
  "era.2010+.ach50": {
   "value": 3.5,
   "text": "3.5",
   "source": "calculator.py:24"
  },
  "date.bills": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "Notes/heatpushers-home-model.md:23"
  },
  "date.realdata": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "Notes/heatpushers-home-model.md:24"
  },
  "date.sweep": {
   "value": "2026-11-04",
   "text": "2026-11-04",
   "source": "Notes/heatpushers-home-model.md:25"
  },
  "date.perf": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "Notes/heatpushers-home-model.md:26"
  },
  "date.ducts": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "Notes/heatpushers-home-model.md:27"
  },
  "date.cutover": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "Notes/heatpushers-home-model.md:28"
  },
  "date.balance": {
   "value": "2026-11-04",
   "text": "2026-11-04",
   "source": "Notes/heatpushers-home-model.md:22"
  },
  "notes.status_date": {
   "value": "2026-11-05",
   "text": "2026-11-05",
   "source": "Notes/heatpushers-home-model.md:3"
  },
  "fix.balance.old": {
   "value": 60.0,
   "text": "60°F",
   "source": "Notes/heatpushers-home-model.md:16"
  },
  "fix.balance.calc": {
   "value": 62.0,
   "text": "62°F",
   "source": "Notes/heatpushers-home-model.md:16"
  },
  "fix.balance.diff": {
   "value": 9.0,
   "text": "9%",
   "source": "Notes/heatpushers-home-model.md:16"
  },
  "example.boston_cost": {
   "value": 1327.0,
   "text": "$1,327",
   "source": "Notes/heatpushers-home-model.md:22"
  },
  "example.boston_balance": {
   "value": 63.3,
   "text": "63.3°F",
   "source": "Notes/heatpushers-home-model.md:22"
  },
  "fix.ach.preset": {
   "value": 0.65,
   "text": "0.65",
   "source": "Notes/heatpushers-home-model.md:27"
  },
  "fix.ach.ach50": {
   "value": 11.0,
   "text": "11",
   "source": "Notes/heatpushers-home-model.md:27"
  },
  "fix.ach.resdb": {
   "value": 12.0,
   "text": "12",
   "source": "Notes/heatpushers-home-model.md:27"
  },
  "fix.ducts.yukon_retro": {
   "value": 1.3,
   "text": "1.3",
   "source": "Notes/heatpushers-home-model.md:27"
  },
  "fix.ducts.yukon_sized": {
   "value": 2.5,
   "text": "2.5",
   "source": "Notes/heatpushers-home-model.md:27"
  },
  "fix.gate.fdays": {
   "value": 500.0,
   "text": "500",
   "source": "Notes/heatpushers-home-model.md:28"
  },
  "fix.gate.tstart_lo": {
   "value": 50.0,
   "text": "50°F",
   "source": "Notes/heatpushers-home-model.md:28"
  },
  "fix.gate.tstart_hi": {
   "value": 68.0,
   "text": "68°F",
   "source": "Notes/heatpushers-home-model.md:28"
  },
  "fix.review.count": {
   "value": 10.0,
   "text": "10",
   "source": "Notes/heatpushers-home-model.md:28"
  },
  "cheapgas.price": {
   "value": 1.06,
   "text": "$1.06",
   "source": "Notes/heatpushers-home-model.md:17"
  },
  "cheapgas.elec": {
   "value": 0.17,
   "text": "$0.17",
   "source": "Notes/heatpushers-home-model.md:17"
  },
  "cheapgas.gas_mmbtu": {
   "value": 11.0,
   "text": "$11",
   "source": "Notes/heatpushers-home-model.md:17"
  },
  "cheapgas.hp_mmbtu": {
   "value": 17.0,
   "text": "$17",
   "source": "Notes/heatpushers-home-model.md:17"
  },
  "cheapgas.cop": {
   "value": 3.0,
   "text": "3",
   "source": "Notes/heatpushers-home-model.md:17"
  }
 },
 "cities": [
  {
   "key": "miami",
   "name": "Miami"
  },
  {
   "key": "phoenix",
   "name": "Phoenix"
  },
  {
   "key": "houston",
   "name": "Houston"
  },
  {
   "key": "atlanta",
   "name": "Atlanta"
  },
  {
   "key": "denver",
   "name": "Denver"
  },
  {
   "key": "seattle",
   "name": "Seattle"
  },
  {
   "key": "chicago",
   "name": "Chicago"
  },
  {
   "key": "boston",
   "name": "Boston"
  },
  {
   "key": "minneapolis",
   "name": "Minneapolis"
  },
  {
   "key": "burlington",
   "name": "Burlington, VT"
  },
  {
   "key": "fairbanks",
   "name": "Fairbanks, AK"
  }
 ],
 "invariants": [
  {
   "key": "nonfinite",
   "label": "No blank or impossible numbers (NaN, Infinity) anywhere on the page"
  },
  {
   "key": "savingsExceedBaseline",
   "label": "Savings never exceed what the house pays for heating and cooling today"
  },
  {
   "key": "negativeRunningCost",
   "label": "Running cost is never below zero"
  },
  {
   "key": "paybackFormula",
   "label": "Payback always equals upfront cost divided by yearly savings"
  },
  {
   "key": "picksMismatch",
   "label": "The three picks always follow the page's own stated rules"
  },
  {
   "key": "sizeNotMonotonic",
   "label": "A bigger house never costs less to heat"
  },
  {
   "key": "climateNotMonotonic",
   "label": "A colder place never costs less to heat for the same house"
  },
  {
   "key": "verdictOverclaim",
   "label": "\"Keeps up\" never claims more heat than the spec sheet lists, where the unit was tested"
  }
 ],
 "field_compare": [
  {
   "city": "boston",
   "cityName": "Boston",
   "type": "ductless",
   "products": 402
  },
  {
   "city": "boston",
   "cityName": "Boston",
   "type": "ducted",
   "products": 278
  },
  {
   "city": "mn",
   "cityName": "Minneapolis",
   "type": "ductless",
   "products": 402
  },
  {
   "city": "mn",
   "cityName": "Minneapolis",
   "type": "ducted",
   "products": 278
  }
 ],
 "study_urls": {
  "cee": "https://www.mncee.org/sites/default/files/report-files/Field-Assessment-of-Ducted-and-Ductless-Cold-Climate-Air-Source-Heat-Pumps.pdf",
  "cadmus2022": "https://e4thefuture.org/wp-content/uploads/2022/06/Residential-ccASHP-Building-Electrification_060322.pdf"
 },
 "studies": [
  {
   "url": "https://www.mncee.org/sites/default/files/report-files/Field-Assessment-of-Ducted-and-Ductless-Cold-Climate-Air-Source-Heat-Pumps.pdf",
   "name": "CEE, Schoenbauer/Bohac/Haynor, ACEEE 2018 paper summarizing the 2017 MN Commerce CARD report",
   "year": "2018",
   "where": "Minnesota, Twin Cities metro + northern MN. HDD not given; most of MN has heating design temp below −10 °F",
   "system": "6 ducted (4 flex-fuel with LP furnace backup and a 5-10 °F changeover; 2 all-electric Mitsubishi with electric plenum booster) + 2 ductless (Mitsubishi Hyper Heat, with baseboard backup)",
   "n": "8 homes",
   "cop": "Table 3 \"Annual System COP\" (includes backup): ducted flex-fuel 1.0-1.3; ducted all-electric 1.9 metro / 1.8 northern MN; ductless 2.3 metro / 2.2 northern MN (ductless serves ~50% of load)",
   "source": "validation/specs/field_studies.md:7"
  },
  {
   "url": "https://ripuc.ri.gov/sites/g/files/xkgbur841/files/eventsactions/docket/4755-TRM-DMSHP-Evaluation-Report-12-30-2016.pdf",
   "name": "Cadmus, MA/RI DMSHP Impact Evaluation",
   "year": "2016",
   "where": "Massachusetts and Rhode Island",
   "system": "Ductless mini-split, single- and multi-head. 78 of 152 units were \"cold-climate\" models (all single-head)",
   "n": "152 homes (metered n per season 57-99)",
   "cop": "Field HSPF is shown only in figures (Figs 30-34, 49-51), and no single seasonal number appears in the text. Text: field HSPF \"generally fell below the nameplate rating\". The top 25% of light and heavy users \"approached or exceeded a 10.0 HSPF\" (about COP 2.9 [derived]). Average rated HSPF: 10.3 overall, 11.0 for cold-climate units",
   "source": "validation/specs/field_studies.md:8"
  },
  {
   "url": "https://www.nlr.gov/docs/fy15osti/63913.pdf",
   "name": "CARB/Steven Winter Assoc., Williamson & Aldrich, NREL/SR-5500-63913",
   "year": "2015",
   "where": "Connecticut, Massachusetts, Vermont",
   "system": "Ductless: 3 Mitsubishi FE18, 3 FE12, 1 Fujitsu 15RLS2",
   "n": "7 sites with usable data (10 instrumented)",
   "cop": "Table 8 overall COP (with defrost): 1.11-2.33. Per site: 1.61, 1.99, 2.31, 1.71, 2.33, 1.11, 2.06. Without defrost: 1.12-2.44",
   "source": "validation/specs/field_studies.md:9"
  },
  {
   "url": "https://neea.org/wp-content/uploads/2025/03/ductless-heat-pump-impact-process-evaluation-field-metering-report.pdf",
   "name": "Ecotope for NEEA, E12-237, Northwest DHP Pilot",
   "year": "2012",
   "where": "Pacific Northwest, 5 clusters (DOE zones 4C, 5B, 6B)",
   "system": "Ductless, mostly single-head, displacing zonal electric-resistance heat in the main living zone",
   "n": "95 homes metered; 69 with COP",
   "cop": "Table ES-1 seasonal COP: mean 3.00 (SD 0.55). Willamette 3.40, Puget Sound 3.05, Boise/Twin Falls 2.96, Eastern Idaho 2.84, Inland Empire 2.41",
   "source": "validation/specs/field_studies.md:10"
  },
  {
   "url": "https://publicservice.vermont.gov/sites/dps/files/documents/Evaluation%20of%20Cold%20Climate%20Heat%20Pumps%20in%20Vermont.pdf",
   "name": "Cadmus for VT PSD",
   "year": "2017",
   "where": "Vermont; both winters mild (−10 °F reached only about once in winter 2016)",
   "system": "Ductless cold-climate mini-splits (single- and some multi-head)",
   "n": "77 units at 65 service accounts",
   "cop": "Field \"HSPF\" 10.7 kBtu/kWh (≈ COP 3.1 [derived]) vs nameplate 11.9 HSPF, i.e. \"approximately 88%\" (exec summary says ~90%). Excludes standby energy",
   "source": "validation/specs/field_studies.md:11"
  },
  {
   "url": "https://e4thefuture.org/wp-content/uploads/2022/06/Residential-ccASHP-Building-Electrification_060322.pdf",
   "name": "Cadmus, \"Residential ccASHP Building Electrification Study\", for MassCEC/NYSERDA et al.",
   "year": "2022",
   "where": "Massachusetts and New York; average design temperature 5.2 °F (MA) and 1.8 °F (NY)",
   "system": "Ductless single- and multi-zone, ducted central/compact, and mixed; whole-home vs \"primary with backup\" applications",
   "n": "43 homes / 73 outdoor units",
   "cop": "Overall site-level sCOP 2.34 (per outdoor unit 2.50). By type: ductless single-zone wall 3.23 (19 units); ductless multi-zone 2.24 (2 heads), 2.57 (3), 1.12 (4), 1.52 (5); ducted single-zone central 2.25 (15 units). By application: ductless 2.23 (primary w/ backup) / 2.80 (whole-home); ducted 2.46 / 2.03",
   "source": "validation/specs/field_studies.md:12"
  },
  {
   "url": "https://www.efficiencymaine.com/docs/Efficiency_Maine_Residential_Heat_Pump_Impact_Evaluation_Report-2024.pdf",
   "name": "Efficiency Maine residential HP impact evaluation; metering by Ridgeline",
   "year": "2024",
   "where": "All 16 Maine counties; 12 homes north of Lincoln, 9 in Presque Isle and north",
   "system": "Predominantly ductless mini-splits (single- and multi-zone, HESP/AHI rebated)",
   "n": "124 homes / 170 outdoor units / 210 indoor units",
   "cop": "Mean seasonal COP 2.57, including defrost. TRM assumed 2.48; earlier HESP evaluation metered 2.7",
   "source": "validation/specs/field_studies.md:13"
  },
  {
   "url": "https://www.pnnl.gov/main/publications/external/technical_reports/PNNL-37127.pdf",
   "name": "PNNL-37127, DOE Cold Climate Heat Pump Challenge field validation",
   "year": "2025",
   "where": "Cold/very-cold US sites and Canada (some Canadian sites were lab homes). Milder-than-normal winters; only 8 of 22 sites had ≥10 h below 0 °F",
   "system": "Centrally ducted ccHP prototypes (8 manufacturers), 3-5 ton, with staged electric auxiliary heat",
   "n": "22 units",
   "cop": "No seasonal COP reported. Heat-pump-only median COP 1.9 in the 0-5 °F bin; medians 1.6-2.7 across bins below 30 °F. These exclude auxiliary heat and defrost periods",
   "source": "validation/specs/field_studies.md:14"
  },
  {
   "url": "https://yukon.ca/sites/default/files/emr-yukon-cold-climate-heat-pump-study-24-25.pdf",
   "name": "RDH Building Science for Govt. of Yukon, 2024/25 season report",
   "year": "2025",
   "where": "Southern Yukon (Whitehorse, Tagish, Haines Junction); subarctic. HDD not given",
   "system": "13 ductless (mini/multi-split), 3 central ducted, 2 air-to-water",
   "n": "18 homes / 19 systems; 13 with SCOP",
   "cop": "Table 3.1 SCOP: ductless 2.9 (all) / 3.2 (operating as intended); central ducted 1.6 / 1.8; air-to-water 1.1 (one site). SCOP includes defrost energy (heat-pump energy only)",
   "source": "validation/specs/field_studies.md:15"
  },
  {
   "url": "https://yukon.ca/sites/default/files/emr/air-source-heat-pump-monitoring-project-technical-report-2022-2023.pdf",
   "name": "Govt. of Yukon Energy Branch, ASHP Monitoring Project, 2022/23 report",
   "year": "2024",
   "where": "Whitehorse, Yukon",
   "system": "Centrally ducted Mitsubishi Zuba (36-42 kBtu/h) with built-in electric auxiliary heat",
   "n": "5 homes",
   "cop": "Table 3 SCOP 2022/23: 1.10-2.51. Per-site 3-season averages 1.13, 1.41, 1.29, 1.36, 2.46",
   "source": "validation/specs/field_studies.md:16"
  }
 ],
 "eras": [
  {
   "key": "pre-1950",
   "label": "Before 1950"
  },
  {
   "key": "1950-69",
   "label": "1950 to 1969"
  },
  {
   "key": "1970-89",
   "label": "1970 to 1989"
  },
  {
   "key": "1990-09",
   "label": "1990 to 2009"
  },
  {
   "key": "2010+",
   "label": "2010 or later"
  }
 ],
 "changelog": [
  {
   "id": "spec-typo-fairbanks",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "A spec-sheet typo made one unit the top pick for Fairbanks, Alaska",
   "wrong": "One LG listing (id {fix.lg.id}) gave its efficiency at {fix.lg.temp} as COP {fix.lg.cop}. Its other heating figures were {fix.lg.cop_lo} to {fix.lg.cop_hi}. The engine believed it, so for an electric-heated house in Fairbanks the page called it \"Best value\" and said it would save {fix.lg.saves} a year. It was the top pick in {fix.lg.best_in} of {fix.lg.of} Fairbanks test houses.",
   "fix": "Listing points that are physically implausible are now dropped: heating COP below {engine.cop_min} or above {engine.cop_cap}, or above {engine.cop_cold_cap} at {engine.cop_cold_max}°F and colder. If two points list the same output, the lower efficiency is kept.",
   "after": "That unit is now a pick in {fix.lg.picks_after} test houses. The highest seasonal efficiency the engine gives any product in Fairbanks fell from {sweep.copmax.fairbanks.before} to {sweep.copmax.fairbanks.after}.",
   "sources": [
    "validation/sweep/REPORT.md",
    "static/perf.js"
   ]
  },
  {
   "id": "cold-capacity-held-flat",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "Heat pumps were assumed to keep full output far below their coldest test",
   "wrong": "Below the coldest temperature a unit was tested at, the engine kept its output flat. So the page said units could carry the whole house down to {fix.flat.design} in Fairbanks. {fix.flat.claims} such \"carries the whole load\" claims were at least {fix.flat.margin}°F below the unit's coldest test. With no backup heat, that is dangerous advice.",
   "fix": "Below the coldest test, output now fades in a straight line to zero {engine.derate_f}°F lower, and efficiency never rises as it gets colder. This is a judgment, anchored on a Minnesota field test where a small unit delivered about {engine.cee_share} of its rated {engine.t_rated_cold} output at {engine.cee_lo} to {engine.cee_hi}.",
   "after": "\"Keeps up\" claims that rely on weather colder than the unit's test fell from {sweep.below_tested_before} to {sweep.below_tested_after}, and those now use the faded output. The top Fairbanks pick for an electric-heated house now covers {fix.fairbanks.best_cover} of the heat, not all of it.",
   "sources": [
    "validation/sweep/REPORT.md",
    "validation/specs/field_studies.md",
    "static/perf.js"
   ]
  },
  {
   "id": "missing-coldest-test",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "Units with no listed coldest test lost all their cold-weather output",
   "wrong": "{fix.null.products} products have no \"lowest tested temperature\" in the listing data. The page filled in an empty test row for them, which read as zero output at {engine.t_rated_cold} and colder. This one ran the other way: good cold-climate units ranked too low.",
   "fix": "The empty rows are gone; those products use the tests they do have.",
   "after": null,
   "sources": [
    "validation/sweep/REPORT.md",
    "validation/specs/REPORT.md"
   ]
  },
  {
   "id": "efficiency-too-high",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "Seasonal efficiency was too high, especially in mild climates",
   "wrong": "When a heat pump runs below its minimum output it cycles on and off, which wastes energy. The engine ignored that, and kept efficiency rising in warm weather. Across all test houses, {sweep.coprange_before} product results had a seasonal COP outside a plausible {sweep.coprange_lo} to {sweep.coprange_hi}, {fix.cop.rows_above} of them too high. Median in Miami: {sweep.cop.miami.before}.",
   "fix": "Running below minimum output now costs efficiency (the industry default cycling factor, Cd = {engine.cycling_cd}). Efficiency no longer rises above the {engine.t_warm} test. Real-home factors and duct losses (below) also apply now.",
   "after": "Results outside {sweep.coprange_lo} to {sweep.coprange_hi}: {sweep.coprange_after}. Median in Miami is now {sweep.cop.miami.after}.",
   "sources": [
    "validation/sweep/analyze.out",
    "validation/sweep/analyze.after-cutover.out",
    "static/perf.js"
   ]
  },
  {
   "id": "best-value-label",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "\"Best value\" was shown on picks that cost more every year",
   "wrong": "In {fix.bestvalue.before} test houses, the pick labeled \"Best value\" would raise the yearly bill. Example: Minneapolis with a {fix.bestvalue.city_eff} gas furnace, where cheap gas beats every heat pump.",
   "fix": "That pick is now labeled \"Lowest extra cost\" when it loses money, and \"Cheapest to own\" when it does not pay back within its lifetime. When nothing saves money, the page says so and compares the cost of heat from each source.",
   "after": "\"Best value\" on a money-losing pick: {fix.bestvalue.after} test houses.",
   "sources": [
    "validation/sweep/REPORT.md",
    "validation/sweep/results.json"
   ]
  },
  {
   "id": "costs-not-annualized",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "Yearly costs were not scaled to a full year",
   "wrong": "A setting hidden in a collapsed section read as blank, so the weather data was never scaled to exactly a year. It happened in {fix.days.scen} of {sweep.scenarios} test houses. Houston's weather covered {fix.days.houston_days} days, so its costs came out about {fix.days.low} low.",
   "fix": "The setting is read correctly now.",
   "after": null,
   "sources": [
    "validation/sweep/REPORT.md"
   ]
  },
  {
   "id": "bills-overstate-heat-loss",
   "date": "2026-11-05",
   "found": "2026-11-05",
   "title": "Monthly bills overstated heat loss, and mild winters were refused",
   "wrong": "Against {hpmon.homes} UK homes with heat meters, heat loss fitted from monthly totals came out {hpmon.ratio_before} times the daily-data fit. The check for \"enough cold weather\" turned away {hpmon.refused_before} of {hpmon.homes} complete years because UK winters are mild. In {ideal.homes} Scottish gas homes, the uncertainty range was {ideal.width_before} of the value: honest, but useless.",
   "fix": "Daily data is added up into weeks first. The temperature where heating starts is kept between {fix.gate.tstart_lo} and {fix.gate.tstart_hi}. The cold-weather check now asks for at least {fix.gate.fdays} degree-days of heating instead of counting cold months. Fits that land far off are set aside.",
   "after": "Refused: {hpmon.refused_after}. Monthly vs daily heat loss: {hpmon.ratio_after}. The Scottish range width: {ideal.width_after}.",
   "sources": [
    "validation/hpmon/analyze.out",
    "validation/hpmon/analyze.after-fitfixes.out",
    "validation/ideal/out_main.txt",
    "validation/ideal/out_main.after-fitfixes.txt"
   ]
  },
  {
   "id": "ducts",
   "date": "2026-11-05",
   "found": "2026-11-04",
   "title": "Ducted heat pumps looked far better than field studies measured",
   "wrong": "The first engine had no duct losses and took spec sheets at face value. It gave a ducted heat pump in Boston a seasonal COP of {specs.engine.boston.ducted.v1}. A {field.cadmus22.year} field study in Massachusetts and New York measured {field.cadmus22.ducted}.",
   "fix": "Duct losses now depend on where the ducts run, and they are charged to whatever uses them: the furnace, the central AC and a ducted heat pump alike. So a ductless unit gets credit for skipping them. Real-home factors are applied on top (ductless {engine.field.ductless}, ducted on ducts sized for it {engine.field.sized}, on reused furnace ducts {engine.field.reuse} of the listed efficiency). Yukon retrofits on old furnace ducts measured about {fix.ducts.yukon_retro}, against {fix.ducts.yukon_sized} on ducts sized for the heat pump. A later review found duct losses counted twice; that was fixed before launch.",
   "after": "Boston ducted is now {specs.engine.boston.ducted.now}, still above the field figure. See the comparison above.",
   "sources": [
    "validation/specs/seasonal_boston.out",
    "validation/specs/seasonal_boston.after-ducts.out",
    "validation/specs/field_studies.md",
    "templates/next.html"
   ]
  },
  {
   "id": "air-leakage-units",
   "date": "2026-11-05",
   "found": "2026-11-05",
   "title": "A reader said our air leakage was \"dead wrong\"",
   "wrong": "The 1960s preset showed {fix.ach.preset} air changes per hour. A reader read that as a blower-door number, which would be an unusually tight house. It was the year-round natural rate, but the page did not say so.",
   "fix": "Air leakage is now entered and shown as the blower-door number (ACH50) an energy audit reports, and divided by {engine.ach50_div} for the natural rate the model uses (an LBL rule of thumb).",
   "after": "The 1960s preset shows {fix.ach.ach50} ACH50; a national database of blower-door tests has a median of about {fix.ach.resdb} for houses from that decade.",
   "sources": [
    "Notes/heatpushers-home-model.md",
    "templates/next.html"
   ]
  },
  {
   "id": "review-before-launch",
   "date": "2026-11-05",
   "found": "2026-11-05",
   "title": "An outside review before launch found {fix.review.count} more bugs",
   "wrong": "Before the new page replaced the old one, independent reviewers went through the code and the page as a homeowner would. They found:",
   "fix": null,
   "after": null,
   "list": [
    "Duct losses were counted twice: once on the house and again on the system that uses the ducts.",
    "A product's detail panel could keep showing numbers from before the house was costed.",
    "The cold-weather output fade was also applied to cooling.",
    "Boilers were charged duct losses they don't have. Gas and oil boilers are now their own choices.",
    "With electric baseboard as backup, the baseboard never took over when the heat pump became less efficient than the baseboard.",
    "Daily usage data lost some days when it was added up.",
    "Green Button downloads lost their time-zone marker.",
    "Fuel backup was labeled in kWh.",
    "Opening a product didn't change the page address, so it couldn't be linked.",
    "Leaving a bill out of the fit was not always applied."
   ],
   "sources": [
    "Notes/heatpushers-home-model.md"
   ]
  },
  {
   "id": "balance-point",
   "date": "2026-11-04",
   "found": "2026-11-04",
   "title": "Our two tools disagreed on when a house starts needing heat",
   "wrong": "The comparison assumed heating starts at {fix.balance.old} outdoors, the calculator at {fix.balance.calc}. Same house, about {fix.balance.diff} apart.",
   "fix": "Both now work it out from the house: thermostat setting minus free heat divided by heat loss. Leaky houses start needing heat at a warmer outdoor temperature, tight ones later. With bills, the fit measures it directly.",
   "after": "Both tools agree to the dollar ({example.boston_cost} a year for the Boston example house).",
   "sources": [
    "Notes/heatpushers-home-model.md",
    "calculator.py"
   ]
  }
 ]
}
