Inspiration

A count can look precise while its denominator disappears. Our downloaded NOAA Seoul series has 92 usable daily maxima in summer 2014 and zero usable daily maxima in summer 2024. Counting only observed hot days gives 34 versus zero. That does not show that the later summer was cooler: it shows that this series cannot answer. HeatWitness makes that distinction visible before the number becomes a climate claim.

What it does

Choose two summers and a temperature threshold. Every expected calendar day stays in the audit. Accepted observations are classified against the threshold; missing, absent and failed-quality observations remain unknown. The interface shows each period's possible hot-day count, the range of possible differences, and a verdict. Users can inspect coverage and download the complete calculation with daily flags, source URLs and a SHA-256 fingerprint of the exact original file.

The 2014–2022 comparison at 30°C remains positive despite missing records: between 3 and 11 more hot days in the later period. The 2014–2024 comparison spans −34 to +58, so it is unresolved. These are real source-derived examples, not invented successful outcomes. The thresholds are demonstration choices, not official heatwave definitions.

Track and intended users

Climate Data & Environmental Monitoring. The prototype addresses the verification gap between a data download and a public environmental claim. Intended users include climate communicators, civic data teams and researchers auditing a preliminary comparison. This is a proposed workflow; no user adoption or impact reduction has been measured.

How we built it

Python's standard library parses NOAA GHCN-Daily fixed-width data and retains measurement, quality and source flags. A build step produces 48 summer audits covering 2010–2025 and 30/32/35°C thresholds. A dependency-free HTML/CSS/JavaScript interface reads that local dataset. No paid API, account, runtime model or blockchain is required. The source can be reprocessed offline.

For H accepted hot days and U unknown days, the count is bounded by [H,H+U]. Subtracting opposite interval endpoints gives the possible difference between disjoint equal-length periods. Only a strictly positive or negative interval supports a direction. Comparing a period with itself returns zero. The CLI rejects partially overlapping periods instead of pretending their unknown days are independent.

Validation and limits

Nine tests cover missing data, quality flags, calendar boundaries, duplicates, identical periods and overlap. An exhaustive check covers all 729 pairs of three-day hot/cold/unknown patterns. Browser controls and downloaded results were checked against the calculation. A separately implemented parser cross-checked all 48 audits and 4,416 calendar-day entries against NOAA's alternate CSV serialization; counts and accepted daily values/flags matched. Results are in csv-crosscheck-v002.json. This checks implementation against another format of the same database; it is not independent weather observation or independent human review.

Bounds are not confidence intervals. Two summers are not a climate trend or attribution study, and one station is not a city-wide estimate. A source hash proves which bytes were used, not that a measurement is true. Missing values in this file do not prove that no other weather archive has observations. No carbon reduction, health benefit, operational deployment or independent-review claim is made.

What is next

Evaluate the audit with climate-data users; add station selection and explicit station-history checks; compare authoritative alternative archives before choosing whether imputation is appropriate. Any imputed values must remain distinguishable from observations and their assumptions must travel with the audit.

AI contribution

OpenAI Codex assisted concept development, implementation, test design and writing. OpenAI image generation provided a UI concept; the implemented evidence grid is drawn from actual data. No model-generated weather values are used. The running prototype is deterministic and does not invoke an AI model.

Built With

Share this project:

Updates

Submission history