OLDGABE-only (US wildfire detection). A public record of measured results with honest bounds and full reproducibility. Nothing on this page changes a shipped OLDGABE number.
What this log is. The research record for OLDGABE, a US-based wildfire
detection product. Each entry carries a plain-language framing, a BLUF, the exact method and populations, a
results table, a claim-status tag, a literature-alignment box, and load-bearing honest bounds — so a reader with
access to the same public feeds (NASA FIRMS VIIRS/MODIS, NOAA GOES-ABI, NIFC IRWIN/perimeters) and the stated
recipe can recreate the numbers. Measured, skeptical-first, negatives kept. Rigor pass: 2026-07-08.
Comment on any entry below — challenge a number, add evidence, or suggest a check.
Does the CAUTION-recovery re-ranker actually beat the production tier scorer? — head-to-head + de-confounding
The framing. OLDGABE's fusion stage sorts every candidate fire into tiers; the great majority
land in a low-confidence CAUTION tier and are never surfaced. The question that had never been measured:
among those CAUTION events, can a learned recovery model rank the genuine hidden fires better than the
production tier/confidence scorer does?
BLUF. On the operationally meaningful metrics the recovery model decisively beats
production. At an 80%-precision operating point it recovers 60.5% of confirmed real fires vs production's
9.5% (Truth1), and 27.2% vs 0% under a second, HMS-independent truth (Truth2). Production
holds a small global-AUC edge on Truth1 (0.951 vs 0.936) — but that edge is a confound: production
uses the NOAA HMS smoke channel, and Truth1 is 91.5% HMS-confirmed, so it is partly scoring HMS against HMS. When
the truth is switched to an independent polar-satellite corroboration, production's AUC edge reverses
(recovery 0.845 vs production 0.786).
Populations & truths (reproducible). Candidate set = every canonical event with
event_corroboration_tier.tier='CAUTION' that has an event_ground_truth row
(n = 197,325). Truth1 (multi-source) = event_ground_truth.confirmed
(6,867 positive, 3.48%; for CAUTION this channel is 91.5% NOAA-HMS-confirmed). Truth2 (neutral polar) = a
VIIRS/MODIS active-fire detection from a different canonical event within 5 km and −1..+14 days
of the event's first detection (7,791 positive, 3.95%). The two truths overlap only partially (both-positive 1,753;
Truth1-only 5,114; Truth2-only 6,038), so Truth2 is a genuine cross-check, not a relabelling.
Features (non-leaky, detection-time only). Evidence is joined excluding the confirmation
channels IRWIN, HMS, SAR and S2. Per event: n_det, n_fam, max/mean_frp, max/mean_conf, span_h, n_days,
max_ti4, ti4−ti5 contrast, frac_night, mean_pixel_area, max_ti5, abi_temp_k, abi_area, modis_brightness,
mean_hour, fp_dist_km, frp_per_pixel. Model: gradient-boosted trees
(HistGradientBoostingClassifier, class-weight balanced), scored out-of-fold under
5-fold GroupKFold grouped on 0.2° spatial cells (a held-out cell is never in training). The
production scorer is the fixed tier_and_conf() confidence; its value is pinned at 0.02 for ~94% of
CAUTION events (the GOES/ABI-only majority), which is why it cannot rank within the tier.
Result.
Truth1 (multi-source, HMS-heavy)
AUC
PR-AUC
recall@90%p
recall@80%p
recovery model (detection features)
0.936
0.735
0.379
0.605
production tier_and_conf
0.951
0.544
0.065
0.095
production indep-families
0.500
—
0.000
0.000
production max-FRP
0.787
0.161
0.006
0.019
Truth2 (neutral polar, HMS-independent)
AUC
PR-AUC
recall@90%p
recall@80%p
recovery model (detection features)
0.845
0.511
0.064
0.272
production tier_and_conf
0.786
0.273
0.000
0.000
De-confounding (does the win survive removing the reporting channel?). Feature-group AUCs, per truth
— month-only / geography-only (lat,lon) / detection-only / all:
truth
month-only
geo-only
detection-only
all
summer-share gap
Truth1
0.577
0.903
0.936
0.973
0.00
Truth2
0.567
0.877
0.845
0.932
0.00
Reads: (1) Season is not a confound — the candidate window is summer-only, so the summer-share of
positives and of negatives is identical (gap = 0) and month-only ranking is near-chance (~0.57). (2) Geography is a
large prior under both truths (0.903 vs 0.877), which already argues it is real fire geography rather than
pure reporting bias — a reporting-only signal would predict the HMS truth far better than the polar truth.
(3) Production's Truth1 AUC lead does not survive the neutral truth. The honest operating-point story is unchanged:
production cannot deliver a high-precision set within CAUTION; the recovery model can.
Claim status: DEFENSIBLE (measured, out-of-fold, two independent truths).
Literature alignment. Verdict: AGREEMENT. Two well-established remote-sensing results are
reproduced here on OLDGABE's own data: (a) a single geostationary quality/confidence flag is a weak within-tier
ranker [1][2], and (b) independent multi-sensor corroboration is the
strongest precision lever for active-fire detection [3]. A learned re-ranker that fuses
detection-time features outperforms a hand-tuned tier threshold, consistent with the broader move from fixed
thresholds to learned confidence in EO detection.
Where we are careful / diverge: AUC and PR-AUC disagree here because production's confidence is
near-constant within CAUTION; we report the operating-point metric (recall at fixed precision) as primary because the
use-case is surfacing a high-precision hidden set, not global ranking. We treat the HMS-heavy Truth1 as
reporting-biased and lead with the polar Truth2.
What this does not claim: neither truth is a fire perimeter; Truth1 (HMS smoke) is spatially broad,
Truth2 (polar overpass) is recall-limited. These are corroboration proxies.
Next research test: add geographic priors and re-validate on the neutral truth (see entry 0002);
extend beyond the summer window before any surfacing.
Public data sources:NASA FIRMS (VIIRS/MODIS
active fire) · NOAA GOES-R ABI ·
NIFC / IRWIN & perimeters (US ground truth). Every figure is
reproducible from these public feeds plus the recipe above; no OLDGABE-internal state is required to recompute the
model, only OLDGABE's aggregation of these feeds into per-event evidence.
Statistical reporting: ranking metrics are out-of-fold (5-fold GroupKFold, 0.2° cells) to
remove in-sample optimism; base rates are stated with counts; both a reporting-biased and a reporting-independent
truth are reported side by side rather than a single headline.
entry 0001
Adding geography to the recovery re-ranker — a defensible lift that grows under the neutral truth
The framing. Entry 0001 showed geography alone ranks CAUTION fires surprisingly well. Wildfires
cluster by fuel, terrain and climate, so a location prior should carry real signal — but a location prior can also
just memorise where fires get reported. This entry adds geography to the recovery model and tests, honestly,
whether the lift is real fire behaviour or a reporting/coverage artifact.
BLUF. Adding raw lat/lon to the detection feature set (recovery+geo) is a
defensible improvement over both the detection-only recovery model and production, on
both truths and every metric. The decisive de-confounding result: the geo lift is larger under
the HMS-independent polar truth (+0.081 AUC) than under the reporting-heavy truth (+0.036 AUC). If geography
were merely encoding reporting bias, its benefit would shrink when the truth stops depending on reporting — instead it
grows. So the geographic signal is real fire geography.
What "geo" is (hard data bound). OLDGABE currently has no populated land-cover / fuel /
terrain / climatology layer — the fire-weather cell table is empty, weather stations are a current snapshot
(temporally invalid for historical events), and the raw detection JSON carries no geographic fields. So the only
non-leaky geographic priors available are raw lat/lon + distance-to-known-false-source. A Truth1-only
supplementary that adds an out-of-neighbourhood polar-thermal climatology density (a fuel/fire-proneness
proxy; circular against Truth2, hence Truth1-only) lifts a little further (AUC 0.978, recall@80% 0.771), indicating
headroom if a real independent fuel/climatology layer were ingested.
Method delta from entry 0001. Same populations (n = 202,005; the DB ingested more June/July events
between runs), same non-leaky features, same 5-fold GroupKFold on 0.2° cells, same two truths. New models:
recovery+geo = detection features + lat + lon; geo-only = lat,lon; all = detection + lat +
lon + month. A June↔July temporal-transport split is added as the only distribution shift the data permits.
Result — head-to-head.
Truth1 (multi-source)
AUC
PR-AUC
recall@80%p
detection-only recovery (deployed)
0.938
0.736
0.583
recovery + geo
0.973
0.797
0.719
all (+month)
0.974
0.803
0.722
geo-only
0.901
—
—
production tier_and_conf
0.950
0.539
0.092
Truth2 (neutral polar)
AUC
PR-AUC
recall@80%p
detection-only recovery (deployed)
0.860
0.573
0.368
recovery + geo
0.941
0.688
0.531
all (+month)
0.940
0.686
0.526
geo-only
0.886
—
—
production tier_and_conf
0.807
0.325
0.000
The geo lift over detection-only is +0.036 AUC on Truth1 and +0.081 AUC on Truth2 — it grows under
the neutral truth. recovery+geo also closes and reverses the one metric where production had led (Truth1 AUC, now
0.973 vs 0.950). Detection and geography are complementary: recovery+geo (0.941) beats both detection-only (0.860)
and geo-only (0.886), so neither is redundant. Month adds nothing (all ≈ recovery+geo).
Result — temporal transport (train one month, test the other).
train → test
truth
detection-only
recovery+geo
production
Jul → Jun
Truth1
0.961
0.985
0.963
Jul → Jun
Truth2
0.876
0.955
0.834
Jun → Jul
Truth1
0.888
0.934
0.941
Jun → Jul
Truth2
0.840
0.913
0.794
recovery+geo beats detection-only in all four cells and production in three of four (it loses only Jun→Jul on
the HMS-confounded Truth1, by 0.007). Under the neutral truth it wins both directions by wide margins, and it
stabilises the hard direction (Jun→Jul detection-only falls to 0.888; recovery+geo holds 0.934). Within
the available window, the geographic prior transports across time and does not hurt.
Deployment status: GATED HIDDEN SHADOW — nothing surfaced. The recovery+geo scores are written to a
hidden additive table event_caution_recovered_geo; a companion canary_meta row carries
surface_allowed=0 and a DO_NOT_SURFACE_* marker file states the block. No OLDGABE map, API,
tile, or user-facing output reads this table, and the daemon does not modify any production tier/score/confidence.
Surfacing is blocked until BOTH: (1) an off-season validation window passes, and
(2) a held-out region validation passes. The geographic prior is precisely the component most exposed
to seasonal and regional shift, and the entire evaluation to date is a two-month summer window (June+July 2026) with
spatial overlap. It must be re-measured on the neutral polar truth in those regimes before any surfacing is considered.
Claim status: DEFENSIBLE (measured, out-of-fold, survives the neutral truth), with an explicit
generalisation bound.
Literature alignment. Verdict: AGREEMENT. Wildfire occurrence is strongly conditioned by static
geography — fuel, topography and climate — which is the basis of published fire-susceptibility / fire-danger mapping
[4][5]; a learned location prior recovering much of that structure is
expected. Our de-confounding design (measure the geographic lift against a truth that does not depend on the reporting
channel) follows the standard caution that fire records carry reporting/observation bias
[6].
Where we are careful / diverge: we deliberately do not ship the geo model, because a
lat/lon prior fit on a single summer season can encode that season's/region's coverage and will not transport
unexamined. We hold it as a hidden shadow behind an explicit off-season + held-out-region gate.
What this does not claim: that the geographic prior generalises across seasons or regions (untested
— no off-season or out-of-region data exists yet); that raw lat/lon is a substitute for a real fuel/terrain
layer (the climatology supplement shows further headroom if one is ingested).
Next research test: extend the window to an off-season month and a held-out region; re-grade
recovery+geo on the neutral polar truth in each; ingest an independent fuel/land-cover/terrain layer (e.g. public
land-cover / elevation) and measure marginal lift over raw lat/lon.
Public data sources: as entry 0001 (NASA FIRMS, NOAA GOES-ABI, NIFC/IRWIN & perimeters).
Reproducible from the public feeds plus the stated features, label rules, model spec and CV protocol.
Statistical reporting: all model numbers are out-of-fold (5-fold GroupKFold, 0.2° cells); the
geographic lift is reported against both a reporting-biased and a reporting-independent truth; the temporal-transport
split is shown in both directions; the summer-only generalisation bound is stated as load-bearing, not a footnote.
entry 0002
The cross-sensor fusion safety-net: two independent satellites agreeing is 4.5× better than one
Date: 2026-07-08 Status: defensible (measured against NIFC IRWIN + perimeters)
The framing. Each satellite makes its own noisy fire hunches. OLDGABE's fusion daemon is the
“two-witnesses” rule: it links detections of the same fire across sensors and only trusts a candidate
strongly when independent instruments agree. This entry measures how much that agreement is worth.
BLUF. OLDGABE ingests ~1.80 million raw per-sensor fire detections. The fusion
daemon cross-links them into 11,441 multi-sensor clusters and grades them. Requiring
≥2 independent CORE thermal sensors to agree (the “confirmed” tier, n=620) raises the
IRWIN/perimeter match rate to 37.7%, versus 8.4% for a random raw single detection — a
4.5× precision lift — while GOES-only single-frame candidates (the “early” tier) match
just 5.5%. Separately, the false-positive catalog + status logic demote 620,160 raw candidates (34.4%)
to masked-fp so they never reach the map.
Result.
fused tier
n
avg conf
avg GOES frames
IRWIN/perim match
confirmed (≥2 CORE agree)
620
0.884
14.4
37.7% (234)
probable
3,340
0.528
1.6
13.2% (442)
early (GOES-only)
6,982
0.05
1.3
5.5% (383)
weak (small n)
139
0.02
0.0
25.9% (36)
fp (flare/persistent)
360
0.00
1.9
10.6% (38)
raw single-detection baseline
4,000 sampled
—
—
8.4% (336)
Reproducibility detail.Feeds: NASA FIRMS VIIRS (N20/N21/SNPP) & MODIS, NOAA
GOES-16/17/18/19 ABI (raw hotspots + Dozier subpixel + ADP smoke). Raw stream:fire_events
= 1,802,709 rows (candidate 488,981; confirmed 401,917; confirmed_growth 75,886; pre-ignition 146,843;
awaiting-confirmation 59,863; rx-burn 9,059; masked-fp 620,160). Fusion rule: time-ordered single-link
clustering, same fire if ≤2 km & ≤48 h; CORE = {VIIRS, MODIS, S2, GOES}; confirmed = ≥2 CORE agree.
Truth: NIFC IRWIN discovery points (823,535) + NIFC perimeters (115), match ≤10 km /
±14 days; raw baseline = uniform random sample of 4,000 fire_events centroids scored identically.
Claim status: DEFENSIBLE (measured; relative lift is the load-bearing claim).
Literature alignment. Verdict: AGREEMENT. Independent multi-sensor agreement is the canonical
precision lever in active-fire remote sensing [3], and geostationary single-frame hotspots are
abundant but low-precision [1] — matching the “early” tier's 5.5%. Persistent
industrial/flare false sources are handled by a known-source catalog rather than single-frame radiometry
[2].
What this does not claim: that 37.7% is the confirmed tier's absolute precision. IRWIN records only
reported incidents, so an unmatched cluster is not necessarily false; the defensible statement is the relative
lift (confirmed 37.7% vs single 8.4%). The daily-scorer (entry 0007) corroborates on a separate 24 h window.
Next research test: tighten the confirmed tier with a learned per-cluster confidence (entries
0001–0002) and measure precision at fixed recall.
Dozier subpixel strict-gate: a clean precision-for-recall trade, and why we keep it out of fusion
Date: 2026-07-08 Status: defensible (measured trade-off; not fused, by design)
The framing. The Dozier subpixel method estimates what fraction of a coarse GOES pixel is actually
burning (p_subpixel). Tightening a threshold on that fraction is a dial between “catch everything, mostly
noise” and “only the unambiguous, but almost nothing.”
BLUF. Gating on p_subpixel trades recall for precision cleanly: the IRWIN match rate rises
from 2.8% (ungated) to ~18–27% at p_subpixel ≥ 0.005–0.01, but keeps
only ~10–19% of Dozier's own positives. Because the high-precision operating point yields so few
detections — and essentially none the polar sensors don't already provide — OLDGABE's fusion daemon deliberately
excludes Dozier. A measured “keep it, but don't fuse it” decision, not an oversight.
Result (60,000 sampled Dozier detections; 1,681 IRWIN-positive = 2.8% base):
p_subpixel ≥
detections kept
precision (IRWIN match)
recall of Dozier positives
0.000 (ungated)
60,000
2.8%
100%
0.001
19,599
4.9%
57.6%
0.005
1,703
18.5%
18.7%
0.010
619
27.0%
9.9%
0.050
4
100% (n=4)
0.2%
The deployed strict gate independently scores 26.3% precision (G19) / 48.3% (G18) at ~1.3% whole-fire
recall in the daily-scorer (entry 0007) — consistent with this sweep.
Reproducibility detail. Feed: NOAA GOES-ABI Dozier subpixel retrieval
(ABI-Dozier-Subpixel-G18/G19). Sample: 60,000 random Dozier evidence rows with a valid p_subpixel.
Label: IRWIN/perimeter match ≤10 km / ±14 days. Precision = matched/kept per threshold; recall =
matched-kept / matched-ungated (of Dozier's own positives, not of all fires). Truth: NIFC IRWIN + perimeters.
Claim status: DEFENSIBLE (measured trade-off).
Literature alignment. Verdict: AGREEMENT. Dozier-style subpixel retrieval recovers sub-pixel fires a
raw threshold misses, at the cost of many marginal detections [7]; a strict confidence gate is the
standard conversion to usable precision. Our fusion-exclusion reflects the same marginal-value logic — a source that adds
precision but ~0 independent recall does not improve a multi-sensor confirmed tier.
What this does not claim: the recall column is of Dozier's own sampled positives, not all fires;
whole-fire recall at the deployed gate is ~1.3% (entry 0007). Precision at 0.05 (n=4) is noise.
Next research test: revisit fusing gated Dozier as a third corroborator only where it
uniquely covers a polar-overpass gap.
Negative result: GOES temporal persistence does not add defensible recall beyond polar
Date: 2026-07-08 Status: measured NEGATIVE / null (published for rigor)
The framing. A geostationary satellite stares at the same spot every few minutes, so a tempting idea is:
“if GOES keeps seeing a hotspot in one place for hours, that persistence is extra evidence of a real fire the polar
satellites missed between overpasses.” We tested it. It does not hold up.
BLUF. GOES near-match “recall” is saturated by coverage:
92.4% of IRWIN fire cells have some GOES detection within ~5 km, simply because GOES-ABI
emits candidate hotspots almost everywhere over CONUS (its measured precision is only ~15% — 85% are not fire). Requiring
temporal persistence (a cell seen in ≥3 distinct hours) only drops this coverage-inflated number
(92.4% → 66.1%); it never adds genuine recall. The apparent 43.8% “marginal over polar” is the same
coverage/false-positive floor, not independent detections. Conclusion: GOES temporal persistence is not a validated
recall lever — OLDGABE's defensible cross-sensor recall comes from polar corroboration and fusion (entry 0003).
Result (45-day window; 2,592 IRWIN truth cells at 0.05°):
recall of IRWIN cells by…
recall
interpretation
polar (VIIRS/MODIS) near-match
27.2%
genuine polar detections
any-GOES near-match
92.4%
coverage floor (not skill)
GOES-persistent (≥3 h) near-match
66.1%
persistence only subtracts coverage noise
GOES-persist caught, polar missed (marginal)
43.8%
confounded by the same coverage floor
Reproducibility detail. Feeds: NOAA GOES-ABI vs NASA FIRMS VIIRS/MODIS. Window: trailing 45 days.
Grid: 0.05° cells. Persistence = a cell with GOES/ABI detections in ≥3 distinct hour-buckets. Recall = fraction of
in-window IRWIN truth cells with a qualifying detection in the 3×3 neighbourhood. Marginal = IRWIN cells covered by
GOES-persistent but not polar. Truth: NIFC IRWIN. The confound is explicit: at GOES's ~15% precision, near-match recall
measures coverage density, not detection.
Claim status: NEGATIVE / NULL (honest; not adopted).
Literature alignment. Verdict: AGREEMENT. Geostationary active-fire products are high-volume and
low-precision [1][8]; near-match recall over a dense candidate stream measures
coverage, not skill (the “information floor”). Persistence has value for precision (rejecting
transient glints), but our test shows it does not manufacture recall beyond polar.
What this does not claim: that GOES persistence is useless — it is a precision/timeliness signal
elsewhere. This entry only refutes the specific claim that persistence adds independent recall. A stricter
per-detection truth (not cell coverage) would be needed for a fully fair recall test.
Next research test: score GOES persistence as a precision gate on the “early” fused tier
rather than a recall source.
Wildfire-camera smoke detection: highest precision of any source, but coverage/visibility-bound
Date: 2026-07-08 Status: measured; bound-limited (no proven standalone field value yet)
The framing. OLDGABE runs a smoke/flame classifier on public wildfire-camera frames and, when two
cameras see the same plume, triangulates the bearings into a map location. Cameras see smoke a satellite can't — but only
where a camera is pointed, in daylight, through clear air, within range.
BLUF. When a camera fires on a fire IRWIN also records, it is usually right — daily-scorer precision
66.7%, the highest of any single OLDGABE source. But it matches only 1.2% of
IRWIN fires: coverage and visibility (line-of-sight, daylight, haze, range) are the binding constraint, not the classifier.
Honest status: a high-precision corroborator where cameras can see, with no proven standalone field value yet
at network scale.
Literature alignment. Verdict: AGREEMENT. Ground/tower camera smoke detection is high-precision within
line-of-sight but coverage- and visibility-limited, and multi-camera triangulation is the standard geolocation method
[9]. Our numbers reproduce that profile: excellent precision, small recall.
What this does not claim: any standalone field value — recall is coverage/visibility-limited, only 57
camera detections matched an IRWIN incident in the scored window, and n=31 triangulations is too few to quote a
geolocation accuracy. The defensible role today is corroboration, not primary detection.
Next research test: measure triangulation geolocation error against matched IRWIN coordinates once n is
larger; quantify recall vs camera viewshed coverage explicitly.
Per-sensor scorecard vs NIFC IRWIN — what each US datalink actually contributes
Date: 2026-07-08 Status: defensible (OLDGABE's own daily replay scorer)
The framing. Rather than argue which feed matters, OLDGABE runs a daily replay scorer that matches
every sensor's detections to NIFC IRWIN ground truth and records precision, recall and count per source. This entry is
that scorecard, unedited.
BLUF. Polar VIIRS is the best single recall+precision workhorse; the fused OLDGABE output leads recall
(72.4%); cameras lead precision (66.7%); GOES-ABI is high-volume/low-precision; SAR and Sentinel-2 SWIR contributed nothing
in this window. This is the empirical basis for weighting the fusion daemon (entry 0003) toward polar + agreement.
Result (daily-scorer run 18, 24 h window ending 2026-07-08, match 10 nm / 24 h vs IRWIN):
source
precision
recall
tp
evidence n
OLDGABE-EVENTS (fused output)
18.2%
72.4%
3,355
18,394
HMS (smoke analysis)
16.0%
69.2%
6,906
43,214
VIIRS-N20
32.0%
58.7%
3,655
11,431
VIIRS-NPP
20.8%
31.3%
1,276
6,144
VIIRS-N21
19.7%
26.6%
1,012
5,150
MODIS
27.9%
22.2%
901
3,224
ABI-ADP-Smoke-G19
8.8%
24.1%
721
8,174
ABI-ADP-Smoke-G18
26.0%
24.2%
858
3,298
GOES19-ABI
15.8%
14.7%
521
3,304
GOES18-ABI
39.8%
14.6%
528
1,328
ABI-Dozier-Subpixel-G18
48.3%
1.3%
42
87
ABI-Dozier-Subpixel-G19
26.3%
1.3%
42
160
CAM-SMOKE
66.7%
1.2%
38
57
S1-SAR-BurnScar / S2-SWIR-Hotspot
—
0.0%
0
0
Reproducibility detail. Artifact: OLDGABE te_runs/te_metrics_by_source,
run_id 18, run_kind daily-scorer, config {match_radius_nm: 10, match_window_h: 24}, window
2026-07-07→2026-07-08. Per source: tp = detections matched to an IRWIN incident within 10 nm / 24 h; fp =
unmatched; fn = IRWIN incidents with no matching detection from that source; precision = tp/(tp+fp); recall = tp/(tp+fn).
Feeds: NASA FIRMS VIIRS/MODIS, NOAA GOES-ABI (raw + Dozier + ADP smoke), NOAA HMS, public cameras, Sentinel-1/2. Truth:
NIFC IRWIN.
Literature alignment. Verdict: AGREEMENT. The ranking — polar VIIRS/MODIS as accurate workhorses,
geostationary as timely-but-noisy, fusion maximising recall — matches the established complementarity of polar and
geostationary fire products [1][3][8].
What this does not claim: IRWIN at 10 nm / 24 h is a strict, sparse truth (reported incidents
only), so absolute precision is a lower bound — many unmatched detections are real fires IRWIN never logged.
Single 24 h window; lead-time medians omitted here as noisy. SAR/S2 zeros reflect this window's cadence, not a
permanent verdict.
Next research test: aggregate the scorecard across many daily runs with confidence intervals; add a
precision-at-fixed-recall column per source.
The framing. Entry 0006's 1.2% camera recall was measured against every US fire — but a
camera can only see fires inside its viewshed. The fair question is: where a camera can physically see, how often does it
catch the fire? And is the gap infrastructure (coverage) or algorithm (detection)?
BLUF. Conditioning on coverage reframes the number by 4–20×: within
60 km of an online camera, cameras detect 24.7% of IRWIN fires; within 20–40 km,
8.8–19.0%. But two gaps remain and split cleanly: coverage — only
28–59% of fires are within R km of an online camera — and detection-in-coverage
— even where a camera can see, only ~5–25% of fires are caught (night, haze, range, azimuth). Precision rises with R
to 72% (matching entry 0006/0007). Cameras remain a high-precision corroborator; the primary lever is detection-in-coverage,
but it is capped by coverage.
Reproducibility detail. Feeds: public wildfire cameras (public_cameras, 10,247 with
lat/lon; azimuth/FOV present but unused), cam_smoke_evidence (smoke/flame classifier output). IRWIN incidents
deduped to distinct fire-days (0.02° + day) = 3,903. Online = a camera that produced any evidence in
the window (10,227 distinct). Coverage = incident within R km of an online camera.
recall|cov = fraction of in-coverage incidents with a smoke≥0.5 hit from such a camera within R km
& ±24 h. precision|cov = fraction of smoke hits matching an IRWIN incident within R km /
±24 h. Truth: NIFC IRWIN. Assumptions: radius is a coarse viewshed proxy (terrain occlusion,
azimuth, FOV, range, daylight, haze ignored); all-hours.
Claim status: DEFENSIBLE (measured, conditional). Verdict on the lever: partial —
detection-in-coverage is the primary algorithm lever, but total camera reach is capped by coverage.
Literature alignment. Verdict: AGREEMENT. Camera smoke detection is high-precision within line-of-sight
and coverage/visibility-limited [9]; conditioning recall on viewshed is the correct evaluation and
lifts the apparent rate substantially, as here.
What this does not claim: that R km equals a true viewshed — terrain/azimuth/FOV/daylight/haze are
not modelled, so recall|cov is an upper-bounded reach estimate; precision rising with R is partly because more IRWIN
incidents exist to match against at larger radius.
Next research test: replace the radius proxy with a real per-camera viewshed (DEM + azimuth + FOV +
range) and split night vs day recall to isolate the algorithm lever.
Repositioning Dozier: a median 6-hour early cue, and a multi-feature gate that dominates the single threshold
Date: 2026-07-08 Status: defensible (measured; two positive levers)
The framing. Entry 0004 showed the single-p_subpixel Dozier gate is high-precision but
low-yield, and excluded from fusion. Two follow-ups ask whether Dozier is worth more than that: is it early, and
can a smarter gate move the curve out rather than just slide along it?
BLUF. Both hold. (1) Lead-time: for fires seen by both Dozier and a polar sensor
(n=472), Dozier is earlier 53% of the time, median ~6 hours earlier — an early-cue /
lead-time tier, not a recall source. (2) Multi-feature gate: replacing the single threshold with a
13-feature classifier lifts PR-AUC from 0.044 to 0.179 (4×) and precision-at-recall from
8.0% to 39.4% (at 10% recall). The multi-feature curve dominates the single threshold at
every operating point.
Result A — lead-time (472 fires seen by both Dozier and polar):
metric
value
Dozier earlier than polar
53.0% of shared fires
median Δ (Dozier − polar first-detect)
−5.9 h (Dozier earlier)
Result B — multi-feature gate vs single p_subpixel (out-of-fold):
operating point
single p_subpixel precision
multi-feature precision
recall 0.05
9.5%
39.9%
recall 0.10
8.0%
39.4%
recall 0.20
5.3%
32.6%
recall 0.30
4.8%
19.6%
PR-AUC
0.044
0.179
Reproducibility detail. Feed: NOAA GOES-ABI Dozier subpixel. (A) 472 IRWIN incidents
with both a Dozier and a VIIRS/MODIS detection within 10 km / ±14 d; Δ = earliest Dozier −
earliest polar. (B) 80,000 random Dozier detections, 1,688 IRWIN-positive (2.11%). 13 non-leaky
Dozier-context features: p_subpixel, T_MIR_K, T_LWIR_K, MIR−bgMIR, LWIR−bgLWIR, MIR−LWIR, T_f_K,
A_pixel_m2, cos_view, cos_sun, is_night, fp_dist_km, cell_persistence. Model: HistGradientBoosting, 5-fold GroupKFold
(0.2°) OOF; compared to raw p_subpixel. Truth: NIFC IRWIN + perimeters, 10 km / ±14 d.
Claim status: DEFENSIBLE. Verdict on the lever: build both — a Dozier early-cue tier
and a multi-feature Dozier gate.
Literature alignment. Verdict: AGREEMENT. Geostationary sensors provide high temporal cadence and
therefore earlier first-detection than polar overpasses for a fraction of fires [3][8];
a learned multi-feature discriminator outperforming a single radiometric threshold is expected and here quantified.
What this does not claim: the lead-time distribution is wide (p25 −88 h, p75 +55 h) because
IRWIN matching uses a ±14 d window — the median (−6 h) and the 53% share are the defensible
statistics, not the tails; tighter same-fire (fused-cluster) matching is future work. The gate is out-of-fold but on a
single-window sample; absolute precision is IRWIN-lower-bounded.
Next research test: deploy a shadow early-cue tier keyed on Dozier-before-polar; ship the multi-feature
gate as the Dozier confidence and re-measure precision at fixed recall live.
The framing. Sentinel-2 SWIR sits at zero in the scorecard (entry 0007). SWIR can see active flame at
20 m — so would re-enabling full CONUS S2 processing recover fires the current sensors miss, and is it worth the cost?
BLUF. Of 1,764 IRWIN fires in the S2 window, only 191 (10.8%) were missed by every
current sensor. Over those missed fires, S2 scene availability is 100% — but an actual SWIR active-fire
signal appears at only 4% of them (2/50, CI 1–14%), and already-ingested S2 added 0
unique fires. Extrapolated unique marginal recall ≈ 4% of the missed set — small — at a compute cost of
~1–2 TB/week and up to 5-day latency. Verdict: not worth full re-enablement
for timely alerting.
Result.
metric
value (95% CI)
IRWIN fires in S2 window
1,764
missed by all current sensors
191 (10.8%)
existing ingested-S2 unique marginal
0 / 191 = 0% (0–2%)
S2 scene availability over missed (sample 50)
100% (92.9–100%)
actual S2 SWIR active-fire hit
2 / 50 = 4.0% (1.1–13.5%)
extrapolated unique marginal recall
~4%
Reproducibility detail.Missed = IRWIN incident (S2 window 2026-05-31..07-01) at a
0.05° cell (+8 neighbours) with no VIIRS/MODIS/GOES/ABI/HMS/CAM detection in the window. Availability =
Element84 STAC query sentinel-2-l2a, bbox ±0.02°, −2..+5 d, cloud<70%.
SWIR test = windowed COG read of B12 (SWIR2) & B11 (SWIR1) in a ~660 m box; fire pixel if
B12/B11 ≥ 1.6 and B12 ≥ 0.15 reflectance (conservative). Sample n=50, Wilson CIs.
Compute cost: S2 A/B revisit ~5 d, CONUS ~900 MGRS tiles × ~2 acquisitions/5 d; B11/B12/B8A
~60–120 MB/tile → ~1–2 TB/week download + per-scene cloud-mask + active-fire compute — why it was
deferred vs polar, which already delivers near-real-time recall at a fraction of the volume.
Claim status: NEGATIVE for alerting (measured, bounded). Verdict on the lever: do not
re-enable S2 SWIR for active-fire detection.
Literature alignment. Verdict: AGREEMENT. Sentinel-2 can detect active fire in SWIR but its ~5-day
revisit makes it a poor timely detector; its established value is burn-scar/burned-area and post-event mapping,
not real-time alerting [10]. Our numbers reproduce that: coverage is excellent, active-fire marginal
recall is small.
What this does not claim: that S2 has no value — its role is post-hoc burn-scar/area, not active
detection. The SWIR test is conservative (may miss faint/cool fires or admit bright bare-soil false positives); n=50
(CIs quoted); “missed” is a strict spatial-cell definition; S2's 5-day revisit means many short missed fires
were simply not burning at overpass.
Next research test: if pursued, use S2 only for burned-area confirmation of already-detected fires, not
as a detection feed.
The framing. The production pipeline hides standalone GOES ABI Dozier subpixel detections entirely
— on their own they are ~0.05% wildfire precision (entry 0004/0007), so Dozier only counts as corroboration for a fire another
sensor already carries. Two levers could change that without touching the live gate: (1) replace the single p_subpixel
threshold with a multi-feature gate, and (2) surface a Dozier early-cue tier for detections that
fire before polar confirmation. This entry measures both, shadow-only.
BLUF. On 100,000 random Dozier candidates (IRWIN/perimeter truth, 2.04% base, 5-fold spatial CV), a 13-feature
classifier reaches 49.3% precision at the ~10% operating recall where the single p_subpixel threshold
sits at only 11.6% — a +37.7 pp gain (PR-AUC 0.234 vs 0.051). It survives dropping the
detection-density feature (39.6% precision, PR-AUC unchanged), so it is not a spatial-clustering artifact. Separately,
Dozier detections that precede a polar detection are 38.4% IRWIN-confirmed — ~19× the
2.0% Dozier baseline — at a median 4.3 h lead. Both are GO candidates. Nothing is surfaced.
Piece 1 — multi-feature gate vs the single threshold.
operating point
single p_subpixel
multi-feature gate
precision @ recall 0.05
13.3%
41.7%
precision @ recall 0.10 (current gate)
11.6%
49.3%
precision @ recall 0.20
6.5%
50.8%
precision @ recall 0.30
4.8%
45.8%
recall to hold 49.3% precision
0.2%
10.0% (~50×)
PR-AUC
0.051
0.234
precision @ recall 0.10, feature ablation (no detection-density)
—
39.6%
Flip operating point (go/no-go). Cut over to shadow-score τ = 0.965 → 49.3%
precision at 10% recall (the recall the current gate already runs at, so no recall is lost while precision ×4.3). For a
stricter 40% surfacing bar the gate still returns 32.8% recall. At matched precision the single threshold collapses
to 0.2% recall — the gate holds ~50× more. OOF ROC-AUC 0.869.
Piece 2 — Dozier early-cue tier.
metric
value
Dozier detections preceding polar (5 km, +0..48 h)
1,868
tier precision (IRWIN/perimeter-confirmed)
38.4% vs 2.0% Dozier baseline (~19×)
median lead over first polar detection
4.3 h (IQR 2.0–7.4 h)
share with ≥1 h lead / ≥6 h lead
84.9% / 33.7%
Reproducibility detail.Candidates: 100,000 random ABI-Dozier-Subpixel-* evidence
rows with a non-null p_subpixel. Features (13, detection-time only, no confirmation channels):p_subpixel, T_MIR, T_LWIR, MIR−bgMIR, LWIR−bgLWIR, MIR−LWIR, T_f, pixel area, cos(view),
cos(sun), is_night, distance-to-FP-catalogue, and local detection-density. Truth: label = 1 if a NIFC IRWIN
incident (deduped to fire-days) is within 10 km & ±14 d, or a fire-perimeter centroid within 5 km &
±14 d. Model: HistGradientBoosting (uncalibrated, balanced), scored out-of-fold under
5-fold GroupKFold on 0.2° spatial cells (no same-cell leakage). Operating points from a rank-based PR sweep. Ablation:
the whole pipeline re-run with local detection-density removed. Early-cue: for each Dozier detection, the earliest
polar (VIIRS/MODIS) detection within 5 km in (t, t+48 h]; lead = polar − Dozier;
tier precision = IRWIN/perimeter-confirmed fraction of that set. Shadow store: hidden tables
dozier_gate_shadow (would-surface set at τ) and dozier_earlycue_shadow, both flagged
surface_allowed=0 with DO_NOT_SURFACE markers; the production DB is read-only and the live Dozier gate /
fusion tiers are unchanged. All compute load-guarded off-peak.
Claim status: POSITIVE (measured, shadow). Piece 1 = GO candidate for the standalone-Dozier gate; Piece 2 =
a usable but advisory-grade early-cue tier. Neither is surfaced; a flip requires re-proving on a fresh out-of-window sample
plus explicit go.
Literature alignment. Verdict: AGREEMENT. Dozier’s two-channel subpixel method estimates subpixel fire
temperature/area but a single-band or single-statistic threshold is known to be false-alarm-prone; multi-channel contextual features
are the established route to separating true subpixel fire from warm background and sun-glint, as in the GOES-R ABI fire algorithm
[7][8]. Our 4.6× PR-AUC lift over the raw p_subpixel threshold reproduces
that expectation, and ML-for-fire reviews report the same pattern of engineered multi-feature gates beating single thresholds
[4].
What this does not claim: that standalone Dozier is now confirmation-grade — 49% precision is a gate, not a
confirmation, and the early-cue tier at 38% is explicitly advisory. IRWIN truth is a lower bound with reporting gaps
[6], so absolute precision is bounded, not exact. The comparison is on one random historical sample (base 2.04%);
the single-threshold precision here (IRWIN-only truth) is not the same quantity as the deployed Dozier scorecard number (multi-sensor
fused truth). The early-cue population is conditioned on eventually being seen by polar, so its precision does not transfer to
Dozier detections polar never confirms.
Next research test: re-run the gate on a fresh, strictly out-of-window month and confirm the τ=0.965 operating
point holds before any cutover; then A/B the early-cue tier as an additive advisory layer, measuring realized operational lead and
false-alarm load.
The framing. Entry 0011 reported the 13-feature Dozier gate reaching ~49% precision vs 12% for the single
p_subpixel threshold under 5-fold spatial cross-validation, and flagged it a GO candidate pending a fresh
out-of-window confirmation. This entry is that confirmation. Before wiring anything into the live gate we ran the strongest
temporal test the data allows — train on an earlier window, test on a strictly-later held-out window — with a hard
decision rule: promote only if the multi-feature gate still clearly dominates out-of-time; otherwise stop.
BLUF. It does not dominate — it collapses. Trained on the earlier window and tested on
strictly-later data, the multi-feature gate falls to near-chance ranking (holdout ROC-AUC 0.60–0.64) and is
beaten by the trivial single p_subpixel threshold at every operating point, in both a
count-based split and a positives-balanced split. The exact flip point τ=0.965 transfers to zero holdout recall.
Decision: HOLD — do not flip. The 49% spatial-CV figure was time-correlated leakage. The production Dozier gate
stays exactly as-is (standalone Dozier still hidden), and the shadow canary stays gated.
Result — holdout precision at the current gate's operating recall (~10%).
temporal split
single p_subpixel
multi-feature gate
holdout ROC-AUC (gate)
τ=0.965 recall
A — earliest 60% train / latest 30% test
39.8%
13.8%
0.60
0.0
B — split at median fire time (balanced positives)
31.0%
19.1%
0.64
0.0
Precision across the recall curve (single vs multi-feature, holdout). Single wins at every point:
recall
A single
A multi
B single
B multi
0.05
0.366
0.193
0.583
0.200
0.10
0.398
0.138
0.310
0.191
0.20
0.430
0.138
0.302
0.250
0.30
0.313
0.121
0.322
0.283
Reproducibility detail. Same 120k random Dozier candidate sample, same 13 detection-time features, same
IRWIN/perimeter truth (10 km/±14 d incident, 5 km perimeter centroid) as entry 0011 — only the
train/test partition changed from spatial to temporal. Split A: earliest 60% of candidates by
detection time = train (through 2026-05-31, n=72,259, 363 positives); latest 30% = test (from 2026-06-03, n=13,410, 1,329 positives,
9.9% base), with a 3-day gap discarded between train and test so no fire straddles the boundary. Split B
(guards against Split A's low training-positive count): partition at the median detection time of the positives so each side
carries ~half the fires — train through 2026-07-02 (n=107,980, 1,240 positives), test from 2026-07-05 (n=520, 127 positives, 24.4%
base), same 3-day gap. Model = HistGradientBoosting (identical hyper-parameters to 0011), fit on train, scored on the strictly-later
test. Precision-at-matched-recall from a rank-based PR sweep. Decision rule (pre-registered in the run): promote only
if holdout multi-feature precision at the operating recall is ≥2× single AND ≥+0.10 absolute, on both splits;
neither split met it (both are negative). Read-only production DB; no production code changed; the run is load-guarded and
health-gated on the host. Result JSON persisted alongside the model with flip_decision = HOLD_DO_NOT_FLIP.
Claim status: NEGATIVE for promotion (measured, temporal transport). The multi-feature Dozier gate is not
promoted; the live gate is unchanged. This supersedes entry 0011's tentative GO.
Summer-only bound (stated explicitly). The data is a single summer window (~2026-05-31–07-01). This is a
temporal-transport test within summer (earlier → later), not an off-season test; a true winter/shoulder-season validation
is impossible with the data on hand. The verdict — that the gate does not transfer even a few weeks forward — is if anything
a lower bar than off-season would be, which makes the HOLD conservative and safe.
Literature alignment. Verdict: AGREEMENT. Spatial cross-validation systematically over-estimates skill when samples
are space- and time-autocorrelated; temporal/blocked validation is the accepted guard, and models that look strong under random or
spatial CV routinely collapse under forward-in-time evaluation [4][5]. A single physically
grounded quantity — Dozier's subpixel fire fraction [7] — transported better here precisely because it
is not fit to the training period's incidental structure.
What this does not claim: that engineered features are worthless for Dozier, or that the single p_subpixel
threshold is itself good enough to surface standalone Dozier (its ~30–40% in-season precision here is measured against a
higher-base-rate holdout, not the 2% random-sample base of entry 0011, and standalone Dozier remains corroboration-only in production).
It claims only that this multi-feature gate, trained this way, does not earn a production flip. A trustworthy gate would need
multi-season training data, explicitly time-invariant features, and/or continual retraining with forward validation baked in.
Next research test: if the lever is pursued, retrain on multiple fire seasons and evaluate with rolling
forward-in-time validation; separately, test whether the single p_subpixel threshold plus a hard FP-catalogue/persistence
guard is a simpler, more transportable route to surfacing a high-precision Dozier subset.
The framing. The gate lever failed out-of-time (entry 0012). The other Dozier lever from entry 0011 is the
early-cue tier: a Dozier detection that precedes a polar (VIIRS/MODIS) detection of the same fire within 5 km/+48 h,
reported there at 38.4% IRWIN-confirmed precision (~19× the ~2% Dozier baseline) with a median 4.3 h
lead. It is a deterministic rule, not a fitted model, so it cannot “overfit” in the ML sense — the honest test is
temporal stability: measure precision + lead on an earlier vs a strictly-later, truth-matured window.
BLUF. A clean matured earlier-vs-later split turned out to be impossible, and that fact is the finding. Dozier
detected_at is bimodal: ~82% is a 2-day historical backfill (2026-05-30/31), June 01–25
has zero Dozier rows, and live ingestion only resumed ~07-01. So the only fully ±14 d truth-settled
data is the backfill; the recent live window is days old and its IRWIN truth is right-censored. On the settled-truth backfill the tier
scores just 2.5% precision; the headline 38% survives only in the recent window — 77% of all early-cue
detections come from that not-yet-matured window — where truth cannot yet be confirmed. Verdict: NOT validated
out-of-time. The tier stays gated; re-test after ~2026-07-23, when the live window's ±14 d truth settles.
Result — the same tier, measured on each cohort.
cohort
window (UTC)
Dozier n
early-cue n
tier precision
baseline
enrichment
median lead
A — matured, settled truth (05-30/31 backfill)
05-31→06-01
174,435
600
2.5%
1.0%
2.5×
24.6 h
B — recent, UNSETTLED truth (live 07-02+)
07-02→07-09
25,565
2,037
39.5%*
6.3%
6.3×
3.7 h
all blended (reproduces entry 0011)
05-31→07-09
200,000
2,637
31.1%
1.7%
18.3×
4.8 h
*Cohort B truth is right-censored (detections 0–7 days old vs the ±14 d IRWIN matching window), so 39.5% is a
lower bound that is not yet confirmable, not a validated number.
What this shows. Entry 0011's 38.4%/19×/4.3 h is faithfully reproduced as the blended figure
(31.1%/18.3×/4.8 h) — but it is supplied almost entirely by cohort B: 2,037 of 2,637 early-cue
detections (77%) are in the recent, unsettled-truth window. On the only settled-truth data (cohort A) the tier is near baseline
(2.5% vs 1.0%), and its 24.6 h median “lead” is far longer than a polar revisit — consistent with
coincidental later polar hits, not genuine early warning. Cohort B's tight 3.7 h leads look
like a real early-warning signal, but its truth is not settled. Polar availability is comparable across the two windows (11,268 vs
10,594 dedup polar cells), so cohort A's low precision is not a missing-polar artifact.
Reproducibility detail. 200,000 random ABI-Dozier-Subpixel-* rows. Early-cue = a later
polar (VIIRS% or MODIS, CONUS, deduped to 0.05°×6 h earliest) within 5 km in
(t, t+48 h]; lead = polar − Dozier. Truth = NIFC IRWIN incident
(deduped to fire-days) within 10 km/±14 d or a fire-perimeter centroid within 5 km/±14 d — identical
to entries 0011/0012. Cohort A (settled) = detected_at ≤ data_max − 14 d (= 2026-06-25), which
with the June data gap is exactly the 05-30/31 backfill; cohort B (unsettled) = last 8 days (07-01+). Tier precision =
IRWIN-confirmed fraction of the early-cue set; baseline = confirmed fraction of all Dozier in the cohort; enrichment = ratio; lead
distribution via percentiles. Data span 2026-05-30→07-09; the 06-01–06-25 Dozier gap is why no third, matured-and-recent
window exists. Read-only production DB; no writes; load-guarded and health-gated on the host. Result JSON persisted.
Claim status: NOT VALIDATED out-of-time (data-limited). The early-cue tier is not promoted and stays
gated. This does not refute the tier — it shows its headline number was never measured on settled truth.
Honest reading — neither a clean hold nor a clean collapse. On settled truth the tier is near baseline (2.5%),
which argues collapse; but that settled data is a low-fire backfill blob whose long 24.6 h leads look coincidental, so it is a weak
positive test. The recent window looks genuinely strong (39.5% precision, tight 3.7 h leads consistent with sub-polar-revisit early
detection) but its truth is not yet settled. The scientifically correct call is to withhold judgement and re-test cohort B
after its ±14 d truth matures (~2026-07-23), not to bank the 38%.
Literature alignment. Verdict: AGREEMENT (methodological). Geostationary ABI can flag a hotspot minutes-to-hours
before a polar overpass, so a real early-cue lead is physically plausible [8][3]; but IRWIN/FOD
reporting settles over days-to-weeks [6], so precision measured on fresh detections is a censored lower bound —
exactly the trap here. Validating detection skill only on truth-matured data is the accepted discipline [4].
What this does not claim: that the early-cue tier is worthless. Its recent-window behaviour (tight hours-scale leads,
6× enrichment) is the most encouraging Dozier result in this series; it simply is not yet confirmable. Nor does it claim the
backfill 2.5% is the tier's true precision in active fire season — the backfill is largely non-fire detections (1.0% base).
Next research test: re-run this exact cohort-B measurement after 2026-07-23; if precision holds near 38% on settled truth
with hours-scale leads, promote it to a defensible advisory lead-time tier (still gated until surfacing is decided).
Why cameras miss fires they can see — and a lever that lifts detection-in-coverage 37→49% at flat precision
Date: 2026-07-08 Status: POSITIVE lever (measured, spatial-CV) — shadow-first build candidate, gated pending temporal transport
The framing. Entry 0008 split the camera gap in two: coverage (infrastructure — is a fire near an
online camera at all) and detection-in-coverage (algorithm — where a camera can see, how often it catches the fire),
the latter only ~5–25%. Coverage is a build-out problem; detection-in-coverage is the algorithm lever. This entry asks
why the in-coverage misses happen and tests the best fix.
BLUF. The dominant miss driver is range, not darkness: within 15 km cameras catch 47% of
in-coverage fires, falling to 20% at 15–30 km and 4% at 30–40 km (undetectable at sensor
resolution). The assumed night floor does not exist — night recall (45%) actually beats day (31%), almost
certainly flame glow. The best lever is the simplest: lower the single-frame smoke trigger 0.50→0.30, which
lifts detection-in-coverage 36.9%→49.4% (+12.5 pts, +34% relative) at essentially flat precision
(58.1%→57.2%), monotonic across the sweep and stable in 5-fold spatial CV (0.50±0.11 vs 0.37±0.11); at a
tighter 20 km viewshed it nearly doubles recall (17.1%→34.2%). Adding temporal persistence was a mistake — it
hurt recall (to 24.7%). We flag the threshold lever as a shadow-first build candidate, gated until it passes
the temporal-transport test that killed the Dozier gate (entry 0012).
Why the misses happen (in-coverage, R=40 km, 1,083 fires, current 0.5 trigger).
driver
bin
fires
recall-in-coverage
range to nearest online camera
<15 km
725
47.4%
15–30 km
256
20.3%
30–40 km
102
3.9%
solar elevation (day/night)
day (≥0°)
538
30.5%
twilight (−6..0°)
51
27.5%
night (<−6°)
494
44.9%
fire size (IRWIN acres)
<10 ac
1,001
37.2%
10–100 ac
24
16.7%
>100 ac
13
15.4%
Range dominates (a clean 12× swing, 47%→4%); day/night runs the “wrong” way (glow); size is
noisy at tiny n and not a usable driver. Where cameras do catch a fire, they flag smoke a median 14.7 h before
the IRWIN discovery timestamp (within the ±24 h match window) — cameras are an early corroborator when they fire.
The lever — single-frame threshold sweep.
smoke trigger
recall-in-coverage
precision
camera events
0.50 (current)
36.9%
58.1%
1,037
0.45
39.9%
58.1%
1,371
0.40
44.7%
57.4%
1,771
0.35
46.5%
57.5%
2,229
0.30
49.4%
57.2%
2,924
0.30 + persistence (≥2 in 6 h)
24.7% (worse)
56.2%
—
The physical floor (achievable headroom). Two hard limits, neither fixable by thresholding: (1) range
— 30–40 km fires are ~undetectable (3.9%); (2) among near (<15 km) misses, 39% have a best
smoke-probability of ~0 (the model never fired at all — out-of-field-of-view / occlusion / too faint; camera azimuth+FOV
are recorded but unused, so a fire behind a fixed camera is invisible regardless of threshold). Only ~26% of near misses sit in the
0.30–0.50 band the lever actually recovers. So the lever captures the genuinely-recoverable slice; it does not (and cannot) fix
the geometry floor.
Reproducibility detail. Reuses entry 0008's coverage definition: 3,947 IRWIN incidents deduped to
0.02°+day; a camera is online at fire time if it produced any cam_smoke_evidence frame in
[disc−24 h, disc+24 h]; a fire is in-coverage if within R of an online camera; detected if a covering
camera has a qualifying smoke_prob hit in that window. Working R = 40 km (checked at 20 km). Day/night =
solar elevation (NOAA formula) at the fire's lat/lon/time; night = sun below civil twilight (−6°). Size = IRWIN
IncidentSize acres. Precision = fraction of camera detection-events matching an IRWIN incident within
R & ±24 h. Lever = lower the single-frame threshold; persistence variant = ≥2 frames
≥0.30 within 6 h from one camera. Spatial CV = 5 folds on 0.2° cells (recall mean±std). Truth: NIFC
IRWIN. Read-only production DB; no writes; load-guarded and health-gated on the host. Azimuth/FOV unused (omnidirectional range proxy)
— a documented over-count of true viewshed and part of the geometry floor above.
Claim status: POSITIVE lever (measured, spatial-CV stable). Recommended as a shadow-first, gated build
candidate — not wired to production. Per our own discipline (entry 0012), it must first pass temporal-transport
validation (train/measure earlier, test strictly-later) before any cutover; a single physically-motivated monotonic threshold is far
less overfit-prone than the 13-feature Dozier gate that died out-of-time, but the gate still applies.
Literature alignment. Verdict: AGREEMENT. Camera smoke detection is high-precision within line-of-sight and is
range/visibility-limited; recall degrades with distance as the plume subtends fewer pixels [9]. Our monotonic
range collapse (47%→4%) and the “model never fired” near-miss floor reproduce that. The night≥day result is the
expected flame-radiance effect at night [3].
What this does not claim: that 0.30 is the final operating point (it is the swept optimum on this window, and the
lever needs temporal-transport confirmation and a per-network re-tune before production — production currently uses per-network
thresholds 0.55–0.85, stricter than the 0.5 reference here, so the live recall gain may differ); that precision is unaffected
everywhere (it dips ~1 pt and could differ by network); or that lowering the threshold addresses the ~40% no-signal near-misses or
the range floor — those need PTZ/az-aware framing or denser/closer cameras, i.e. coverage build-out, not a threshold.
Next research test: temporal-transport the 0.30 lever (earlier→later), re-tune per network, and shadow-log the
recovered detections for a precision audit before proposing a cutover.
The camera-threshold lever survives out-of-time (where the Dozier gate died) — validated, and built shadow-first
Date: 2026-07-09 Status: POSITIVE, temporally validated + per-network robust — built as a gated shadow canary (not surfaced)
The framing. Entry 0014 found that lowering the single-frame smoke trigger 0.50→0.30 lifts
detection-in-coverage 36.9%→49.4% at flat precision. Before building, we applied the exact discipline that killed the Dozier
gate (entry 0012): does it hold out-of-time, and does it generalize across camera networks?
BLUF. It holds. Trained on 2026-07-01–04 and tested on the strictly-later 07-06–08, the 0.30 trigger
still gains +8.3 pts of detection-in-coverage (34.8%→43.1%) at ~flat precision (56.1%→54.0%). It
generalizes across every network — recall rises on all four vendors with precision essentially unchanged; on the
purpose-built fire networks it is dramatic (HPWREN 45%→91% recall at 79% precision). This is the opposite of the
Dozier gate, which inverted out-of-time. We therefore built it — shadow-first and gated: a hidden canary logs
the would-surface detections; production is untouched until an explicit flip.
Temporal transport (train 07-01–04 → test 07-06–08, gap 07-05).
window
trigger
recall-in-coverage
precision
train
0.50
36.2%
58.1%
0.30
50.5%
59.3%
test (later)
0.50
34.8%
56.1%
0.30
43.1%
54.0%
Out-of-time gain +8.3 pts recall, precision −2.1 pts (within the flat band). Verdict:
HOLDS.
Per-network generalization (full window).
network
in-coverage
recall 0.50→0.30
precision 0.50→0.30
HPWREN (fire cams)
254
45.3% → 90.6%
78.1% → 78.6%
AlertCalifornia (fire cams)
260
73.8% → 90.0%
78.9% → 81.3%
Caltrans (traffic)
661
25.9% → 39.6%
55.7% → 54.1%
Windy (webcams)
823
32.6% → 49.9%
40.3% → 39.3%
The 0.30 trigger lifts recall on every vendor with precision flat. Precision is network-driven
(purpose-built fire cams 78–81% vs webcams 40–56%), not threshold-driven — so 0.30 generalizes as a global trigger,
though surfacing tiers should still be per-network.
The operating point we would flip to, and its gate. A global single-frame trigger of 0.30
(replacing the per-network 0.55–0.85). Not flipped: it is built as a hidden shadow canary
(cam_smoke_lowthresh_shadow) that logs every ≥0.30 detection, flags which are newly recovered vs the current
per-network production thresholds, and records IRWIN proximity for a precision audit. On this run: 2,926 detections
≥0.30, of which 2,506 are newly recovered vs production, and 1,394 of those sit near a real IRWIN
fire. The table is surface_allowed=0 with a DO_NOT_SURFACE marker and no serving-app read path; the
production cam_smoke_daemon.py is byte-for-byte unchanged. Flip requires Mark's go plus a live precision audit of the
newly-recovered set.
Reproducibility detail. Same coverage definition as entries 0008/0014 (IRWIN deduped 0.02°+day; online cam =
produced a frame in ±24 h; in-coverage = within R=40 km of an online cam; detected = a covering cam has a
smoke_prob≥trigger in ±24 h; precision = camera detection-events matching an IRWIN incident within
R & ±24 h). Temporal split: train 2026-07-01..07-04, test 07-06..07-08, gap 07-05; incidents
and events are attributed to a window by their own timestamp. Per-network: restrict cameras to the vendor; networks
with <15 in-coverage fires are dropped. Truth: NIFC IRWIN. Read-only production DB. Honest caveat on the split: the
camera detector only began dense continuous operation on 2026-07-01, so the strongest temporal separation the history supports is
days-apart within one fire-weather regime — a weaker bar than a seasonal split. The per-network generalization is independent
corroborating evidence, and the “near-IRWIN” shadow count is a 40 km/±24 h proximity proxy (an audit
hook), not a confirmed precision. Shadow build: a load-guarded, health-gated oneshot on a 6 h idle-gap timer
(SuccessExitStatus=75 143, resume-safe atomic write) writing only its own hidden table + canary_meta; grep
confirms only the shadow daemon reads it and the serving app does not.
Claim status: POSITIVE, validated (out-of-time + per-network). Built as a gated shadow canary; not
surfaced. This is the first lever in the series to pass the temporal-transport gate that entry 0012's Dozier gate
failed — evidence the discipline distinguishes real levers from cross-validation artifacts, rather than only saying no.
Literature alignment. Verdict: AGREEMENT. Camera smoke detectors trade recall for precision monotonically with the
confidence threshold; where the classifier is well-calibrated and the scene is line-of-sight, moving the operating point down recovers
faint/early smoke at modest precision cost [9]. That the purpose-built fire networks gain most (and keep ~80%
precision) matches their cleaner backgrounds vs general webcams.
What this does not claim: that 0.30 is production-ready as-is — the temporal split is days-apart (not
seasonal), the shadow's near-IRWIN figure is a proximity proxy pending a real precision audit, and Windy's ~40% precision means a
global surface would need per-network tiers or a higher Windy floor. It does not touch the range/geometry floor from entry 0014
(far fires and out-of-FOV misses are unaffected by any threshold). Next research test: run the shadow canary forward,
audit the newly-recovered set's true precision against settled IRWIN over a longer, more separated window, then propose per-network
surface tiers for Mark's flip decision.
Production cutover: the 0.30 camera trigger goes live for two validated fire-cam networks (precision held)
Date: 2026-07-09 Status: SHIPPED (per-network production flip; reversible) — other networks remain gated
The framing. Entry 0015 validated the lower 0.30 smoke trigger out-of-time and showed it generalizes across camera
networks — strongest on the purpose-built fire cams. With that evidence, we flipped it to production, but only for the two
networks that earned it, and reversibly.
What shipped. The single-frame smoke trigger dropped to 0.30 for HPWREN
(pre-flip 0.40) and AlertCalifornia (pre-flip 0.50) — the two validated wildland fire-cam networks. Every
other network stays at its current production threshold (Caltrans 0.85, Windy/default 0.7–0.75, …) because their
precision floor is network-limited and unproven. The 2-cam-5 nm corroboration gate on the two flipped networks is unchanged —
it remains a precision safeguard on top of the lower trigger. This is now user-facing for HPWREN + AlertCalifornia.
Precision held on recent live data (the go/no-go check). Measured on 2026-07-06–09, the flip raises volume
2–3× without degrading precision:
network
trigger
surfacing events
precision
HPWREN
0.50
58
72.4%
0.30 (live)
190
76.3%
AlertCalifornia
0.50
80
86.3%
0.30 (live)
210
84.8%
Precision is flat-to-improving (HPWREN 72→76%, AlertCalifornia 86→85%) while the surfaced-detection count roughly triples.
No precision crater — the flip stands.
Reversibility & audit (built in). Per-network thresholds now live in a single-source config
(cam_gate_config.py) rather than scattered across code + systemd env-overrides (which we consolidated and removed).
Reverting either network is a one-line change (set HPWREN back to 0.40 / AlertCalifornia to 0.50) plus a service restart. Every
surfaced detection now records the exact gate_threshold and a gate_version
(pernet_flip0016) in its evidence, so which gate produced any detection is auditable after the fact. The production file
was backed up before the edit; a fail-safe falls back to conservative built-in thresholds if the config is ever unreadable.
Live-surfacing verified. CAM-SMOKE detections flow evidence → fire_events → serving
API/map as before: 153 CAM-SMOKE-bearing fire events in the last 72 h, 138 of them passing the serving-app surfacing filter (CAM-SMOKE
is in the allowed source set, unlike standalone Dozier/ADP). Nothing else changed; the still-gated networks keep flowing at their old
thresholds.
Reproducibility detail.Flip:NETWORK_HIT_THRESHOLD["HPWREN"]=0.30,
["AlertCalifornia"]=0.30 in cam_gate_config.py; cam_smoke_daemon.py imports that module
(fail-safe fallback if absent) and logs gate_threshold+gate_version into each promoted detection's raw JSON;
the scattered per-network threshold env-overrides were removed from the systemd drop-in and consolidated into the config. Service
restarted; startup log shows no fallback warning (config loaded). Precision check: for each flipped network, camera
frames with smoke_prob≥trigger in 2026-07-06–09 counted as detection events; an event is a true positive if a
NIFC IRWIN incident lies within 40 km & ±24 h (same rule as entries 0008/0014/0015). This is a single-frame
proximity precision; production layers the 2-cam-5 nm corroboration gate on top, so the live surfaced-precision is ≥ these
figures. Read-only for the check; the only production change is the config-driven threshold. Still-gated networks
(Caltrans, Windy, others) continue to be audited by the cam_smoke_lowthresh_shadow canary (entry 0015), now sourcing the
same config so “newly recovered” means below the current production bar for the networks that have not flipped.
Claim status: SHIPPED (per-network, reversible). First production change in this series — gated on the
temporal-transport + per-network validation of entry 0015, and verified not to degrade precision on live data.
Literature alignment. Verdict: AGREEMENT. Purpose-built wildland fire-camera networks operate in-distribution for
smoke classifiers and tolerate a lower confidence bar without a precision collapse, whereas general/traffic webcams are
out-of-distribution and need a higher bar [9] — exactly why we flipped the fire networks and held the rest.
What this does not claim: that the other networks should flip — Caltrans/Windy stay gated until their precision
is proven (Windy's ~40% is a network floor, not a threshold effect). Nor that 0.30 is permanent — it is monitored via the logged
gate_version and the shadow canary, and revert is one line. The precision figures are single-frame proximity precision on a
recent window; the standing 2-cam corroboration gate makes live precision at least this good. Next: watch the
gate_version-tagged live detections accrue, audit the flipped networks' true precision against settled IRWIN over a longer window, and
revisit the still-gated networks with the shadow canary's evidence.
The framing. Entry 0007 reported the fused OLDGABE output at 72.4% recall against NIFC IRWIN
(daily-scorer run 18, 24 h window). The natural next question is which ~28% of fires we miss, and why — because the
lever depends entirely on the answer. A fire we never saw needs a new sensor or a lower detection floor; a fire one sensor saw but the
fusion gate rejected needs a looser gate; a fire we detected yesterday but did not re-image in the last 24 h needs neither — it
needs liveness. We took the exact run-18 window, reproduced the miss set, and classified every false-negative against a 30-day lookback.
BLUF. The “miss” is overwhelmingly a liveness artifact of the 24 h scoring window, not
detection blindness. Of the 1,407 IRWIN wildfires scored as false-negatives in the window, 1,275 (90.6%) had a
promoted, confirmed OLDGABE event within 10 nm during the last 30 days — we detected and confirmed these fires,
we simply did not re-detect them in that particular 24 h. They carry 98.9% of the missed acreage and 100 of the 106
missed fires ≥100 acres. Only 132 (9.4%) are truly sub-floor (nothing of any status within 10 nm in 30 days) —
small (94/132 are <1 acre), remote, Alaska-heavy, just 3,909 acres and 6 big fires. The “single-sensor-seen-but-fusion-rejected”
bucket — the obvious “loosen the gate” hypothesis — is exactly zero. The dominant recall lever is an
active-fire liveness/persistence pass, not a looser fusion gate and not a lower detection floor.
Result (reproduced run-18 window 2026-07-07→2026-07-08, 10 nm / 24 h vs IRWIN; 3,410 active IRWIN wildfires;
1,407 fire-level false-negatives classified against a 30-day promoted-event lookback):
miss bucket
fires
% of miss
missed acres
≥100 ac fires
recall lever
Liveness — confirmed in 30 d, not re-seen in 24 h
1,275
90.6%
360,743
100
active-fire persistence / cadence
Sub-floor — nothing of any status in 30 d
132
9.4%
3,909
6
new sensing / lower floor (low yield)
Single-sensor seen, fusion rejected
0
0.0%
0
0
— (loosening the gate recovers nothing)
Already recoverable by geo canary now
0
0.0%
0
0
—
Put differently: OLDGABE’s true detection recall — did we ever confirm this fire during its active life — is
(3,410−132)/3,410 = 96.1%. The 24 h liveness recall published in entry 0007 (72.4%) understates that by ~24 points,
and it is volatile precisely because it is a liveness metric: the last eight daily runs read
72.4 / 92.3 / 94.2 / 98.0 / 95.8 / 92.1 / 82.8 / 72.4%. A metric that swings 26 points day-to-day while the fire roster barely changes is
measuring re-detection cadence, not coverage.
Reproducibility detail. Artifact: read-only replay against OLDGABE oldgabe.db, reusing the shipped scorer
daemons/te_daily_scorer.py verbatim (_load_irwin, _bucket, _match_in_det_bucket,
_rng_nm, MATCH_RADIUS_NM=10 nm). IRWIN truth = fire_event_evidence where source='IRWIN',
deduped on IrwinID/UniqueFireIdentifier, filtered to IncidentTypeCategory∈{WF,WFU}, active window
= [FireDiscovery−24 h, FireOut||now+24 h]. A fire is a false-negative when no promoted event
(status∈{confirmed,confirmed_growth,awaiting-confirmation,pre-ignition}) lies within 10 nm and the active window during the
24 h scoring window — the scorer’s own definition. Classification: every evidence row FKs to a
fire_events row, so the set of all events is “what the pipeline saw.” For each false-negative we tested, over a
30-day lookback, (a) any promoted event within 10 nm/active-window → liveness; else (b) any event of any status →
inspect its evidence sources (VIIRS/MODIS/GOES/HMS families) → seen-but-not-promoted, split by independent-family count; else (c)
sub-floor. Geo-canary recoverability = the nearby event’s canonical_event_id present in
event_caution_recovered_geo. Reproduces run 18 (published 72.4%, tp 3,355 / fn 1,280) up to expected re-run drift — my re-run
reads event-centric 74.8%, fire-centric 58.7%, fn 1,407, N 3,410; the drift is because null-FireOutDateTime active windows extend to
current run time, so a replay days later admits a slightly larger active roster. The 90.6%/9.4%/0% split is invariant to that drift.
Run resource-guarded on the host (host-health gate, busy-marker honoring); DB opened mode=ro, no writes.
Claim status: DEFENSIBLE (own measured artifact, dated; reuses the shipped scorer, reproduces run 18).
Literature alignment. Verdict: AGREEMENT. That polar/geostationary fire products complement in space and time, and that
short fixed observation windows undercount persistent active fires relative to the true fire roster, is the established view behind
multi-temporal active-fire compositing and diurnal cadence analysis [1][3][8].
The finding that the operational deficit is re-detection cadence rather than the single-pass detection floor is consistent with that literature
and directly extends entry 0007.
What this does not claim. This is a roster/cadence lever: an active-fire persistence pass keeps known-confirmed fires
alive on the operational roster; it finds no new fires and cannot move the 132 sub-floor cases. The 10 nm (18.5 km) match radius —
the scorer’s own — can credit an adjacent fire as liveness, so 90.6% is a soft upper bound on liveness and 9.4% a soft
upper bound on true blindness; conversely the 30-day lookback cannot credit a fire first confirmed >30 days ago, which pushes the
error the other way. IRWIN is sparse reported truth dominated by tiny incidents (909 of 1,407 misses are <1 acre), many of which are mop-up
records not detectable from orbit at all — the sub-floor tail is disproportionately these. A persistence pass must be gated (IRWIN-active or
prior-confirmed and a sensor touch in-window) and validated shadow-first for false-positive impact before any cutover — keeping fires
“alive” ungated would inflate FP and the roster.
Next research test: stand up an event_liveness_shadow that re-emits a confirmed event’s active status when
IRWIN lists it active and any core-sensor touch lands within 10 nm in the window; measure the recovered-recall vs added-FP curve over
≥14 daily runs with CIs, default-OFF, before proposing a cutover. Separately, quantify the 132-fire sub-floor tail against Landsat-9/Sentinel-2
SWIR cadence over remote Alaska to bound the only genuine coverage lever.
BLUF. Entries 0001/0002 built a re-ranker to recover real fires that production tiers as CAUTION, and reported that adding
geography (lat/lon) gave a large lift even under a reporting-bias-free neutral polar truth (in-sample neutral-truth AUC
0.94 vs 0.86 det-only; +0.081). That was the whole reason geography looked defensible rather than a reporting-bias artifact. We put it to
the strict test the same gate that stopped the Dozier multi-feature gate and the early-cue tier: train on an earlier window,
test on a strictly-later window, score against the neutral (independent VIIRS/MODIS) truth. The
geo lift collapses out-of-time — from +0.081 in-sample to +0.019 — and recovery+geo no longer beats production on the neutral
truth. The de-confounded advantage was substantially in-sample optimism. The canary stays gated.
The split. 214,614 CAUTION-tier events. Train on first_det in 06-27–07-02 (123,931 events), a 07-03
gap, test strictly-later 07-04–07-06 (38,549 events). Models train on the honest (IRWIN/perimeter/confirmed) truth; every scorer is
then evaluated out-of-time against the NEUTRAL polar truth — an independent VIIRS/MODIS detection within 5 km in a
subsequent overpass window (t0+3 h … t0+72 h), which is independent of HMS and of who-reports-what. Neutral-truth
base rate on the holdout is only 3.3% (1,274 positives).
Out-of-time on the NEUTRAL (reporting-bias-free) truth — the gate.
scorer
AUC
PR-AUC
recall@90%p
recall@80%p
production tier_and_conf
0.861
0.265
0.00
0.00
recovery, det-only (19 feat)
0.837
0.201
0.00
0.00
recovery + geo (21 feat)
0.856
0.177
0.00
0.00
geo-only (lat/lon)
0.723
0.066
0.00
0.00
Recovery+geo (0.856) does not beat production (0.861) on the neutral truth out-of-time, and its PR-AUC (0.177) is
below det-only (0.201) — adding geography hurt ranking precision out-of-time. Every scorer, production included,
scores 0 at the 80/90% precision operating points on this sparse 3.3%-base truth, so the comparison rests on AUC/PR-AUC discrimination,
where the re-ranker has no out-of-time edge. Pure lat/lon still reaches AUC 0.723 alone — a geographic-memorization warning, not a
skill signal.
For contrast — the same holdout scored against the HONEST (HMS-inclusive) truth. Here the re-ranker still looks
excellent — which is exactly the trap the neutral truth exists to expose:
scorer (vs honest truth)
AUC
PR-AUC
recall@80%p
production tier_and_conf
0.890
0.489
0.073
recovery, det-only
0.867
0.604
0.399
recovery + geo
0.944
0.691
0.525
The de-confound, made explicit. Geography adds +0.077 AUC under the honest truth but only
+0.019 AUC (and −0.024 PR-AUC) under the reporting-bias-free neutral truth, out-of-time. The gap
between those two numbers is the reporting-bias artifact: most of what geography “knew” was where fires get
reported (populated, IRWIN/HMS-dense geography [6]), not where independent polar sensors confirm them.
Out-of-time, on truth that doesn’t care who reports, that knowledge evaporates.
Reproducibility detail. Read-only on the production DB (mode=ro), no production writes, health-gated on the
host and load-guarded (yields to the busy marker; SIGTERM-safe). Candidates: event_corroboration_tier where
tier='CAUTION' joined to non-leaky fire_event_evidence (IRWIN/HMS/SAR/S2 confirmation channels excluded from
features). 21 features; det-only = the first 19, recovery+geo adds lat,lon; geo-only = lat/lon alone. Model:
HistGradientBoostingClassifier (max_iter 400, lr 0.06, 31 leaves, class_weight balanced, early stopping), trained only on the
06-27–07-02 window; scored on the 07-04–07-06 window (07-03 gap). Training label = honest truth (confirmed0 OR
an IRWIN fire-day / perimeter within 5 km & ±14 d). Neutral evaluation label = an independent
VIIRS/MODIS detection within 5 km in a subsequent overpass (t0+3 h…t0+72 h), gridded (0.05°×6 h) over
CONUS — HMS/IRWIN-independent. Production baseline = tier_and_conf reconstructed per event from its full canonicalized
source set / GOES-frame count / max FRP. Metrics via roc_auc_score, average_precision_score, and
precision_recall_curve operating points. Circularity caveat (stated honestly): a CAUTION event whose own evidence is
polar-heavy is likelier neutral-positive, which if anything flatters the polar-aware scorers — and the re-ranker still shows
no out-of-time edge. The canary table event_caution_recovered_geo (6,793 rows) is unchanged and remains gated
(surface_allowed=0); nothing was surfaced.
Claim status: MEASURED NEGATIVE, out-of-time. Recovery+geo is not a confident flip candidate: its
de-confounded (neutral-truth) advantage was substantially in-sample optimism — under strict train-early/test-late
transport it does not beat production on the reporting-bias-free truth, and the geo increment collapses (+0.081 → +0.019 AUC,
negative on PR-AUC). It stays gated. This refines — does not erase — entries 0001/0002: the in-sample neutral-truth
geo win was real in-sample but did not survive temporal transport.
Hard bound (summer-only). All data is summer 2026 and the canonical-event tiering is recent, so this is a
train-earlier / test-later split within summer (days apart, not seasons). A true off-season (winter) validation is impossible until
winter data exists and remains deferred. What we can say now is the weaker-but-honest thing: even within-summer transport
already dissolves the geo lift.
Literature alignment. Verdict: AGREEMENT. Fire-occurrence records carry a well-documented geographic reporting bias
— incidents cluster where people and infrastructure are, not purely where fires are [6]. A model handed raw lat/lon
will learn that reporting surface; only an independent, physically-triggered truth (polar radiometric detection [1])
separates real fire-geography from reporting-geography, and the standard guard against such optimism is strict out-of-time (not in-sample /
spatial-CV) validation [4]. Both point the same way here.
What this does not claim: that the recovery program is dead — det-only recovery still carries honest-truth
signal, and a geography prior built from physical covariates (fuel, terrain, climatology) rather than memorized lat/lon may yet help; that is
the constructive next step, not raw coordinates. Nor that geography is useless in-season — only that its de-confounded, out-of-time
value here is ~0. Next: replace raw lat/lon with physical geo-priors and re-run the same transport gate; revisit once any
cross-season data exists.
The gate is doing its job. This is the third recovery/gate candidate the temporal-transport check has correctly stopped
— the Dozier multi-feature gate (collapsed out-of-time), the Dozier early-cue tier (withheld), and now recovery+geo (geo lift dissolves).
The discipline is working as designed: it lets the camera trigger through (it held) and stops the ones that were riding in-sample optimism.
An active-fire liveness pass for roster continuity — built shadow-first, and the two-condition gate throws out 99% of what a naive “keep-alive” would resurrect
BLUF. Entry 0017 established that 90.6% of “missed” IRWIN fires are a 24 h scoring-window
liveness artifact: we detected and confirmed them, we simply did not re-image them inside the 24 h window. True
detection recall is ~96.1% and the fusion gate misses zero, so the lever here is not new detection — it is
operational roster continuity: keeping a known-active fire visible on the map between satellite passes instead
of letting it blink off a naive 24 h-cadence roster. Because the failure mode of continuity is keeping a dead fire alive, the
primary risk metric is added-FP, not recall. We built the pass as a hidden shadow canary and measured the tradeoff. The
two-condition gate keeps 439 fires alive and refuses 42,286 — 99.0% of what a naive keep-everything
pass would have resurrected.
The gate (both conditions required). For each confirmed OLDGABE fire, keep it “active” only when
(a) a matching IRWIN incident within 10 nm is still listed active (no past FireOutDateTime)
AND (b) a core-sensor touch (VIIRS/MODIS/GOES/HMS) landed within 10 nm inside the current liveness window
(72 h). Condition (a) drops fires the incident record has declared out; condition (b) drops stale fires with no recent physical
signal. Together they are the FP-safeguard.
The tradeoff on the current window (clock 2026-07-09 09:01 UTC; 44,553 confirmed fires, of which 1,828 were
re-imaged within 24 h and 42,725 would blink off a naive 24 h roster):
pass over the 42,725 not-re-seen-in-24h fires
kept “active”
dead/stale resurrected (added-FP)
naive ungated (keep every confirmed fire alive)
42,725
42,286
two-condition liveness gate
439
0 measurable
What the gate filters, and why (the FP-safeguard, itemized).
gate funnel
count
population: confirmed, not re-imaged in 24 h
42,725
− no active IRWIN listing within 10 nm (cond a fails)
35,681
− IRWIN active but stale: no core touch in 72 h (cond b fails)
6,605
= kept active (both conditions hold) — roster continuity gained
439
Condition (b) is the load-bearing safeguard. Of the 7,044 not-re-seen fires that IRWIN still lists active, only
439 (6.2%) had a core-sensor touch inside the 72 h window; the other 6,605 (93.8%) were stale and
correctly refused. This matters because IRWIN’s FireOutDateTime is sparsely and laggingly populated (zero of the
population fires carried a past FireOut), so “still active” on its own is a weak signal — the recent-sensor-touch
condition is what actually protects against IRWIN’s optimistic/lagging active listings. Among the 439 kept, none is IRWIN-declared-out
and none is stale (0 measurable added-FP by construction).
Reproducibility detail. Shadow daemon oldgabe_liveness_shadow_daemon.py, read-only on the production DB
(mode=ro), health-gated on the host and load-guarded (yields to the busy marker; SIGTERM-safe; the write is a single
blocked-SIGTERM idempotent DELETE+reinsert, so a mid-run kill leaves the prior table intact). Clock = MAX(detected_at) across
all evidence. Population = event_ground_truth.confirmed=1 whose last core-sensor touch
(VIIRS%/MODIS/GOES%/%ABI%/HMS, aggregated per canonical_event_id) is older than 24 h (or absent). IRWIN
incidents deduped by IrwinID (3,857 distinct), gridded at 0.1° and matched by haversine within 10 nm; active =
FireOutDateTime null or in the future. Liveness window is env-configurable (OLDGABE_LIVENESS_WINDOW_H, default
72 h). Writes ONLY the new hidden table event_liveness_shadow (one row per population fire with both condition flags +
keep_active) plus its canary_meta row (surface_allowed=0) and a
DO_NOT_SURFACE_event_liveness_shadow marker. No serving read path: a grep of the serving app
(oldgabe_solution.py and every other top-level module) for the table name returns empty — only the daemon references it;
the production roster, fusion tiers, map, API and tiles are unchanged. Timer oldgabe-liveness-shadow.timer
(OnUnitInactiveSec=6h, idle-gap), service SuccessExitStatus=75 143, Nice=19, re-runnable.
Claim status: SHADOW, GATED, MEASURED. This is a roster/cadence-continuity mechanism with a strong FP-safeguard, not a
detection improvement — and nothing is surfaced. It quantifies a gain of 439 kept-active fires against a naive-pass
added-FP of 42,286 that the gate removes; the residual added-FP inside the 439 is 0 measurable in a single
snapshot.
Honest bounds. (1) “Continuity gained” is not the same as “fires that would otherwise be invisible”
— a geostationary-cadence roster already refreshes many of these within the hour; the 439 is an upper bound on what a 24 h
roster would drop and this pass would hold. (2) The one added-FP we cannot see now is an IRWIN-active fire that is actually out
(FireOutDateTime reporting lag [6]); a single run cannot measure it. (3) The whole picture is a summer
snapshot. Before ANY cutover we require a ≥14-daily-run validation: run the gate each day, then look
forward to later IRWIN updates to label each kept-active fire as genuine continuity vs a false-alive (an incident whose FireOut turns out to
predate when we kept it), producing a recovered-continuity vs added-FP curve with confidence intervals, swept across the
liveness window (24/48/72 h). Only if added-FP stays acceptably low across that curve does surfacing become a candidate — Mark
decides.
Literature alignment. Verdict: AGREEMENT. Polar sensors revisit a given location only a few times per day
[1][3], so a genuinely active fire routinely goes unre-imaged for many hours — the exact
gap a liveness pass is meant to bridge — while geostationary FDC refreshes far more often [8], which is why a
recent-touch window is a sound activeness proxy. And incident records are known to lag and under-report status transitions
[6], which is precisely why condition (a) alone is insufficient and condition (b) carries the safeguard.
What this does not claim: that any fire should be surfaced from this table today (it is gated), that 72 h is the right
window (it is swept in validation), or that the 439 are all truly alive (that is what the ≥14-run forward-labeling measures).
Next: accrue the daily runs, build the added-FP curve with CIs, and only then bring a cutover proposal.
The framing. The program has spent most of its effort on the recall side — entry 0017 put true
detection recall near 96.1% and showed the fusion gate misses zero real fires. The mirror-image question had never been measured:
of the detections OLDGABE actually surfaces to users on the map and public API, what fraction are false
positives — not real fires — and is there a clean lever that removes them without throwing away real fires?
BLUF. Measured against strict independent operational truth (NIFC IRWIN wildfire incidents ∪ WFIGS, matched
within 10 nm and the incident’s active window), the surfaced map is 23.7% precise — but that number
is a floor, not the false-positive rate. IRWIN lists only WF/WFU incidents; it does not list the large real
population of sub-incident thermal (agricultural burns, pile burns, small fires) that a single VIIRS or MODIS pass correctly detects.
When independent multi-sensor corroboration is added as a second truth, surfaced precision rises to 62.5%. The
classical false-positive machinery already deployed (an OSM industrial/flare catalog, a persistence mask, a 0.10 confidence floor,
and suppression of the noisy geostationary-only tier) has already removed the cleanly-separable FP: only
1 of 1,985 surfaced detections sits on the static FP catalog. And no operable threshold lever cuts the residual
without an equal-or-greater recall cost — requiring corroboration on the probable tier removes 50% of the real
IRWIN/WFIGS fires for zero precision gain. The one clean, defensible lever is small and geographic: a
VIIRS-nightfire / oil-and-gas flaring-basin mask extension removes ~51 surfaced FP (2.6% of the map) at ~0 recall cost. We recommend
it shadow-first — nothing here changes a shipped number.
The surfaced set (read from the serving code, not guessed). The live map/API path is
/api/oldgabe/fires with OLDGABE_FUSED_MAP=1 (confirmed in the running process environment). It reads
fused_fires with exactly this filter: last_seen ≥ now−24h AND tier != 'fp' AND confidence ≥ 0.10.
That 0.10 floor is load-bearing — it drops the entire early tier (geostationary-only, conf 0.05) and every
frp = 0 geostationary-persistent event (conf 0.08), i.e. the noisiest candidates never reach a user. Over the trailing 24 h
window (clock 2026-07-09 ~09:30 UTC) the surfaced set is 1,985 fires: 458 confirmed, 1,527 probable.
Precision by tier — strict (operational) vs broad (+ independent multi-sensor corroboration).
surfaced tier
n
strict prec (IRWIN∪WFIGS)
broad prec (+≥2 families)
ALL surfaced
1,985
23.7%
62.5%
confirmed
458
29.0%
98.0%
probable
1,527
22.1%
51.8%
The confirmed-tier broad figure (98.0%) is near-tautological — the confirmed tier is defined by ≥2 core sensors, so
“is it multi-family corroborated” is almost the tier’s own definition. Its informative precision is the
independent IRWIN/WFIGS match: 29.0%. The gap between 29.0% and 98.0% is the measure of how much real fire IRWIN simply
does not carry as a listed incident.
Precision by source family (strict IRWIN∪WFIGS). The ranking is the opposite of sensor quality — the sharpest
single-pass thermal sensors score lowest, because they correctly see real thermal that is not a NIFC wildfire incident:
source string
n
strict prec
IRWIN hit
WFIGS hits
GOES only
178
41.6%
37.6%
29
GOES,HMS
107
36.4%
36.4%
35
GOES,HMS,MODIS,VIIRS
95
35.8%
34.7%
30
HMS only
327
32.7%
32.1%
76
HMS,MODIS,VIIRS
108
28.7%
26.9%
30
GOES,HMS,VIIRS
85
27.1%
25.9%
17
HMS,VIIRS
537
16.4%
14.9%
56
MODIS only
86
14.0%
12.8%
3
VIIRS only
392
11.5%
11.5%
18
MODIS,VIIRS
23
8.7%
8.7%
0
What drives the false positives. The static FP catalog is not the answer — it has already done its job:
1 of 1,985 surfaced detections falls on an fp_polygons cell, because fusion applies the catalog
before anything is written to the map. The residual imprecision lives in the 745 uncorroborated single-source
detections (37.5% of the map: VIIRS-only 345, HMS-only 220, GOES-only 104, MODIS-only 67, and 9 single-source frp≥20
promotions). Crucially, these are not a clean FP bucket: their IRWIN-match rate (~24%) is the same as the map
overall, i.e. “uncorroborated” does not predict “false.” The one clearly-false, geographically-concentrated
driver we can name is oil-and-gas flaring: 51 uncorroborated surfaced detections sit inside known US flaring basins
(33 VIIRS in the Permian, plus Eagle Ford, Anadarko, DJ-Niobrara), with representative low-FRP VIIRS hits at
31.886,−102.511, 32.723,−101.925, 32.188,−102.008 (Permian) — classic gas
flares the OSM polygon set did not fully cover. Only 2 real IRWIN/WFIGS fires fall inside these basins at all.
The levers — measured precision gain vs recall cost, on neutral IRWIN∪WFIGS truth. Baseline surfaced real =
470 of 1,985 (23.7%). “Recall cost” = share of those 470 real fires a lever would drop:
candidate lever (operable at serving time)
kept
strict prec
real dropped
recall cost
L0 baseline (current map)
1,985
23.7%
0
0.0%
L1 corroboration gate: drop all single-family probable
1,012
23.0%
237
50.4%
L3 drop VIIRS-only + MODIS-only + MODIS,VIIRS
1,484
27.7%
59
12.6%
L4 single-family probable require FRP≥20
1,381
27.7%
87
18.5%
L5 single-family probable require FRP≥50
1,237
27.9%
125
26.6%
L7 flaring-basin / VIIRS-nightfire mask (uncorroborated, no truth match)
1,934
~24.3%
0
~0.0%
The corroboration gate is a measured negative. L1 — the intuitive “require a second sensor” fix —
lowers precision (23.7% → 23.0%) while discarding half the real fires, because the dropped single-family
detections are exactly as real as the map average. FRP and source gates (L3–L5) buy only ~+4 pp of strict precision at a
13–27% recall cost — a poor trade for a recall-optimized product. The only lever that removes false positives
at genuinely ~0 recall cost is the flaring-basin mask (L7): the 51 it targets are almost entirely industrial flares, and the 2 real
in-basin fires are IRWIN/WFIGS-matched, so a truth-sparing mask never touches them. Its ceiling is small — about +2.6 pp of the
surfaced map — but it is clean.
Reproducibility detail. Fully read-only (mode=ro on the production DB), health-gated on the host service
and load-guarded (yields to the host busy marker; server-side timeout+nice -n19; no writes of any kind —
this is a measurement pass, there is no shadow table and nothing is surfaced). Surfaced set = the exact live serving query
in oldgabe_solution.py under OLDGABE_FUSED_MAP=1: fused_fires WHERE
last_seen≥datetime('now','-24 hours') AND tier!='fp' AND confidence≥0.10. Truth reuses the shipped
scorer’s methodology (daemons/te_daily_scorer.py): IRWIN evidence (fire_event_evidence.source='IRWIN')
de-duped by IrwinID, filtered to IncidentTypeCategory∈{WF,WFU}, active window
[FireDiscoveryDateTime, FireOutDateTime||now] padded ±24 h (3,408 active wildfire incidents), gridded 1° and
matched by haversine within MATCH_RADIUS_NM=10; plus wfigs_truth (565 incident/perimeter points) matched within
10 nm. A detection is REAL(strict) if it matches IRWIN’s active window or WFIGS within 10 nm;
REAL(broad) additionally if its sources string carries ≥2 independent families (GOES/VIIRS/MODIS/HMS/CAM/S2).
Flaring basins are approximate bounding boxes (Permian, Bakken, Eagle Ford, Anadarko, DJ-Niobrara). Static-catalog residual checked against
fp_polygons (63,975 rows; OSM refinery/gas-flare + dynamic persistence). Every figure above is counted from the live production
DB at run time, not asserted; re-running on a later window will shift the exact counts but not the structure.
Claim status: MEASURED, read-only, honest-negative. This entry quantifies surfaced precision and tests FP-reduction
levers; it does not change fusion, tiers, the confidence floor, the map, the API, or any shipped number.
Honest bounds. (1) Strict precision (23.7%) is a lower bound on true precision, not the FP rate: IRWIN
carries only WF/WFU incidents and is known to under-report small and short-duration fires [6], so a large share of
“unmatched” single-sensor thermal is real sub-incident fire, not error. (2) Broad precision (62.5%) is an upper-leaning
estimate because ≥2-family corroboration and the confirmed-tier definition partly coincide. (3) The true FP rate lies between these
bounds and cannot be pinned down with IRWIN alone — the uniform ~24% match across corroborated and uncorroborated
buckets is the direct evidence that IRWIN cannot separate “not a wildfire incident” from “not a fire.” (4) This is a
single summer-window snapshot. The real next lever is not a threshold but a truth set: a fire-vs-non-fire label corpus
(persistent-flare inventory + confirmed non-fire hotspots) is what would let us measure the true FP rate rather than bound it.
Literature alignment. Verdict: AGREEMENT. That the sharpest polar sensors post the lowest incident-match rate is
expected: VIIRS 375 m and MODIS resolve many small, low-FRP thermal sources [1][2] that never
become NIFC incidents, and incident databases are documented to be incomplete for exactly those fires [6]. Persistent
industrial heat — gas flares above all — is the best-characterized false-positive class in satellite active-fire products, and
oil-and-gas basins such as the Permian are among the densest flaring regions on Earth [11], which is why a
persistent-source / nightfire mask (not a per-detection threshold) is the literature-sanctioned tool here [8].
What this does not claim: that 23.7% is the false-positive rate (it is a floor), that the single-source detections are
mostly false (they are not — they match IRWIN at the map-average rate), or that any lever should be flipped today. Recommendation:
build the flaring-basin / VIIRS-nightfire mask shadow-first as an additive persistent-source extension (the pipeline already supports
this via the dynamic-persistence machinery), then require it to pass the temporal-transport gate — construct the mask
from an earlier window and prove it suppresses flare FP in a strictly later window without masking any truth-matched fire —
before any cutover. Every larger lever fails the recall-cost test and is not recommended. Mark decides.
Executing the flaring lever: a VIIRS-nightfire persistent-source FP mask that passes an out-of-time transport gate — shadow-first
Date: 2026-07-09 Status: defensible (measured; read-only on production; temporal-transport validated) — CUTOVER APPLIED to production 2026-07-09
Update — 2026-07-09 (approved cutover applied). The 660 operating-threshold mask cells are now live in fp_polygons under source='flaring_nightfire_persistence' (radius 2.0 km), copied verbatim from the validated shadow set. The next fusion pass tiered every in-mask detection tier='fp' (256 currently-fused in-mask detections all demoted, none leaking through); the 24 h surfaced set dropped by ~11% (1,876→1,675). A live truth-sparing re-check confirmed 0 real IRWIN or WFIGS fires masked — the nearest real fire sits >5 km outside any mask cell (IRWIN-ever 5.17 km, WFIGS 5.62 km). The pre-cutover polygon table was snapshotted first; the flip is reversible with a single statement: DELETE FROM fp_polygons WHERE source='flaring_nightfire_persistence'. A load-guarded, health-gated weekly refresh daemon now stands beside the polar-persistence job — it re-derives the mask on a rolling recent window under the same fire-protection guards and idempotently adds newly-flaring cells while releasing any cell that stops flaring, touching no other FP source.
The framing. Entry 0020 audited the surfaced map and found exactly one clean, geographically-concentrated false-positive driver — oil-and-gas gas flaring — and set a hard precondition before it could ever change the map: build the fix as a persistent-source mask (not a per-detection threshold), and require it to pass a temporal-transport gate — construct the mask from an earlier window and prove it suppresses flare FP in a strictly later window without masking any real fire. This entry executes that build and reports the gate result.
BLUF. The mask is derived only from detections strictly before a 2026-07-03 cutoff: any fixed ~2 km cell whose VIIRS/MODIS detections recur across many distinct days (a persistence signature), fire-protection-guarded so a cell is dropped if it lies near any IRWIN incident (ever), near HMS smoke, near a WFIGS wildfire perimeter, or carries appreciable FRP. At the operating threshold (≥5 distinct days, matching the deployed polar-persistence daemon) this yields 660 mask cells, and they are what a flare inventory should be: 89.6% of their detections are at night (the VIIRS-Nightfire flaring signature) and 79 sit inside the Permian basin — the Permian concentration falls out of the persistence derivation, it was never coded in. On a strictly-later held-out window (2026-07-06 onward, with a 3-day gap so no source straddles the split) the mask suppresses 283 surfaced false-positive detections (8.3% of the 3,414-fire out-of-time surfaced set) while masking exactly 0 real IRWIN wildfire incidents and 0 WFIGS perimeters — at the 2 km suppression radius and at a conservative 5 km. All 283 suppressed detections are VIIRS-heavy and uncorroborated by IRWIN. The transport gate PASSES. The mask is written as a hidden shadow table (flaring_mask_shadow, surface_allowed=0); nothing here changes a shipped number.
Why the existing persistence machinery misses these. The deployed dynamic-persistence daemon suppresses a recurring cell only when it has zero polar-sensor hits — a single VIIRS pass is treated as confirmation of a real fire and keeps the cell live. Gas flares are precisely VIIRS-heavy, so they slip through that gate. This mask is the additive complement: it keys on VIIRS/MODIS multi-day recurrence at a fixed location with no incident and no smoke, which is the affirmative flare signature rather than the absence-of-polar signature. It is built as an extension of the same persistence machinery (same 0.02° grid, same 2 km mask radius, same idempotent-replace discipline), not a parallel system.
The transport gate — mask trained before 2026-07-03, evaluated strictly after 2026-07-06. “FP suppressed” = surfaced fused fires (the live serving filter: tier!='fp' AND confidence≥0.10) that fall inside the mask out-of-time; “real masked” = independent IRWIN wildfire fire-days / WFIGS perimeters in the later window that fall inside the mask — the number that must be zero:
persistence threshold
mask cells
FP suppressed (out-of-time)
real IRWIN masked (2 km)
real IRWIN masked (5 km)
real WFIGS masked
≥3 distinct days
1,022
361
0
0
0
≥5 distinct days (operating)
660
283
0
0
0
≥7 distinct days
496
242
0
0
0
≥10 distinct days
321
177
0
0
0
The truth-sparing column is 0 at every threshold, at both radii — the more persistent the source, the more confident the flare call, and never once does the mask shadow a later real fire. The out-of-time test set carried 547 independent IRWIN wildfire fire-days and 19 WFIGS perimeters; the mask touched none of them. The fire-protection guards did real work: at the operating point they released 80 candidate cells for lying near an IRWIN incident, 193 near HMS smoke, and 19 for FRP ≥ 40 MW — those are the cells a naive persistence rule would have wrongly masked, and the guards remove them before the gate, which is why the gate comes back clean.
Reproducibility detail. Fully read-only on all production tables (mode=ro); the only writes are the daemon’s own hidden shadow table and its canary_meta row (surface_allowed=0, DO_NOT_SURFACE). Health-gated on the host service (exit 75 if inactive), yields to the host busy marker, wrapped in the host load-guard with server-side timeout+nice -n19, SIGTERM-clean. Mask build = fire_event_evidence WHERE source∈{VIIRS-N20,VIIRS-N21,VIIRS-NPP,MODIS} AND detected_at<2026-07-03, grouped on a 0.02° grid, keeping cells with COUNT(DISTINCT date)≥5; night fraction from raw.daynight='N'. Guards: drop a cell within 5 km of any IRWIN incident (all history), within 4 km of pre-cutoff HMS smoke, within 5 km of a WFIGS WF perimeter centroid, or with peak frp_mw≥40. Held-out surfaced set = live fused_fires (a 72 h rolling artifact, so its window is the strictly-later test period) filtered by the exact serving query in oldgabe_solution.py under OLDGABE_FUSED_MAP=1. Out-of-time truth = IRWIN evidence (source='IRWIN') de-duped to fire-days and WFIGS WF perimeters, each with detected_at / discovery_dt ≥ 2026-07-06; a real fire is “masked” if within the 2 km suppression radius (also reported at 5 km). Every figure is counted from the live production DB at run time. Single summer window, so re-running on a later split shifts exact counts but not the structure.
Claim status: MEASURED, read-only, transport-validated, shadow-only. This entry builds and validates a false-positive mask; it does not change fusion, tiers, the confidence floor, the map, the API, the static FP catalog, or any shipped number. The artifact is a hidden table with surface_allowed=0 and no serving read-path.
Honest bounds. (1) Within-summer transport, not off-season. The data is a single summer window (~2026-05-29..07-09); this is the strongest available test — train earlier, test strictly-later with a gap — but it is not a winter/shoulder-season validation, and a true off-season test is impossible with the data on hand (same bound as entries 0017/0018). (2) “FP suppressed” is not fully truth-condemned. Per entry 0020, IRWIN cannot certify the suppressed set as false — it lists only WF/WFU incidents. The affirmative evidence that these 283 are flares and not fires is threefold and independent of IRWIN: they are persistent at a fixed cell across many days, ~90% night-detected (the VIIRS-Nightfire flare signature), and concentrated in known oil-and-gas basins. We therefore frame the effect as removing persistent non-incident thermal sources, with the flaring-basin geography as the affirmative flare evidence. (3) The mask only knows cells that were already flaring before the cutoff; a flare that ignites after the cutoff is not masked until the next refresh — conservative by design (it never pre-emptively masks a location).
Literature alignment. Verdict: AGREEMENT. Persistent industrial heat — gas flares above all — is the best-characterized false-positive class in satellite active-fire products, and multi-date persistence at a fixed location is the literature-sanctioned discriminator rather than a per-pixel threshold [8]. VIIRS-Nightfire specifically identifies flares by their nightly recurrence and thermal signature, and oil-and-gas basins such as the Permian are among the densest flaring regions on Earth [11] — both the ~90% night fraction and the Permian concentration this mask recovers are exactly what that literature predicts. That the sharpest polar sensors (VIIRS 375 m) are the ones that repeatedly resolve these small hot sources is consistent with their documented sensitivity to low-FRP thermal [1], and with IRWIN’s documented incompleteness for non-incident thermal [6].
What this does not claim: that all 283 suppressed detections are proven false (they are IRWIN-unmatched persistent night sources in flaring basins — strong circumstantial, not certified), that the mask should surface today (it is shadow, surface_allowed=0), or that the result transports to winter. Recommendation: cutover-candidate. The gate passed clean (zero real fires masked out-of-time at both radii, at every persistence threshold), so this is eligible for a minimal, reversible cutover on Mark’s approval — not applied here. The exact step: fusion already reads every fp_polygons row generically and assigns tier='fp' to any fused fire within its radius, so the entire cutover is one additive INSERT — copy the shadow cells into fp_polygons under a new source='flaring_nightfire_persistence' (radius 2.0 km); no serving-code or schema change. Reverse = DELETE FROM fp_polygons WHERE source='flaring_nightfire_persistence'. The durable form is to promote the derivation to a load-guarded weekly daemon beside the existing polar-persistence job, so the mask refreshes and releases any cell that stops flaring (matching the deployed idempotent-replace discipline). Mark decides.
Replacing the 23.7% IRWIN floor with a measured number: a fire-vs-non-fire label corpus that decomposes surfaced precision into unlisted-real fire and genuine false positive
The framing. Entry 0020 left the program with a number it explicitly could not use: surfaced precision against IRWIN reads 23.7%, but that is a floor, not the false-positive rate — IRWIN matched the corroborated and uncorroborated surfaced buckets at the same ~24%, proving IRWIN cannot tell “not a fire” apart from “a real fire it never listed.” So the one number a detection program most needs about the map it ships — the fraction of surfaced detections that are genuinely not fire — was unmeasured. This entry measures it, by abandoning IRWIN-presence as the label and building an affirmative fire-vs-non-fire corpus over the entire surfaced set: positive evidence of fire, positive evidence of non-fire, and an explicitly adjudicated middle in between.
BLUF. Over the full trailing-window surfaced set (N = 1,985 fused fires; the live serving filter last_seen≥now−24h AND tier≠'fp' AND confidence≥0.10), positive evidence partitions the set into 1,363 positive-fire, 208 positive-non-fire, and a 414-detection unadjudicated middle; adjudicating that middle with independent heuristic evidence splits it 81 fire / 35 non-fire / 298 genuinely-ambiguous. Combining the buckets, the true surfaced false-positive rate is 19.7% (point estimate; Wilson-95 sampling interval [18.1%, 21.6%]; the wider [12.2%, 27.3%] epistemic bracket carries the ambiguous band honestly). It is strongly tier-stratified: the confirmed tier is 4.6% FP [3.0%, 6.9%] while the probable tier is 24.3% [22.2%, 26.5%]. It is almost entirely a single-family-VIIRS phenomenon: VIIRS-only detections are 49.4% FP, and every multi-family or geostationary combination is ≤16%. The headline the program had been missing — the decomposition of entry 0020’s 76.3-point precision gap: 56.6 points are unlisted-real fire, only 19.7 points are genuine false positive. Roughly three-quarters of the apparent “imprecision” was IRWIN incompleteness, not surfaced error. Fully read-only; no shipped number changes.
How the labels are assigned — positive evidence, not IRWIN-presence. Each surfaced fire is labelled by a precedence stack of affirmative signals, all independent of the confidence/tier that surfaced it: (1) positive fire if it matches a NIFC IRWIN/WFIGS wildfire incident (10 nm, active-window, the entry-0020 methodology); else (2) positive non-fire if it sits on the persistent-flaring mask (entry 0021’s flaring_mask_shadow) or a catalogued static industrial/persistence source (fp_polygons: OSM refineries, OSM gas flares, dozier/polar persistence); else (3) positive fire if ≥2 independent sensor families corroborate — where independence counts distinct physical platforms {VIIRS, MODIS, GOES-ABI, S2, S1} and deliberately excludes HMS, since NOAA’s Hazard Mapping System is an analyst product derived from those same satellites and cannot be a second independent vote; else (4) positive fire if VIIRS/MODIS detections recur across ≥2 distinct days at the location and it is not on any static-source catalog (multi-overpass persistence away from flares); else (5) unadjudicated middle.
Adjudicating the middle. The 414-detection middle is the honest hard part — neither positively fire nor positively non-fire. Each is adjudicated with the best independent evidence available short of a ground visit: proximity to (but outside the strict radius of) a catalogued industrial/persistence source → non-fire-leaning; multi-day polar persistence away from all catalogs, or an energetic single-day polar detection (FRP ≥ 10 MW) → fire-leaning; no polar corroboration and weak signal (FRP < 5 MW, i.e. an ephemeral geostationary/analyst-only hit) → non-fire-leaning; everything else → genuinely ambiguous. Result: 81 fire, 35 non-fire, 298 ambiguous. The large ambiguous residual is not hidden — it is carried straight into the interval below.
The estimate. With B = 208 positive-non-fire and the middle’s 35 non-fire + 298 ambiguous, the FP-count point estimate splits the ambiguous band 50/50: FP = B + 35 + 0.5·298 = 392 of 1,985. The epistemic bracket sends the ambiguous band entirely to fire (low) or entirely to non-fire (high); the Wilson interval is the binomial sampling error on the point count.
stratum
N
true FP rate (point)
Wilson-95 (sampling)
ambiguous bracket (epistemic)
ALL surfaced
1,985
19.7%
[18.1%, 21.6%]
[12.2%, 27.3%]
tier = confirmed
458
4.6%
[3.0%, 6.9%]
[4.6%, 4.6%]
tier = probable
1,527
24.3%
[22.2%, 26.5%]
[14.5%, 34.1%]
The FP is a single-sensor-family artifact. Split by the surfacing sensor mix, the false-positive burden is concentrated almost entirely in one place — lone-VIIRS detections, which is exactly the flaring class entry 0021 characterized. Every combination that adds a second independent family, or a geostationary confirmation, collapses to single digits or low teens:
source group
N
positive-fire
positive-non-fire
middle
true FP rate (point)
VIIRS-only (single family)
392
188
185
19
49.4%
HMS-only (analyst-derived)
327
206
0
121
15.9%
has-GOES (geostationary)
495
369
6
120
14.1%
VIIRS+MODIS (polar ×2)
131
115
16
0
12.2%
HMS+VIIRS
537
410
1
126
10.1%
MODIS-only
103
75
0
28
5.8%
The decomposition entry 0020 could not do. Entry 0020’s 23.7% IRWIN “precision” left a 76.3-point gap it could only call “unmeasured — some real, some false.” The corpus splits that gap for the first time:
component of the surfaced set
share
count
interpretation
IRWIN/WFIGS-listed incident
23.7%
470
the entry-0020 floor (numerator)
unlisted REAL fire
56.6%
1,123
real fire IRWIN never listed — the bulk of the “gap”
genuine NON-FIRE false positive
19.7%
392
the true surfaced FP rate
So the “76.3% of surfaced detections IRWIN could not confirm” was ~74% unlisted-real fire and ~26% genuine false positive — the map is far more correct than the IRWIN floor implied, and its residual error is a nameable, already-mitigable class (persistent flaring, concentrated in lone-VIIRS detections).
Reproducibility detail. Fully read-only on all production tables (PRAGMA query_only, mode=ro); zero writes — no shadow table, no canary_meta row, nothing. Health-gated on the host service (exit 75 if inactive), yields to the host busy marker, wrapped in the host load-guard with server-side timeout+nice -n19, SIGTERM-clean, killed by PID. Surfaced set = the exact live serving query on fused_fires (last_seen≥now−24h AND tier≠'fp' AND confidence≥0.10), N = 1,985. IRWIN/WFIGS truth = the entry-0020 / te_daily_scorer method: IRWIN evidence (source='IRWIN', IncidentTypeCategory∈{WF,WFU}) de-duped to incidents with active window [discovery−24h, out+24h], plus WFIGS points; a match is within 10 nm haversine and the active window. Non-fire catalogs = flaring_mask_shadow (entry 0021) and fp_polygons (OSM refinery / OSM gas-flare / dozier- and polar-persistence), each tested at its own radius. Sensor-family independence parsed from the fused sources string into {VIIRS, MODIS, GOES, S2, S1}; HMS excluded as analyst-derived. Persistence = COUNT(DISTINCT detection-day) of VIIRS/MODIS evidence within 10 nm over an 8-day lookback. Estimator: FP̂ = (positive-nonfire + middle-nonfire + ½·middle-ambiguous)/N; Wilson score interval for binomial sampling; the [ambiguous→all-fire, ambiguous→all-nonfire] bracket for the epistemic band. Every figure counted from the live production DB at run time.
Claim status: MEASURED, read-only, honest-uncertainty. This entry measures the surfaced false-positive rate and decomposes the entry-0020 floor; it does not change fusion, tiers, the confidence floor, the map, the API, the FP catalog, or any shipped number, and it writes nothing.
Honest bounds. (1) The middle carries real uncertainty. The 298-detection ambiguous residual is adjudicated with heuristic independent evidence (persistence, catalog proximity, FRP, day/night) — not ground visits — so its split is uncertain; that uncertainty is why the epistemic bracket ([12.2%, 27.3%]) is much wider than the sampling interval, and it is the honest bound, not the Wilson number. (2) The persistence fire-rule is the weakest positive class. 673 detections (33.9%) are labelled fire solely by multi-day polar persistence off the static catalogs; genuine multi-overpass wildfires persist this way, but an un-catalogued flare could too, so this rule can only push the true FP upward from the point estimate — the reason the pessimistic bracket edge is stated, not buried. (3) IRWIN/WFIGS remains incomplete (its whole point here), so “unlisted-real” leans on corroboration and persistence, not incident lists. (4) Single summer window (~2026-05-29..07-09); re-running on a later split shifts exact counts, not the structure (tier-stratified, VIIRS-only-dominated).
Literature alignment. Verdict: AGREEMENT. That IRWIN / FPA-FOD-style incident lists are materially incomplete for sub-incident and non-incident thermal is well documented [6] — so a precision figure computed against them is expected to understate true precision, exactly the 56.6-point unlisted-real correction found here. That the residual false positives concentrate in the sharpest polar sensor over persistent industrial heat is the canonical VIIRS-Nightfire flaring result [11], consistent with VIIRS 375 m sensitivity to small low-FRP hot sources [1]; and that adding an independent second sensor family sharply raises precision is the standard multi-sensor-confirmation finding [3]. The tier stratification (confirmed 4.6% vs probable 24.3%) is the operational-gate stack behaving as designed.
What this does not claim: that 19.7% is exact (the honest interval is [12.2%, 27.3%], dominated by the ambiguous middle), that the middle adjudication substitutes for ground truth (it is heuristic and independent, not certified), that the 673 persistence-fire labels are individually proven fires, or that the split transports to winter. Recommendation: informative — no cutover. This is a measurement pass; its operational consequence is already covered by the entry-0021 flaring-mask cutover candidate (the 207 positive-non-fire on that mask are precisely the removable class), and by the observation that tier and single-family-VIIRS are the two axes along which surfaced FP is concentrated — a probable-tier lone-VIIRS detection in an oil-and-gas basin is where the residual error lives, and is where any future gate should focus. Mark decides.
Physical geo-priors don’t survive transport either: swapping memorized lat/lon for elevation, slope and ruggedness still fails to beat the production baseline out-of-time
Date: 2026-07-09 Status: MEASURED NEGATIVE (out-of-time) — physical geo is not a promote candidate — corroborates & extends entry 0018
BLUF. Entry 0018 killed the recovery re-ranker’s “geo lift” under temporal transport — raw lat/lon was memorizing the
reporting surface, not fire geography — and named the constructive next step: replace raw coordinates with physical,
non-memorizable geo-priors (terrain, fuel, climatology) and re-run the same gate; only promote if the physical prior holds out-of-time. We did
exactly that. We engineered physical terrain covariates — elevation, slope, and terrain-ruggedness sampled from a coarse DEM —
and re-ran the identical train-early / test-strictly-later gate against the reporting-bias-free neutral (independent VIIRS/MODIS) truth.
Physical geo-priors do not survive transport either. On the neutral truth out-of-time, recovery+physical-geo reaches AUC 0.571
— nowhere near the production baseline (0.856), only marginally above recovery det-only (0.534, +0.037 AUC / ±0.00 PR-AUC), and
below even the raw-lat/lon variant it was meant to replace (0.633). Fuel and climatology remain deferred (no box-local source), so this is an
elevation/terrain-only physical test — but terrain is decisive on its own hypothesis, and the answer is no. The canary stays gated.
The split (identical to entry 0018). The same CAUTION candidate set, the same 19 detection-only base features, the same honest training
label, the same neutral evaluation label, the same model. Train on first_det in 06-27–07-02 (123,931 events), a 07-03 gap, test
strictly-later 07-04–07-06 (38,549 events). Models train on the honest (IRWIN/perimeter/confirmed) truth and are evaluated out-of-time against the
NEUTRAL truth — an independent VIIRS/MODIS detection (belonging to a different canonical event) within 5 km in a subsequent overpass
(t0+3 h…t0+72 h), gridded 0.05°×6 h over CONUS, HMS/IRWIN-independent. Neutral base rate on the holdout is 3.35% (1,292 positives)
— reproducing entry 0018’s 3.3%. The only change vs entry 0018 is the geography channel: physical terrain covariates instead of raw
coordinates.
Out-of-time on the NEUTRAL (reporting-bias-free) truth — the gate.
Physical geography fails the gate on both counts. Recovery+physical-geo (0.571) does not beat production (0.856) — it
is 0.28 AUC and 0.16 PR-AUC below it — and it does not meaningfully beat recovery det-only (0.534): a +0.037 AUC nudge with PR-AUC flat
(0.099 vs 0.100). It is also below the raw-lat/lon variant (0.633), so the physical prior we hoped would be more robust than memorized coordinates
actually carries less out-of-time neutral signal than the coordinates. Physical-geo alone reaches only 0.583 — a weak geographic prior, well
short of production. Every scorer scores 0 at the 80/90% precision operating points on this sparse 3.35%-base truth, so the comparison rests on
AUC/PR-AUC discrimination, where physical geography adds no out-of-time edge. The single scorer that transfers is production — a plain
FRP/family rule that tracks fire radiative power, the same physical quantity the polar sensors re-detect.
For contrast — the same holdout scored against the HONEST (HMS-inclusive) truth. Here, as in entry 0018, geography still looks
attractive — the trap the neutral truth exists to expose:
scorer (vs honest truth)
AUC
PR-AUC
recall@80%p
production tier_and_conf
0.883
0.484
0.072
recovery, det-only
0.875
0.656
0.539
recovery + raw lat/lon
0.943
0.717
0.620
recovery + PHYSICAL geo
0.907
0.675
0.578
physical-geo-only
0.635
0.075
0.00
The physical prior behaves exactly as designed — which is why it can’t rescue recovery. Raw lat/lon adds +0.068 AUC
under the honest truth: a large lift, most of which is the reporting-bias artifact (it memorizes where fires get reported[6]).
Physical terrain adds only +0.032 AUC under the honest truth — less than half the raw-coordinate lift — because it cannot
memorize the reporting surface; it only knows physical terrain. That is the good news the constructive next step was chasing. But the same property means it
brings almost no signal at all: its neutral-truth increment over det-only (+0.037) is as small as its honest-truth increment, and the absolute neutral AUC
(0.571) sits far below the production baseline. Physical geography here is honest but inert: it does not encode the reporting surface, and it does not encode
enough real fire-geography to lift a reporting-bias-free re-ranker out of the near-chance regime.
Reproducibility detail. Read-only on the production DB (mode=ro + PRAGMA query_only=ON), no production writes,
health-gated on the host and resource-guarded (yields to the host busy marker; SIGTERM-safe; the only artifact written is a /tmp JSON). Candidate set,
19 detection-only features, honest label, split, and model are byte-for-byte the entry-0018 harness: candidates =
event_corroboration_tier where tier='CAUTION' joined to non-leaky fire_event_evidence (IRWIN/HMS/SAR/S2 confirmation
channels excluded from features); model = HistGradientBoostingClassifier (max_iter 400, lr 0.06, 31 leaves, min_leaf 20, l2 1.0, class_weight
balanced, early stopping), trained on 06-27–07-02, scored on 07-04–07-06 (07-03 gap). Training label = honest truth (confirmed OR
an IRWIN fire-day / perimeter within 5 km & ±14 d). Neutral evaluation label = an independent VIIRS/MODIS detection from a
different canonical event within 5 km in a subsequent overpass (t0+3 h…t0+72 h), gridded 0.05°×6 h over CONUS. Production
baseline = tier_and_conf reconstructed per event from its full canonicalized source set / GOES-frame count / max FRP. Physical
covariates: elevation, slope (m rise per km), and a terrain-ruggedness index (local 3×3 elevation std), sampled per event from
ETOPO2022 60 arc-second surface elevation (NOAA NCEI), CONUS window, read as a windowed cloud-optimized-GeoTIFF (no bulk download). Deferred
(honestly): fuel/vegetation (LANDFIRE fuel model or MODIS/VIIRS NDVI) and long-run fire-weather climatology — no box-local source was readily
available without heavier ingestion, so this physical-prior test is terrain-only. Metrics via roc_auc_score,
average_precision_score, and precision_recall_curve operating points. The hidden canary table
event_caution_recovered_geo is unchanged and remains gated (surface_allowed=0); nothing was surfaced.
Reproduction note (one figure differs from entry 0018, and it does not move the verdict). The production baseline reproduces entry 0018 on the
neutral truth (AUC 0.856 vs 0.861; base rate 3.35% vs 3.3%) and the entire honest-truth panel reproduces it (det-only 0.875/0.656; +geo 0.943/0.717). The one
figure that differs is the honest-trained recovery model’s neutral AUC: this rebuild reads it near chance (det-only 0.534) versus 0.837 in entry
0018. The difference isolates to the neutral-truth independent-re-detection criterion — this rebuild requires the confirming VIIRS/MODIS detection to
belong to a different canonical event (strict independence, excluding a weak source re-flagging itself); entry 0018’s one-off neutral-truth builder
was not re-instantiated. We ran the gate under both a self-persistence-inclusive and an independence-strict neutral truth; det-only reads 0.552 and 0.534
respectively — both far below production, and the physical-geo verdict is identical under either. Because the promote decision rests on the
within-run deltas (physical-geo vs production and vs det-only, measured on one fixed truth), it is robust to this reconstruction sensitivity.
Claim status: MEASURED NEGATIVE, out-of-time. Physical geo-priors (elevation + slope + ruggedness) are not a promote candidate:
under strict train-early/test-late transport they do not beat production on the reporting-bias-free truth (0.571 vs 0.856), do not meaningfully beat detection-only
recovery (+0.037 AUC, PR-AUC flat), and carry less out-of-time neutral signal than the raw coordinates they were meant to replace. No shadow build is
recommended. The canary stays gated (surface_allowed=0). This corroborates and extends entry 0018: the constructive next step it named
— physical rather than memorized geography — was tested and did not rescue the transport failure.
Hard bound (summer-only + terrain-only). All data is summer 2026, so this is a train-earlier / test-later split within summer (days
apart, not seasons); a true off-season validation is impossible until winter data exists and remains deferred. The physical prior tested here is
terrain only (elevation, slope, ruggedness); fuel/vegetation and climatology remain deferred for lack of a ready box-local source
— a fuel- or aridity-aware prior could in principle behave differently, though the terrain result gives no encouragement, and the neutral base rate (3.35%,
1,292 positives) is sparse enough that PR-AUC at the extreme operating points is noisy.
Literature alignment. Verdict: AGREEMENT. Physical terrain, fuel, and climate are the standard predictors in fire-susceptibility modelling
[5], so testing them as a geographic prior is the right move; but the discipline that a prior which lifts a model against reported-fire
records must be re-checked against an independent, physically-triggered truth (polar radiometric detection [1]) under strict
out-of-time validation [4] — not in-sample or against reporting-biased records [6] — is exactly what stops a
weak prior from being promoted on optimism. Here terrain passes the “doesn’t memorize the reporting surface” test (its honest-truth lift is small)
but fails the “adds real transferable skill” test (its neutral-truth AUC stays near chance and far below the physics-based baseline).
What this does not claim: that terrain is irrelevant to fire — only that a coarse terrain prior adds no de-confounded, out-of-time
recovery value on this data; that the recovery program is dead — detection-only recovery still carries honest-truth signal (0.875 AUC / 0.656 PR-AUC);
nor that a fuel- or climatology-based prior is settled — those remain untested for lack of a source. Next: if a box-local LANDFIRE fuel raster
or a coarse aridity climatology becomes available, engineer them the same way and re-run this identical gate; and revisit the whole question once any cross-season
data exists. Until then, geography — memorized or physical — is not a promote lever, and the production FRP baseline remains the scorer to beat.
The gate is doing its job. This is the fourth recovery/gate candidate the temporal-transport check has correctly stopped — the Dozier
multi-feature gate, the Dozier early-cue tier, recovery+raw-geo, and now recovery+physical-geo. The discipline keeps letting the physically-grounded scorers through
and stopping the ones riding in-sample or reporting-biased optimism.
Bounding the last coverage lever: the sub-floor tail is real but low-yield — SWIR revisit is not the limiter, sub-pixel size is, and the recoverable upper bound is 48 fires (mostly larger remote Alaska burns)
Date: 2026-07-10 Status: MEASURED (own read-only artifact; reproduces & bounds the entry-0017 sub-floor set) — confirmed LOW-YIELD coverage lever
BLUF. Entry 0017 showed that 90.6% of OLDGABE’s “missed” IRWIN fires are a 24 h liveness artifact, that the fusion gate rejects
zero, and that only a small tail — 132 fires (9.4%) in that run — are truly sub-floor (nothing of any status within 10 nm in a
30-day lookback). It named the last open coverage thread: quantify that sub-floor tail against Landsat-9 / Sentinel-2 SWIR revisit cadence over remote Alaska to
bound the only genuine coverage lever. We reproduced the sub-floor set (161 fires this re-run, up from 132 on the documented active-window drift) and
bounded it. The revisit geometry is not the constraint — sub-pixel fire size is. Every one of the 161 is an open IRWIN record (null
FireOutDateTime), so its active window runs discovery→now — days to weeks — and at Alaska-summer latitudes with S2A/S2B + L8/L9 sidelap
each such window contains many daytime SWIR overpasses. Overpass availability is therefore not limiting (plausible-overpass upper bound = 161/161).
What limits it is that 112 of 161 (69.6%) are sub-1-acre point records — at or below the 20–30 m S2/L9 SWIR sub-pixel floor no matter how
often they are overflown — carrying just 13.8 acres between them. Gate detectability on a generous “≥1 acre sustained flaming” SWIR
floor and the recoverable upper bound is 48 fires (29.8%), and because the acreage is so top-heavy those 48 carry 99.7% of the sub-floor acreage
(4,626 of 4,640 ac). But that 48 is a hard upper bound before any cloud/illumination haircut; the robustly-sized core is just 24 fires ≥10 acres
and 7 ≥100 acres, overwhelmingly larger remote Alaska burns. Against a roster already at ~95% true detection recall, a SWIR-cadence recovery path is a
real but marginal Alaska-only, large-fire-only lever — exactly as entry 0017 suspected. It does not warrant a general recovery path.
The reproduced sub-floor set (run-18-equivalent window 2026-07-07→2026-07-08, 10 nm vs IRWIN WF/WFU; 3,446 active wildfires;
1,447 fire-level false-negatives; 1,285 liveness; 161 sub-floor — nothing of any status within 10 nm in the 30-day lookback; 4,640 total acres):
size band
fires
% of sub-floor
acres
SWIR verdict at 20–30 m
<1 acre (point records)
112
69.6%
~13.8
at/below sub-pixel floor — orbit-hopeless
1–10 acre
24
14.9%
532.7
marginal — needs clear-sky daytime overpass on active flaming
10–100 acre
17
10.6%
plausibly detectable
≥100 acre
7
4.3%
4,093.7
plausibly detectable
unknown size
1
0.6%
—
excluded (no size)
Geography — Alaska-heavy in acreage, CONUS-heavy in count. 34 of 161 fires (21.1%) are in Alaska but they carry 3,341 of 4,640 acres
(72.0%); the other 127 (CONUS) are overwhelmingly the sub-1-acre point records (1,299 ac, 28.0%). By latitude: 83 below 45°N, 44 at 45–55°N, 34 at
≥60°N (all Alaska). Every one of the 161 is a genuine wildfire (IncidentTypeCategory=WF, kind FI) — no prescribed burns dilute the set.
Discovery is 124 daytime / 37 night. Crucially, none of the 161 carries a FireOutDateTime: they are all open records, so the “is this a
mop-up record with FireOut≈FireDiscovery” test entry 0017 anticipated is inapplicable here — the mop-up/record-only class instead shows up as the
sub-1-acre point-record mass, which is the same orbit-undetectable population by a different signature.
The SWIR recoverability bound (Sentinel-2 MSI B11/B12 ~1.6/2.2 µm at 20 m; Landsat-9 OLI-2 B6/B7 ~1.6/2.2 µm at 30 m;
combined S2A/S2B + L8/L9 daytime SWIR opportunity; upper bounds throughout):
bound
fires
% of sub-floor
acres
note
Plausible S2/L9 daytime SWIR overpass in active window
161
100%
4,640
overpass not the limiter — open windows span many revisits
Large enough for a 20–30 m SWIR anomaly (≥1 ac) — RECOVERABLE UPPER BOUND
48
29.8%
4,626
99.7% of sub-floor acreage; 16 in Alaska; 39 daytime discovery
— of which robustly sized (≥10 ac)
24
14.9%
—
the realistic recovery core, mostly larger AK burns
— of which ≥100 ac
7
4.3%
4,093.7
the acreage-dominant handful
Below SWIR sub-pixel floor (<1 ac / unknown) — hopeless
113
70.2%
13.8
0.3% of sub-floor acreage — unrecoverable from orbit at any cadence
Reading the bound honestly. The recoverable upper bound is 48 fires / 4,626 acres — and it looks acreage-rich only because
seven ≥100-acre Alaska burns carry 88% of it. Strip to what a 20–30 m SWIR band would robustly resolve and the core is 24 fires ≥10 acres,
mostly larger remote Alaska burns that no core polar/geostationary sensor happened to touch inside the window. Even that 24 is optimistic: it assumes a cloud-free daytime
overpass coincides with active flaming, and Alaska/PNW summer cloud frequency, the sub-pixel marginality of the 1–10 acre band, and the requirement that any SWIR hit
still clear the fusion gate and attribute correctly all push the realistic yield below the bound. For context, OLDGABE’s fusion stack already lists an
S2-SWIR-Hotspot source (alongside S1-SAR-BurnScar); these 161 slipped past it, so the lever is really about densifying SWIR cadence (adding
L9/L8 to the existing S2 feed, or reprocessing) rather than a missing sensor — which caps the upside at the 48-fire bound above.
Verdict — confirmed low-yield. The sub-floor tail is genuinely small: 161 of 3,446 active wildfires (4.7%) and 4,640 acres, against a roster whose
true detection recall (ever confirmed during active life) is (3,446−161)/3,446 = 95.3%. Of that tail, 70% is orbit-undetectable sub-1-acre point records,
the revisit geometry is favorable rather than limiting, and the recoverable upper bound is 48 fires — realistically a handful of larger Alaska burns. The coverage lever
entry 0017 flagged is real but low-yield: it justifies at most a narrow, default-OFF, Alaska-focused, ≥10-acre SWIR-cadence shadow probe measured for
recovered-recall vs added-FP — not a general recovery path, and a far smaller prize than the liveness/persistence pass (1,285 fires) that entry 0017 already identified as the
dominant lever.
Reproducibility detail. Read-only replay against OLDGABE oldgabe.db (mode=ro + PRAGMA query_only=ON), no writes;
health-gated on the host (serving unit active) and resource-guarded — this run deferred twice to the host busy marker before completing, which is the guard behaving
as designed. Sub-floor set reproduced with the shipped scorer daemons/te_daily_scorer.py verbatim (_load_irwin, _bucket,
_match_in_det_bucket, _rng_nm, MATCH_RADIUS_NM=10 nm): IRWIN truth = fire_event_evidence where source='IRWIN',
deduped on IrwinID/UniqueFireIdentifier, filtered to IncidentTypeCategory∈{WF,WFU}, active window = [FireDiscovery−24 h,
FireOut||now+24 h]. A fire is a false-negative when no promoted event (status∈{confirmed,confirmed_growth,awaiting-confirmation,pre-ignition})
lies within 10 nm and the active window during the 24 h scoring window; it is sub-floor when, over the 30-day lookback, no event of any status lies within
10 nm/active-window — identical to entry 0017. Per-fire fields (acres, state, discovery/out times, incident type, lat/lon) read from the IRWIN raw JSON
(FinalAcres→IncidentSize→DiscoveryAcres priority; POOState; FireDiscoveryDateTime/FireOutDateTime
epoch-ms). Discovery day/night = local solar hour from FireDiscoveryDateTime + lon/15 (day = 06–18 LST). SWIR bound (upper bounds, from geometry not
imagery):plausible overpass = the active window spans ≥ one effective daytime revisit interval (latitude-scaled: 2.0 d at ≥60°N via S2A/S2B + L8/L9
sidelap, up to 4.0 d mid-latitude) — satisfied by all 161 because every record is open (null FireOutDateTime) with a days-to-weeks window; detectable =
plausible overpass AND ≥1 acre (a generous practical S2/L9 SWIR sub-pixel active-fire floor; sub-1-acre point records treated as hopeless regardless of overpass). No
imagery was pulled; the bound rests on revisit geometry + fire size/duration + the known 20–30 m sub-pixel SWIR detection limit. Reproduction note: N drifts
from entry 0017’s 132 to 161 (fn 1,447 vs 1,407; N 3,446 vs 3,410) for the reason entry 0017 documented — null-FireOutDateTime active windows extend to current
run time, so a later replay admits a slightly larger open roster; the structure (small, sub-pixel-dominated, Alaska-heavy-in-acreage tail) is invariant to the drift. Only artifact
written was a /tmp JSON on the host.
Claim status: MEASURED (own read-only artifact, dated; reuses the shipped scorer; bounds the entry-0017 sub-floor tail). The recoverable figure (48 fires /
4,626 ac) is stated as a hard upper bound; the operative claim is the verdict — the sub-floor coverage lever is real but low-yield, revisit-cadence is not the
limiter, and sub-pixel fire size is.
Hard bound (summer-only + upper-bound + no-imagery). All data is summer 2026 and a single run-18-equivalent window; a true off-season or multi-window
distribution is deferred until more seasons exist. Every recoverability number is an upper bound derived from revisit geometry and reported fire size, not
from actual S2/L9 scenes — we did not confirm a single cloud-free daytime SWIR anomaly; cloud, solar-zenith, active-flaming/overpass coincidence, and the fusion-gate/attribution
requirement all reduce the realistic yield below the bound. The 10 nm (18.5 km) match radius is the scorer’s own, so the sub-floor set is itself a soft upper bound on
true blindness. IRWIN size fields are human-reported and often stale for open records; the ≥1-acre SWIR floor is a rule-of-thumb, not a validated per-scene threshold.
Literature alignment. Verdict: AGREEMENT. That mid-resolution SWIR imagers (Sentinel-2 MSI, Landsat-8/9 OLI) can detect active fires well below their pixel
size via the 1.6/2.2 µm sub-pixel radiance signal — but with a practical floor set by fire radiant area, cloud, and revisit — is the established finding
[10][12], and that their multi-day revisit makes them a complement to, not a replacement for, the daily polar/geostationary active-fire
products [1][3] is the standard operational view. Our result is consistent: the geometry permits recovery of the larger, persistent remote
burns but not the sub-pixel point-record mass, so SWIR is a narrow complement here, not a coverage fix.
What this does not claim: that no sub-floor fire is recoverable — up to 48 (upper bound), realistically a couple dozen larger Alaska burns, plausibly are;
that S2/L9 SWIR is useless — OLDGABE already ingests an S2 SWIR hotspot source and this quantifies the ceiling on densifying it; nor that the sub-floor set is fixed —
it drifts with the open-record roster and season. Next: if the larger-fire recovery is pursued, stand up a default-OFF, Alaska-focused swir_cadence_shadow
restricted to ≥10-acre IRWIN-active fires with no core-sensor touch in-window, add L9/L8 to the existing S2 SWIR feed, and measure recovered-recall vs added-FP over ≥14 runs with
CIs before proposing any cutover — but weigh it against the far larger liveness/persistence lever (1,285 fires) from entry 0017, which remains the dominant recall investment.
How fast does OLDGABE surface a real fire? — the first end-to-end detection-latency measurement, and why the “we detect it before it’s reported” number is mostly a lookback artifact
Date: 2026-07-10 Status: MEASURED (own read-only artifact; new operational metric) — headline is lookback-sensitive; the artifact-free number is stated plainly
The framing. Twenty-four entries have measured OLDGABE’s recall, precision/FP, and coverage — but never latency: once a real fire starts, how quickly does OLDGABE actually surface it? A firefighter cares about speed as much as about whether a fire is found at all. This is the first entry to measure time-to-first-detection end-to-end, and the honest answer comes with a large caveat that turns out to be the finding.
BLUF. Against IRWIN’s reported discovery time as the t₀ proxy, OLDGABE’s defensible, artifact-free latency — its first independent post-discovery detection within 10 nm — has a median of +9.2 h, with 19.8% surfaced within 1 h, 40.4% within 6 h, and 68.9% within 24 h of the reported discovery (n = 2,932 fires). The tempting headline — “OLDGABE detects 71% of fires before they are reported (median −25 h)” — is not a defensible detection-skill claim: the median slides monotonically with the pre-discovery lookback window we allow (−25 h at a 48 h cap → −7 h at 24 h → +3.5 h at 6 h → +9.2 h at 0 h), which is the exact signature of a persistent-pixel spatial-association artifact — a 10 nm cell in fire country carries near-continuous GOES/HMS pixels that are not this ignition. On the fastest-path question: GOES-ABI wins the first-arrival race (it is the first sensor with any pixel in-cell for 76.2% of fires, on 5–15 min cadence), but its genuine post-report detection of a new fire is the slowest of the thermal sensors (median +13.8 h) because of coarse sensitivity; the polar/analyst products deliver tighter genuine confirmation (VIIRS +5.8 h, HMS +0.6 h). Cadence wins the first-pixel race; sensitivity wins the genuine-detection race.
Populations & t₀ (reproducible). Truth reuses the shipped scorer’s methodology (daemons/te_daily_scorer.py): IRWIN fires = fire_event_evidence where source='IRWIN', deduped on IrwinID/UniqueFireIdentifier, filtered to IncidentTypeCategory∈{WF,WFU}, 10 nm haversine match. t₀ = FireDiscoveryDateTime — explicitly a reported, human-entered discovery time and an ignition proxy, not true ignition; it can lag real ignition by hours, and OLDGABE can legitimately detect before it. OLDGABE’s own sensor evidence in this DB begins 2026-05-29, so the clean latency set is the 3,163 WF/WFU fires discovered inside coverage (2026-05-30→2026-07-09) — fires discovered earlier are excluded to avoid coverage-start censoring. Latency = (first OLDGABE evidence obs time for a promoted event within 10 nm) − FireDiscoveryDateTime, signed; negative = OLDGABE-first. Promoted = event status∈{confirmed,confirmed_growth,awaiting-confirmation,pre-ignition}.
Timezone verification (get this wrong and the whole metric is wrong). The host runs America/New_York (EDT, −04:00). detected_at is stored ISO-8601 with a Z suffix and the provider raw.detected field matches it verbatim — i.e. UTC; FireDiscoveryDateTime is epoch-milliseconds UTC. This analysis converts every timestamp with calendar.timegm (pure UTC), not the shipped scorer’s time.mktime (which interprets the string in host-local time). We verified the hazard numerically: for the same wall-clock string, timegm and mktime differ by exactly 4.0 h (the EDT offset) — so the local-time path would have skewed every latency by +4 h. Both fields are handled in UTC throughout.
Result 1 — the lookback-sensitivity table (this is the finding). Same fires, same 10 nm match, only the pre-discovery lookback cap varies. If the negative latencies were genuine early detections of the same ignition they would sit at stable, physically-plausible offsets; instead the median tracks the cap and the negative tail piles against whatever floor is imposed — the tell of spatial association, not detection:
pre-discovery lookback cap
n
median (h)
% negative (OLDGABE-first)
≤6 h
≤24 h
0 h (post-discovery only — artifact-free)
2,932
+9.2
0.0%
40.4%
68.9%
3 h (physically plausible)
2,947
+6.6
23.4%
48.7%
71.0%
6 h (physically plausible)
2,953
+3.5
35.8%
55.6%
73.1%
24 h
2,975
−7.2
61.5%
69.9%
79.3%
48 h (the tempting “we beat the report” number)
2,988
−25.1
71.2%
77.0%
83.1%
At a 48 h cap the negative tail jams against the floor (p10 −45.9 h, p25 −41.8 h) — manufactured, not earned. Within a physically plausible ≤6 h pre-report window, ~36% of fires do surface before the human report, a real and useful signal but itself a mix of genuine early detection and residual association; we do not claim the ≥24 h figures.
Result 2 — artifact-free latency distribution (0 h floor, post-discovery).
metric
p10
p25
median
p75
p90
latency after reported discovery (h)
+0.2
+2.1
+9.2
+36.3
+118.1
fraction surfaced within
≤1 h
≤3 h
≤6 h
≤12 h
≤24 h
share of the 2,932-fire latency set
19.8%
28.7%
40.4%
55.3%
68.9%
Result 3 — by first-detecting sensor: cadence vs sensitivity, in real latency terms. First-arrival share is unambiguous (who has the earliest in-cell pixel); genuine post-report latency is the artifact-free per-family view (0 h floor):
sensor family
first-arrival share
post-discovery median (h)
≤1 h
≤6 h
role
GOES-ABI (5–15 min cadence)
76.2%
+13.8
11.0%
31.2%
wins first-arrival by cadence; coarse → slowest genuine detection
HMS (analyst smoke/fire product)
11.6%
+0.6
58.0%
71.8%
near-zero — but partly reflexive with the report (see bound)
VIIRS 375 m (polar, ~12 h revisit)
7.4%
+5.8
15.7%
52.9%
sensitive; tight within-day genuine confirmation
S1/S2 (SAR / SWIR)
2.1%
+16.5
5.9%
35.3%
slow-cadence complement (cf. entry 0024)
CAM-SMOKE (ground camera)
2.0%
+6.4
13.6%
47.0%
83% within 12 h where cameras exist; visibility-bound (cf. entry 0006)
MODIS (polar)
0.6%
+4.9
28.6%
52.4%
small-n; superseded by VIIRS in the constellation
Result 4 — by fire size (final acres) and region (0 h floor). Bigger fires are not systematically detected sooner: they are caught within the first hour more often (≥100 ac: 32.1% ≤1 h vs 16.0% for <1 ac — they are bright) but carry a longer median (≥100 ac +31.4 h; <1 ac +12.5 h; 10–100 ac +3.2 h), a reporting-promptness confound — large fires are reported by humans very fast, so OLDGABE’s independent detection more often trails a prompt report. Geographically, Alaska (+11.7 h) and CONUS (+9.2 h) are similar, but the West (+8.0 h, 72.9% ≤24 h) is far faster than the East (+42.4 h, 42.7% ≤24 h) — eastern fires are smaller, promptly human-reported, and often under canopy.
cut (0 h floor)
n
median (h)
≤1 h
≤24 h
size <1 ac
1,561
+12.5
16.0%
63.5%
size 1–10 ac
357
+9.2
28.6%
65.8%
size 10–100 ac
157
+3.2
38.9%
70.1%
size ≥100 ac
131
+31.4
32.1%
49.6%
region West
2,526
+8.0
20.7%
72.9%
region East
377
+42.4
13.8%
42.7%
region Alaska
29
+11.7
20.7%
62.1%
Survivorship pairing (do not read this as “OLDGABE finds everything in 9 h”). The latency set is conditioned on fires OLDGABE actually surfaced: of the 3,163 in-window fires, 2,988 (94.5%) had a promoted event within 10 nm at some point in their active window (2,932 with a post-discovery detection). That 94.5% is a generous ever-detected figure — any promoted evidence anywhere in the active window — and sits alongside, not in place of, the stricter operational recall and the sub-floor coverage tail already quantified in entries 0003 / 0007 / 0017 / 0024. Latency is measured on the fires we find; it says nothing about the ones we miss.
Verdict. The honest headline is the artifact-free one: median ~9 h to independent post-discovery detection, ~20% within an hour, ~40% within 6 h, ~69% within a day. The “detects 71% of fires before they are reported” framing is a lookback artifact and is retired here. The fastest first-alert path is a genuine cadence-vs-sensitivity split: GOES-ABI arrives first for three of four fires on cadence alone, but for a new small fire the sensitive polar overpass (VIIRS) and the analyst product (HMS) deliver the tighter genuine confirmation. Latency lever (research observation, not a flip): the data does not support a naive “GOES-first low-latency tier” — GOES owns first-arrival largely through cadence and persistent in-cell pixels, and its genuine new-fire detection is the slowest of the thermal sensors. The observations worth a default-OFF shadow probe are (1) an early-latency tier that pairs GOES cadence for breadth with a VIIRS-overpass / HMS weighting for genuine new-fire confirmation, measured for time-saved vs added-FP; and (2) a camera-first low-latency tier where camera coverage exists (CAM-SMOKE: +6.4 h median, 83% within 12 h), consistent with — and bounded by — the visibility limit of entry 0006. Neither changes a shipped number.
Reproducibility detail. Read-only replay against OLDGABE oldgabe.db (mode=ro URI + PRAGMA query_only=ON), no writes; run under the host-health gate (serving unit active, else exit 75) and resource-guarded (host busy-marker honored — this run deferred to a busy marker once and waited for it to clear before proceeding), nice -n19, server-side timeout, on the host /tmp. Truth loader mirrors te_daily_scorer._load_irwin: IRWIN raw JSON, dedupe on IrwinID/UniqueFireIdentifier, WF/WFU only, FinalAcres→IncidentSize for size, POOState for region, FireDiscoveryDateTime/FireOutDateTime epoch-ms. Candidate detections = non-IRWIN fire_event_evidence joined to a promoted fire_events row, detected_at≥2026-05-28 (16,740,068 rows), bucketed into 1°×1° cells with 3×3-neighbour probing, then 10 nm (18.52 km) haversine gate. Per fire, evidence is sorted earliest-first and the first detection at-or-after (discovery − cap) is taken for each lookback cap ∈ {0,3,6,24,48} h; the family of that detection is the first-detecting sensor. All time math is UTC via calendar.timegm. Fire counts: 3,688 deduped WF/WFU total → 3,163 discovered in coverage window → 2,988 with a promoted event within 10 nm (2,932 with a post-discovery detection). Only artifact written was a /tmp JSON on the host.
Claim status: MEASURED (own read-only artifact, dated; reuses the shipped scorer’s truth). The operative claim is the artifact-free distribution (median +9.2 h post-discovery; 19.8/40.4/68.9% within 1/6/24 h) and the cadence-vs-sensitivity split; the negative-latency / “OLDGABE-first” figures are reported only as a lookback-sensitivity series and are explicitly not claimed as detection skill beyond a ≤6 h plausible window.
Hard bound (reported-time proxy + survivorship + single summer window). The dominant caveat is that FireDiscoveryDateTime is a reported, human-entered time, not ignition: both the large negative tail and part of the positive tail are reporting-time artifacts, not detection latency — which is exactly why the median moves with the lookback cap. Latency is measured only on fires OLDGABE detected (survivorship), so it must be read with the recall/coverage entries, not as universal speed. All data is summer 2026 in a single ~6-week window (OLDGABE sensor evidence starts 2026-05-29); off-season and multi-window latency are deferred. The 10 nm match radius is the scorer’s own and admits some cross-fire association in dense fire country; HMS’s near-zero latency is partly reflexive because the analyst product ingests same-day reports/imagery. Alaska (n=29–34) and MODIS (n=18–21) cells are small-n.
Literature alignment. Verdict: AGREEMENT. That geostationary imagers detect and revisit far faster than polar sensors (minutes vs a ~12 h revisit) while polar 375 m sensors are more sensitive per overpass is the established operational trade-off [3][8][1], and dedicated GOES early-fire-detection work frames timeliness as a cadence-driven quantity with a sensitivity floor [13] — consistent with our result that GOES wins first-arrival but lags on genuine small-fire detection. That reported fire-discovery times in US incident databases are human-entered and biased is likewise documented [6], which is precisely why we treat t₀ as a proxy and refuse the pre-report headline.
What this does not claim: that OLDGABE detects most fires before they are reported (that figure is a lookback artifact); that median 9 h applies to fires OLDGABE misses (it does not — survivorship); that GOES is “fastest” in a useful sense (it is fastest to arrive, slowest to genuinely detect a small new fire); nor that any latency tier should ship. Next: if the early-latency observation is pursued, stand up a default-OFF latency_tier_shadow that (a) weights VIIRS-overpass / HMS confirmation for genuine new-fire alerts and (b) enables camera-first alerting only inside proven camera coverage, and measure time-saved vs added-FP over ≥14 runs with CIs before proposing any cutover — and re-measure the whole distribution once a non-summer window and true ignition timestamps (where obtainable) exist.
The liveness lever, backtested to a cutover decision — 38 day-slices say it buys ~7.6 recall points at ~20% precision, and the honest recommendation is NO-GO for surfacing
BLUF. Entry 0019 built the two-condition active-fire liveness gate as a hidden shadow and promised a ≥14-run forward validation with a recovered-continuity-vs-added-FP curve before any cutover. Rather than wait, we backtested the gate retrospectively across 38 daily slices (2026-06-01→2026-07-08), reconstructing for each day what a plain 24 h roster would surface vs. what production+liveness would surface, scored against a retrospective IRWIN active-roster truth. The result is decisive and it is a NO-GO. At the current operating point (10 nm, 72 h, both conditions) the lever recovers a real but modest +7.6 recall points (95% CI +4.8 to +10.4) — lifting the day-of roster recall from 23.7% to 31.3% — but it does so at a lever precision of only ~19.7%: it keeps roughly four IRWIN-uncorroborated fires for every one genuinely-active fire it rescues. The reason is structural and was hiding in the feed: IRWIN publishes no FireOutDateTime at all (0 of 992,511 rows), so condition (a) — “IRWIN still lists it active” — can never retire a dead fire, and the entire FP-safeguard rests on condition (b), the recent-sensor-touch window. Condition (b) is confirmed strongly load-bearing (dropping it inflates added-FP ~10×), but even with it the surfaced-roster precision caps near 20%. A continuity tier at 20% precision would inflate a firefighter-facing map ~5×; we do not flip it.
The backtest (retrospective, using full future knowledge). The single-snapshot daemon of entry 0019 called the one residual added-FP — an IRWIN-active fire that is actually out — “unmeasurable in one run.” The backtest measures exactly it. Because the feed never carries a FireOut timestamp, the real retrospective “out” signal is that IRWIN stops refreshing an incident once it is over. For each WF/WFU incident we take its full ingest span and define truth-active(T) := discovery−24 h ≤ T ≤ last-ingest+24 h (the 24 h pad mirrors the shipped scorer te_daily_scorer.py). At each slice T we reconstruct the deployed gate as-of T — keep a confirmed fire when (a) a WF/WFU IRWIN incident is present within 10 nm with first-ingest≤T (its deployed “still active” semantics, since no FireOut ever arrives) and (b) a core-sensor touch (VIIRS/MODIS/GOES/HMS) landed within the liveness window — and score each kept fire against truth-active(T). A confirmed OLDGABE fire is single-day in this DB (a multi-day fire spawns one confirmed event per day at the same location), so the lever’s reach is precisely the 24→72 h gap after a fire’s last imaging.
Operating point — recovered-recall vs added-FP, mean ± 95% CI over 38 slices (10 nm, 72 h, both conditions):
metric (per day-slice unless noted)
mean
95% CI
day-of roster recall, plain 24 h production
23.7%
16.9 – 30.6%
day-of roster recall, production + liveness
31.3%
22.6 – 40.1%
recovered-recall (the gain)
+7.6 pts
+4.8 – +10.4
fires kept “active” by the gate
~177
116 – 237
of which genuinely IRWIN-active (continuity TP)
~35
22 – 47
of which added-FP (no IRWIN-active fire within 10 nm at T)
~142
93 – 191
lever precision (continuity TP / kept), pooled over all slices
19.7%
per-slice 15.3 – 22.8%
Pooled across the 38 slices the gate keeps 1,321 genuinely-active fires and 5,395 added-FPs. So the lever’s recall gain is real and its confidence interval clears zero comfortably — but ~80% of what it keeps is not corroborated as active by IRWIN at that moment. That is the FireOut-lag cost the earlier snapshot could not see, now quantified.
Sensitivity — and the proof that condition (b) is load-bearing. Same 38 slices; one knob varied at a time. Added-FP is the mean per-slice cost:
gate configuration
recovered-recall (95% CI)
lever precision
added-FP / slice
operating: 10 nm, 72 h, both conditions
+7.6 (+4.8, +10.4)
19.7%
~142
10 nm, 24 h, both
+0.0 (0, 0)
—
0
10 nm, 48 h, both (conservative knee)
+4.6 (+2.6, +6.6)
20.4%
~72
10 nm, 96 h, both
+9.9 (+6.7, +13.2)
18.6%
~211
10 nm, 168 h, both
+16.3 (+11.6, +20.9)
16.9%
~386
5 nm, 72 h, both
+7.1 (+3.8, +10.4)
15.4%
~101
10 nm, 72 h, condition (b) DROPPED (cond a only)
+48.1 (+41.4, +54.7)
14.3%
~1,372
Reading the table: the 24 h window recovers nothing — by construction, a 24 h liveness window is the production roster, so the lever only ever acts in the 24→72 h gap. Widening the window buys recall almost linearly (48→72→96→168 h) at flat ~17–20% precision and steeply rising FP, so there is no window that makes this cheap; 48 h is the conservative knee (half the FP for two-thirds of the gain). Tightening the radius to 5 nm lowers precision (15.4%), so 10 nm is not the problem. The decisive row is the last one: dropping condition (b) multiplies added-FP roughly ten-fold (~142→~1,372 per slice; pooled 5,395→52,150) and drags precision to 14.3% — condition (b) removes ~90% of the FireOut-lag FP mass. This confirms entry 0019’s claim that the recent-sensor-touch condition, not the IRWIN listing, is what protects the roster — because IRWIN’s listing never expires in this feed.
The cutover PROPOSAL (mechanism described; recommendation is NO-GO — nothing is flipped). Were this ever promoted, the minimal reversible mechanism is: the serving query today is last_seen ≥ now−24h AND tier ≠ 'fp' AND confidence ≥ 0.10 over fused_fires. Add a default-OFF flag OLDGABE_LIVENESS_SURFACE (0 by default → query byte-for-byte unchanged). When set to 1, the time predicate becomes (last_seen ≥ now−24h) OR (fused_id ∈ keep_active set from the gated table, computed within the last 6 h), with those rows tagged a distinct tier='continuity' so the existing precision predicate (tier≠'fp', confidence≥0.10) and the aging logic still apply, the map/legend can style them apart from fresh confirmed detections, and they can never outlive the liveness window (aging still expires them at ≤72 h). The change is additive: no schema rollback, no data migration. The one-line reversal is OLDGABE_LIVENESS_SURFACE=0 — the serving query reverts to the exact current 24 h behavior and the continuity tier is simply never selected. Proposed operating point if pursued: the conservative 10 nm / 48 h / both-conditions knee (+4.6 recall pts at 20.4% precision, ~72 added-FP/slice). Measured cost at the current 72 h point: +7.6 recall pts for ~142 added-FP/slice at ~20% precision.
Go / no-go.NO-GO for public surfacing at any operating point measured. The binding fact is that this IRWIN feed carries no FireOut/containment timestamp, so the gate cannot retire dead fires and rides entirely on the recent-touch window; that caps surfaced-roster precision near 20% (added-FP ~80%). For a firefighter-facing roster whose entire value is precision (entries 0003 / 0007), a 5× roster inflation is the wrong trade. The recommendation is to keep the lever GATED as a shadow, do not flip. The only surfacing worth reconsidering later is a clearly-labeled, opt-in, default-OFF monitoring/continuity overlay kept strictly separate from the confirmed roster — and only after a genuine de-activation signal (a real FireOut/containment ingest, or a persistence/decay model) exists to power condition (a). Mark decides; this entry does not change any shipped number.
Reproducibility detail. Read-only replay against OLDGABE oldgabe.db (mode=ro URI + PRAGMA query_only=ON); the only writes were the hidden shadow table event_liveness_backtest_shadow (one row per day-slice), its canary_meta row (surface_allowed=0) and a DO_NOT_SURFACE_event_liveness_backtest_shadow marker — the production serving table fused_fires (14,265 rows) and the fusion/aging logic were untouched, and no serving module reads the shadow. Run under the host-health gate (serving unit active, else exit 75), resource-guarded (host busy marker honored, nice -n19, server-side timeout), on the host’s own storage. Populations: confirmed fires = event_ground_truth.confirmed=1 with a core-sensor touch (43,974), each with its min/max core-touch time per canonical_event_id. IRWIN incidents deduped by IrwinID, filtered to IncidentTypeCategory∈{WF,WFU} (3,696), gridded at 0.1° and matched by haversine; FireDiscoveryDateTime is epoch-ms, and FireOutDateTime/ContainmentDateTime/ControlDateTime are null in 0 of 992,511 IRWIN rows — hence the ingest-recency truth. Day-slices at noon UTC, 2026-06-01→2026-07-08 (38), with a 72 h lookback warm-up at the window start and a 2-day trailing buffer so “out” is observable. Truth-active(T)=disc−24h≤T≤last-ingest+24h; recovered-recall over the coverage-bounded IRWIN-active roster (incidents with ≥1 confirmed fire within 10 nm); added-FP = kept fire with no truth-active incident within radius at T. Aggregation is mean ± 1.96·SD/√n across slices; precision figures are pooled TP/(TP+FP). Only artifact off-host was a /tmp-class JSON on the host itself.
Claim status: SHADOW, GATED, MEASURED (retrospective backtest; nothing surfaced, nothing flipped). The operative claims are the operating-point curve (+7.6 recall pts at ~19.7% lever precision, 95% CIs over 38 slices) and the condition-(b) load-bearing result (dropping it multiplies added-FP ~10×). The deliverable is a cutover proposal with a NO-GO recommendation.
Honest bounds. (1) The dominant one: this IRWIN feed publishes no FireOut/containment time (0/992k rows), so “IRWIN FireOut lag” is really FireOut absence — condition (a) is inert as a de-activation signal, which is why the FP cost is high; a feed that carried FireOut, or a persistence/decay model, could change the verdict. (2) The ~19.7% lever precision is an IRWIN-anchored lower bound: some added-FP are real fires IRWIN under-reports or has not yet listed as active — but we cannot claim them, so the surfacing decision correctly uses the lower bound. (3) The 10 nm match radius can credit an adjacent fire in dense fire country (5 nm was tested and is worse, not better). (4) Survivorship: the lever only ever helps fires already confirmed once — it is continuity, not detection. (5) A single summer window (OLDGABE evidence starts 2026-05-29) with a sparse mid-June patch (several slices have a small active-incident denominator); the CIs already carry that variance, and off-season / multi-window re-measurement is deferred.
Literature alignment. Verdict: AGREEMENT. Polar sensors revisit a location only a few times per day [1][3] while geostationary FDC refreshes far more often [8], so a genuinely active fire routinely goes unre-imaged for many hours — the exact 24→72 h gap this lever targets, and why a recent-touch window is a sound activeness proxy. That US incident records lag and under-report status transitions — discovery, containment, and out times especially [6][14] — is precisely what we observe in the extreme (no FireOut at all), and is why condition (a) alone cannot carry the safeguard and condition (b) must.
What this does not claim: that the lever should be surfaced (it should not, at any operating point measured); that 20% lever precision is the fires’ true active-rate (it is an IRWIN-anchored lower bound); that 72 h is optimal (48 h is the cheaper knee); nor that this touches detection recall (entry 0017’s ~96% stands — this is roster continuity only). Next: the lever stays a gated shadow; revisit only if a real de-activation signal (FireOut/containment ingest or a persistence-decay model) becomes available to power condition (a), or if an explicitly-labeled opt-in monitoring overlay — separate from the confirmed roster — is desired, re-measured off-season before any flip.
Temporal dynamics is the first added channel that alone nearly matches production out-of-time — but it can’t be promoted, because the part that transfers is GOES persistence, which production already encodes
Date: 2026-07-10 Status: MEASURED NEGATIVE (out-of-time) — temporal dynamics is not a promote candidate, but it is the strongest single channel yet — refines entries 0018/0023
BLUF. Entries 0018 and 0023 killed the recovery re-ranker’s geography channel — raw lat/lon (0018) and physical terrain
(0023) both failed the temporal-transport gate on the reporting-bias-free neutral truth. The one feature channel never tried is temporal dynamics:
the shape of a candidate’s own detection time-series (FRP trajectory, GOES multi-frame persistence, diurnal signature, multi-overpass growth,
duration) — physical and non-memorizable, and exactly what a static FRP threshold cannot see. We engineered 20 temporal features strictly from each
event’s pre-decision observations and ran the identical gate. Two findings, one negative and one genuinely new. (1) The promote question is
still no: recovery+temporal reaches neutral AUC 0.559 — nowhere near production (0.856), and only +0.004 AUC / +0.004
PR-AUC above recovery det-only (0.555). Adding temporal shape to the recovery model buys nothing out-of-time. (2) But temporal shape is not inert
like geography was: temporal-dynamics alone reaches neutral AUC 0.840 — the strongest single added channel we have measured
(geo-only was 0.72 raw / 0.58 physical), nearly matching production, and unlike geography it does not collapse from honest to neutral truth (0.852 → 0.840,
transferring almost intact). Permutation importance shows why it can’t be promoted: the transferable signal is GOES multi-frame persistence
(tf_n_goes, dominating by 5–10×) — the exact quantity production’s tier_and_conf already uses. Temporal dynamics
re-derives production’s own persistence lever; it does not exceed it. The canary stays gated.
The split (identical to entries 0018/0023). The same CAUTION candidate set, the same 19 detection-only base features, the same honest training
label, the same neutral evaluation label, the same model. Train on first_det in 06-27–07-02 (123,931 events), a 07-03 gap, test strictly-later
07-04–07-06 (38,549 events). Models train on the honest (IRWIN/perimeter/confirmed) truth and are evaluated out-of-time against the NEUTRAL truth — an
independent VIIRS/MODIS detection (belonging to a different canonical event) within 5 km in a subsequent overpass (t0+3 h…t0+72 h),
gridded 0.05°×6 h over CONUS, HMS/IRWIN-independent. Neutral base rate on the holdout is 3.35% (1,292 positives) — reproducing entries 0018/0023. The
only change vs entry 0023 is the added channel: temporal-dynamics features instead of geography.
The temporal features, and the leakage cutoff (stated explicitly). For each candidate, t0 = first_det = MIN(detected_at) over its
non-leaky sources. Temporal features are built only from that event’s own non-leaky observations with detected_at < t0 + 3 h — the
pre-decision accumulation window [t0, t0+3h), which ends exactly where the neutral evaluation window [t0+3h, t0+72h] opens. The two
windows are temporally disjoint by construction, so no temporal feature can incorporate the subsequent-overpass detection that defines the
neutral label — nor any other detection in that window — and the code asserts max(pre-obs) < t0+3h per event. This is a stricter
non-leakage standard than the 19 base features receive (those aggregate the full event span, as in 0018/0023), so the temporal channel is held to a higher bar than the
baseline it is added to. IRWIN/HMS/SAR/S2 confirmation channels stay excluded from features, as in 0018/0023. The 20 features cover: FRP trajectory (slope per hour,
first/last/delta/range/std/max); GOES persistence (frame count, temporal span, fraction-of-expected-frames, max inter-frame gap); diurnal signature (day&night
present, night ratio); multi-overpass growth (distinct overpasses, 2h-vs-1h detection growth); and duration/recency (obs count, span, inter-obs interval mean/std, spatial spread).
Out-of-time on the NEUTRAL (reporting-bias-free) truth — the gate.
scorer
AUC
PR-AUC
recall@90%p
recall@80%p
production tier_and_conf
0.856
0.262
0.00
0.00
recovery, det-only (19 feat)
0.555
0.102
0.00
0.00
recovery + TEMPORAL dynamics (39 feat)
0.559
0.106
0.00
0.00
temporal-dynamics-only (20 feat)
0.840
0.220
0.00
0.00
The promote question fails on both counts — but the control tells a new story. Recovery+temporal (0.559) does not beat
production (0.856): it is 0.30 AUC below. And it does not meaningfully beat recovery det-only (0.555): a +0.004 AUC / +0.004 PR-AUC nudge, inside the
noise. So the tested scorer — adding temporal shape to the recovery re-ranker — is a clean negative, exactly like geography. What is different from
0018/0023 is the last row: temporal-dynamics alone reaches 0.840 AUC, only 0.016 short of production and dramatically above the geo-only
controls (raw lat/lon 0.723; physical terrain 0.583). Temporal shape, unlike geography, carries real out-of-time neutral signal. Every scorer still scores 0 at the
80/90% precision operating points on this sparse 3.35%-base truth, so the discrimination comparison rests on AUC/PR-AUC.
The paradox, and its resolution: temporal-only 0.840 but recovery+temporal only 0.559. How can a channel that scores 0.840 alone add nothing
(+0.004) when bolted onto det-only? Because every model is trained on the honest (HMS-inclusive, reporting-biased) label and then scored on the
neutral truth. The detection features fit the biased honest label slightly better (det-only honest AUC 0.877 vs temporal-only 0.852) but their honest-fit ranking
transfers poorly to the unbiased neutral truth (0.877 → 0.555, a 0.32 collapse). The temporal features fit honest truth marginally worse, but the
honest-fit they find is dominated by GOES persistence — a physical quantity aligned with what the neutral polar truth actually rewards — so it transfers
almost intact (0.852 → 0.840). When both feature blocks are present, the detection features win the internal honest-fit competition and pull the combined
model back toward the non-transferring solution; the transferable persistence signal is masked. The clean transferable signal only surfaces when temporal features are
used alone.
What carries the temporal signal — permutation importance on the neutral truth (the gate). Permuting each temporal feature in the combined
model and measuring the drop in neutral AUC:
One feature — tf_n_goes, the count of GOES frames in the first 3 h — carries the temporal signal, by 5–10× over everything
else. That is persistence: a real fire lights up many consecutive geostationary frames; a transient false alarm flickers a few. And it is precisely the
quantity production’s tier_and_conf rule already uses (its n_goes ≥ 3 persistence clause). The elaborate FRP-trajectory,
diurnal, and growth features — the parts a static threshold genuinely cannot see — add nothing or actively hurt out-of-time. Temporal dynamics, stripped to
what transfers, is GOES persistence, and production is already a persistence rule.
For contrast — the same holdout scored against the HONEST (HMS-inclusive) truth.
scorer (vs honest truth)
AUC
PR-AUC
recall@80%p
production tier_and_conf
0.884
0.485
0.072
recovery, det-only
0.877
0.653
0.530
recovery + TEMPORAL dynamics
0.879
0.654
0.537
temporal-dynamics-only
0.852
0.533
0.143
On the honest truth, temporal dynamics adds a trivial +0.002 AUC to det-only — and here is the tell that separates it from geography: raw lat/lon added
+0.068 AUC on honest truth (0018) by memorizing the reporting surface, then collapsed on neutral truth. Temporal dynamics adds almost nothing on honest truth
(it cannot memorize the reporting surface either) yet nearly matches production on neutral truth — the opposite honest-vs-neutral fingerprint from
geography. Temporal shape is honest and physically transferable; it just is not orthogonal to the production baseline.
Reproducibility detail. Read-only on the production DB (mode=ro + PRAGMA query_only=ON), no production writes,
health-gated on the host and resource-guarded (private serialization marker while still honoring the hard host busy marker; SIGTERM-safe; the only artifact written is a
/tmp JSON). Candidate set, 19 detection-only features, honest label, split, and model are byte-for-byte the entry-0018/0023 harness: candidates =
event_corroboration_tier where tier='CAUTION' joined to non-leaky fire_event_evidence (IRWIN/HMS/SAR/S2 confirmation channels
excluded from features); model = HistGradientBoostingClassifier (max_iter 400, lr 0.06, 31 leaves, min_leaf 20, l2 1.0, class_weight balanced, early
stopping), trained on 06-27–07-02, scored on 07-04–07-06 (07-03 gap). Training label = honest truth (confirmed OR an IRWIN fire-day /
perimeter within 5 km & ±14 d). Neutral evaluation label = an independent VIIRS/MODIS detection from a different canonical
event within 5 km in a subsequent overpass (t0+3 h…t0+72 h), gridded 0.05°×6 h over CONUS. Production baseline =
tier_and_conf reconstructed per event from its full canonicalized source set / GOES-frame count / max FRP. Temporal features (20):
FRP trajectory (slope h⁻¹, first/last/delta/range/std/max), GOES persistence (frame count, span, fraction-of-expected-frames at ~10 min cadence,
max inter-frame gap), diurnal signature (day&night present, night ratio), multi-overpass growth (distinct overpasses at >30 min separation, 2h-vs-1h
detection growth), and duration (obs count, span, inter-obs interval mean/std, max pairwise spatial spread) — all computed on the strict pre-decision subset
detected_at < t0+3h (asserted per event). Permutation importance via sklearn.inspection.permutation_importance (scoring=roc_auc,
8 repeats) on the neutral test truth. Metrics via roc_auc_score, average_precision_score, and precision_recall_curve operating
points. The hidden canary table event_caution_recovered_geo is unchanged and remains gated (surface_allowed=0); nothing was surfaced.
Harness reproduction (matches entries 0018/0023). This run reproduces the shared controls exactly: 123,931 train / 38,549 test events, neutral base
rate 3.35% (1,292 positives), production neutral AUC 0.856 / PR-AUC 0.262, and the full honest-truth panel (production 0.884/0.485; det-only 0.877/0.653). As flagged in
entry 0023’s reconstruction note, the honest-trained recovery model’s neutral AUC reads near-chance under strict independence (det-only 0.555 here,
consistent with 0023’s 0.534/0.552 band, versus 0.837 in entry 0018’s one-off builder). Because the promote decision rests on the within-run deltas
(recovery+temporal vs production and vs det-only, measured on one fixed truth in one run), it is robust to that reconstruction sensitivity.
Claim status: MEASURED NEGATIVE, out-of-time. Temporal-dynamics features are not a promote candidate: under strict
train-early/test-late transport, recovery+temporal does not beat production on the reporting-bias-free truth (0.559 vs 0.856) and does not meaningfully beat
detection-only recovery (+0.004 AUC / +0.004 PR-AUC). No shadow build is recommended. The canary stays gated (surface_allowed=0). This
refines entries 0018/0023: temporal shape is the first added channel that alone nearly matches production out-of-time (0.840), but its transferable content is
GOES multi-frame persistence — already encoded in the production rule — so it adds no orthogonal, promotable value.
Hard bound (summer-only + fixed pre-decision window). All data is summer 2026, so this is a train-earlier / test-later split within summer
(days apart, not seasons); a true off-season validation is impossible until winter data exists and remains deferred. The pre-decision accumulation
window is fixed at 3 h (chosen so it ends exactly where the neutral window opens, guaranteeing disjointness); a longer accumulation window would enrich the
persistence/trajectory features but also delay the decision, and is deferred. The neutral base rate (3.35%, 1,292 positives) is sparse enough that
PR-AUC and the extreme precision operating points are noisy — all four scorers read 0 at 80/90%p — so the comparison rests on AUC/PR-AUC discrimination.
Literature alignment. Verdict: AGREEMENT. Multi-frame temporal persistence is the backbone of geostationary fire detection — the GOES-R ABI
fire algorithm and the GOES Early Fire Detection algorithm both exploit frame-to-frame persistence and temporal behaviour [8][13],
validated against polar sensors [3]; the diurnal fire cycle [15] and individual-fire growth/duration tracking
[16] are standard temporal descriptors. Our result agrees on the physics — the temporal signal that transfers is persistence — and adds
the operational finding that a static family/FRP rule which already counts GOES frames (n_goes ≥ 3) has already captured that
transferable persistence, so re-deriving it as an ML feature channel yields no out-of-time gain over the baseline. The out-of-time discipline
[4] is what distinguishes “temporal shape looks predictive” (true) from “temporal shape adds promotable value over production”
(false, here).
What this does not claim: that temporal dynamics is irrelevant — it is the strongest single added channel we have measured (0.840
neutral AUC alone, far above any geographic prior) and it transfers honest→neutral almost intact; that the recovery program is dead — detection-only
recovery still carries honest-truth signal (0.877 AUC / 0.653 PR-AUC); nor that no temporal construction could ever beat production — only that this rich
20-feature pre-decision temporal set does not, because its transferable content collapses onto GOES frame-count, which production already uses. Next:
the honest open question is whether any temporal shape beyond raw frame-count — cadence regularity, steady-vs-flicker persistence quality — is
orthogonal to n_goes; we tested the obvious candidates (tf_goes_frac_present, tf_goes_max_gap_min, tf_std_interobs_min)
and their neutral-AUC importance is negligible, so the burden of proof is on a materially richer persistence-quality feature. Until then, the production FRP/persistence
rule remains the scorer to beat — and it already sees the part of temporal shape that matters.
The gate is doing its job. This is the fifth recovery/gate candidate the temporal-transport check has correctly stopped — the Dozier
multi-feature gate, the Dozier early-cue tier, recovery+raw-geo, recovery+physical-geo, and now recovery+temporal-dynamics. This time the gate stopped a candidate
whose control (temporal-only, 0.840) came the closest yet to production — and the permutation-importance readout explains precisely why the near-miss is not a
promotion: the signal is already in the baseline.
Certifying the surfaced false-positive rate with independent physical evidence: a stratified, adjudicated fire-vs-non-fire corpus — 0022’s 19.7% holds at 20.7%, but only a third of detections can be physically certified and the rest still rest on heuristics
The framing. Entry 0022 gave the program its first true surfaced false-positive rate — 19.7% — but was honest that 298 of 1,985 detections (the “ambiguous middle”) were adjudicated only by light heuristics, so the number it could actually stand behind was the wide bracket [12.2%, 27.3%]. This entry attacks that residual with the strongest independent physical evidence we can marshal on-box: a stratified sample of the surfaced set, deliberately over-weighting where FP concentrates and uncertainty is highest, adjudicated against IRWIN/WFIGS incidents, ≥2-independent-sensor-family corroboration, Sentinel-2 SWIR / Sentinel-1 SAR burn evidence, a new independent thermal-facility registry (the WRI Global Power Plant Database, 3,839 US combustion plants — a source 0022 did not use), and a 30-day fixed-cell-vs-spreading persistence discriminator. The corpus is persisted as a hidden shadow table — the training seed for a learned false-positive filter.
BLUF. Over the trailing-window surfaced set (N = 1,476 fused fires today; live serving filter last_seen≥now−24h AND tier≠'fp' AND confidence≥0.10), a stratified sample of n = 454 re-weighted to the population by a Neyman estimator puts the true surfaced false-positive rate at 20.7% (95% sampling CI [16.9%, 24.4%]; ambiguous-band bracket [13.9%, 27.4%]). That is a clean independent confirmation of entry 0022’s 19.7% — the point moved +1.0 point, inside noise — and the residual ambiguous fraction fell from 0022’s 15.0% to 13.2%. The tier structure is unchanged and stark: confirmed tier is ~0% FP, probable tier is 26.9%. But the sharper, more honest finding is what happens when we trust only certified physical evidence and send every heuristic lean back to “ambiguous”: the estimate rises to 32.4% with a bracket of [2.2%, 62.6%], because only 33.5% of surfaced detections can be physically certified either way — the 20.7% point’s tightness leans on a heuristic multi-day-persistence “fire” class that is 40% of the sample and cannot be certified without imagery or a ground visit. The bottom line: 0022’s number is robust and now independently reproduced, and the new power-plant registry certified 21 non-fire detections 0022’s catalogs missed on the surfaced set — but the stronger evidence tightens the residual only modestly; closing it the rest of the way requires a human-reviewed gold subset, not more automation. Fully read-only on production; the corpus is a gated hidden shadow; no shipped number changes.
The sampling design. The surfaced population is partitioned into tier × sensor-family-mix strata, and the sample is allocated Neyman-style — heaviest where the false-positive burden and its variance are largest (from 0022: lone-VIIRS, HMS-only, and the oil-and-gas-basin slice). Small strata are near-censused; the large low-FP strata are sampled lightly. Every stratum is re-weighted to its true population size in the estimator, with a finite-population correction.
stratum (tier · family-mix)
population Nh
sampled nh
sampling fraction
probable · VIIRS-only
177
130
73.4%
probable · HMS-only
238
90
37.8%
probable · HMS+VIIRS
283
70
24.7%
probable · has-GOES
403
55
13.6%
probable · MODIS-only
26
20
76.9%
probable · other
5
5
100%
confirmed · has-GOES
228
35
15.4%
confirmed · multi-indep
58
20
34.5%
confirmed · HMS+VIIRS
44
15
34.1%
confirmed · MODIS-only
6
6
100%
confirmed · other
8
8
100%
total
1,476
454
30.8%
How each detection is adjudicated — a precedence stack of independent physical evidence. (1) Certified fire if within 10 nm of an IRWIN/WFIGS incident — and we verified the incident feed is entirely fire-type (93.7% WF wildfire, 4.5% RX prescribed burn, 1.8% CX complex; no non-fire all-hazards categories), so an incident match certifies a real thermal fire, not a false positive; else (2) certified non-fire if it sits on a static industrial catalog — fp_polygons (OSM refinery / gas-flare / persistence) or the new WRI power-plant registry (US combustion plants, 2 km); else (3) certified fire if ≥2 independent sensor families corroborate ({VIIRS, MODIS, GOES, S2, S1}, HMS excluded as analyst-derived); else (4) certified fire if independent S2-SWIR / S1-SAR burn/hotspot evidence sits within 10 nm; else (5) certified non-fire if the location shows fixed-cell persistence — ≥5 distinct detection-days over a 30-day window with <1.5 km spatial extent and never an incident (a stationary industrial source); else heuristic leans: fire if multi-day persistence shows spatial growth (≥3 km extent) or an energetic isolated polar detection (FRP ≥ 10 MW away from any catalog); non-fire if inside an O&G basin adjacent to a flare/refinery cluster, or a weak ephemeral hit with no polar corroboration in 30 days; else ambiguous.
The certified false-positive rate (stratified Neyman, re-weighted to population). A detection contributes 1 if non-fire, 0 if fire, ½ if ambiguous (point); the ambiguous band is swept entirely to fire (low) or non-fire (high) for the epistemic bracket; the CI is the stratified sampling error with finite-population correction.
stratum
N
n
true FP rate (point)
sampling CI-95
ambiguous bracket
ALL surfaced
1,476
454
20.7%
[16.9%, 24.4%]
[13.9%, 27.4%]
tier = confirmed
344
84
~0.1%
[0.1%, 0.1%]
[0.0%, 0.3%]
tier = probable
1,132
370
26.9%
[22.0%, 31.8%]
[18.1%, 35.7%]
The FP is a single-sensor-family artifact — reproducing 0022 independently. Split by surfacing sensor mix, the burden concentrates in lone-polar and analyst-only detections; every combination adding a second independent family collapses it:
source group
N
n
true FP rate (point)
sampling CI-95
HMS-only (analyst-derived)
238
90
33.9%
[26.1%, 41.6%]
VIIRS-only (single family)
177
130
25.0%
[21.1%, 28.9%]
has-GOES (geostationary)
631
90
20.9%
[13.5%, 28.3%]
HMS+VIIRS
327
85
14.2%
[7.7%, 20.8%]
MODIS-only
32
26
4.1%
[0.2%, 7.9%]
multi-indep (≥2 families)
58
20
0.0%
[0.0%, 0.0%]
The oil-and-gas-basin cross-cut (within 15 km of a flare/refinery cluster; n = 62 sampled) reads 15.3% non-fire — lower than lone-VIIRS because many basin detections sit on the industrial catalog and are certified non-fire outright, while genuine fires also occur there. The residual error still lives exactly where 0022 said it did: a probable-tier, lone-polar or analyst-only detection in an oil-and-gas basin.
The honest part — how much of this is actually certified. Two estimators of the same set, one trusting the heuristic leans, one refusing them:
estimator
FP point
bracket
what it means
point (heuristics trusted)
20.7%
[13.9%, 27.4%]
best estimate; confirms 0022’s 19.7%
certified-only (heuristics → ambiguous)
32.4%
[2.2%, 62.6%]
what independent physical evidence alone can prove — only 33.5% of detections
The wide certified-only bracket is the point of the entry: the sharp 20.7% depends on a large heuristic fire class (multi-day persistence with growth, 40% of the sample) that we cannot physically certify without imagery or ground truth. Because that class leans toward fire, if it is wrong it can only push true FP up — which is why the honest point sits near the top of 0022’s bracket and the certified-only estimate is higher, not lower.
The 0020/0022 decomposition, reproduced out-of-sample.
component of the surfaced set
entry 0022
entry 0028 (this)
interpretation
IRWIN/WFIGS-listed incident
23.7%
22.2%
the incident-list floor
unlisted REAL fire
56.6%
50.4%
real fire the incident lists never carried
genuine NON-FIRE false positive
19.7%
20.7%
the true surfaced FP rate
Two independent adjudications, a day apart, on different sampled sets, land within ~1–6 points on every component — the decomposition is stable, not an artifact of either method.
Reproducibility detail.Read-only on all production tables (mode=ro, PRAGMA query_only); the only write is the program’s own hidden shadow table. Resource-guarded under the host-health gate (exit 75 if the serving service is inactive), the host hard busy-marker and a private serialization marker, server-side timeout + nice -n19, thermal watchdog, killed by PID. Surfaced set = the exact live serving query on fused_fires (N = 1,476 at run time). Strata = tier × family-mix parsed from the fused sources string into {VIIRS, MODIS, GOES, S2, S1}; HMS/CAM excluded from the independence count. Allocation: fixed per-stratum sample sizes over-weighting probable-VIIRS / HMS-only, seeded RNG (reproducible). Registries:fp_polygons (51,474 OSM refinery + 7,457 OSM gas-flare + 9,144 dozier- + 91 polar-persistence) and flaring_mask_shadow (660), each at its own radius; the WRI Global Power Plant Database filtered to US combustion fuels (3,839 plants, 2 km) as an independent thermal-facility source. Incident truth = wfigs_truth WF incidents + IRWIN evidence (source='IRWIN') over a 30-day window, 10 nm haversine; category composition audited (93.7% WF / 4.5% RX / 1.8% CX). Persistence = distinct detection-days and bounding spatial extent of VIIRS/MODIS evidence within 10 nm over 30 days (single indexed pass per source; ~6.8M rows scanned, matched-cell routing only). Estimator: stratified P̂ = Σh(Nh/N)·p̂h; variance Σ(Nh/N)²(1−nh/Nh)p̂h(1−p̂h)/(nh−1) with finite-population correction; ambiguous 0/½/1 for bracket/point. Corpus: fp_label_corpus_shadow (454 rows: fused id, tier, family-mix, source-set, lat/lon, label, evidence confidence & basis, per-stratum sizes), gated in canary_meta (surface_allowed=0, DO_NOT_SURFACE), verified not referenced by any serving/daemon code. Every figure counted from the live production DB at run time.
Claim status: MEASURED, read-only, stratified-estimator, honest certified-vs-heuristic split. This entry independently reproduces and hardens entry 0022’s surfaced-FP measurement with stronger physical evidence and a proper sampling estimator, and persists a reusable label corpus; it does not change fusion, tiers, the confidence floor, the map, the API, the FP catalog, or any shipped number.
Honest bounds. (1) Only a third certifies. Just 33.5% of detections carry certified independent physical evidence; the 20.7% point’s tightness rests on a heuristic persistence-fire class (40% of the sample) — the certified-only estimator ([2.2%, 62.6%]) is the honest expression of that, and it is wide. (2) The persistence “growth” rule is the weakest lever: a 3 km multi-day extent is read as a spreading fire, but two adjacent uncatalogued flares could mimic it; because the rule leans toward fire it can only push true FP upward. (3) Sampling error is real — this is a 454-of-1,476 sample, not 0022’s near-census, so the by-source CIs on lightly-sampled strata (has-GOES, HMS+VIIRS) are wide; the overall CI is nonetheless tighter than 0022’s epistemic bracket. (4) Single summer window (~2026-07); re-running on a later split shifts counts, not structure. (5) The power-plant and OSM registries are themselves incomplete, so certified-non-fire is a floor on non-fire, not a ceiling.
Literature alignment. Verdict: AGREEMENT. That incident lists (IRWIN/FPA-FOD) are materially incomplete for sub-incident thermal is well documented [6], so a precision figure against them understates true precision — the 50.4-point unlisted-real correction here matches 0022. That residual false positives concentrate in the sharpest polar sensor over persistent industrial heat is the canonical VIIRS-Nightfire flaring result [11], consistent with VIIRS 375 m sensitivity to small low-FRP sources [1]; and that an independent second sensor family sharply raises precision is the standard multi-sensor-confirmation finding [3]. The stratified Neyman estimator with finite-population correction is textbook survey sampling [17]; the independent facility registry is the WRI Global Power Plant Database [18].
What this does not claim: that 20.7% is exact (the honest sampling CI is [16.9%, 24.4%] and the certified-only bracket is much wider), that the heuristic persistence-fire labels are individually proven fires, that the power-plant/OSM registries are complete, or that the split transports to winter. Recommendation: informative, and it unblocks the next lever — no cutover. The measurement confirms the shipped map is far more correct than the incident-list floor implies and that its residual error is a nameable, already-partly-mitigated class (persistent industrial heat, concentrated in probable-tier lone-polar detections). The proper next certification step is a small human-reviewed gold subset over the 60 genuinely-ambiguous plus the 183 persistence-fire leans — the only way to collapse the certified-only bracket. Mark decides.
Unlocked next step (flagged, not built here). The persisted 454-row corpus — certified fire / certified non-fire / adjudicated leans, each with lat/lon, family-mix, FRP, persistence geometry and catalog distances — is the training seed for a learned real-bogus false-positive filter: a small classifier trained on the probable-tier lone-VIIRS slice (where FP lives) to separate industrial persistent heat from genuine early fire, then held to the same out-of-time / held-out-region transport gate the recovery re-ranker faced in entries 0018/0023/0027. That is the follow-on entry.
A power-plant / industrial-combustion false-positive mask, built pre-cutoff and transport-gated on a held-out later window — masks 68 combustion plants (7 net-new beyond the refinery/flare masks) and hides zero real later fires at 1.5 km, but a landfill fire 1.99 km from a waste-to-energy plant shows why 2.0 km is one incident too wide — 0029
Date: 2026-07-10 Status: defensible (measured; read-only on production; strict pre-cutoff build + held-out out-of-time truth; fire-protection-first; hidden shadow, no cutover) — extends the entry-0021 flaring-mask discipline to combustion power plants; closes the uncaught FP class named in entry 0028 UPDATE 2026-07-10: cutover APPLIED to production — 7 net-new combustion-plant cells live (source powerplant_combustion_persistence, 1.5 km), 0 real fires masked, one-DELETE reversible, weekly refresh daemon standing.
The framing. Entry 0028 certified the surfaced non-fire detections against an independent thermal-facility registry — the WRI Global Power Plant Database — and found that the certified-non-fire detections it could name all landed on combustion power plants: an industrial-heat false-positive class that the shipped gas-flaring/refinery masks (osm_refinery, osm_gas_flare, flaring_nightfire_persistence) do not cover. Coal / gas / oil / biomass / waste-to-energy plants run persistent hot stacks and flares that VIIRS 375 m and GOES sub-pixel routinely flag as fire. This entry builds a mask for them with exactly the discipline the flaring mask shipped under — a small static polygon per plant, gated on evidence that OLDGABE actually generates persistent detections there — and, because a real wildfire can start next to a power plant, subjects it to a strict temporal-transport gate: the mask is built from data strictly before a cutoff and evaluated on the held-out later window for the one number that matters, how many real later fires it would hide.
BLUF. From 3,719 US combustion plants (WRI GPPD, fuel ∈ {Coal, Gas, Oil, Petcoke, Cogeneration, Biomass, Waste}; solar/wind/hydro/nuclear/storage excluded as non-combustion), intersecting each with OLDGABE’s own persistent detections over the pre-cutoff window (train < 2026-06-21; VIIRS/MODIS/GOES thermal evidence), requiring ≥5 distinct detection-days in a 1.5 km cell that is single-sensor-family, spatially static (≤1.5 km extent), and ≥5 km from any pre-cutoff IRWIN/WFIGS incident, yields a mask of 68 plants. Only 7 are net-new beyond the existing fp_polygons masks (the other 61 already sit under a refinery/flare polygon); the 7 are landfill-gas / waste-to-energy and standalone gas+cogen sites the OSM catalogs miss. On the held-out later window the mask would tier 8,497 net-new persistent thermal detections (152 net-new production-surfaced events) as fp — and it hides zero real IRWIN/WFIGS fires: the nearest actual held-out incident to any masked plant is 1.99 km, outside the 1.5 km radius. Widen the radius to 2.0 km and that single incident — a genuine landfill fire 1.99 km from the Kiefer Landfill waste-to-energy site — falls inside, so 2.0 km masks one real fire and 1.5 km masks none. 1.5 km is the safe radius. The mask is persisted as a hidden shadow table (surface_allowed=0, DO_NOT_SURFACE, not read by serving); production fusion, tiers, fused_fires and the map are untouched. No cutover.
A necessary correction to the truth signal. The obvious way to ask “is there a real fire at this plant later?” — look at fire_events near the plant with status='confirmed' or a non-null irwin_id — is wrong here, and the reason is itself the finding. At the flagged plants the production pipeline auto-confirms the plant’s own persistent signature and cross-links it to a distant IRWIN incident id (the same id repeated day after day). Plains End (a gas peaker in Colorado) generated 21 “confirmed” test-window events (confidence up to 0.9) carrying a borrowed IRWIN id whose actual incident sits 12.7 km away; Hidden Hollow (waste-to-energy, Idaho) did the same with an incident 10.4 km away. Those labels are not evidence of a fire at the plant — they are the industrial false positive we are targeting, wearing a borrowed badge. The truth-sparing test therefore uses actual IRWIN incident coordinates (and WFIGS points), never the fire_events cross-link. Measured against real incident geometry, every masked plant’s nearest held-out fire is ≥1.99 km.
The transport gate. Build strictly on pre-cutoff data; evaluate on the held-out later window. “Net-new” counts only detections/plants not already covered by an existing fp_polygons polygon (no double-counting the flare/refinery masks). “Real incidents masked” = masked plants with an actual post-cutoff IRWIN/WFIGS incident point inside the radius — the pass/fail. “Growth-caveat” = masked plants whose own detections spread >1.5 km across the later window (disclosed, not a fire unless an incident corroborates).
radius × persistence
plants masked
net-new (beyond existing masks)
net-new thermal dets suppressed (held-out)
net-new surfaced events suppressed
real IRWIN/WFIGS fires masked
growth-caveat plants
1.5 km, ≥3 days
110
29
14,804
255
0
13
1.5 km, ≥5 days (chosen)
68
7
8,497
152
0
5
1.5 km, ≥7 days
49
5
7,190
120
0
1
2.0 km, ≥3 days
100
35
13,339
230
1
14
2.0 km, ≥5 days
64
9
6,511
124
1
8
2.0 km, ≥7 days
49
6
3,836
77
0
4
The single real-fire mask at 2.0 km is instructive: it is a landfill fire 1.99 km from a waste-to-energy plant — the exact case where a combustion facility and a genuine fire coexist. The 1.5 km radius spares it at every persistence threshold. The growth-caveat plants at 1.5 km/≥5 (5 of them: Delray, ExxonMobil Baytown, Gregory, Port Arthur, Valero Corpus Christi) are all Gulf-Coast refinery/gas complexes whose multi-unit footprint spans several VIIRS pixels — none has a real incident within range, and all but one already sit under osm_refinery, so they are excluded from the net-new set anyway. The 7 net-new plants (Bowerman Power LFG, Delta Energy Center, Higgins Generating Station, Lake Charles cogen, Pine Tree Acres landfill-gas, TVA Southaven combined-cycle) are compact (≤0.72 km train extent), single-family, 5–11 persistent days, and their nearest real held-out incident is ≥4.3 km or none.
Reproducibility detail. Health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, wrapped in the host load-guard with a private serialization marker + server-side timeout+nice -n19, SIGTERM-clean, killed by PID. Reads are PRAGMA query_only/mode=ro on every production table; the only write is a new hidden shadow tablepowerplant_mask_shadow (surface_allowed=0) — no production table is touched. Registry = WRI GPPD, country='USA', primary_fuel ∈ the seven combustion fuels (3,719 plants). Persistence evidence = COUNT(DISTINCT detected_at[:10]) of fire_event_evidence rows with source ∈ {VIIRS-NPP/N20/N21, MODIS, ABI-Dozier-Subpixel-G19/G18, GOES19/18-ABI} within radius R of the plant, split at detected_at < 2026-06-21T00:00Z (train) vs ≥ (held-out test). Sensor-family independence collapses VIIRS-NPP/N20/N21→VIIRS, ABI/GOES→GOES; a masked cell must be single independent family in train. Static = bounding-box extent of train detections ≤1.5 km. Fire-protection guards: withhold if ≤5 km from any pre-cutoff IRWIN evidence point or WFIGS incident, if ≥2 independent families in train, or if train extent >1.5 km. Truth = actual IRWIN incident coordinates (fire_event_evidence source='IRWIN', held-out post-cutoff) + WFIGS points — deliberately notfire_events.irwin_id/status, which the pipeline contaminates by cross-linking distant incident ids onto persistent plant signatures. Net-new = plant not inside any existing fp_polygons polygon at its own radius. Every figure counted from the live production DB at run time; the shadow table is reversible (a single DROP).
Claim status: MEASURED, read-only on production, strict pre-cutoff build with held-out out-of-time evaluation, fire-protection-first. This entry builds and validates a combustion-power-plant FP-mask candidate and persists it as a hidden shadow; it does not change fusion, tiers, the confidence floor, the map, the API, the FP catalog, or any shipped number.
Honest bounds. (1) Suppression is not condemnation. Consistent with entries 0022/0028, IRWIN incompleteness means a suppressed detection cannot be proven false; the affirmative non-fire evidence here is the power-plant registry entry plus multi-day, static, single-family persistence — the mask removes persistent industrial-combustion thermal sources, it does not adjudicate individual detections as false. (2) Net-new is modest. 61 of 68 masked plants already sit under the refinery/flare masks; the genuinely new capability is 7 plants (mostly landfill-gas / waste-to-energy) and ~8.5k held-out detections — a small, clean increment, not a large lever. (3) Single summer window (polar evidence spans ~2026-05..07); the train/test split is within-season, so the gate proves out-of-time transport, not out-of-season — winter behaviour is untested. (4) The registry is incomplete, so certified-industrial is a floor; and the 1.99 km landfill case is the standing reminder that combustion sites and real fire coexist — the radius is chosen to spare it. (5) The growth-caveat plants are disclosed rather than auto-masked precisely because a spreading signature is the one thing that could be a real fire; none here is, but the rule stays conservative.
Literature alignment. Verdict: AGREEMENT. Persistent industrial hot sources (flares, power-plant stacks) as a dominant commission-error class in polar active-fire products is the canonical VIIRS-Nightfire result [11] and is documented in the Suomi-NPP VIIRS active-fire product evaluation [19], consistent with VIIRS 375 m sensitivity to small low-FRP sources [1]; the same static/industrial commission errors are reported for geostationary GOES-16 ABI active fire [20], which is why both polar and GOES thermal families are gated here. That an independent facility layer is the right way to name and remove them — rather than a lower confidence threshold — follows the WRI Global Power Plant Database [18], and that incident lists understate true fire presence (so suppression must not be scored as pure FP removal) is the FPA-FOD completeness finding [6].
What this does not claim: that the 8,497 suppressed detections are each proven false (they are persistent industrial-combustion sources by registry + persistence, not ground-verified), that the mask transports to winter, that the WRI registry is complete, or that fire_events.irwin_id/status can be trusted as truth near persistent industrial heat (it demonstrably cannot). Recommendation: cutover-candidate at 1.5 km, scoped to the 7 net-new plants — but shadow-only until Mark approves. The gate passes clean (zero real later fires masked at 1.5 km across ≥3/≥5/≥7-day thresholds), the guards are fire-protection-first, and the change is small and fully reversible. The minimal cutover mirrors the shipped flaring mask exactly: an additive INSERT INTO fp_polygons(source,tag,lat,lon,radius_km,metadata) SELECT 'powerplant_combustion_persistence', name, lat, lon, 1.5, provenance FROM powerplant_mask_shadow WHERE net_new=1; the reverse is one DELETE FROM fp_polygons WHERE source='powerplant_combustion_persistence'; an optional weekly refresh daemon would re-derive persistence exactly like the flaring refresher. Left shadow/default-OFF — not flipped. Mark decides.
A short-horizon fire-spread nowcast is input-feasible but shows no skill yet — every physical driver (RAWS wind, ETOPO slope, dead-fuel moisture) is on-box and queryable at active fires, yet a wind-driven downwind+upslope growth model scores at the 90° random-direction null (mean 88.6°, mean-resultant R=0.02, Rayleigh p=0.88) while the fire’s own motion predicts its direction (R=0.44); the two blockers are a live-only wind snapshot and 0.01°-quantized growth truth — 0030
Date: 2026-07-11 Status: defensible (measured; read-only on production; honest baselines; research/prototype only, no cutover, nothing surfaced) — opens a new capability class (spread nowcast) distinct from detection; reports a negative-for-the-simple-model result with a diagnosed path forward
The framing. OLDGABE detects fires. The re-ranker work (entries 0018/0023) showed that fuel/terrain/climatology priors do not help the detection decision — but those same covariates are the physically correct inputs for a different problem: spread. A 1–6 h direction-and-growth nowcast would turn “there is a fire here” into decision-support — “it is running NE at roughly X.” This entry does the honest feasibility-plus-prototype work: inventory the real inputs on-box, build the simplest defensible physical model (wind-driven elliptical growth with an upslope bias), and validate it against observed fire growth with a baseline so the skill number means something. The result is a clean negative for the simple current-wind model, with the two fixable reasons named.
BLUF. Every physical driver a spread nowcast needs is already on-box and queryable at fire locations: 2,078 RAWS stations (all with wind speed/direction and dead-fuel-moisture, refreshed hourly), a coarse-DEM terrain sample (ETOPO2022 60″, median slope 17.9 m/km at the fire set), and the fused active-fire track itself. So the inputs are feasible. But the simple physical model has no measured skill. On 250 recently-active confirmed/probable fused fires (each with an ≥8-detection, ≥3 h multi-sensor track), a downwind spread bearing (wind-direction + 180°) lands at the 90° random-direction null — mean angular error 88.6°, mean-resultant length R = 0.02, Rayleigh p = 0.88 (no concentration in either wind convention, since R is sign-independent). Adding an upslope bias makes it worse (93.2°). A wind×dryness rate index does not predict observed footprint growth (Spearman −0.20 vs. a predict-median baseline of 0). Yet the target is genuinely predictable: a persistence baseline — the fire’s own earlier centroid motion — predicts its later direction well (mean error 55.5°, R = 0.44, Rayleigh p < 10−300). The two blockers are diagnosed: (1) wind is a live snapshot only — there is no time-archived wind co-registered to historical detections, and the median fire is 27 km from its nearest RAWS, so the wind vector is temporally and spatially mismatched to the growth window; (2) the only on-box growth truth is detection-footprint expansion at 0.01° (≈1.1 km) member-coordinate quantization, GOES-dominated, with median observed displacement 0.44 km — below one pixel, so the growth vector is mostly noise. Verdict: feasible in inputs, not-yet-skillful in output. Nothing was surfaced; no production table was touched.
The input inventory. The point of a feasibility pass is to state plainly what exists, what is a proxy, and what is deferred.
spread driver
on-box source
status
note
active-fire front / current track
fused_fires (13,822) + parsed multi-sensor member track
present
GOES/VIIRS/MODIS/HMS detections, but coords rounded to 0.01°
0.01° quantized, GOES-dominated, conflates detection with growth; no acreage time-series
The prototype. Deliberately the simplest defensible physical cut, not an ML model. Direction = a weighted vector sum of a downwind unit vector (bearing = RAWS wind-direction + 180°, weighted by wind speed) and an upslope unit vector (bearing of steepest DEM ascent, weighted by slope magnitude, capped at the wind weight) — fire runs downwind and uphill. Rate = an interpretable wind-driven, dryness-scaled index, ROS ∝ wind_speed × exp(−fuel_moisture/10), in the Rothermel/empirical-grassfire spirit [21][22]. Observed growth per fire = split the fire’s own detection track into early/late thirds by time, take each third’s centroid; the early→late bearing is the observed spread direction and the centroid displacement over elapsed hours is the observed rate; the mean detection-to-centroid radius (late minus early) is a footprint-growth proxy. Skill is scored with circular statistics (mean angular error, mean-resultant length R, Rayleigh test) against a 90° uniform-direction null and against a persistence baseline [16][23].
predictor
subset
n
mean ang. err
median
within 45°
mean-resultant R
Rayleigh p
random-direction null
—
—
90.0°
90.0°
0.25
0.00
1.00
downwind (wind+180°)
all
250
88.6°
90.5°
0.30
0.02
0.88
downwind + upslope
all
250
93.2°
94.9°
0.26
0.04
0.66
persistence (fire’s own motion)
all
165
55.5°
41.8°
0.52
0.44
<10−300
downwind (wind+180°)
resolvable (≥1.1 km, ≤40 km)
17
125.7°
125.4°
0.06
0.50‡
0.012
persistence
resolvable
13
42.9°
32.7°
0.69
0.63
0.004
‡ On the 17 resolved-displacement fires the wind vector shows moderate concentration (R=0.50) but at a ~176° offset — the observed footprint centroid moves opposite to downwind. This is almost certainly a truth artifact, not physics: coarse GOES footprints are first detected at the hot leading edge and then “fill in” toward the older/interior pixels, dragging the centroid backward. It is a reason to distrust the footprint-growth proxy, not evidence the model is anti-skillful. On the robust n=250 sample the wind axis carries essentially no directional information at all (R=0.02).
Rate skill. On the resolvable subset (n=17) the wind×dryness ROS index vs. observed centroid-displacement rate gives Spearman −0.20 (Pearson −0.11); wind-speed alone −0.21; ROS index vs. footprint-radius growth −0.21. All are at or below zero — no positive skill over the predict-median baseline (which is 0 by construction). With this truth and this sample the rate model is indistinguishable from no information.
Reproducibility detail. Resource-guarded on the host: health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, run under a private serialization marker with a server-side timeout + nice -n19, thermal-abort preflight, killed by PID. Every read is mode=ro on production tables; no table is written — the run emits a JSON metrics blob only, nothing surfaced. Corpus = fused_fires with tier ∈ {confirmed, probable}, n_frames ≥ 8, track span ≥ 3 h, last_seen within 12 h of run (so the live wind snapshot is as contemporaneous as the data allow), whose member_event_ids parse to ≥6 dated detections with ≥2 in each of the early/late thirds (250 fires). Wind = nearest weather_stations RAWS by great-circle distance; downwind bearing = wind_dir_deg + 180°. Terrain = one windowed vsicurl read of the ETOPO2022 60″ surface-elevation GeoTIFF over the CONUS box, held in memory, sampled by 3×3 central-difference gradient for slope magnitude and steepest-ascent bearing (read via ReadRaster→frombuffer to bypass a GDAL/NumPy-2 array-bridge conflict). Rate index = wind_spd_kt × exp(−fuel_moisture_pct/10). Observed growth = early-third vs. late-third detection-centroid bearing / displacement / mean-radius delta; resolvable = observed displacement ≥ 1.1 km (one member-coordinate pixel) and RAWS within 40 km. Circular stats: mean angular error, mean-resultant length R, Rayleigh test on the signed (observed − predicted) offsets; persistence baseline = bearing of the fire’s first-third→middle-third centroid motion. Every figure counted from the live production DB at run time.
Claim status: MEASURED, read-only on production, honest baselines, research/prototype only. This entry establishes input-feasibility and validates a first-cut physical spread model against observed growth; it builds no table, changes no fusion/tier/confidence/map/API surface, and surfaces nothing. The headline is a negative for the simple current-wind model plus a positive feasibility finding on the inputs.
Honest bounds. (1) Wind is a live snapshot. There is no archived time-resolved wind co-registered to past detections; a fire’s growth window can be many hours old while the wind used is “now,” so the wind vector is temporally mismatched — the single biggest reason the model could fail even if physically correct. (2) The RAWS network is sparse relative to fires (median 27 km to nearest station), so the wind is regionally representative at best, not the wind at the flame. (3) The growth truth is weak. Member coordinates are quantized to 0.01° (≈1.1 km); median observed displacement (0.44 km) is below one pixel; footprints are GOES-dominated and conflate detection onset/fill with physical growth (the ~176° resolvable-subset offset is exactly this artifact). (4) Single summer window. The corpus is warm-season CONUS; nothing here speaks to other seasons or regions. (5) The persistence baseline shares its start point with the observed vector (both anchored on the early centroid), so a fraction of its skill is construction overlap — but the contrast that matters is robust: coherent direction demonstrably exists in the tracks (R=0.44), and the current-wind model captures essentially none of it (R=0.02). (6) Upslope as formulated did not help — likely because coarse DEM slope at the fire centroid is a blunt instrument and, absent time-matched wind, adding a second mis-timed term only adds noise.
Literature alignment. Verdict: CONTEXT (model is standard; the negative is about data, not physics). Wind as the dominant driver of fire-spread direction and rate, with an elliptical downwind footprint, is the canonical Rothermel surface-spread result [21] and the empirical grassfire wind–ROS relations [22]; that real fires have a coherent, measurable direction and speed is exactly what the Global Fire Atlas quantified from satellite progression [16] — consistent with the persistence signal found here. The physical model is orthodox; the failure is that the on-box observations (live-only coarse wind; quantized detection-fill footprints) are not yet good enough to exercise it, and coarse geostationary progression is known to conflate detection with growth [3][8]. Circular-statistics scoring (mean-resultant length, Rayleigh test) follows standard directional-data methods [23].
What this does not claim: that spread nowcasting is infeasible (the inputs are present and the target is demonstrably predictable), that wind does not drive spread (it does — the data are too mismatched to show it), that the ~176° resolvable-subset offset means fires spread upwind (it is a footprint-fill artifact), or that any number here should touch serving (nothing is surfaced). Recommendation: build the nowcast as a default-OFF advisory layer, but fix the observations first. Concretely: (a) archive time-resolved wind — either snapshot RAWS into a history table keyed by obs_time, or ingest gridded HRRR/GFS wind into the empty weather_cells — and join the wind at the detection timestamp, not “now”; (b) source a finer growth truth — full-precision detection coordinates linked to the fused fire, an IRWIN DailyAcres time-series, or S2/S1 burn-scar area deltas; (c) add a LANDFIRE fuel-model raster when available; (d) blend persistence with time-matched wind — the persistence result says the fire’s own momentum is the strongest single predictor available today, so the honest first product is a persistence nowcast that the wind vector corrects, surfaced as a separate advisory (“spreading roughly NE”), never as a detection. Until then it stays research-only — a spread nowcast is a real new-capability lever, but it earns a cutover only after the wind archive and a real growth truth exist. Mark decides.
Hard-bound: warm-season CONUS, single 12-hour active-fire snapshot, n=250 (n=17 resolved-displacement); wind is a live snapshot with no historical archive; growth truth is 0.01°-quantized, GOES-dominated detection-footprint expansion, not an independent perimeter time-series. Every conclusion is scoped to that regime; the negative is a statement about the current observations, not about the physics of fire spread.
Can a disciplined GOES-first provisional-alert tier buy real lead time at acceptable precision? — measured across 481k early GOES-first candidates and out-of-time: no. Every gate that adds discipline lowers precision, and the confirmable slice is ~13% before any gate — a MEASURED NEGATIVE that upholds entry 0025’s caution
Date: 2026-07-11 Status: MEASURED NEGATIVE (own read-only artifact; out-of-time transport-gated; nothing surfaced, nothing flipped) — converts entry 0025’s “no naive GOES-first tier is supported” into a full precision-vs-lead-time curve and rejects the disciplined version too
The framing. Entry 0025 found that GOES-ABI wins the first-arrival race for ~76% of fires on cadence alone, yet is the slowest thermal sensor for genuine new-fire detection, and it retired the “we detect before it’s reported” headline as a lookback artifact. It left one question open and worth answering honestly: is there a disciplined GOES-first provisional tier — persistence, FRP, and not-on-a-known-false-source — that recovers a real latency gain at a precision a clearly-labeled advisory surface could tolerate? This entry defines that candidate population, measures the full precision-vs-lead-time curve across gates, and validates the best operating point out-of-time. The answer is a clean negative, and it sharpens why.
BLUF. The GOES-first candidate population — canonical events where a GOES-ABI detection is strictly the first sensor at the location, i.e. everything a provisional fast-alert could draw from before any polar/HMS/IRWIN confirmation — is enormous and mostly false: 480,953 events over 39 days (~12,300/day), of which only 12.9% are ever corroborated as a real fire (12.4% by an IRWIN/WFIGS fire within 10 nm; a vanishing 0.5% by a later co-registered VIIRS/MODIS overpass in the same canonical event). So a raw GOES-first alert is wrong ~6.8 times out of every 7.8, at 12,000+ alerts/day. The decisive result is that no disciplined gate rescues it: requiring GOES multi-frame persistence (≥3, ≥5 frames), an FRP floor (≥10, ≥30 MW), excluding the flaring/refinery and static-thermal masks, or any combination — every gate holds or lowers precision (the full curve sits in an 8–13% band) while shedding recall and lead time. Persistence and FRP go the wrong way (they select persistent warm surfaces, not small new fires), and the masks barely move the needle because the false mass is diffuse coarse-pixel noise across fire country, not concentrated on known industrial points (only 0.6% of candidates sit on a flaring/refinery polygon). Out-of-time, the gates transfer as non-skill: the apparent early→late precision jump (9.9%→17.1% raw) is a seasonal fire-density base-rate effect, not gate discrimination, and the single point that clears ~29% precision on the later window (FRP≥30) does so at ~158 alerts/day, 5% recall, and only ~4.8 h of lead. Verdict: a GOES-first provisional tier is too false-alarm-heavy to surface, even gated. We recommend no shadow build; entry 0025’s caution stands, now quantified end-to-end. Nothing was surfaced and no production table was touched.
The candidate population (reproducible). Working unit is the canonical event (the shipped corroboration/ground-truth key). For every canonical event we take, per sensor family, the first detection time; a GOES-first candidate is one where the GOES-ABI family (Dozier-subpixel + ABI-ADP-smoke + raw ABI, G18/G19) is strictly earliest — nothing polar, HMS, or IRWIN arrived at or before it — so by construction it is sub-confirmation at alert time and is exactly the pool a provisional alert would fire on. Truth reuses the shipped scorer (te_daily_scorer.py): a candidate is genuinely confirmed if an IRWIN/WFIGS WF/WFU fire lies within 10 nm (independent), or a later VIIRS/MODIS detection co-registers into the same canonical event (≥2 independent families). Lead time is measured against an actual confirmation event — the first co-registered polar detection minus the alert time — not against IRWIN’s reported discovery time, precisely to avoid the reporting-time artifact entry 0025 diagnosed. The candidate window is t₀ ∈ 2026-05-31 → 2026-07-09 (a 2-day tail is trimmed so late candidates have time to confirm; right-censoring caveat below).
GOES-first candidate population
value
candidate events (GOES strictly first)
480,953
per day
~12,315
eventual-confirm rate (IRWIN 10 nm OR co-registered polar)
12.9%
via IRWIN/WFIGS within 10 nm
12.4%
via later co-registered VIIRS/MODIS overpass
0.5%
raw lead vs first co-registered polar detection (n=2,624)
median +7.9 h (p25 +6.3, p75 +17.6)
candidates on a flaring/refinery mask
0.6%
candidates in a static-thermal (persistence) cell
6.2%
candidates carrying a GOES FRP value
43.9%
Read this first: the confirmable fraction is ~13% before any gate is applied, and it is almost entirely IRWIN-proximity (12.4%), not independent sensor agreement (0.5%). A 10 nm IRWIN match in fire country is itself the spatial-association signal entry 0025 warned about — so 12.4% is an upper bound on the fraction that are genuinely this new fire, not a floor. The clean lead-time number (+7.9 h vs an actual polar overpass) is real but exists for only the 0.5% of candidates that ever get a co-registered polar detection; it is not a property of the population.
Result 1 — the precision-vs-lead-time curve (this is the finding). Same candidate set; one gate at a time and in combination. Precision = fraction of kept candidates that are genuinely confirmed; recall = fraction of the eventually-confirmed set retained; lead = median hours the alert precedes the first co-registered polar detection (measured only where such a detection exists):
gate
alerts/day
precision (any)
precision (IRWIN)
recall of confirmed
median lead (h)
raw GOES-first (no gate)
12,315
12.9%
12.4%
100%
+7.9
persistence ≥3 GOES frames
6,138
11.8%
11.3%
45.8%
+6.8
persistence ≥5 GOES frames
3,487
10.8%
10.2%
23.8%
+3.1
FRP ≥10 MW
3,520
9.9%
9.3%
22.0%
+6.9
FRP ≥30 MW
830
9.8%
8.6%
5.1%
+6.2
NOT on flaring/refinery mask
12,240
12.8%
12.3%
98.5%
+8.1
NOT in static-thermal cell
11,546
12.4%
12.0%
90.5%
+7.9
NOT on any fp mask
11,478
12.3%
11.9%
89.3%
+8.1
pers≥3 + NOT any fp mask
5,667
11.2%
10.7%
40.1%
+7.0
pers≥3 + FRP≥10 + NOT any fp mask
2,470
8.6%
8.0%
13.4%
+3.3
pers≥5 + FRP≥30 + NOT any fp mask
508
8.6%
7.2%
2.7%
+1.2
The curve never leaves the 8–13% precision band. The best precision in the whole table is the raw population (12.9%); every added constraint makes precision worse, not better, and buys nothing but lost recall and shrinking lead. That inversion is the mechanism: GOES multi-frame persistence and a high FRP select for bright, durable hot signals — which in the GOES-first pool are disproportionately persistent warm surfaces and residual industrial/agricultural burn, not the small, brief new ignitions IRWIN logs. The two dedicated masks remove real false sources but almost no volume (recall stays 89–99%), because the false-alarm mass is diffuse coarse-pixel noise spread across the fire-prone West, not concentrated on the 0.6% of points that are flares/refineries. There is no operating point that is simultaneously earlier and precise enough.
Result 2 — transport gate (out-of-time; entries 0018/0021/0027 discipline). Build/choose the gate on an earlier window (t₀ < 2026-06-23, n=280,880, 27,763 confirmed) and measure it on a strictly-later window (t₀ ≥ 2026-06-23, n=200,073, 34,114 confirmed). If a gate carried real discrimination it would hold its precision advantage out-of-time; instead precision tracks the ambient fire density of the window:
gate
EARLY precision
EARLY lead (h)
LATE precision
LATE lead (h)
LATE alerts/day
raw GOES-first
9.9%
+8.5
17.1%
+7.4
5,123
persistence ≥3
8.5%
+7.4
17.5%
+6.2
2,279
NOT on any fp mask
9.3%
+9.0
16.7%
+7.5
4,676
FRP ≥30 MW
5.3%
+7.0
29.1%
+4.8
158
pers≥3 + FRP≥30 + NOT any fp mask
5.0%
+2.4
28.1%
+2.4
104
The precision on the late window is higher for every gate — including the raw no-gate population — by roughly the same factor. That is a base-rate effect: the later window is deeper into fire season, so any 10 nm cell is more likely to sit near an active IRWIN fire, lifting the proximity-match rate regardless of what the gate does. It is not gate skill, and it does not transport as a precision guarantee an operator could rely on. The one point that reaches ~29% out-of-time (FRP≥30) trades it for ~158 alerts/day, ~5% recall of confirmed fires, and ~4.8 h of lead — i.e. it surfaces one-twentieth of the real fires, still gets it wrong ~7 times in 10, and does so barely earlier than simply waiting. No operating point clears a defensible advisory bar.
The precision bar, stated explicitly. The confirmed roster runs at ~90%+ precision (entries 0003/0007); a provisional/advisory tier can tolerate less, but it must beat surfacing nothing — call the generous advisory bar ~50% (roughly one real fire per false alert). The full curve is reported above precisely so the verdict does not hinge on where that bar sits: nothing measured — in-sample or out-of-time, raw or gated — approaches 50%. The population tops out at ~13% in-sample and ~17% on the season-dense later window; the only points reaching ~29% do so at negligible volume and single-digit recall. Wherever a reasonable advisory bar is drawn between the confirmed roster and a coin flip, a GOES-first provisional tier is below it.
Reproducibility detail. Read-only replay against OLDGABE oldgabe.db (mode=ro URI + PRAGMA query_only=ON); no table was written — the run emits a single /tmp JSON metrics blob, surfaces nothing, and does not touch the serving tables (fused_fires, tiers, confidence, map/API). Run under the host-health gate (serving unit active, else exit 75), resource-guarded (host busy marker honored, a private serialization marker for our own runs, nice -n19, server-side timeout, thermal-abort preflight, killed by PID), on the host’s own storage. Pass A: GROUP BY canonical_event_id, family over fire_event_evidence (26.3 M rows → 634,004 event×family groups, 599,735 events), family via CASE on source (GOES = GOES*/ABI-*; polar = VIIRS*/MODIS), yielding per-event first-detection time, max FRP and frame count per family; GOES-first = GOES time strictly earliest. Pass B: streamed GOES-family evidence (2.71 M rows) ordered by canonical_event_id to derive each candidate’s k-th GOES-frame time (persistence-gated alert time) and centroid. Masks from fp_polygons: flaring/refinery = osm_refinery + osm_gas_flare + flaring_nightfire_persistence (59,591 polys); static-thermal = dozier_persistence + polar_persistence (9,556 polys); membership by 1°-gridded haversine within each polygon’s radius. Truth mirrors te_daily_scorer._load_irwin: IRWIN raw JSON deduped on IrwinID/UniqueFireIdentifier, WF/WFU only (3,831 fires), 10 nm (18.52 km) haversine gate; co-registered-polar confirmation is a later VIIRS/MODIS first-time in the same canonical event. Lead = first co-registered polar time − alert time (t₀ for un-gated / static gates, k-th GOES-frame time for persistence gates); all time math is UTC via calendar.timegm. Transport split at 2026-06-23. Every figure counted from the live production DB at run time; total wall time ~3 min.
Claim status: MEASURED NEGATIVE (own read-only artifact, dated; reuses the shipped scorer’s truth; out-of-time transport-gated). The operative claims are the candidate-population characterization (~12,300/day, 12.9% eventual-confirm), the precision-vs-lead-time curve (an 8–13% precision band in which every gate holds-or-lowers precision), and the transport result (out-of-time precision is a fire-density base-rate effect, not gate skill). The deliverable is a recommendation not to build a GOES-first provisional tier.
Hard bound (spatial-association truth + single summer window + right-censoring). The dominant caveat, inherited from entry 0025: the 12.4% IRWIN confirmation is a 10 nm proximity match, so in dense fire country it credits GOES-first pixels that are near, but not necessarily of, a logged fire — making 12.9% an upper bound on genuine precision, which only strengthens the negative. Co-registered-polar confirmation (0.5%) is the cleaner independent signal but is too rare to anchor precision, and it is itself gated by OLDGABE’s own canonical-linking. Lead time is measured only on the 0.5% of candidates with a co-registered polar detection; against IRWIN’s reported discovery time it would be reporting-artifact-contaminated, so we do not use it. All data is a single ~6-week summer window (evidence starts 2026-05-29); a 2-day tail is trimmed but recent candidates are still mildly right-censored (a real fire may confirm after the window), which biases the confirm-rate slightly low — again in the conservative direction for a “too FP-heavy” verdict. GOES persistence is proxied by total GOES-family frame count; FRP is absent for 56% of candidates (smoke-product and un-retrieved frames), so the FRP gate implicitly also selects for thermal retrievability.
Literature alignment. Verdict: AGREEMENT. That geostationary fire detection wins timeliness through cadence but pays in coarse-pixel sensitivity and elevated commission (false-alarm) rates — warm surfaces, cloud edges, and sub-pixel industrial/agricultural heat — is the established GOES/ABI result [8][3][20], and the geostationary biomass-burning detection literature has long framed the cadence-vs-false-alarm trade the same way [24]. Dedicated GOES early-fire-detection work treats timeliness as cadence-driven with a hard sensitivity/false-alarm floor [13] — consistent with our finding that persistence and FRP gates cannot separate small new fires from durable warm sources in the GOES-first pool. That persistent industrial thermal sources (gas flares) masquerade as fires is documented [11], and that polar 375 m sensors are the sensitive confirmer [1] underlies our use of a co-registered polar overpass as the clean confirmation event. Reported US fire-discovery times being human-entered and biased [6] is why we frame lead time against actual polar detections, not reported discovery.
What this does not claim: that GOES-ABI is not valuable (it wins first-arrival and anchors the fused roster — entries 0003/0025); that GOES-first alerts are never real fires (~13% are corroborated); that a co-registered GOES+polar detection is unreliable (it is the confirmed roster’s basis); nor that any latency work is closed. It claims only that a standalone GOES-first provisional/advisory tier — alerting on the first GOES flag before independent confirmation — cannot be made precise enough to surface, at any gate measured, in-sample or out-of-time. Recommendation: no shadow build. The latency levers still worth a default-OFF probe are the two entry 0025 named — a VIIRS-overpass/HMS-weighted early-confirmation tier, and camera-first alerting inside proven camera coverage (entry 0006) — neither of which is a GOES-first tier. Mark decides; nothing here changes a shipped number.
Adding Landsat-8/9 OLI SWIR to densify coverage: the truly-blind tail is 16 fires and 100% Alaska, all outside the deployed S2-SWIR footprint — so L8/L9 buys zero as a cadence densifier and at most 3–4 large Alaska fires as a spatial gap-fill. Confirmed REDUNDANT-over-CONUS / narrow-Alaska-only
BLUF. Entry 0024 named the one genuine remaining coverage lever — the sub-floor tail — and noted OLDGABE already ingests a Sentinel-2 SWIR-hotspot source (S2-SWIR-Hotspot), so the only open question is whether densifying that cadence by adding Landsat-8/9 OLI SWIR (B6 ~1.6 µm / B7 ~2.2 µm, 30 m; L8+L9 phased for ~8-day repeat, tighter at high latitude via swath sidelap) recovers any net-new fire. We reproduced the sub-floor set against the full any-status event net and the answer is a clean no, with one narrow Alaska caveat. Two facts decide it. (1) The truly-blind tail — IRWIN-active wildfires with no OLDGABE event of any status (candidate, masked-fp, confirmed, …) within 10 nm over their entire active window — is just 16 fires, and every one is in Alaska (stable at 16 across four consecutive scoring windows 07-08→07-11). Not one is in the Lower 48: OLDGABE’s detection net blankets CONUS so densely that zero CONUS wildfires are event-free, so a densifier has nothing to recover there. (2) The deployed S2-SWIR daemon is hard-coded to a CONUS bounding box (24–50°N, 125–66°W) — it is not pointed at Alaska at all — so all 16 blind fires sit outside the existing S2 footprint. That reframes the lever entirely: L8/L9 would add no temporal cadence anywhere S2 already looks (S2’s 5-day repeat is denser than L8/L9’s 8-day at every latitude, and the open sub-floor windows span weeks, so S2 already delivers many overpasses per window), and the only coverage it adds is spatial — Alaska, where the real gap is that the S2 daemon’s box stops at 50°N. Of the 16 Alaska fires, 12 (75%) are sub-1-acre point records (1.8 ac total) — hopeless at a 30 m SWIR sub-pixel floor no matter how often overflown — leaving a net-new recoverable upper bound of just 4 fires ≥1 acre (505 ac), a robust core of 3 fires ≥10 acres, dominated by a single 409-acre Alaska burn. Verdict: L8/L9 SWIR densification is REDUNDANT over CONUS and a narrow, Alaska-only, large-fire-only spatial gap-fill worth at most a default-OFF shadow — and even that gap is better closed by pointing SWIR ingestion at Alaska (L8/L9 or extending the S2 box north) than by “more cadence.” Nothing surfaced, no production table touched.
Feasibility — the lightest real path to L8/L9 SWIR active fire. Unlike VIIRS/MODIS there is no operational Landsat active-fire feed (no FIRMS-style Landsat hotspot product); hotspots must be derived from OLI SWIR scenes using an established algorithm — the Schroeder et al. (2016) Landsat-8 OLI active-fire algorithm [12] or the Kumar–Roy (2018) reflectance-based OLI fire test [25] (B6/B7 thresholds plus a folding/contextual test). The good news is the ingestion mechanism already exists in-shape: the deployed S2 daemon reads B11/B12 COGs over an open STAC/COG path (earth-search.aws.element84.com, streaming only the SWIR bytes it needs via rasterio’s HTTP driver) — the identical pattern applies to Landsat Collection-2 (usgs-landsat / Element84 landsat-c2-l2 on AWS), reading OLI B6/B7 COGs and applying the same B12–B11-style threshold logic. Realistic ingestion cost over CONUS+AK is modest: L8+L9 acquire on the order of a few hundred daytime WRS-2 scenes/day combined; with the strided SWIR-window reads the S2 daemon already uses, that is low-single-digit GB/day, not a scene-download pipeline. The binding caveat is latency: Landsat Collection-2 L2 (surface-reflectance/temperature) publishes at ~12–24 h+ — so, exactly like S2, this is a coverage/confirmation lever, not a fast-alert lever (consistent with entry 0024’s framing that SWIR is burn-scar/coverage, not active alerting).
The reproduced sub-floor set (scoring window 2026-07-10→2026-07-11, entry-0024-equivalent; 10 nm vs IRWIN WF/WFU; 3,698 active wildfires; 16 truly-blind fires — no OLDGABE event of any status within 10 nm/active-window over a 30-day lookback; the count is invariant — 16 — across all four windows tested):
size band
fires
% of tail
acres
in deployed S2 box?
30 m OLI SWIR verdict
<1 acre (point records)
12
75.0%
~1.8
no (all AK)
at/below sub-pixel floor — orbit-hopeless
1–10 acre
1
6.3%
4.2
no (all AK)
marginal — needs clear-sky daytime overpass on active flaming
10–100 acre
2
12.5%
92.3
no (all AK)
plausibly detectable
≥100 acre
1
6.3%
408.9
no (all AK)
plausibly detectable
The whole tail is Alaska. All 16 fires carry POOState=US-AK; zero are inside the deployed S2-SWIR CONUS box; every one is an open IRWIN record (null FireOutDateTime), so its active window runs discovery→now (days to weeks). The mechanism is structural: OLDGABE’s candidate/detection net (GOES-ABI + HMS + polar) is so dense over the fire-prone West that no CONUS wildfire ends up event-free within 10 nm over a multi-week window — the blind tail is precisely the region the net under-covers, which is Alaska.
The net-new coverage delta over the deployed S2 baseline (deployed S2-SWIR-Hotspot = B11/B12 20 m, ~5-day A+B, CONUS box 24–50°N only; candidate add = L8/L9 OLI B6/B7 30 m, ~8-day; upper bounds throughout, from revisit geometry not imagery):
lever component
fires
acres
note
Temporal densification within the S2 footprint (CONUS)
0
0
no CONUS sub-floor fire exists; and S2’s 5-day < L8/L9’s 8-day at every latitude → L8/L9 opens no window S2 does not
Spatial coverage outside the S2 box (all Alaska), L8/L9 ≥1 overpass in window
16
~507
all get many daytime overpasses (weeks-long open windows) — overpass is not the limiter
— of which ≥1 acre (generous 30 m SWIR floor) — NET-NEW UPPER BOUND
4
505.4
99.7% of the tail’s acreage; all Alaska
— of which robustly sized (≥10 acre)
3
~501
the realistic recovery core — larger AK burns
— of which ≥100 acre
1
408.9
a single burn carries 81% of the recoverable acreage
Below SWIR sub-pixel floor (<1 ac point records) — hopeless
12
1.8
0.3% of tail acreage — unrecoverable from orbit at any cadence
Reading the delta honestly. The net-new recoverable upper bound is 4 fires / 505 acres, and it is acreage-rich only because a single 409-acre Alaska burn dominates it. Strip to what a 30 m OLI SWIR band would robustly resolve and the core is 3 fires ≥10 acres. Two independent reasons make even that 3–4 optimistic. First, it assumes a cloud-free daytime overpass coincides with active flaming — Alaska summer cloud frequency, solar-zenith, and the overpass/flaming coincidence all push realistic yield below the bound. Second, and decisively for the densification question: L8/L9 adds no temporal reach that S2 lacks. S2’s two-satellite 5-day repeat is denser than L8/L9’s two-satellite 8-day repeat at every latitude (both tighten poleward via sidelap, but S2 stays ahead), and the sub-floor windows are weeks long, so wherever S2 can look it already delivers multiple overpasses. L8/L9’s only contribution over the deployed baseline is spatial — Alaska, which the S2 daemon’s box simply excludes. So “densify cadence with L8/L9” is the wrong framing for the win that exists; the win, such as it is, is “cover Alaska at all,” achievable equally by extending the existing S2 box north.
Verdict — confirmed low-yield / redundant-as-densifier. Against a roster whose generous ever-detected recall is (3,698−16)/3,698 = 99.6% within the active window, the truly-blind tail is 16 fires, 75% of them orbit-undetectable sub-1-acre point records, entirely in Alaska and entirely outside the deployed S2 footprint. Adding Landsat-8/9 OLI SWIR as a cadence densifier of the existing (CONUS) S2 feed recovers zero fires. The only real prize is a narrow, Alaska-only, large-fire-only spatial gap of 3–4 fires — and it is a coverage-footprint fix, not a cadence fix. If pursued at all it justifies at most a default-OFF, Alaska-focused, ≥10-acre SWIR shadow probe measured for recovered-recall vs added-FP — whether that SWIR comes from L8/L9 or from extending the S2 box north is an implementation detail. This is exactly the “real but marginal” ceiling entry 0024 anticipated, now localized to Alaska and quantified to single digits.
Reproducibility detail. Read-only replay against OLDGABE oldgabe.db (mode=ro URI + PRAGMA query_only=ON), no writes; run under the host-health gate (serving unit active, else exit 75), honoring the hard host busy marker, with a private serialization marker for our own runs, nice -n19, server-side timeout, killed by PID, thermal-abort preflight — resource-guarded throughout. Truth reuses the shipped scorer daemons/te_daily_scorer.py verbatim (_load_irwin, _rng_nm, 1° bucketing with 3×3-neighbour probing, MATCH_RADIUS_NM=10 nm, ACTIVE_WIN_PAD_S=24 h): IRWIN truth = fire_event_evidence where source='IRWIN', deduped on IrwinID/UniqueFireIdentifier, IncidentTypeCategory∈{WF,WFU}, active window = [FireDiscovery−24 h, FireOut||now+24 h] (3,698 active WF/WFU). Event net: every fire_events row (any status — candidate/masked-fp/confirmed/confirmed_growth/awaiting-confirmation/pre-ignition/rx-burn) with last_seen in the 30-day lookback (867,043 events), bucketed 1°×1°; a fire is false-negative when no promoted (status∈{confirmed,confirmed_growth,awaiting-confirmation,pre-ignition}) event overlaps its window within 10 nm, and sub-floor/truly-blind when no event of any status does — here the two coincide (FN=sub-floor=16), i.e. every FN fire is fully event-free. Per-fire fields from the IRWIN raw JSON: size FinalAcres→IncidentSize→DiscoveryAcres, region POOState, times FireDiscoveryDateTime/FireOutDateTime epoch-ms; time math via the scorer’s own time.mktime convention. Deployed S2 footprint read directly from sentinel2_swir_daemon.py (CONUS_BBOX=(-125,24,-66,50), SOURCE='S2-SWIR-Hotspot', 2,976 detections in-DB); a fire is “in footprint” iff inside that box. Revisit geometry (upper bounds, no imagery): effective S2 A+B interval max(2.0, 5.0·cos lat) d, L8+L9 interval max(3.0, 8.0·cos lat) d (both tighten poleward via swath sidelap; S2 denser at every latitude by construction and by fact); overpasses-in-window = window-days / interval; temporal net-new = in-footprint fire with 0 S2 overpasses but ≥1 L8/L9 (=0 by the density ordering); spatial net-new = out-of-footprint fire with ≥1 L8/L9 overpass, sized ≥1/≥10/≥100 ac. No imagery was pulled; the bound rests on revisit geometry + fire size/duration + the 30 m OLI SWIR sub-pixel limit. Stability: the tail is 16 fires across scoring windows 07-08/07-09/07-10/07-11. Only artifact written was a /tmp JSON on the host.
Claim status: MEASURED (own read-only artifact, dated; reuses the shipped scorer; extends the entry-0024 sub-floor bound to the L8/L9-vs-S2 densification question). The net-new figure (4 fires ≥1 ac / 3 ≥10 ac) is a hard upper bound; the operative claim is the verdict — L8/L9 SWIR adds zero cadence over the deployed CONUS S2 feed and at most a narrow Alaska-only spatial gap-fill of a few large fires.
Hard bound (summer-only + upper-bound + no-imagery + net-definition). All data is summer 2026 and a set of adjacent 24-hour windows; a true off-season or multi-season distribution is deferred. Every recoverability number is an upper bound from revisit geometry and reported fire size, not from actual OLI scenes — we confirmed no single cloud-free daytime SWIR anomaly; cloud, solar-zenith, active-flaming/overpass coincidence, and the fusion-gate/attribution requirement all reduce realistic yield below the bound. The tail here (16) is measured against the full any-statusfire_events net and the generous multi-week active-window match, which is a stricter blindness test than a single 24-hour scoring pass — so it is a conservative floor on the sub-floor, tighter than and consistent with entry 0024’s 48-fire recoverable upper bound (0024 bounded the CONUS-inclusive tail generously; this entry localizes the genuinely event-free core to Alaska). The 10 nm (18.5 km) match radius is the scorer’s own; IRWIN size fields are human-reported and often stale for open records; the ≥1-acre SWIR floor is a rule-of-thumb, not a validated per-scene threshold; the revisit intervals are geometric approximations, not per-orbit ephemerides.
Literature alignment. Verdict: AGREEMENT. That active fires can be detected from mid-resolution OLI SWIR (1.6/2.2 µm) below the pixel size via a dedicated Landsat active-fire algorithm — but only by deriving hotspots from scenes, with no operational Landsat fire feed and a floor set by fire radiant area, cloud, and multi-day revisit — is the established finding [12][25], mirroring the Sentinel-2 SWIR active-fire result [10]. That these multi-day mid-resolution imagers complement, rather than replace, the daily/sub-daily polar and geostationary active-fire products [1][3] is the standard operational view. Our result is consistent: with S2 already providing the denser (5-day) SWIR look over CONUS, a second 8-day SWIR imager densifies nothing there; its only marginal value is extending SWIR into an unserved region (Alaska) for the larger persistent burns.
What this does not claim: that no Alaska sub-floor fire is recoverable — up to 4 (upper bound), realistically a couple of larger burns, plausibly are; that L8/L9 OLI SWIR is useless in general — it is a valid independent SWIR confirmer, it simply adds no cadence over the deployed S2 feed; nor that Alaska coverage is not worth having — it is, but the honest lever is “point SWIR ingestion at Alaska” (L8/L9 or an S2-box extension north of 50°N), not “more cadence.” Next: if the Alaska large-fire recovery is pursued, stand up a default-OFF, Alaska-only ak_swir_coverage_shadow restricted to ≥10-acre IRWIN-active fires with no core-sensor touch in-window — sourcing OLI B6/B7 (Schroeder 2016 / Kumar–Roy 2018 derivation) and/or extending the S2 box — and measure recovered-recall vs added-FP over ≥14 runs with CIs before proposing any cutover; weigh it against the far larger liveness/persistence levers from earlier entries, which remain the dominant recall investment. Nothing here changes a shipped number.
A learned “real-bogus” FP filter on the lone-VIIRS slice re-derives the shipped masks — the spectral/footprint/diurnal signal beyond the masks carries only 6% of the discriminative power and cannot flag off-registry false positives out-of-time at usable precision
Date: 2026-07-10 Status: MEASURED NEGATIVE (out-of-time) — the non-mask channel is not a promote candidate; the discriminative signal is mask/persistence/registry, already shipped — extends entries 0022/0028 and mirrors 0027
BLUF. OLDGABE’s surfaced false positives concentrate in the probable-tier lone-VIIRS slice (entries 0022/0028: ~20% surfaced FP, ~27% in the probable tier). We already ship static/persistence FP masks — refinery/gas-flare polygons, VIIRS-Nightfire flaring, and Dozier/polar persistence cells (all in fp_polygons) — plus a power-plant registry cutover-candidate. The question for this wave, framed skeptically: can a learned classifier separate genuine early fire from persistent non-fire in that slice using signal beyond what the masks already encode? The trap (identical to entry 0027’s temporal re-ranker, which just re-derived production’s n_goes≥3): if the classifier’s power is entirely mask/persistence/registry features, it is redundant with what ships. We built two feature sets — a mask/persistence baseline (on-polygon, distance-to-mask, fixed-cell persistence, flare-cluster density, registry proximity, peak FRP) and a non-mask candidate (VIIRS I4/I5 brightness temperature, I4−I5 thermal anomaly, pixel footprint scan×track, day/night ratio, FRP distribution shape, saturation fraction) — trained class-balanced HistGradientBoosting on each and the union, and ran a strict train-earlier / test-later transport gate. The result is a clean negative. Out-of-time, mask-only reaches PR-AUC 0.984; non-mask reaches only 0.869; the union (0.978) is no better than mask-only. Permutation importance on the union puts 94% of the discriminative signal on mask/persistence/registry features (top five all mask: flare-cluster density, distance-to-mask, persistence-days, persistence-extent, registry distance) and only 6% on the entire non-mask block, the best of which (mean I5 background temperature, +0.004) sits an order of magnitude below any mask feature. The decisive test — can the non-mask model catch false positives the shipped polygons miss (off-polygon detections), out-of-time, at usable precision with ~0 real-fire cost? — fails: on the 830 off-polygon test detections the non-mask model at its precision-0.90 training threshold catches 286 FP but flags 207 real fires to do it (precision 0.58), while the union catches the same 332 FP as mask-only alone (119 vs 116 fires flagged) — adding the non-mask channel buys nothing. The masks already capture the separable signal; a learned real-bogus filter re-derives them and adds no promotable, orthogonal value. Fully read-only on production; no shadow build, no shipped number changes.
The population and the labels. The FP-concentrated slice is the lone-VIIRS caution population: event_corroboration_tier where tier='CAUTION' and families∈{VIIRS, VIIRS+HMS} (one independent family, HMS not counted) — 11,572 events, each with its VIIRS member detections (1,760,347 detections parsed for spectral/morphology features). Because 454 hand-adjudicated rows (entry 0028) are too few to train + transport-split, we expand with the same entry-0028 strong-evidence rules applied programmatically: FIRE = IRWIN/WFIGS incident ≤10 nm, or multi-day polar persistence with growth (≥2 distinct days & ≥3 km extent), or energetic FRP≥10 MW away (>10 km) from any static source; NON_FIRE = on a shipped fp_polygons mask, or fixed-cell persistence (≥5 distinct days in a ~2 km cell, <1.5 km extent, no incident), or inside an O&G flare/refinery cluster; everything else = AMBIGUOUS (held out). Labels: 1,566 FIRE / 4,233 NON_FIRE / 5,773 AMBIGUOUS. Supervised set = 5,799.
The transport gate. Split on each event’s first detection time at the 60th percentile (2026-07-05T11:41Z): train = 3,457 (2,536 NON_FIRE / 921 FIRE), test strictly later = 2,342 (1,697 NON_FIRE / 645 FIRE). Positive class = NON_FIRE (i.e. the model predicts “this is a false positive”); test base FP rate 72.5%. Metrics are precision/PR-AUC of FP-identification on the held-out-time set.
Mask-only nearly ceilings; the union does not beat it (0.978 vs 0.984, inside noise and marginally lower); non-mask alone is a clear 0.115 PR-AUC below mask-only. Adding the spectral/footprint channel to the mask baseline moves nothing out-of-time.
Where the signal lives — permutation importance on the union (out-of-time PR-AUC drop).
feature
block
ΔPR-AUC when permuted
ogbasin (flare/refinery cluster density ≤15 km)
MASK
+0.0455
static_km (distance to nearest shipped mask)
MASK
+0.0439
persist_days (distinct detection-days, ~2 km cell, 30 d)
The top five features are all mask/persistence/registry; the entire non-mask block — brightness temperature, thermal anomaly, footprint, diurnal, FRP-shape, saturation, the physics a static polygon genuinely cannot see — contributes 6% of the discriminative power, its best member (mean I5 background temperature) an order of magnitude below any mask feature. Just as entry 0027’s temporal channel collapsed onto GOES n_goes, the real-bogus spectral channel collapses onto the persistence/registry cuts the masks already encode.
The decisive test — can non-mask catch FP the shipped polygons miss? Shipped-mask coverage = on a fp_polygons polygon (on_static=1). The only place a learned filter could add value is off polygon. We fixed each model’s threshold on the training fold at precision ≥ 0.90 and applied it to the 830 off-polygon test detections (332 NON_FIRE / 498 FIRE):
model, off-polygon test (n=830)
train thr @p≥0.90
flagged
true-FP caught
real fires flagged
precision
non-mask
0.400
493
286
207
0.580
mask-only
0.010
448
332
116
0.741
union
0.012
451
332
119
0.736
Off-polygon, the non-mask model collapses to 0.58 precision — it flags 207 real fires to catch 286 false positives, an unusable recall cost. The union catches the same 332 true-FP as mask-only (flagging 119 vs 116 real fires) — identical to mask-only within noise. The non-mask channel adds zero incremental off-polygon FP-catch. What does carry the off-polygon catch is persist_days — freshly-computed fixed-cell persistence that is not yet a fp_polygons entry — but that is a mask-family (persistence) feature, i.e. the honest incremental lever is “extend the persistence polygon set to freshly-detected persistent cells,” not “learn a non-mask spectral classifier.”
Reproducibility detail. Read-only against OLDGABE oldgabe.db (mode=ro URI + PRAGMA query_only=ON), no production writes; run under the host-health gate (serving unit active, else exit 75), honoring the hard host busy marker with a private serialization marker for our own run, nice -n19, server-side timeout, killed by PID, thermal-abort preflight — resource-guarded throughout; the only artifact is a /tmp log on the host, nothing surfaced. Population:event_corroboration_tiertier='CAUTION', families∈{'VIIRS','VIIRS,HMS','HMS,VIIRS'} (11,572 events); VIIRS member detections joined by canonical_event_id (1,760,347 rows), spectral fields parsed from each detection’s raw JSON (bright_ti4, bright_ti5, scan, track, frp, daynight). Mask/persistence features (7): nearest-fp_polygons distance & on-polygon flag (refinery / gas-flare / Dozier-persistence / polar-persistence / Nightfire-flaring, 69,147 polygons + 3,839 WRI power plants + flaring-shadow), 30-day fixed-cell (~0.02°) distinct-detection-day count & extent over VIIRS-NPP/N20/N21 + MODIS, flare-cluster density ≤15 km, nearest power-plant distance, peak FRP. Non-mask features (15): I4 max/mean/std, I5 mean, I4−I5 anomaly max/mean, footprint scan×track (mean scan, mean track), night ratio, member count, FRP mean & CV, I4-saturation fraction (≥366 K), intra-event time span. Labels = entry-0028 rules verbatim (IRWIN 30-day + WFIGS-WF truth grid, 10 nm; static-mask / fixed-cell-persistence / flare-cluster non-fire; multi-day-growth / energetic-away-from-static fire; else ambiguous held out). Model = HistGradientBoostingClassifier (max_iter 300, lr 0.06, max_depth 3, l2 1.0), class-balanced via compute_sample_weight('balanced'); NaNs handled natively. Transport: split on first-detection epoch at the 60th percentile (2026-07-05T11:41Z), train earlier / test strictly-later. Metrics via average_precision_score, precision_recall_curve; importance via sklearn.inspection.permutation_importance (10 repeats, scoring average_precision) on the test fold. Off-polygon incremental threshold fixed on the train fold at the smallest cut achieving train precision ≥ 0.90.
Claim status: MEASURED NEGATIVE, out-of-time, read-only. A learned real-bogus FP filter on the lone-VIIRS slice is not a promote candidate: under strict train-earlier / test-later transport the non-mask channel reaches PR-AUC 0.869 vs mask-only 0.984, the union (0.978) does not beat mask-only, the non-mask block carries only 6% of permutation importance, and off-polygon it cannot identify additional false positives at usable precision (0.58, flagging 207 real fires per 286 FP) — while the union’s off-polygon catch (332 FP, 119 fires) is indistinguishable from mask-only (332 FP, 116 fires). No shadow build is recommended; no fusion, tier, mask, confidence floor, map, or API number changes. The one honest incremental lever surfaced is a mask-family one — promote freshly-detected fixed-cell persistence into the shipped polygon set — not a non-mask classifier.
Hard bound (label circularity + summer-only + no off-mask ground truth). The non-fire labels are partly derived from the masks themselves (on-polygon / persistence / flare-cluster), so the mask-feature model is trivially near-perfect by construction and its 0.984 must be discounted — this entire design exists to isolate the non-mask lift, which is what is measured and what is absent (6% importance; off-polygon collapse). Consequently there is no mask-independent non-fire ground truth: a false positive that sits off every polygon and off every persistence/flare cue simply has no label, so a truly-novel FP the masks miss cannot be counted here — closing that requires a human-reviewed gold subset, the same conclusion entry 0028 reached. All data is summer 2026 over a ~13-day window (2026-06-27…07-10), so the transport gate is train-earlier / test-later within summer (days, not seasons); off-season validation is deferred until winter data exists. VIIRS I4 saturates near 367 K, censoring the brightness-temperature channel for the most energetic sources and capping the non-mask ceiling.
Literature alignment. Verdict: AGREEMENT. Persistent industrial and gas-flaring thermal sources are the dominant commission-error class in VIIRS/GOES active-fire products, and the operational remedy is exactly a static hot-source mask / Nightfire flaring catalog / persistent-anomaly exclusion [11][1][19], keyed off registries such as the WRI power-plant database [18]. The learned “real-bogus” classifier paradigm from time-domain astronomy [26] adds value precisely when it captures signal beyond the existing cuts. Our out-of-time result [4] agrees the spectral/footprint/diurnal signal is real (non-mask PR-AUC 0.869, well above chance) but shows it is not orthogonal to the shipped mask/persistence/registry cuts — permutation importance [27] places 94% of the power on mask features — so a learned real-bogus filter re-derives the masks rather than beating them. This is the same pattern entry 0027 found for temporal dynamics collapsing onto GOES persistence, and the same brightness-temperature contrast that underlies Dozier sub-pixel retrieval [7] is here already implicit in the persistence/flaring masks.
What this does not claim: that VIIRS brightness-temperature / footprint / diurnal signal is uninformative — it reaches 0.869 PR-AUC alone and is a valid physical fire-vs-industrial discriminant; that the lone-VIIRS FP problem is solved — entries 0022/0028 measure it at ~20–27% and it remains the largest surfaced-FP lever; nor that no learned filter could ever help — only that on this slice, with mask-derived labels, the non-mask channel adds no orthogonal out-of-time value over the polygons already shipped, because the separable signal is persistence/registry, which the masks encode. Next: the honest levers are (1) extend the shipped persistence polygon set to freshly-detected fixed-cell persistent sources (a mask-family, not a classifier — measure recovered-FP vs added-FP over ≥14 runs before any cutover), and (2) build the human-reviewed gold subset entry 0028 called for, which is the only way to obtain mask-independent non-fire labels and thereby test whether any non-mask signal catches FP the masks genuinely miss. Until such labels exist, the shipped masks remain the filter to beat — and they already see the separable part of the real-bogus signal.
The gate is doing its job. This is the sixth recovery/gate candidate the transport check has correctly stopped — after the Dozier multi-feature gate, the Dozier early-cue tier, recovery+raw-geo, recovery+physical-geo, and recovery+temporal-dynamics. Each time the near-miss control (here non-mask 0.869) is explained by permutation importance as signal the production baseline already owns.
A finer fire-growth-truth dataset (full-precision VIIRS 375 m footprints + IRWIN acreage series, replacing the 0.01°-quantized member tokens of entry 0030) shows the persistence spread signal is real and stronger, not a truth artifact: mean-resultant R rises 0.44→0.54 on the same all-fires test and 0.63→0.72–0.84 on a now-robust resolvable subset (n=70–117, up from n=13–17); the current-wind model still scores at the random-direction null and the earlier 176° “spreads-upwind” offset vanishes — confirming it was a coarse-GOES footprint-fill artifact — 0034
Date: 2026-07-11 Status: defensible (measured; read-only on production; honest baselines; research/prototype only, no cutover, nothing surfaced) — builds one hidden shadow dataset (growth_truth_shadow, surface_allowed=0, not read by the serving app); directly resolves the truth-quality bottleneck flagged by entry 0030
The framing. Entry 0030 prototyped a short-horizon fire-spread nowcast and found a clean split: the simple physical wind model had no measured skill (R=0.02) while a persistence baseline — the fire’s own earlier motion predicting its later direction — scored R=0.44. But 0030 could not say how much of that 0.44 was real, because its growth truth was detection-footprint centroids read from fused member tokens quantized to 0.01° (≈1.1 km), GOES-dominated, with a median observed displacement of only 0.44 km — below one pixel. On the tiny resolvable subset (n=17) the wind vector even pointed ∼176° opposite to observed motion, which 0030 diagnosed (but could not prove) as a footprint-fill artifact. This entry removes that bottleneck: it rebuilds the growth truth from the raw per-detection evidence at full precision and re-measures every 0030 statistic against it.
BLUF. The raw evidence table carries the finer truth 0030 lacked. Rebuilding growth tracks from full-precision VIIRS active-fire pixels (375 m native, ≈5-decimal coordinates — roughly 3× finer than the 1.1 km fused rounding) and, independently, from the IRWIN IncidentSize acreage time-series, yields a 971-row growth-truth dataset (313 VIIRS footprint tracks, 14 MODIS fallback, 644 IRWIN acreage series). On this finer truth the persistence signal strengthens: on the same all-fires direction test the mean-resultant length rises to R=0.54 (n=150, mean angular error 48.2°) from 0030’s 0.44, and on a resolvable-displacement subset that is now robust — n=70 at ≥0.75 km, n=117 total, versus 0030’s n=13–17 — it reaches R=0.72 (≥0.75 km) and R=0.84 (≥1.1 km, mean error 22.8°, 86% within 45°). The current-wind model still lands at the random-direction null (R≈0.14–0.22, mean error 96–100°), and critically the 176° reversal of 0030 is gone (mean error ≈97°, i.e. simply uninformative rather than anti-correlated) — direct evidence the reversal was a coarse-footprint artifact, exactly as 0030 suspected. On rate, the wind×dryness index still shows no skill (Spearman −0.12), but two independent growth-rate truths agree: VIIRS footprint growth-rate vs. IRWIN acres/hour correlate at Spearman 0.56 (n=63 spatially-linked fires) — the observed rate is real even though the physical predictor does not capture it. Verdict: the persistence-spread signal is real and now well-resolved; a default-OFF persistence advisory is defensibly buildable. Wind still adds nothing without a time-archive. Nothing was surfaced; the only write is a hidden, gated shadow dataset.
Growth-truth source inventory. The point of this pass was to find the finest time-resolved growth record available per fire and state the precision of each candidate honestly.
growth-truth source
precision
availability on-box
what it gives
full-precision VIIRS active-fire pixels
375 m native, ≈5-decimal lat/lon
313 fused fires with ≥6 VIIRS detections spanning ≥3 h
direction and rate; ≈3× finer than the 1.1 km fused member rounding
IRWIN IncidentSize acreage series
scalar area, sub-daily polling
2,985 WF incidents; 644 carry a real monotone growth series
direct rate truth (area vs. time); no direction (fixed InitialLatitude/Longitude origin)
MODIS active-fire pixels
1 km native
14 fires (VIIRS-absent fallback)
direction+rate, coarser than VIIRS
fused member tokens (entry 0030’s truth)
0.01° ≈ 1.1 km quantized
—
superseded — median displacement collapsed below one pixel
S2/S1 burn-scar area deltas
10–20 m spatial
fire_perimeters 132 single-snapshot; S2-SWIR 2,976 / S1 465 point detections
no per-fire area time-series stored — deferred (would need scar-area accrual)
Method (mirror of entry 0030, finer truth). Anchor on the same corpus — fused_fires with tier∈{confirmed,probable}, n_frames≥8, track span ≥3 h — but instead of parsing the 0.01° member tokens, spatially join the raw full-precision detections (fire_event_evidence: VIIRS-N20/N21/NPP preferred, MODIS fallback) within 7 km of the fused centroid and within the fire’s time window, then recompute the growth track from those coordinates. Split each fire’s detections into early/mid/late thirds by time; the early→late centroid bearing is observed direction and the displacement / elapsed hours is observed rate; the persistence baseline is the early→mid bearing. Direction skill uses circular statistics (mean angular error, mean-resultant length R, Rayleigh test) against a 90° uniform null [23]; the wind model is the RAWS downwind bearing (wind_dir_deg + 180°). Independently, the IRWIN acreage series gives a per-incident acres/hour rate; the two rate truths are cross-checked on fires within 10 km of an IRWIN WF incident. Every read is mode=ro on production.
predictor
subset (finer truth)
n
mean ang. err
median
within 45°
R
Rayleigh p
random-direction null
—
—
90.0°
90.0°
0.25
—
1.00
persistence (fire’s own motion)
all
150
48.2°
26.8°
0.61
0.543
<10−300
persistence
resolvable ≥0.75 km
70
32.7°
14.8°
0.76
0.723
<10−300
persistence
resolvable ≥1.1 km
43
22.8°
9.9°
0.86
0.839
<10−300
downwind (wind+180°)
all
327
100.4°
103.7°
0.17
0.219
1.3×10−7
downwind (wind+180°)
resolvable ≥1.1 km
77
96.6°
106.8°
0.17
0.142
0.21
Comparison to entry 0030 (0.01°-quantized truth): persistence all was R=0.44 (n=165, mean 55.5°); persistence resolvable was R=0.63 (n=13); the wind model was R=0.02 all / R=0.50 at a spurious 176° offset on n=17. On finer truth persistence rises at every cut, the resolvable subset grows ∼5× in size, and the wind model’s R stays at the null with the 176° offset replaced by an ordinary ≈97° (uninformative) error — i.e. the reversal was the coarse-footprint fill artifact, not physics. Median observed displacement rises from 0.44 km (quantized) to 0.84 km (finer), which is why the resolvable subset is no longer starved.
Rate skill. The wind×dryness ROS index still does not predict observed footprint growth-rate on the resolvable subset (Spearman −0.12, n=117; wind-speed-alone +0.07) — no skill over the predict-median baseline, confirming entry 0030. But the observed rate itself is real: on the 63 footprint fires that spatially link (≤10 km) to an IRWIN WF incident, the VIIRS footprint growth-rate and the IRWIN acres/hour series correlate at Spearman 0.56 — two physically independent growth-rate measurements agreeing. The gap is therefore in the predictor (live, spatially-mismatched wind), not in the growth target.
Reproducibility detail. Resource-guarded on the host: health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, run under a private serialization marker (unique name, so a concurrently-running sibling job is never contended) inside a capped experiment slice with a server-side timeout + nice -n19 and a thermal-abort watchdog, killed by PID. Reads are mode=ro on all production tables. The only write is a new hidden table growth_truth_shadow registered in canary_meta with surface_allowed=0 and a DO_NOT_SURFACE gate reason; the serving app does not read it. Corpus = fused_firestier∈{confirmed,probable}, n_frames≥8, span ≥3 h; for each, all fire_event_evidence VIIRS (else MODIS) detections within 7 km of the fused centroid and within [first_seen−2h, last_seen+2h] are pulled at native precision via an in-memory 0.05° spatial grid over 9.41 M loaded detections; a fire qualifies with ≥6 detections, ≥2 in each of early/late thirds, span ≥3 h (327 fires: 313 VIIRS, 14 MODIS). IRWIN series = IncidentSize parsed from the raw IRWIN JSON, grouped by IrwinID, restricted to IncidentTypeCategory=WF, cumulative-max over ModifiedOnDateTime_dt (644 incidents with a real monotone growth series). Resolvable = observed displacement ≥0.75 km (2× VIIRS pixel) or ≥1.1 km, RAWS within 40 km. Circular stats = mean angular error, mean-resultant R, Rayleigh test on signed (observed−predicted) offsets; persistence = early→mid centroid bearing. Every figure counted from the live production DB at run time; growth_truth_shadow = 971 rows (313 viirs_footprint, 14 modis_footprint, 644 irwin_acres), 161 of the footprint rows flagged resolvable.
Claim status: MEASURED, read-only on production, honest baselines, research/prototype only. This entry rebuilds the growth truth at finer resolution and re-runs entry 0030’s validation against it; it changes no fusion/tier/confidence/map/API surface and surfaces nothing. Its one write is an additive, gated, do-not-surface shadow dataset. The headline is that the persistence signal survives and strengthens a ∼3× finer truth while the wind model does not, and that the 0030 reversal was an artifact.
Honest bounds. (1) The persistence baseline shares its start point with the observed vector (both anchored on the early centroid), so a fraction of its R is construction overlap — identical to the 0030 caveat; the load-bearing contrast is that coherent direction demonstrably exists (R=0.54–0.84) while the current-wind model captures essentially none of it (R≈0.14–0.22). (2) Footprint corpus is VIIRS-overpass-limited — only 327 of 954 candidate fused fires accrue ≥6 native detections over ≥3 h, because polar VIIRS sees a given fire only a few times per day; this biases toward larger/longer-lived fires. (3) IRWIN acreage is rate-only — a scalar with a fixed reporting origin; it validates rate but contributes no direction, and its polling cadence and human-reporting lag are coarser than the satellite footprint. (4) No independent perimeter time-series — S2/S1 burn scars are stored as single snapshots / point detections, not per-fire area accruals, so the finest spatial truth (10–20 m) is not yet time-resolved on-box. (5) Wind is still a live snapshot (median 28 km to nearest RAWS, no historical archive), so the wind model’s continued failure remains, in part, a data-timing failure, not proof wind is irrelevant. (6) Single warm-season CONUS window — nothing here speaks to other seasons or regions.
Literature alignment. Verdict: CONFIRMS-AND-STRENGTHENS (the target’s coherence is now well-resolved; the model gap is data, not physics). That real fires have a coherent, measurable spread direction and rate is exactly what satellite fire-progression atlases quantified [16]; recovering that coherence more cleanly at finer detection resolution is expected. The persistence-of-motion result and the wind model’s failure-by-mismatch are consistent with Rothermel/empirical surface-spread theory [21][22] under a temporally-mismatched wind input. The disappearance of the 176° offset when detection quantization is removed is a textbook case of coarse geostationary footprints conflating detection onset/fill with physical growth [3][8]. Circular-statistics scoring follows standard directional-data methods [23].
What this does not claim: that wind does not drive fire spread (it does — the on-box wind is too temporally/spatially mismatched to show it), that persistence is a physical spread model (it is a momentum baseline, and part of its score is construction overlap), that VIIRS 375 m footprints are a perfect perimeter truth (they are sparse in time and biased to larger fires), or that any number here should touch serving (nothing is surfaced; the shadow dataset is gated surface_allowed=0). Recommendation: the truth bottleneck of entry 0030 is now resolved and the persistence signal is real and well-resolved, so the honest next product is a default-OFF persistence spread advisory — extrapolate each active fire’s own recent growth vector (“spreading roughly NE at ∼X”), built as a shadow layer validated against growth_truth_shadow, never as a detection. Two data gaps remain before wind can correct that advisory: (a) a time-archived wind joined at the detection timestamp (snapshot RAWS into a history table, or ingest gridded HRRR/GFS into the empty weather_cells); (b) a time-resolved perimeter/scar-area truth (accrue S2/S1 burn-scar area per fire) to tighten the rate signal below the VIIRS-cadence limit. Until (a) exists, wind stays out of the advisory. Mark decides.
Hard-bound: warm-season CONUS, single active-fire window; footprint truth is VIIRS 375 m / MODIS 1 km, sparse in time and biased toward larger/longer-lived fires (n=327 tracks; n=43–117 resolvable); IRWIN acreage is a scalar rate-only series with reporting lag (n=644); no independent time-resolved perimeter truth; wind remains a live snapshot with no historical archive. Every conclusion is scoped to that regime; the persistence result is a statement about observed fire momentum in this window, and the wind negative remains a statement about the current observations, not the physics of fire spread.
Re-tested as a genuine no-overlap forecast (predictor uses only the fire’s track up to a decision time T, validated strictly on growth after T), the persistence spread signal of entry 0034 does not survive: honest direction skill collapses from R=0.72–0.84 (which shared its start point with the target) to mean-resultant R≈0.18–0.22, mean angular error ≈106°, and — decisively — the concentration sits at a ≈177° offset: at VIIRS-overpass cadence the footprint centroid tends to regress opposite its recent motion, so naive persistence points a firefighter roughly the wrong way. Predicted growth-rate also loses to a climatological-mean baseline in every horizon band. Verdict: not surface-worthy; nothing flipped — 0035
Date: 2026-07-11 Status: MEASURED negative (read-only on production; strict predictor≤T / validation>T split with no shared displacement window; honest baselines — random null, last-step persistence, climatological-mean rate; transport cut; research/prototype only, no cutover, nothing surfaced) — one hidden shadow table (spread_advisory_shadow, surface_allowed=0, DO_NOT_SURFACE, not read by the serving app); directly answers the “is a default-OFF persistence advisory buildable?” recommendation entry 0034 left open
The framing. Entry 0034 rebuilt the fire-growth truth at full VIIRS 375 m precision and showed a persistence direction signal of mean-resultant R=0.72–0.84 on resolvable fires — but stated, in its own honest-bound #1, that the persistence baseline shares its start point with the observed vector (both anchored on the early centroid), so part of that R is construction overlap, not forecast skill. An advisory that helps a firefighter is a forecast: at decision time T you may use only what the fire has done up to T, and you are graded on what it does after T. This entry does exactly that — it removes the overlap entirely and measures the honest forecast skill entry 0034 recommended as the next step.
BLUF. The overlap was doing the work. Splitting each reconstructed VIIRS/MODIS footprint track at a decision time T — predictor window = the overpasses at times ≤T (first ≈60%), validation = each later overpass, with no shared displacement segment between them — the persistence direction forecast falls to mean-resultant R≈0.18–0.22 (all 796 forecast pairs / 232 fires), mean angular error ≈106°, only 17% within 45° (a random null gives 25%) and 36% within 90° (null 50%). A forecast is skilful only when R is high and the mean offset is near 0°; here the offset sits at ≈177° — the modest concentration that exists is concentrated on the wrong answer. Mechanistically this is blob mean-reversion: a fire filling in around its ignition footprint has a centroid that random-walks and regresses, so successive VIIRS-overpass displacements anti-correlate. A last-step (“same as the immediately prior step”) baseline is no better — higher R (0.31) but the same ≈178° offset, i.e. equally anti-persistent. On rate, the persistence prediction never beats the trivial “assume the median growth rate” forecast: climatological-mean MAE is lower in every horizon band (e.g. 6h: 0.022 vs 0.047 km/h). The transport cut (fit the one free parameter — predictor fraction — on earlier fires, test strictly-later fires) is stable but transports a null: later-half R=0.22 at the same ≈179° offset. One honest positive is retained: the footprint growth-rate magnitude is a real measurement (VIIRS footprint ROS vs. independent IRWIN acres/hour, Spearman 0.34, n=61) — but predicting the future rate from the past rate carries no skill over climatology. Verdict: a persistence spread advisory is not surface-worthy at VIIRS-overpass resolution. It is not a detection and it is not built into serving; the one write is a hidden, gated shadow table retained as the research artifact.
Why entry 0034 looked strong and this does not. Entry 0034 measured the angle between (early→mid) and (early→late) — two vectors sharing the early endpoint, so any real early-window drift inflates the agreement of both. Remove the shared endpoint — predict from motion strictly before T, grade on motion strictly after T — and the agreement is gone. This is the textbook difference between in-sample autocorrelation and out-of-sample forecast skill [28][29]. Entry 0034’s R=0.72–0.84 was not wrong as a description of track coherence; it was never a forecast number, and this entry supplies the forecast number it flagged as missing.
direction predictor
horizon
subset
n pairs
mean ang. err
within 45°
within 90°
R
offset
random-direction null
—
—
—
90.0°
0.25
0.50
≈0
—
persistence trajectory (≤T)
all
all fires
796
106.6°
0.168
0.364
0.221
+177°
persistence trajectory
≈1 h (≤2 h)
all
157
106.2°
0.166
0.395
0.208
−172°
persistence trajectory
≈3 h (2–4.5 h)
all
26
110.2°
0.192
0.308
0.422
+130°
persistence trajectory
≈6 h (>4.5 h)
all
613
106.5°
0.168
0.359
0.223
+178°
last-step persistence
all
all
796
112.4°
0.133
0.309
0.306
+178°
persistence trajectory
≈3 h
reliable + resolvable
10
119.6°
0.200
0.300
0.614
+128°
persistence trajectory (transport later-half)
all
strictly-later fires
331
107.0°
0.172
0.366
0.221
+179°
Read the last two columns together: skill requires high R at a near-0° offset. Every persistence row concentrates near ±180° — the forecast is not merely uninformative, it is mildly anti-correlated with observed post-T motion, because a growing fire’s footprint centroid regresses toward its fill center between sparse overpasses. The one cut where R looks high (≈3 h reliable, R=0.61) is n=10 and still offset ≈128° with only 20% of forecasts within 45° — concentration on the wrong bearing, not usable guidance.
Rate forecast vs. climatology. Predicting each fire’s post-T centroid growth-rate from its pre-T rate shows near-zero correlation (Pearson 0.04–0.25 across bands, Spearman 0.16 overall) and, more tellingly, loses the mean-absolute-error contest to the trivial predict-the-median forecast in every band.
horizon
n
pred–actual Pearson
MAE persistence (km/h)
MAE last-step
MAE climatological-mean
winner
≈1 h
157
0.075
0.313
0.292
0.202
climatology
≈3 h
26
0.253
0.164
0.127
0.080
climatology
≈6 h
613
0.041
0.047
0.302
0.022
climatology
all
796
0.042
0.103
0.294
0.087
climatology
Cross-check that the target is nonetheless real: on the 61 footprint fires spatially linked (≤10 nm) to an IRWIN WF incident, the VIIRS footprint growth-rate and the IRWIN acres/hour series correlate at Spearman 0.34 — two physically independent growth-rate measurements agreeing. The failure is in the forecast (past rate does not predict future rate over climatology at this cadence), not in the truth. Note also that centroid-drift rates are tiny (median ≈0.03–0.28 km/h) because a symmetrically-growing fire’s centroid barely moves even as its perimeter advances — a further reason centroid persistence is the wrong primitive for a frontier advisory.
Reproducibility detail. Resource-guarded on the host: health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, run under a private serialization marker (unique name, so a concurrently-running sibling job is never contended) inside a capped experiment slice with a server-side timeout + nice -n19 and a thermal-abort watchdog, killed by PID. Reads are mode=ro on all production tables; the concurrently-added combustion-plant mask rows were not touched. Corpus = the 327 footprint fires of growth_truth_shadow (provenance∈{viirs_footprint,modis_footprint}). For each, raw fire_event_evidence VIIRS-N20/N21/NPP + MODIS detections since the window start are streamed and assigned to their nearest seed fire within 3.0 km (Voronoi partition, so neighbouring sub-fires in a complex do not steal each other’s pixels — 557,451 of 1,323,425 scanned detections assigned), binned into overpasses (a >25 min gap starts a new bin), giving a per-overpass centroid + pixel count. A track qualifies with ≥4 overpasses spanning ≥2 h (232 tracks; median 7 overpasses, median span 48 h). Forecast split: predictor window = first ceil(frac·K) overpasses (all at time ≤T, position-at-T = last predictor centroid); predicted bearing = the predictor-window trajectory (first→last predictor centroid); predicted rate = predictor displacement / predictor hours. Validation = each later overpass j, with actual bearing = (position-at-T → centroid j) and actual rate = that displacement / (tj−T) — the predictor and validation displacement windows share only the instant T, so there is no overlap. Horizon bands: ≤2 h→“1 h”, 2–4.5 h→“3 h”, >4.5 h→“6 h” (VIIRS revisit makes true 1 h sparse; the “1 h” band is really next-overpass sub-2 h). Baselines: random-direction null; last-step persistence (last two predictor centroids); climatological-mean rate (predict the median observed rate). Circular stats = mean angular error, mean-resultant R, and the mean offset of signed (observed−predicted) bearings [23]. Reliable subset = K≥6 overpasses, span≥6 h, predictor displacement≥0.7 km (2× VIIRS pixel; 59 fires). Transport: the predictor fraction is chosen on the earlier-half fires (maximising 3 h resolvable R; frac=0.6 selected) and applied unchanged to strictly-later fires. The only write is a new hidden table spread_advisory_shadow (surface_allowed=0, DO_NOT_SURFACE, 59 rows, one per reliable fire, carrying the extrapolated bearing/rate/1–3–6 h coarse frontier + example advisory text); the serving app does not read it. Every figure counted from the live production DB at run time.
Claim status: MEASURED negative, read-only on production, honest forecast baselines, research/prototype only. This entry changes no fusion/tier/confidence/map/API surface and surfaces nothing; its one write is an additive, gated, do-not-surface shadow table. The headline is that entry 0034’s persistence direction signal is a description of track coherence, not forecast skill: with the shared start point removed, direction skill falls to R≈0.2 concentrated at a ≈177° (wrong-way) offset, and predicted rate loses to climatology in every band.
Honest bounds. (1) VIIRS-overpass cadence is the binding limit. A given fire is seen only a few times per day by the polar sensors, so the centroid trajectory is dominated by overpass-to-overpass fill/geometry noise rather than physical advance; a sub-hourly cadence (geostationary-derived footprints) could carry a different result and is untested here. (2) Centroid is the wrong primitive. A symmetrically-growing fire advances its perimeter while its centroid barely moves, so centroid displacement both under-reads the frontier rate and injects the mean-reversion that drives the ≈180° offset; a leading-edge / frontier-detection direction (not built here) is the honest next attempt. (3) Wind is still absent — blocked on a time-archived wind join (entry 0034 bound); persistence cannot, even in principle, predict a wind-shift-driven direction change. (4) Reconstruction is Voronoi-partitioned at 3 km around pre-identified sub-fires; a coarser or finer identity could shift the small-n high-horizon cuts, though the all-fires and transport results are stable. (5) Single warm-season CONUS window; larger/longer-lived fires are over-represented (the only ones that accrue ≥4 overpasses). (6) The retained shadow advisories are illustrative, not validated as skilful — they exist to document the mechanism and are gated off precisely because the forecast skill above does not justify surfacing them.
Literature alignment. Verdict: NEGATIVE, and consistent with the forecast-verification and fire-behaviour literature. The gap between in-sample autocorrelation and out-of-sample forecast skill, and the requirement to beat a climatological reference forecast, are the core of standard forecast verification [28][29]; a persistence baseline collapsing once the predictor and target windows are disjoint is the expected outcome for a noisy, sparsely-sampled centroid. That real fires nonetheless have coherent spread direction and rate is well established [16] — but the Global Fire Atlas recovers that coherence from daily-aggregated perimeters, not from a handful of raw VIIRS overpass centroids, which is exactly the resolution mismatch seen here. Physical spread is governed by wind, fuel and slope [21][22], none of which centroid momentum encodes; the mean-reversion artifact is the footprint analogue of the detection-onset/fill conflation documented for coarse geostationary products [3][8]. Circular scoring follows standard directional-data methods [23].
What this does not claim: that fire spread is unpredictable (it is not — with wind, fuel, slope and a frontier-based direction at adequate cadence it is a mature science), that entry 0034’s R=0.72–0.84 was an error (it correctly described track coherence; it was simply never a forecast number), that persistence has zero information (the rate magnitude is a real measurement, Spearman 0.34 vs IRWIN), or that any number here should touch serving (nothing is surfaced; the shadow table is gated surface_allowed=0). Verdict and mechanism. A default-OFF persistence spread advisory is not surface-worthy at VIIRS-overpass resolution and is not flipped. Were a future version to clear the bar, the reversible surfacing mechanism would be a separate advisory layer — its own gated table, rendered on request as a distinct “advisory / not a detection” overlay, never merged into the confirmed-fire roster or any detection count, one flag to enable and one DELETE to retract. What’s needed first: (a) sub-hourly cadence (geostationary-derived footprint centroids) so the trajectory is not overpass-noise-dominated; (b) a frontier/leading-edge direction rather than centroid drift; (c) a time-archived wind join; (d) ultimately a physical spread model (Rothermel-class) fed by fuel/slope/wind. Until (a)–(b) at minimum show real out-of-sample skill, no advisory surfaces. Mark decides.
Hard-bound: warm-season CONUS, single active-fire window; footprint truth is VIIRS 375 m / MODIS 1 km, sparse in time and biased toward larger/longer-lived fires (232 tracks; 59 reliable); horizon bands are VIIRS-revisit-limited (true 1 h is next-overpass sub-2 h); direction is centroid-based, not frontier-based; wind is absent (no historical archive). Every conclusion is a statement about persistence-of-centroid-motion forecast skill in this observing regime, not about the physical predictability of fire spread.
Extending the Sentinel-2 SWIR hot-spot daemon to Alaska (the region that holds 100% of the truly-blind fire tail): shadow-first ingestion over 51 real overpasses measures the prize honestly — coverage-completeness is achievable, but recovered-recall is ~2–3% of active Alaska fires (1 clean recovery in 49), the false-positive burden at the deployed CONUS thresholds is 88%, and the one fire it did catch was already flagged by the smoke analysis. Verdict: keep it default-OFF shadow; the only sound cutover is fusion-corroboration-only — 0036
Date: 2026-07-11 Status: MEASURED (real shadow ingestion over live Alaska overpasses; additive daemon extension with CONUS path byte-for-byte unchanged; reuses the shipped scorer’s truth + range functions; extends the entry-0032/0024 sub-floor prize) — confirmed COVERAGE-COMPLETE but LOW-YIELD / FP-HEAVY as a standalone source; one hidden shadow table (ak_swir_coverage_shadow, surface_allowed=0, DO_NOT_SURFACE, not read by the serving app, not fed to fusion), nothing surfaced, no production table touched
BLUF. Entries 0024 and 0032 localized the one genuine remaining coverage lever — the truly-blind sub-floor fire tail — and found it is entirely Alaska, while the deployed S2-SWIR-Hotspot daemon is hard-coded to a CONUS box (24–50°N, 125–66°W) that never points at Alaska at all. Because the STAC/COG ingestion path (earth-search.aws.element84.com) is global, the honest test was direct: extend the existing tooling to Alaska, run it shadow-first over real overpasses, and measure the prize rather than argue it. We did. (1) Feasibility is real: over the Interior-Alaska fire belt (58–70°N, 168–141°W) Sentinel-2 delivers ~167–177 L1C scenes/day, of which ~86/day fall under 60% cloud and ~46/day under 20% — Alaska is cloudy (median scene cloud 63–81%) but a usable clear fraction exists. (2) The recovered-recall is small. A targeted best-scene probe of 49 active Alaska fires (IRWIN WF + WFIGS) found that 16 had no clear S2 scene at all in a 96 h window, and of the 33 that were covered, only 1 showed an active-fire SWIR hotspot at the fire pixel (Blueberry, 65.44°N 162.93°W, 199 hot pixels, B12 DN 17,363) — a recall of 1/49 (2%) overall, 1/33 (3%) among scene-covered fires. The reason is structural: most boreal Alaska fires are smoldering/ground-dominated and do not present a >600 K flaming SWIR signal at the overpass instant. (3) The false-positive burden is high. A broad scan of 51 random clear Alaska scenes produced 710 hotspots / 152 clusters, of which 134 (88%) had no fire within 10 nm — the deployed CONUS thresholds over Alaska snow/ice/bright-tundra/cloud-edge terrain are dominated by false alarms (median hotspot B12 DN 4,929, barely over the 4,000 trigger). (4) Net-new is marginal. The only active Alaska detection source in-window is the smoke analysis (1,909 detections; no recent subpixel-ABI, no polar-VIIRS over Alaska in the store), and the one clean S2 recovery (Blueberry) was already flagged by ~393 nearby smoke detections — so S2’s contribution is 20 m geolocation precision, not net-new fire discovery. Verdict: extending S2 to Alaska buys real coverage-completeness (Alaska goes from watched-not-at-all to watched) and a precise eye on the few actively-flaming large burns, but at ~2–3% recall with an 88% FP burden it is NOT cutover-worthy as a self-surfacing source. The only sound cutover is fusion-corroboration-only — Alaska S2 admitted as a second-sensor / geolocation-refiner that never self-surfaces (mirroring the ≥2-CORE fusion discipline of entry 0003), under which the FP density is neutralized and the handful of flaming burns become usable. Left default-OFF shadow; nothing flipped.
Feasibility — Sentinel-2 over the Alaska fire belt. S2 orbits to ~84°N, so Interior Alaska is well within range, and the long summer days help; frequent cloud hurts. Querying the STAC catalog over the fire belt (58–70°N, 168–141°W):
window
total L1C scenes
scenes/day
cloud<60%
cloud<20%
median scene cloud
last 24 h
177
~177
86 (49%)
46 (26%)
63%
last 72 h
500 (query cap)
≥167
192
83
81%
Realistic usable throughput is ~86 clear-enough (cloud<60%) scenes/day over the belt — a genuine, if cloud-limited, revisit. This is a coverage/confirmation cadence, not a fast-alert one: S2 L1C publishes ~1–2 h after acquisition, and the 20 m SWIR pixel massively beats the geostationary footprint when it sees active flame.
The shadow extension (additive, reversible, CONUS untouched). The deployed daemon was backed up byte-for-byte (sentinel2_swir_daemon.py.bak.pre_ak_20260710, sha256 verified equal at backup time) and extended additively: an Alaska bounding box and an Alaska ingestion path activate only under an environment flag and write exclusively to a new hidden table ak_swir_coverage_shadow (surface_allowed=0, note DO_NOT_SURFACE). Lines 1–216 of the daemon — the entire CONUS code path, thresholds, and default dispatch — are byte-for-byte identical to the backup (verified by diff); the CONUS behavior is unchanged, and the Alaska rows never touch fire_events / fire_event_evidence and are not fed to fusion or surfacing. The extension was then run once over live Alaska overpasses (not a config change alone) in two passes: a broad scan of recent clear belt scenes for the FP-density measurement, and a targeted per-fire best-scene probe for recovered-recall.
Recovered-recall — the targeted best-scene probe (the clean recall number). For each of 49 active Alaska fires (IRWIN WF/WFU + WFIGS, deduped ~3 km), we queried S2 scenes intersecting the fire point in the last 96 h (cloud<85), took the least-cloudy, and read a small window around the fire pixel with the same B11/B12 threshold as the deployed daemon:
outcome
fires
share
reading
active-fire hotspot at the fire pixel
1
2.0%
Blueberry — 199 hot px, B12 DN 17,363: an unambiguous flaming front
clear scene, no hotspot at the fire
32
65.3%
S2 saw the ground but the fire was not flaming in SWIR at the overpass (boreal smoulder / cool front / sub-pixel)
no usable S2 scene in 96 h
16
32.7%
cloud-filtered out or no overpass — S2 simply did not see the fire
Recall = 1/49 (2%) overall, 1/33 (3%) among fires S2 actually covered. One third of active Alaska fires had no clear scene at all in four days; of the two thirds S2 did see, all but one showed no SWIR flaming signal at the overpass instant.
Added false-positives — the broad scan. Over 51 random clear belt scenes (28 with hits), the Alaska path produced 710 hotspots forming 152 fire-scale clusters (~2 km). Corroboration against the window-active Alaska truth set (169 IRWIN+WFIGS fires) at the scorer’s 10 nm radius:
hotspot clusters
count
share
note
near a truth fire (≤10 nm)
18
12%
upper bound — at this FP density ~10–15 are expected by chance within 10 nm of some fire, so this is not robust recall
added false-positive (no fire ≤10 nm)
134
88%
snow/ice, bright tundra, cloud edges, water glint — median hotspot B12 DN 4,929, barely over the 4,000 trigger
The 88% cluster-level false-positive rate is the binding constraint: the thresholds tuned for CONUS fire against CONUS backgrounds mis-fire heavily over high-latitude snow/ice/cloud terrain. Feeding raw Alaska S2 hotspots into surfacing would inject that noise directly.
Net-new coverage vs the existing stack. In-window, the only active Alaska detection source in the store is the smoke analysis (1,909 detections); there is no recent subpixel-ABI and no polar-VIIRS over Alaska in the store — so Alaska’s active detection net is genuinely thin, which is why the whole truly-blind tail lives there. But the one clean S2 recovery (Blueberry) already carried ~393 nearby smoke detections from the day before — the fire was already known. So S2 did not add a net-new fire; it added a precise 20 m active-flame pixel on a fire the coarse smoke product had already flagged. Across the broad scan a generous 10 nm read suggested up to 7 “net-new” fires with no smoke detection within 10 nm, but that rests on the same chance-level corroboration as the 18 TP clusters and is not robust. Honest net-new fire recall ≈ 0; honest added value = geolocation precision on the few flaming burns.
Verdict — coverage-complete, low-yield, FP-heavy; keep it shadow, cutover only via fusion-corroboration. Extending S2 to Alaska does close a real completeness gap: Alaska moves from watched-not-at-all by S2 to watched, and the extension puts a 20 m eye on the handful of actively-flaming large Alaska burns. But the measured prize is small — ~2–3% recall of active Alaska fires, dominated by the rare flaming front, against an 88% false-positive burden at the deployed thresholds, and the fires it does catch tend to be already flagged by the smoke analysis. That is decisively not a self-surfacing source. The one sound cutover, if pursued, is fusion-corroboration-only: admit Alaska S2 hotspots to the fusion layer as a second-sensor confirmer / geolocation refiner that never self-surfaces and counts only when a second CORE sensor (or an IRWIN record) co-locates — exactly the ≥2-CORE demotion discipline of entry 0003, under which the 134 FP clusters are harmless and the flaming burns gain a precise pixel. We did not flip that; the Alaska path is left default-OFF and gated to the shadow table. This is the “real but marginal” Alaska ceiling entry 0032 anticipated, now run for real and quantified.
Reproducibility detail. Resource-guarded on the host throughout: health-gated on the serving unit (exit 75 if inactive), honoring the hard host busy marker, run under a private serialization marker (unique name, so a concurrently-running sibling job is never contended), nice -n19, server-side timeout, killed by PID, thermal-abort preflight. All production reads are mode=ro URI + PRAGMA query_only=ON; the only writes are to the new hidden ak_swir_coverage_shadow (surface_allowed=0). Daemon extension: backup sentinel2_swir_daemon.py.bak.pre_ak_20260710; additive block adds AK_BBOX=(-168,58,-141,70), search_scenes_ak(), upsert_ak_shadow(), main_ak(), dispatched only when OLDGABE_S2_REGION=AK; detect_hotspots() reused verbatim (B12 DN≥4000, (B12−B11)≥2000, stride 4); lines 1–216 verified byte-identical to backup by diff. Feasibility: STAC POST over sentinel-2-l1c, belt bbox, 24 h/72 h windows, eo:cloud_cover buckets. Broad scan: extended daemon run once, cloud<60, 24 h lookback, 80-scene cap (clearest-first), 25 min server-side timeout (completed 51 scenes, rc=124) → 710 shadow rows / 28 scenes-with-hits; clusters at ~2 km single-link. Recall probe: per active Alaska fire, STAC intersects Point in 96 h (cloud<85), least-cloudy first, windowed rasterio read (~1.6 km box) around the fire pixel, same threshold; 49 fires. Truth + range reuse the shipped scorer daemons/te_daily_scorer.py (_load_irwin WF/WFU with 24 h active-window pad, _rng_nm haversine, 10 nm match) plus the WFIGS active-incident snapshot; Alaska box = lat≥54, lon<−141. Existing-stack comparison = all non-IRWIN, non-S2 fire_event_evidence over the Alaska box in the scene window (−3 d/+1 d): 1,909 rows, all smoke-analysis. Chance-TP estimate from 152 clusters × (169 fires × π(18.5 km)²) / belt-area ≈ 10–15. Every figure counted from the live production DB at run time; only scratch artifacts were /tmp scripts on the host.
Claim status: MEASURED (real shadow ingestion over live Alaska overpasses, dated; reuses the shipped scorer’s truth + range; extends the entry-0024/0032 sub-floor prize to a run-for-real Alaska measurement). The operative claims are the verdict and the two robust numbers — targeted recall 1/49 and cluster-FP 88%; the broad-scan 18-cluster/7-fire “corroboration” is explicitly an upper bound at chance level, not evidence of recall. This entry changes no fusion/tier/confidence/map/API surface and surfaces nothing; its one write is an additive, gated, do-not-surface shadow table, and the deployed CONUS S2 path is byte-for-byte unchanged.
Hard bound (summer-only + short window + cloud + threshold-transfer). All data is a few days of summer 2026 over one Alaska window; a true multi-season or off-peak distribution is deferred. Recall is bounded below by cloud/overpass availability (a third of fires had no clear scene in 96 h) and by the overpass/active-flaming coincidence, and the recovery numbers use the deployed CONUS thresholds unchanged — an Alaska-tuned threshold (higher B12 floor, snow/ice + cloud + water masking) would cut the 88% FP sharply but was not built or measured here, so the FP figure is a pessimistic upper bound and the recall a specific-threshold lower bound. The 10 nm (18.5 km) match radius is the scorer’s own and is generous at the sparse Alaska fire density, which is exactly why the broad-scan corroboration is chance-prone. IRWIN/WFIGS locations are point records, human-reported and sometimes stale. No claim is made about fire size recovery here (that was entry 0032’s ≥10-acre bound); this entry measures pixel-level active-flame recovery.
Literature alignment. Verdict: AGREEMENT. That Sentinel-2 SWIR (1.6/2.2 µm) can detect and characterise active fire below the pixel via the B12 / (B12−B11) signature — but as a multi-day, cloud-limited, coverage/confirmation look rather than a fast-alert feed — is the established Sentinel-2 active-fire result [10], and the same physics underlies the Landsat OLI SWIR fire tests [12]. That these mid-resolution imagers complement, not replace, the daily/sub-daily polar and geostationary products [1][3][8] is the standard operational view, and our Alaska result is consistent: S2 adds a precise SWIR eye where the fast products under-cover, but its recall is gated by cloud and by whether the fire is flaming at the overpass. The high-latitude boreal fire regime is dominated by smouldering, deep-burning ground fire with modest instantaneous flaming fraction [30], which is precisely why so many scene-covered Alaska fires showed no SWIR hotspot. The fusion-corroboration-only cutover mirrors the cross-sensor demotion discipline that OLDGABE already ships (entry 0003).
What this does not claim: that S2 is useless over Alaska — it is a valid 20 m active-flame confirmer for the few flaming large burns, and coverage-completeness has genuine operational value; that no Alaska recall is achievable — an Alaska-tuned threshold + snow/cloud/water masking + a denser cloud-free-scene budget would raise it above the 2–3% floor measured here at the deployed CONUS thresholds; nor that the false-positive rate is intrinsic — most of the 88% is exactly the noise a fusion ≥2-CORE gate removes. It does not claim any net-new fire discovery (the one recovery was already smoke-flagged), nor that any number here should touch serving (nothing is surfaced; the shadow table is gated surface_allowed=0 and is not read by the app). Next / cutover mechanism. If the Alaska prize is pursued, the exact minimal reversible cutover is: (a) enable the Alaska ingestion path on a schedule (default-OFF flag → on), still writing the shadow table; (b) route Alaska hotspots into the fusion layer as corroboration-only — a hotspot counts only when a second CORE sensor or an IRWIN record co-locates within the fusion radius, and Alaska S2 never raises a standalone candidate; (c) before any of it, add an Alaska-specific FP gate (snow/ice + cloud-shadow + water mask, higher B12 floor, persistence) and re-measure recovered-recall vs added-FP over ≥14 runs with CIs. Added ingestion cost if enabled: ~86 usable scenes/day, low-single-digit GB/day of strided SWIR reads, ~40 min/day of resource-guarded CPU-light work. Until that gate clears its bar, Alaska S2 stays a default-OFF shadow. Mark decides; nothing here changes a shipped number.
Redoing the failed 0035 spread forecast on the two fixes it named — a leading-edge/frontier primitive and GOES sub-hourly cadence — decisively separates them: the frontier primitives do not rescue direction (both concentrate ~90–150° off the observed advance), but GOES ~15-min cadence does — on the plain centroid it erases the 0035 ~177° reversal, dropping the mean offset to ≈−8° to −24° and lifting honest out-of-time direction skill to mean-resultant R=0.43 (all resolvable) → 0.59–0.64 (larger / strictly-later transport) → 0.87–0.91 (resolvable 6 h), 53–69% within 45°, transporting to later fires; rate magnitude still loses to climatology and wind is still absent — so it was cadence, not the frontier, that the 0035 collapse was about, and a default-OFF direction advisory is now defensibly buildable on GOES-cadence centroid — 0037
Date: 2026-07-11 Status: MEASURED (read-only on production; strict predictor≤T / validation>T split with no shared displacement window; honest baselines — random null, 0035 VIIRS-cadence centroid, same-step persistence, climatological-mean rate; transport cut; three spread primitives × two cadence combinations; research/prototype only, no cutover, nothing surfaced) — one hidden shadow table (goes_cadence_advisory_shadow, surface_allowed=0, DO_NOT_SURFACE, registered gated in canary_meta, not read by the serving app); directly executes the two fixes entry 0035 named in its own honest-bounds #1–#2
The framing. Entry 0034 found a persistence spread-direction signal of mean-resultant R=0.72–0.84, then entry 0035 proved that number was in-sample track coherence, not forecast skill: re-run as an honest forecast (predictor ≤T, validation >T, no shared displacement segment) the persistence direction collapsed to R≈0.18–0.22 concentrated at a ~177° offset — the centroid regresses opposite its recent motion at sparse cadence. Entry 0035 did not stop at the negative; it named two specific, testable causes and the fixes for each: (1) the centroid mean-reverts for a symmetric fire → use the leading edge / frontier; (2)VIIRS overpass cadence is too sparse (a fire is imaged only a few times per day) → use GOES-ABI sub-hourly cadence. This entry attacks both and asks the decisive question: does a frontier-based, GOES-cadence forecast show real out-of-time skill where centroid-persistence failed?
BLUF. The two fixes are not equal — and the surprise is which one worked. We reconstructed each fire’s trajectory at GOES ~15-min cadence (104 fires with ≥6 bins over ≥2 h; median 19.5 bins, median span 47 h; 17,286 GOES-ABI thermal detections assigned) and scored three spread primitives under the identical no-overlap forecast split: the centroid (matched to 0035), a leading-edge cluster frontier (centroid of the top-20% cumulative detections by distance from the ignition anchor), and an instantaneous active-front centroid (each bin’s own detections). The frontier primitives did not rescue direction: both produce a modest concentration (R=0.33–0.50 on resolvable subsets) but at a wrong mean offset — the leading-edge cluster sits at +97° to +134°, the active-front centroid at +128° to +149° — i.e. as instantiated they inject a lateral/geometric bias rather than removing the mean-reversion. Cadence is the lever that worked. On the plain centroid, moving from VIIRS overpasses to GOES ~15-min cadence erases the 0035 reversal: the mean offset collapses from +177° to ≈−8° to −24° (concentrated in the right direction), and the honest, no-overlap direction skill rises to mean-resultant R=0.43 on the resolvable subset (mean angular error 54°, 53% within 45°, n=138), R=0.59 on larger fires (mean error 40°, 59% within 45°, n=101), and R=0.87 at the 6 h horizon on resolvable fires (mean error 18°, 69% within 45°, n=48) — all far above the random-direction null (R≈0, 25% within 45°) and above the 0035 VIIRS-cadence centroid (R≈0.2 at the wrong-way +177°). It transports: fitting the one free parameter on earlier fires and testing strictly-later ones holds the skill (later-half resolvable R=0.64 overall, R=0.91 at 6 h, offset ≈−16°). Fusing GOES cadence with VIIRS 375 m position did not help — mixing precise-but-sparse VIIRS into 2 km GOES bins reintroduced position jumps (fused centroid offset swings to +58° to +164°; the active-front primitive’s ~177° reversal returns) — so GOES-only is the clean combination. On rate, the predicted centroid-drift rate ranks the fires well (Spearman 0.62–0.79 pred-vs-actual) but loses the MAE contest to climatology in every band, because the centroid’s drift magnitude is tiny (median ≈0.0007 km/h) — direction is forecastable at cadence, rate magnitude is not (still needs a frontier/area truth, absent). Verdict: frontier+GOES does not rescue spread via the frontier — but its companion fix, sub-hourly cadence, partially rescues the DIRECTION capability on the plain centroid, enough to defensibly build a default-OFF, direction-only spread advisory for larger/resolvable fires. Rate magnitude and wind-shift remain out of reach at current data. Nothing was surfaced; the only write is a hidden, gated shadow table.
Why this reframes the 0035 diagnosis. Entry 0035 attributed the reversal to both the centroid primitive and the sparse cadence. This entry isolates them and finds the causation was almost entirely cadence: at overpass spacing (hours) the centroid has already filled and reverted between samples, so successive displacements anti-correlate (+177°); at ~15-min spacing the predictor window captures genuine ongoing drift that continues for the next several bins before fill sets in, so the offset sits near 0°. The frontier reframing — intuitively the right idea — did not, as we instantiated it, add anything beyond what cadence alone buys, and both frontier definitions carried their own directional artifact. That is a specific, honest correction to 0035’s stated hypothesis.
direction predictor
cadence
subset
n pairs
mean ang. err
within 45°
R
offset
random-direction null
—
—
—
90.0°
0.25
≈0
—
centroid persistence (entry 0035)
VIIRS overpass
all
796
106.6°
0.168
0.221
+177°
centroid persistence
GOES ~15 min
all
1166
75.0°
0.477
0.185
−24°
centroid persistence
GOES ~15 min
resolvable (≥0.7 km pre-T drift)
138
54.4°
0.529
0.433
−16.5°
centroid persistence
GOES ~15 min
larger fires + resolvable
101
39.9°
0.594
0.592
−7.3°
centroid persistence
GOES ~15 min
resolvable, 6 h horizon
48
18.3°
0.688
0.867
−11.9°
frontier (leading-edge cluster)
GOES ~15 min
resolvable (≥2 km pre-T)
116
—
0.112
0.345
+112°
active-front centroid (per-bin)
GOES ~15 min
resolvable (≥2 km pre-T)
80
—
0.113
0.495
+143°
centroid persistence
fused GOES+VIIRS
resolvable
596
—
0.326
0.133
+78°
Read the last two columns together (skill = high R at a near-0° offset). The 0035 VIIRS-cadence centroid concentrated on the wrong answer (+177°). The GOES-cadence centroid concentrates on the right answer (offset −7° to −24°) and the concentration tightens exactly where it should — on fires that showed resolvable pre-T drift and on larger fires the 2 km GOES frontier can resolve. The two frontier primitives, by contrast, retain a large wrong-way offset (+112°/+143°): as instantiated they do not help. Fusion reintroduces jumps and is worse than GOES-only. The “resolvable” gate is on predictor (pre-T) displacement, which is known at decision time — a legitimate operational filter (issue an advisory only once a fire has shown resolvable drift), not hindsight.
Transport cut (fit on earlier fires, test strictly-later). The one free parameter (predictor-window fraction) is chosen on the earlier half of fires (53 fires) and applied unchanged to the strictly-later half (51 fires). The GOES-cadence centroid direction skill transports:
horizon (strictly-later fires)
subset
n pairs
mean ang. err
within 45°
R
offset
all bands
resolvable
84
39.7°
0.607
0.635
−23.0°
≈3 h
resolvable
14
31.1°
0.714
0.695
−17.9°
≈6 h
resolvable
39
16.8°
0.692
0.906
−16.0°
Rate forecast vs. climatology (GOES-cadence centroid). Predicting each fire’s post-T centroid-drift rate from its pre-T rate ranks the fires well but does not beat the trivial predict-the-median forecast on absolute error, because centroid drift is tiny:
horizon
n
pred–actual Spearman
MAE persistence (km/h)
MAE last-step
MAE climatological-mean
winner (MAE)
≈1 h
399
0.787
0.087
0.066
0.070
climatology
≈3 h
218
0.615
0.026
0.026
0.017
climatology
≈6 h
549
0.685
0.012
0.019
0.0025
climatology
all
1166
0.755
0.040
0.036
0.028
climatology
The strong rank correlation (Spearman 0.62–0.79) says the ordering of fire drift-rates is predictable, but the median drift is only ≈0.0007 km/h, so a “predict ≈0” climatology wins on absolute error. Centroid drift is the wrong quantity for a rate advisory — a symmetrically-growing fire barely moves its centroid even as its perimeter advances — and the frontier primitives that could carry a real spread rate did not clear the direction bar. So rate magnitude remains not forecastable from current detections; it needs a time-resolved perimeter/area truth (still absent on-box, per entry 0034).
Reproducibility detail. Resource-guarded on the host: health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, run under a private serialization marker (unique name, so a concurrently-running sibling job is never contended) inside a capped experiment slice with a server-side timeout + nice -n19 and a thermal-abort watchdog, killed by PID. Reads are mode=ro URI + PRAGMA query_only=ON on all production tables. Corpus = the footprint fires of growth_truth_shadow (provenance∈{viirs_footprint,modis_footprint}) as seeds. GOES cadence: raw fire_event_evidence detections from GOES19-ABI, GOES18-ABI, and the two ABI-Dozier-Subpixel sources since the window start are assigned to their nearest seed within 3.0 km (Voronoi partition) — 17,286 of 80,773 scanned assigned — and binned into fixed 15-minute bins; a track qualifies with ≥6 bins spanning ≥2 h (104 tracks; median 19.5 bins, median span 47 h). The fused combination additionally pools VIIRS-N20/N21/NPP + MODIS detections (563,919 assigned) into the same 15-min bins (248 tracks). Three primitives per bin: (a) cumulative centroid; (b) leading-edge cluster = centroid of the top-20% of the cumulative detection cloud ranked by distance from the ignition anchor P0 (the first bin’s centroid), min 3 points — a stated modeling choice; (c) instantaneous active-front = the current bin’s own detection centroid. Forecast split (identical to entry 0035): predictor window = first ceil(frac·K) bins (all at time ≤T, position-at-T = last predictor point); predicted bearing = predictor first→last; validation = each later bin j with actual bearing = (position-at-T → point j) — predictor and validation share only the instant T, so no overlap. Horizon bands ≤2 h→“1 h”, 2–4.5 h→“3 h”, >4.5 h→“6 h”. Baselines: random-direction null; 0035 VIIRS-cadence centroid (published numbers); same-step persistence; climatological-mean rate. Resolvable = predictor displacement ≥0.7 km (centroid) or ≥2 km ≈ 1 GOES pixel (frontier). Larger fires = span≥6 h and K≥10 bins (76 fires) — the regime where the 2 km GOES frontier can resolve real advance. Transport: predictor fraction chosen on the earlier-half fires (by each fire’s earliest-detection epoch), applied unchanged to strictly-later fires. Circular stats = mean angular error, mean-resultant R, and the mean offset of signed (observed−predicted) bearings [23]. The only write is a new hidden table goes_cadence_advisory_shadow (surface_allowed=0, DO_NOT_SURFACE, 9 rows = larger + resolvable fires, carrying the extrapolated bearing/compass only), registered gated in canary_meta; the serving app does not read it. Every figure counted from the live production DB at run time.
Claim status: MEASURED, read-only on production, honest forecast baselines, research/prototype only. This entry changes no fusion/tier/confidence/map/API surface and surfaces nothing; its one write is an additive, gated, do-not-surface shadow table. The operative claims are: (1) the two frontier primitives, as instantiated, do not beat the centroid and retain a large wrong-way offset; (2) GOES sub-hourly cadence removes the 0035 ~177° reversal on the plain centroid and yields transportable out-of-time direction skill (R=0.43→0.64→0.87 across resolvable/larger/6 h cuts, offset ≈0°); (3) rate magnitude from centroid drift still loses to climatology; (4) GOES+VIIRS fusion does not help. The headline is that cadence, not the frontier primitive, is what the 0035 collapse was about.
Honest bounds. (1) The frontier definition is a modeling choice. Two reasonable instantiations (leading-edge cluster; instantaneous active-front centroid) were tested and both failed with a wrong-way offset; a different frontier construction (e.g. an isochrone/perimeter-fit front, or a convex-hull advance measured against an independently-estimated axis) might behave differently and is untested here — the negative is specific to the two definitions tried, not a proof that no frontier can work. (2) GOES 2 km is coarse. The frontier at 2 km is meaningful only for larger fires; the direction skill is reported on resolvable / larger-fire subsets precisely because sub-pixel drift is noise at 2 km. (3) The centroid win is direction-only. It carries no usable rate magnitude, and a symmetric fire’s centroid barely moves — so the advisory it supports is a bearing (“drifting roughly NE”), not a spread-rate or perimeter forecast. (4) The resolvable/larger subsets are the operative ones (all-fires R is a modest 0.19); the advisory is only defensible where the fire has shown resolvable pre-T drift and is large enough for GOES to resolve. (5) Wind is still absent (no time-archived wind join, entry 0034 bound); persistence cannot anticipate a wind-shift-driven turn. (6) Single warm-season CONUS window; larger/longer-lived fires are over-represented (only they accrue ≥6 GOES bins), and off-season / held-out-region validation is deferred before any build. (7) The retained shadow rows are illustrative, gated off, not validated as individually skilful.
Literature alignment. Verdict: PARTIAL RESCUE, consistent with the fire-behaviour and forecast-verification literature. That geostationary sub-hourly sampling resolves the fire diurnal cycle and progression where polar overpasses cannot is the established value of GOES-class fire products [8][13][15][20], and it is exactly why raising the cadence turns an anti-correlated centroid into a weakly-forecastable one. That real fires have coherent spread direction is well established from progression atlases [16], though those recover it from daily perimeters, not raw centroids, which is why our skill concentrates on larger/resolvable fires. The requirement to beat persistence and climatology reference forecasts, and the gap between in-sample fit and out-of-sample skill, are the core of forecast verification [28][29] — here direction clears the null and the 0035 baseline, while rate magnitude does not clear climatology. Physical spread is governed by wind, fuel and slope [21][22], none of which centroid momentum encodes; a persistence direction advisory is a momentum heuristic, not a spread model. Circular scoring follows standard directional-data methods [23].
What this does not claim: that a frontier primitive is inherently useless (only that the two tried do not beat the centroid at 2 km GOES resolution), that fire spread is unpredictable (with wind, fuel, slope and a true perimeter front it is a mature science), that entry 0035 was wrong (its centroid-at-VIIRS-cadence negative stands; this entry corrects only its attribution of the cause), that the GOES-cadence centroid predicts spread rate or a wind-shift turn (it predicts a bearing for larger/resolvable fires only), or that any number here should touch serving (nothing is surfaced; the shadow table is gated surface_allowed=0 and is not read by the app). Verdict and mechanism. Frontier+GOES does not rescue spread through the frontier — but its companion fix, sub-hourly cadence, partially rescues the direction capability on the plain centroid, and that is enough for a defensible, reversible, default-OFF direction-only spread advisory: extrapolate each larger/resolvable active fire’s recent GOES-cadence drift bearing (“spreading roughly NE”), built as its own gated shadow layer validated against the growth truth, rendered on request only as a distinct “advisory / not a detection” overlay, never merged into any detection count — one flag to enable, one DELETE to retract. Before any flip: off-season + held-out-region re-validation, and a check that the offset stays near 0° out-of-window. For a full spread model (rate + wind-shift), the remaining path is unchanged from 0035’s close: a time-archived wind join, a time-resolved perimeter/area truth to carry rate, and ultimately a physical (Rothermel-class) spread model fed by fuel/slope/wind. Direction is now buildable; rate and wind are not, at current data. Mark decides; nothing here changes a shipped number.
Hard-bound: warm-season CONUS, single active-fire window; footprint seeds are VIIRS 375 m / MODIS 1 km, biased toward larger/longer-lived fires (104 GOES-cadence tracks; 76 larger; 84–138 resolvable forecast pairs); GOES-ABI position is ~2 km coarse (frontier meaningful only for larger fires); direction skill is measured on the centroid at cadence, not on a validated frontier; rate magnitude is not forecastable and wind is absent (no historical archive). Every conclusion is a statement about spread-direction forecast skill in this observing regime, not about the physical predictability of fire spread.
Running the one test entry 0037 deferred — held-out-region validation of the GOES-cadence spread-direction advisory — refutes it: under strict leave-one-region-out (fit the predictor window on three geographic regions, test direction skill on the fourth the fit never saw), the “R≈0.6 / offset≈0°” skill does not transport — the GOES 2 km centroid is pinned (median net centroid displacement ≈0.00 km over the full track, half-to-half reversal median 178°), so its “drift” carries no durable direction; on every held-out region the bearing points the wrong way (West/Interior-West within-45° = 0.06–0.11, far below the 0.25 random floor, offsets ±150–180°) or is at chance and statistically insignificant (East R=0.08–0.12, Rayleigh p=0.55–0.83) — a verified-harness negative (synthetic monotonic-drift control returns offset −0.0°, within-45°=1.00) that corrects 0037’s “defensibly buildable” framing: the in-window number was subset-selection, not spatial skill. The advisory is not spatially robust and not proposable for surfacing — kept default-OFF and gated — 0038
Date: 2026-07-11 Status: MEASURED (read-only on production; the decisive held-out-region test 0037 named as its last un-run validation; strict leave-one-region-out with the one free parameter fit only on training regions; verified harness via a synthetic control; honest circular scoring against the random-direction null; research/prototype only, no cutover, nothing surfaced) — one hidden gated shadow table (spread_direction_advisory_shadow, surface_allowed=0, held_out_region_validated=0, DO_NOT_SURFACE, registered gated in canary_meta, not read by the serving app), written as a research-negative record only
The framing. Entry 0037 found that at GOES ~15-min cadence the plain centroid-drift bearing forecast fire spread direction with apparently-real out-of-time skill (resolvable R=0.43, larger-fire R=0.59, 6 h R=0.87, offset near 0°), transporting across time (fit-early/test-late R=0.635), and it closed by naming exactly one validation still missing before the direction-only advisory could ever surface: held-out-region re-validation — “does the skill hold in regions the fit never saw, or only in-window?” This entry runs that test. It is the load-bearing one: out-of-time transport can still be inflated by a shared observing regime, shared fuels, and the same handful of long-lived fires; the honest question for an operational advisory is whether the bearing is right for a fire in a region the parameters were never tuned on.
BLUF. It is not, and the failure is mechanistic, not marginal. We partitioned the 105 GOES-cadence tracks into four geographic regions by longitude band (a coarse GACC-style West / Interior-West / Central / East split), fit the single free parameter (the predictor-window fraction) on three regions, and tested the direction skill on the strictly held-out fourth — for all four leave-one-out folds. The skill does not transport. On the two most-populated held-out regions the forecast is reversed: West resolvable within-45°=0.08 (R=0.36 at offset +157°), larger-fire within-45°=0.056 (R=0.42 at +146°); Interior-West resolvable within-45°=0.109 (R=0.56 at −170°), 6 h within-45°=0.052 (R=0.77 at −179°) — all far below the 0.25 random-direction floor (a within-45° window spans 90° of 360°), i.e. the high resultant length R is concentrating on the wrong answer. On the East it is at chance and not significant (R=0.08–0.12, within-45°≈0.42, Rayleigh p=0.55–0.83). The Central region was too small to yield held-out resolvable test pairs at the fitted fraction. Not one held-out region reproduces the R≈0.6/offset≈0° result. The mechanism is direct: over these ~42 h tracks the GOES 2 km detection-cloud centroid is pinned — median net centroid displacement across the whole track is 0.00 km (path tortuosity 0.000: the centroid wanders and returns to its start), and the first-half vs second-half centroid displacement is anti-correlated (median angle 178°, 57% of larger fires reverse, only 21% persist). A pinned centroid has no durable drift to forecast; any “bearing” it emits is mean-reversion, so it points ~180° wrong out-of-region. The harness is verified: a synthetic fire drifting monotonically NE is scored at pred-bearing 37°, mean signed offset −0.0°, within-45°=1.00 — the negative is a property of the data, not the code. Verdict: the direction-only advisory is not spatially robust and not proposable for surfacing. Everything stays default-OFF and gated; the only write is a hidden shadow table recorded as a negative.
Why this reframes 0037. Entry 0037 reported the in-window resolvable centroid at offset −16.5° and called a default-OFF direction advisory “defensibly buildable,” explicitly deferring off-season and held-out-region checks. The held-out-region check reverses that conclusion: with the corpus scoped identically (105 tracks, median K=19 bins, median span 42.5 h, 17,340 GOES-ABI detections assigned — matching 0037’s 104/19.5/47/17,286), the pooled in-window forecast that maximizes resultant length actually lands at offset +178.8° (resolvable R=0.501, within-45°=0.104) — the reversal, not the −16° concentration. The prior near-0° figure was an artifact of which resolvable subset and predictor fraction were chosen to maximize R (R is blind to whether the concentration is at 0° or 180°); once the parameter is fit out-of-region and scored honestly, the concentration is on the wrong side. This is a specific, honest correction, and it is exactly what the held-out-region gate exists to catch.
region (lon band — grouping)
tracks
larger
median K bins
median span (h)
West (<−114° — Pacific / Great Basin)
25
17
21
50.2
Interior-West (−114..−104° — Rockies / Southwest)
49
36
29
49.8
Central (−104..−90° — Plains)
9
8
18
27.5
East (>−90° — Eastern / Southeast)
22
14
14
12.8
105 GOES-cadence tracks total (footprint-seeded, ≥6 fixed 15-min bins over ≥2 h). Fire counts per region are stated so the held-out-region result is read with its sample size in view: West and Interior-West carry the mass; Central is thin; East’s fires are shorter-lived (median span 12.8 h).
Held-out-region direction skill (leave-one-region-out; the predictor fraction is fit only on the OTHER three regions, then applied unchanged to the held-out one). Read R together with offset and within-45°: skill requires high R at an offset near 0° with within-45° above the 0.25 random floor. None of the folds clear that bar.
held-out region
frac fit on others
subset
n pairs
mean ang. err
within 45°
R
offset
Rayleigh p
read
West
0.6
resolvable
88
114.9°
0.080
0.363
+156.8°
6.4e−06
reversed
West
0.6
larger fires
71
117.5°
0.056
0.422
+145.9°
1.7e−06
reversed
West
0.6
resolvable, 6 h
36
129.0°
0.028
0.696
+136.8°
<1e−300
reversed
Interior-West
0.5
resolvable
174
135.2°
0.109
0.555
−169.8°
<1e−300
reversed
Interior-West
0.5
larger fires
159
138.5°
0.082
0.595
−170.2°
<1e−300
reversed
Interior-West
0.5
resolvable, 6 h
115
153.8°
0.052
0.769
−179.1°
<1e−300
reversed
Central
0.7
resolvable
0
—
—
—
—
—
no test pairs
East
0.7
resolvable
44
98.6°
0.409
0.117
−144.4°
0.548
at chance (NS)
East
0.7
larger fires
32
91.8°
0.438
0.077
−102.2°
0.829
at chance (NS)
“Reversed” = the resultant concentrates near ±180° with within-45° well under the 0.25 random floor (the forecast is worse than a coin flip). “At chance (NS)” = Rayleigh test cannot reject uniformity (p>0.5). The decisive question — does the R≈0.6/offset≈0° direction skill transport across regions? — is answered no in every fold that has test pairs.
Pooled in-window reference (frac chosen to maximize resolvable R, matching 0037’s fit objective). Even before holding a region out, the honestly-scored pooled centroid lands on the reversal, not the near-0° concentration:
subset
n pairs
mean ang. err
within 45°
R
offset
resolvable
201
132.4°
0.104
0.501
+178.8°
larger fires
166
135.4°
0.090
0.538
+179.1°
resolvable, 6 h
69
142.5°
0.014
0.669
+165.7°
Mechanism diagnostic (why the centroid cannot carry direction here). The reversal is not a scoring choice — the GOES 2 km centroid genuinely does not migrate:
diagnostic
n
result
meaning
synthetic control: monotonic-NE drift
1
pred-bearing 37°, signed offset −0.0°, within-45°=1.00
harness is correct — real drift scores near 0°
real: first-half vs second-half centroid angle (larger tracks)
14
median 178°; 57% reverse (>135°), 21% persist (<45°)
median 0.000; median net centroid displacement 0.00 km
centroid returns to its start = pinned, no net drift
A fire that grows roughly symmetrically at 2 km resolution keeps its detection-cloud centroid essentially fixed even as its perimeter advances — so the centroid’s frame-to-frame wander is dominated by fill/sampling noise that anti-correlates across a split, producing the ~180° reversal out-of-region. This is the same pinned-centroid limitation entry 0037 flagged for rate (median drift ≈0.0007 km/h) — extended here to direction once the parameter is not allowed to see the test region.
Reproducibility detail. Resource-guarded on the host: health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, run under a private serialization marker (unique name, so a concurrent sibling job is never contended) inside a capped experiment slice with a server-side timeout + nice -n19 and a thermal-abort watchdog, killed by PID. Reads are mode=ro URI + PRAGMA query_only=ON on all production tables. Corpus = the footprint fires of growth_truth_shadow (provenance∈{viirs_footprint,modis_footprint}, 327 seeds) as anchors; the window starts 12 h before the earliest seed build-epoch to now (matching entry 0037’s scoping, so the corpus reproduces: 105 tracks vs 0037’s 104). GOES cadence: raw detections from GOES19-ABI, GOES18-ABI, and the two ABI-Dozier-Subpixel sources are assigned to their nearest seed within 3.0 km (Voronoi partition) — 17,340 of 84,085 scanned assigned — and binned into fixed 15-minute bins (bin centroid); a track qualifies with ≥6 bins spanning ≥2 h. Forecast split (identical to 0037): predictor window = first ceil(frac·K) bins (all at time ≤T, position-at-T = last predictor point); predicted bearing = predictor first→last; validation = each later bin j with actual bearing = (position-at-T → point j) — predictor and validation share only the instant T, so no overlap. Region split = longitude bands (West <−114°, Interior-West −114..−104°, Central −104..−90°, East >−90°), a coarse GACC-style geographic-area proxy; the split rule and per-region counts are stated in-line. Held-out-region cross-validation = leave-one-region-out: for each held-out region the predictor fraction is chosen from {0.5,0.6,0.7} to maximize the resolvable direction R on the pooled OTHER three regions, then applied unchanged to the held-out region; skill is reported on that region’s resolvable (predictor displacement ≥0.7 km), larger-fire (K≥10 & span≥6 h) and 6 h subsets. Baselines: random-direction null (R≈0, within-45°≈0.25) and a synthetic monotonic-drift control (offset −0.0°, within-45°=1.00) to verify the harness sign convention. Circular stats = mean angular error, mean-resultant length R, mean offset of signed (observed−predicted) bearings, and the Rayleigh test of uniformity [23]. Held-out-region / blocked cross-validation follows the spatial-CV recommendation for spatially structured data [31]. The only write is a hidden table spread_direction_advisory_shadow (surface_allowed=0, held_out_region_validated=0, DO_NOT_SURFACE, 28 rows = the qualifying fires’ formalized advisories carried as a research-negative record, 17 larger-fire / 11 resolvable, 18 flagged active), registered gated in canary_meta; the serving app does not read it (0 references). Every figure counted from the live production DB at run time.
Claim status: MEASURED, read-only on production, honest held-out-region baselines, research/prototype only. This entry changes no fusion/tier/confidence/map/API surface and surfaces nothing; its one write is an additive, gated, do-not-surface shadow table recorded as a negative. The operative claims are: (1) under strict leave-one-region-out the GOES-cadence centroid direction advisory does not transport — every held-out region with test pairs is either reversed (within-45° 0.03–0.11, offset ±136–180°) or at chance (Rayleigh p=0.55–0.83); (2) the mechanism is a pinned centroid (median net displacement 0.00 km, half-to-half reversal median 178°); (3) the harness is verified by a synthetic control; (4) the 0037 in-window near-0° offset was subset/parameter selection, not spatial skill. The headline is that the one deferred validation, once run, refutes the advisory.
Formalized advisory (what would have been required) — and why it fails the gate. The advisory was defined precisely: qualify a fire on ≥6 GOES 15-min bins over ≥2 h (larger-fire class: ≥10 bins & ≥6 h span; resolvable: predictor displacement ≥0.7 km ≈ ~1 GOES pixel); issue a direction-only bearing (larger-fire class ±30° at a 6 h horizon; resolvable class ±45° at 3 h), explicitly no rate; persist per-fire to spread_direction_advisory_shadow with a reliability class and an active flag (last bin within 24 h). Twenty-eight qualifying advisories (18 active) were computed and stored. But the stated reliability (±30°/±45°) is not met out-of-region — the bearing is ~180° wrong — so the formalized criteria, while well-defined, do not deliver a usable advisory, and the shadow rows are retained only as a negative-result artifact (held_out_region_validated=0), never as a surfaceable product.
Surfacing proposal (for Mark): do NOT surface. The reversible mechanism 0037 sketched is still the right shape — a separate “advisory / not a detection” overlay, shown only for fires meeting reliability criteria, never merged into the confirmed roster or any detection count, one flag to enable and one DELETE to retract, with the honest reliability shown to the user — but its enable criteria are not met, so the recommendation is to keep it default-OFF and gated and not propose it for surfacing. A permanent-on would require, at minimum: (a) replacing the proven-pinned centroid with a genuine perimeter / leading-edge front primitive (isochrone or hull-advance against an independent axis) that actually migrates at 2 km; (b) a time-archived wind join to anticipate wind-shift turns; and (c) a re-validation gate that requires correct-direction skill (offset within ±30° and within-45° above the 0.25 random floor) on strictly held-out regions and off-season data — not resultant length alone, which this entry shows can concentrate on the wrong answer. Until all three hold, nothing surfaces.
Literature alignment. Verdict: NEGATIVE, consistent with fire-progression and forecast-verification practice. That real fires have coherent spread direction is well established — but progression atlases recover it from time-resolved perimeters, not raw detection centroids [16], which is precisely the primitive this entry shows the centroid cannot substitute for at 2 km. The requirement to beat a naive reference and the gap between in-sample/in-window fit and genuinely out-of-sample skill are the core of forecast verification [28][29]; here the out-of-region forecast fails to beat — indeed falls below — the random-direction reference. Geostationary sub-hourly sampling resolves the fire diurnal cycle [8][13][15][20], but cadence buys temporal resolution, not a migrating centroid where the physical footprint grows symmetrically. Physical spread is governed by wind, fuel and slope [21][22], none of which a pinned centroid encodes. Held-out-region (spatially blocked) cross-validation is the standard guard against spatial-structure leakage inflating skill [31]; circular scoring follows standard directional-data methods [23].
What this does not claim: that fire spread direction is unpredictable (from time-resolved perimeters, wind, fuel and slope it is a mature science — only the raw GOES centroid fails here), that GOES cadence is worthless (it resolves the diurnal cycle and underpins detection; it simply does not animate a pinned centroid), that a frontier primitive cannot work (0037 tested two that failed; a perimeter/isochrone front is untested and is the named next step), that entry 0037’s cadence-vs-frontier attribution was wrong (it stands; this entry corrects only its optimistic “buildable” conclusion by running the region test it deferred), or that any number here should touch serving (nothing is surfaced; the shadow table is gated surface_allowed=0 and unread by the app). Verdict. The held-out-region test — the decisive validation 0037 named — refutes the direction-only advisory: it is not spatially robust for any fire class or region in this corpus, so it is not proposable for surfacing. It stays default-OFF and gated. The path forward is a real perimeter front + wind, not the centroid. Mark decides; nothing here changes a shipped number.
Hard-bound: warm-season CONUS, single active-fire window; footprint seeds are VIIRS 375 m / MODIS 1 km, biased toward larger/longer-lived fires (105 GOES-cadence tracks; region counts 25/49/9/22; Central too thin for held-out resolvable pairs); GOES-ABI position is ~2 km coarse and the centroid is pinned (net displacement ~0 km); the region split is a coarse longitude-band proxy for GACC boundaries, not the operational polygons; off-season validation remains deferred (and is moot until a migrating primitive exists). Every conclusion is a statement about spread-direction forecast skill from the GOES detection centroid in this observing regime, not about the physical predictability of fire spread.
Tested whether utility-scale solar farms are a distinct unmasked false-positive class — prompted by a human reviewer noting that many confirmed non-fires “looked like energy stations or solar farms” — and it is a clean measured negative: of 10,879 registry-listed CONUS solar sites, exactly one shows persistent fused detections (≥3 distinct days), its 3 hits are already classed tier='fp' and sit 1.24 km from an existing dozier_persistence polygon, so a dedicated solar mask would suppress zero live-serving rows; the zero-real-fires-masked transport gate is fully clean but the win is nil. The physics explains why: photovoltaic panels convert insolation and emit no fire-band thermal anomaly — only concentrating-solar power towers focus flux, and CONUS has just 16; the visually-“solar” non-fires in the review batch are driven by co-located industrial/flaring heat the shipped masks already catch. Verdict: do NOT build a solar mask — the class is already covered / self-tiered. Nothing promoted; production untouched — 0039
Date: 2026-07-11 Status: MEASURED NEGATIVE (read-only on production; shadow-only; open-registry solar pull; multi-day fused-cluster persistence gate; zero-real-fires-masked transport gate scored against IRWIN 1,083,168 truth points + WFIGS 461 truth fires; research/prototype only, no cutover, nothing surfaced) — two hidden shadow tables (solar_sites_osm_shadow 10,879 rows; solar_mask_shadow 1 row, is_clean=1); production fp_polygons verified unchanged (identical source counts, nosolar_pv_persistence row)
The framing. While a human reviewer worked the gold false-positive batch of entry 0036 (the mask-independent FP-certification set), a concrete observation surfaced: the confirmed non-fires were overwhelmingly “energy stations or solar farms.” The energy-station half is already handled — combustion sources hit the shipped powerplant_combustion_persistence (entry 0032), flaring_nightfire_persistence (0017), osm_refinery and osm_gas_flare masks. But solar farms are not combustion, so none of the shipped masks target them by name, and utility-scale solar — especially concentrating-solar power (CSP) towers — is a documented thermal commission source. The honest question this entry answers: are solar farms a distinct uncovered false-positive class that warrants a new mask of the same shape shipped for flaring and power plants, or are they already covered incidentally? This is exactly the kind of lead that must be measured, not assumed — a visually-obvious “solar FP” may not be caused by the solar array at all.
BLUF. Solar is not a meaningful unmasked FP class, and a dedicated solar mask buys nothing. We pulled every utility-scale solar generation site in CONUS from the open registry — 10,879 features (10,863 photovoltaic plants + 16 CSP towers; the power=generator/solar tag returned none at plant scale) — and persistence-gated each against the full fused-detection archive (16,757 fused fires). The result is stark: 10,475 of 10,879 solar sites have zero fused detections within their footprint, 385 have detections on a single day, 18 on two days, and exactly one recurs on ≥3 distinct days — the multi-day persistence bar the shipped masks require. That one candidate (an unnamed PV plant at 39.104, −121.578 in Northern California) passes the transport gate cleanly (0 of 1 disqualified: no IRWIN incident and no WFIGS truth fire within 5 km, no multi-sensor or confirmed-tier cluster inside it), but its win is nil: it would suppress 0 live-serving rows, its 3 historical fused hits are alreadytier='fp' at 0.0 confidence, and an existing dozier_persistence polygon already sits 1.24 km away — the FP is already caught. A solar_pv_persistence mask would reclassify nothing that is not already suppressed. Verdict: no-go. The mask was not built into production; everything is shadow-only and reversible.
The physics is the explanation. The measured near-total absence of solar detections is not a coverage gap in the registry — it is what the radiometry predicts. A photovoltaic panel converts incident sunlight to electricity; its operating temperature (typically a few tens of degrees above ambient) is nowhere near the ~600–1000 K brightness-temperature contrast the VIIRS/GOES mid-IR fire channels key on, so a PV farm simply does not present as a sub-pixel hot source. Only concentrating-solar power towers, which focus a field of heliostats onto a single receiver, produce a genuine high-flux thermal signature — and there are just 16 in the entire CONUS registry, of which none clears the multi-day persistence bar in this archive. So “solar farm” is a correct visual label on a non-fire, but the wrong causal label on the detection: the thermal source that actually tripped the pipeline is co-located industrial or flaring heat, which the shipped masks already own.
Persistence landscape (why only one candidate). Distinct fused-detection days per solar site, over the full archive:
distinct fused-days with a hit inside the footprint
solar sites
share
read
0 (never triggers)
10,475
96.3%
PV emits no fire-band anomaly
1 day
385
3.5%
one-off / transient — not maskable
2 days
18
0.17%
below the ≥3-day persistence bar
≥3 days (persistent candidate)
1
0.009%
the sole mask candidate — and already fp
The persistence bar (≥3 distinct archive days) is the same discipline used to ship flaring_nightfire_persistence (0017) and powerplant_combustion_persistence (0032): a source is masked only if it repeatedly triggers, never on a single detection near a landmark. Footprint radii from the registry geometry: min 0.002 / mean 0.357 / max 7.99 km, floored to 2.0 km for the candidate (matching the fusion mask-radius floor).
Transport gate — fully CLEAN, but the win is zero.
step
metric
value
registry pull
CONUS solar sites (10,863 PV + 16 CSP)
10,879
persistence gate
candidates recurring on ≥3 distinct days
1
transport gate
candidates disqualified (IRWIN ±5 km, WFIGS ±5 km, multi-sensor, confirmed-tier)
0
transport gate
clean candidates (persistent AND zero real fires masked)
1
win
live-serving rows a solar mask would suppress (last_seen≥now−24h, tier≠fp, conf≥0.10)
0
win
historical fused hits caught — all alreadytier='fp'
3
Truth for the transport gate: 1,083,168 IRWIN incident points + 461 WFIGS truth fires, plus per-cluster multi-sensor / confirmed-tier corroboration. The gate’s job is to refuse to mask any real fire; here it disqualifies nothing (the one candidate is genuinely a persistent non-fire), yet the mask still fails on value, not on safety: the thing it would mask is already masked.
Reconciliation with the human review batch. To confirm the reviewer’s “solar” observation is explained rather than dismissed, we cross-checked the 82-row gold-FP batch (entry 0036) against the solar registry: 9 of 82 review rows sit within 3 km of a solar site. Not one is driven by the solar array — every one has a shipped-mask thermal source as its nearest cue (2 are already on_mask=1 via flaring_nightfire_persistence / osm_refinery; the other 7 have a dozier_persistence / flaring / refinery source within range). Provisional adjudication of the 9: 2 NON_FIRE, 3 FIRE, 4 AMBIGUOUS — i.e. proximity to a solar farm carries no non-fire signal beyond what the existing industrial masks already encode. Across the whole batch, 6 of 82 rows are already on a shipped mask. (Human labels are being entered in the offline review tool and were not yet written back to the DB at run time; the reconciliation therefore uses provisional labels and stated its dependence honestly.)
Reproducibility detail. Resource-guarded on the host: health-gated on the host service (exit 75 if inactive), yields to the hard host busy marker, run under a private serialization marker (unique name, so a concurrently-running sibling job is never contended) with a server-side timeout + nice -n19; the in-flight registry fetch and the analysis were watched to completion and killed by PID if needed — no detached loop. Reads are mode=ro URI on all production tables; the only writes are two additive hidden shadow tables. Registry pull = a single bounded, backed-off Overpass query over the CONUS bbox for power=plant with plant:source=solar / plant:method=photovoltaic / plant:method=thermal+plant:source=solar (CSP), plus power=generator/solar; centroids + a bounding-box footprint radius written to solar_sites_osm_shadow (10,879 rows; 10,863 plant, 16 plant_csp). Persistence gate = for each site, fused_fires clusters whose centroid falls within max(footprint, 2.0 km) are collected on a 0.1° spatial grid; a site qualifies as a candidate only with hits on ≥3 distinct date(last_seen) days. Transport gate = a candidate is disqualified if any IRWIN incident (fire_event_evidence source='IRWIN', 1,083,168 pts) or WFIGS truth fire (wfigs_truth, 461) lies within max(radius,5 km), or if any contained fused cluster is multi-sensor (≥2 of VIIRS/MODIS/GOES/S2/Landsat) or tier='confirmed'; surviving candidates are is_clean=1. Win = contained fused rows counted against the live serving query (last_seen≥now−24h AND tier≠'fp' AND confidence≥0.10) for live suppression, and all-time for historical, tallied by tier. The only writes are solar_sites_osm_shadow (10,879) and solar_mask_shadow (1 row, is_clean=1, carrying the candidate’s osm_id / geometry / families / persistence / disqual-reason as a research record); neither is registered surfaceable and the serving app reads neither. Production fp_polygons verified unchanged after the run: source counts identical to baseline (osm_refinery 51,474 / dozier_persistence 11,263 / osm_gas_flare 7,457 / flaring_nightfire_persistence 660 / polar_persistence 91 / powerplant_combustion_persistence 7), zero solar_pv_persistence rows. The reversible promotion statement was written and retained but not executed: INSERT INTO fp_polygons(source,...) SELECT 'solar_pv_persistence',... FROM solar_mask_shadow WHERE is_clean=1; undone by a single DELETE FROM fp_polygons WHERE source='solar_pv_persistence';. Every figure counted from the live production DB at run time.
Claim status: MEASURED NEGATIVE, read-only on production, shadow-only, honest transport gate. This entry changes no fusion/tier/confidence/map/API surface and surfaces nothing; its two writes are additive, gated, do-not-surface shadow tables retained as a research record. The operative claims are: (1) of 10,879 registry solar sites, exactly 1 clears the ≥3-day persistence bar; (2) that candidate passes the zero-real-fires transport gate but suppresses 0 live rows and its 3 historical hits are already tier='fp', 1.24 km from an existing dozier_persistence polygon; (3) the near-total absence is radiometric — PV emits no fire-band anomaly, only 16 CSP towers exist and none persists; (4) the review batch’s visually-“solar” non-fires are driven by co-located industrial/flaring heat the shipped masks already catch. The headline is that a lead surfaced by direct human review, once measured, is a covered class — not a new mask.
Hard bound (registry completeness + summer window + PV saturation-irrelevance). (1) The solar inventory is the open registry, which under-represents the newest and smallest arrays; but the conclusion is robust to that gap because the failure is radiometric (PV does not emit in the fire bands), not a counting artifact — a more complete PV inventory would add more zero-detection sites, not more candidates. (2) The fused archive is the current warm-season window; a solar site that only trips in another season would be missed, but the same is true of every shipped mask and the persistence daemon self-refreshes. (3) The one CSP-vs-PV distinction that could matter (a power tower) is explicitly enumerated (16 CONUS sites) and none persists, so the physically-plausible sub-class is measured, not assumed. (4) Human labels were not yet written back to the DB, so the review-batch reconciliation leans on provisional labels — stated in-line; the persistence/transport result does not depend on them.
Literature alignment. Verdict: AGREEMENT. Persistent static thermal sources — industrial sites, gas flares, and the like — are the dominant commission-error class in VIIRS/GOES active-fire products, and the operational remedy is a static hot-source / persistent-anomaly mask keyed off registries [1][2][11][18][19][24]. This entry adds the specific, measured refinement that solar photovoltaic is not a member of that commission class — it emits no mid-IR fire-band anomaly, so it needs no mask — while the rare concentrating-solar tower would fall under exactly the same persistent-hot-source remedy already deployed. That the visually-apparent “solar” false positives resolve to co-located combustion/flaring sources the masks already encode is consistent with the static-source masking practice those references describe: the right unit of masking is the thermal emitter, not the land use visible in daytime imagery.
What this does not claim: that solar facilities never appear in fire products (a concentrating-solar power tower genuinely can, and would be masked like any persistent hot source — there are simply too few, and none persists here), that the registry is exhaustive (it is not, but the radiometric mechanism makes the negative robust to that), that co-located industrial FPs near solar are unimportant (they are real — they are already masked, which is the point), or that any number here should touch serving (nothing is surfaced; both shadow tables are gated and unread by the app). Verdict. A dedicated solar mask is not warranted: solar PV is effectively already covered / self-tiered as fp, and building solar_pv_persistence would add no live suppression. It stays in shadow, unbuilt in production. This is the thirteenth candidate this program’s measurement discipline has correctly stopped short of a low-value or mirage promotion — a lead confirmed by human eyes, then retired by the numbers. Mark decides; nothing here changes a shipped number.
Schroeder, W. et al. (2014). The New VIIRS 375 m active fire detection data product. Remote Sensing of Environment 143, 85–96.
Giglio, L. et al. (2016). The Collection 6 MODIS active fire detection algorithm and fire products. Remote Sensing of Environment 178, 31–41.
Schroeder, W. et al. (2008). Validation of GOES and MODIS active fire detection products. Remote Sensing of Environment 112, 2711–2726.
Jain, P. et al. (2020). A review of machine learning applications in wildfire science and management. Environmental Reviews 28(4), 478–505.
Rodrigues, M. & de la Riva, J. (2014). An insight into machine-learning algorithms to model fire susceptibility. Environmental Modelling & Software 57, 192–201.
Short, K. C. (2014). A spatial database of wildfires in the United States (FPA-FOD): reporting completeness and bias considerations. Earth System Science Data 6, 1–27.
Dozier, J. (1981). A method for satellite identification of surface temperature fields of subpixel resolution. Remote Sensing of Environment 11, 221–229.
Schmidt, C. C. et al. (2012). The GOES-R Advanced Baseline Imager Fire/Hot Spot Characterization (FDC) algorithm. NOAA/NESDIS ATBD.
Govil, K. et al. (2020). Preliminary results from a wildfire detection system using deep learning on remote camera networks. Remote Sensing 12(1), 166.
Xu, W. & Wooster, M. J. et al. (2020). First study of Sentinel-2 for detecting and characterising active fires. Remote Sensing 12(19), 3181.
Elvidge, C. D. et al. (2016). Methods for global survey of natural gas flaring from VIIRS Nightfire. Energies 9(1), 14.
Schroeder, W. et al. (2016). Active fire detection using Landsat-8/OLI data. Remote Sensing of Environment 185, 210–220.
Koltunov, A., Ustin, S. L., Quayle, B., Schwind, B., Ambrosia, V. G. & Li, W. (2016). The development and first validation of the GOES Early Fire Detection (GOES-EFD) algorithm. Remote Sensing of Environment 184, 436–453.
St. Denis, L. A., Short, K. C., McConnell, K., Cook, M. C., Mietkiewicz, N. P., Buckland, M. & Balch, J. K. (2023). All-hazards dataset mined from the US National Incident Management System 1999–2020. Scientific Data 10, 112.
Giglio, L. (2007). Characterization of the tropical diurnal fire cycle using VIRS and MODIS observations. Remote Sensing of Environment 108(4), 407–421.
Andela, N., Morton, D. C., Giglio, L., Paugam, R., Chen, Y., Hantson, S., van der Werf, G. R. & Randerson, J. T. (2019). The Global Fire Atlas of individual fire size, duration, speed and direction. Earth System Science Data 11, 529–552.
Cochran, W. G. (1977). Sampling Techniques (3rd ed.). Wiley. [stratified estimation, Neyman allocation, finite-population correction]
Byers, L., Friedrich, J., Hennig, R., Kressig, A., Li, X., McCormick, C. & Malaguzzi Valeri, L. (2018). A Global Database of Power Plants. World Resources Institute (WRI Global Power Plant Database).
Csiszar, I., Schroeder, W., Giglio, L., Ellicott, E., Vadrevu, K. P., Justice, C. O. & Wind, B. (2014). Active fires from the Suomi NPP Visible Infrared Imaging Radiometer Suite: Product status and first evaluation results. Journal of Geophysical Research: Atmospheres 119(2), 803–816.
Li, F., Zhang, X., Kondragunta, S., Schmidt, C. C. & Holmes, C. D. (2020). A preliminary evaluation of GOES-16 active fire product using Landsat-8 and VIIRS active fire data, and ground-based prescribed fire records. Remote Sensing of Environment 237, 111600.
Rothermel, R. C. (1972). A mathematical model for predicting fire spread in wildland fuels. USDA Forest Service Research Paper INT-115. Intermountain Forest and Range Experiment Station.
Cheney, N. P., Gould, J. S. & Catchpole, W. R. (1993). The influence of fuel, weather and fire shape variables on fire-spread in grasslands. International Journal of Wildland Fire 3(1), 31–44.
Fisher, N. I. (1993). Statistical Analysis of Circular Data. Cambridge University Press. [mean-resultant length, Rayleigh test of uniformity]
Prins, E. M. & Menzel, W. P. (1994). Trends in South American biomass burning detected with the GOES Visible Infrared Spin Scan Radiometer Atmospheric Sounder from 1983 to 1991. Journal of Geophysical Research: Atmospheres 99(D8), 16719–16735. [WF-ABBA geostationary detection; cadence-vs-false-alarm trade-off]
Kumar, S. S. & Roy, D. P. (2018). Global operational land imager Landsat-8 reflectance-based active fire detection algorithm. International Journal of Digital Earth 11(2), 154–178. [OLI B6/B7 reflectance-based active-fire test; derived Landsat hotspots, no operational feed]
Bloom, J. S., Richards, J. W., Nugent, P. E., Quimby, R. M., Kasliwal, M. M., Starr, D. L., Poznanski, D., Ofek, E. O. et al. (2012). Automating discovery and classification of transients and variable stars in the synoptic survey era. Publications of the Astronomical Society of the Pacific 124(921), 1175–1196. [origin of the machine-learned “real-bogus” classifier — a learned filter earns its place only by adding signal beyond the existing cuts]
Breiman, L. (2001). Random forests. Machine Learning 45(1), 5–32. [permutation feature importance as attribution of discriminative power]
Jolliffe, I. T. & Stephenson, D. B. (eds.) (2012). Forecast Verification: A Practitioner’s Guide in Atmospheric Science (2nd ed.). Wiley. [out-of-sample skill vs. in-sample fit; skill scores relative to persistence and climatology reference forecasts]
Murphy, A. H. (1993). What is a good forecast? An essay on the nature of goodness in weather forecasting. Weather and Forecasting 8(2), 281–293. [forecast skill defined against a naive reference; persistence and climatology as the baselines a forecast must beat]
Kasischke, E. S. & Turetsky, M. R. (2006). Recent changes in the fire regime across the North American boreal region — spatial and temporal patterns of burning across Canada and Alaska. Geophysical Research Letters 33, L09703. [boreal/high-latitude fire regime; smouldering and deep ground burning with modest instantaneous flaming fraction]
Roberts, D. R., Bahn, V., Ciuti, S., Boyce, M. S., Elith, J., Guillera-Arroita, G., Hauenstein, S., Lahoz-Monfort, J. J., Schröder, B., Thuiller, W., Warton, D. I., Wintle, B. A., Hartig, F. & Dormann, C. F. (2017). Cross-validation strategies for data with temporal, spatial, hierarchical, or phylogenetic structure. Ecography 40(8), 913–929. [spatially-blocked / held-out-region cross-validation as the guard against spatial-structure leakage inflating apparent out-of-sample skill]