What
The two datasets describe the same fires from different sides, and neither says how well they meet. This adds a third measurement page, join.html: for each DINS incident, whether a FRAP perimeter record exists for it, and for each FRAP record in the DINS era, whether any inspection records exist. The join is attempted on three keys in turn, each published separately and never merged: IRWIN ID where both carry one; CAL FIRE incident number with year and unit; normalized fire name with year. Counts are published per key: matched, unmatched, and ambiguous (one DINS incident matching several perimeters), with the DINS records and acres each bucket represents.
Why it matters
"Which burned structures have a mapped perimeter" is coverage in the project's own sense, and the answer depends on a join key nobody has audited, so the key is treated the way markers are: three readings, each counted, each with its evidence and cost in docs/MARKERS.md. Name joins are the weakest and the most tempting, and publishing them beside identifier joins shows what they are worth. No record is corrected, no fire is renamed, no rate is drawn per agency. The sibling wildfire-service-territory-overlap met the same naming problem joining a county's records (ADR 0018) and refused rather than guessed; this makes the refusal quantitative.
Scope
src/perimeter/join.py: per-key match tables; ambiguity counted, never resolved; the DINS era boundary stated from the earliest incident start date in the file.
- Artifact
site/data/join-coverage.json with is_fixture, per-key {matched, unmatched, ambiguous} in both directions, and a key_basis per key in the style of marker_basis.
- Page with the three-state key, WCAG gates, and prose-number tracing; a
docs/MARKERS.md section for the join keys.
- Fixtures extended with a shared IRWIN id, a shared incident number, and a name-only near miss.
Out of scope
- Spatial joins (the sibling's lane) and any "best" key.
- Damage or loss totals per perimeter.
Done when
- Fixtures yield the hand-computed match counts per key, with the near miss unmatched under exact name and ambiguous under normalized name.
- A DINS incident with no start date is counted in its own cohort, not dropped.
- Zero matches on a key prints "none matched" in words and
0 in the artifact with its denominator.
Pointers
src/perimeter/perimeters.py (duplicate-signal keys irwin_id, year_unit_incident_number, year_name_acres), dins.py, schema.py (INCIDENTNUM, INCIDENTNAME, INCIDENTSTARTDATE)
docs/MARKERS.md, docs/adr/0003-published-versus-inferred-marker-basis.md
Proposed with AI assistance.
What
The two datasets describe the same fires from different sides, and neither says how well they meet. This adds a third measurement page,
join.html: for each DINS incident, whether a FRAP perimeter record exists for it, and for each FRAP record in the DINS era, whether any inspection records exist. The join is attempted on three keys in turn, each published separately and never merged: IRWIN ID where both carry one; CAL FIRE incident number with year and unit; normalized fire name with year. Counts are published per key: matched, unmatched, and ambiguous (one DINS incident matching several perimeters), with the DINS records and acres each bucket represents.Why it matters
"Which burned structures have a mapped perimeter" is coverage in the project's own sense, and the answer depends on a join key nobody has audited, so the key is treated the way markers are: three readings, each counted, each with its evidence and cost in
docs/MARKERS.md. Name joins are the weakest and the most tempting, and publishing them beside identifier joins shows what they are worth. No record is corrected, no fire is renamed, no rate is drawn per agency. The siblingwildfire-service-territory-overlapmet the same naming problem joining a county's records (ADR 0018) and refused rather than guessed; this makes the refusal quantitative.Scope
src/perimeter/join.py: per-key match tables; ambiguity counted, never resolved; the DINS era boundary stated from the earliest incident start date in the file.site/data/join-coverage.jsonwithis_fixture, per-key{matched, unmatched, ambiguous}in both directions, and akey_basisper key in the style ofmarker_basis.docs/MARKERS.mdsection for the join keys.Out of scope
Done when
0in the artifact with its denominator.Pointers
src/perimeter/perimeters.py(duplicate-signal keysirwin_id,year_unit_incident_number,year_name_acres),dins.py,schema.py(INCIDENTNUM,INCIDENTNAME,INCIDENTSTARTDATE)docs/MARKERS.md,docs/adr/0003-published-versus-inferred-marker-basis.mdProposed with AI assistance.