What
dins.html carries one row per incident and a per-field split for the whole file; the per-incident field split exists in the artifact (incidents_detail) and is rendered nowhere. A county emergency manager or a reporter working one fire wants exactly that: for the Camp Fire, which fields were recorded, which carry Unknown, which are blank, split by assessed and inaccessible structures. This renders site/incidents/<slug>.html for every incident from the existing artifact, with the incident's name and number as published, its record count, its damage-value counts, and the per-field three-state table in the same layout as the file-level page, plus incidents/index.html in name order.
Why it matters
The README's argument for the per-incident table is that "an average across the file describes no incident in particular", and the same holds one level down: a per-incident completeness percentage describes no field in particular. The data is already computed and gated; the gap is rendering. Static pages with no script keep the current posture; the WCAG, reflow, contrast, and prose-number gates run over all of them, which is the cost and the reason to do it with the existing tooling rather than a filter widget. No address, parcel, or coordinate appears; an incident with no assessed records prints "none assessed" in words.
Scope
render.py: incident page template and index; slugs derived deterministically from incident number and name with collision handling recorded in the artifact.
pages.yml and site-offline build all pages; gates parametrized over the directory.
- Cross-links: the incident row on
dins.html links to its page; each page links back and to the data artifact.
- Page count stated on the index; the fixture build renders the fixture incidents.
Out of scope
- Any map, chart, or per-incident rate beyond the counts already in the artifact.
- Client-side filtering or search.
Done when
- The fixture build renders one page per fixture incident, each passing every page gate, and the index lists them in name order.
- Two incidents with the same name and different numbers get distinct slugs and both appear.
- An incident whose records are all inaccessible shows assessed denominators in words and the inaccessible split.
- Every number on an incident page traces to
incidents_detail.
Pointers
src/perimeter/render.py, coverage.py (IncidentCoverage), site/data/dins-coverage.json (incidents_detail)
tools/a11y.mjs, tools/a11y_browser/, tests/test_pages_html.py
Proposed with AI assistance.
What
dins.htmlcarries one row per incident and a per-field split for the whole file; the per-incident field split exists in the artifact (incidents_detail) and is rendered nowhere. A county emergency manager or a reporter working one fire wants exactly that: for the Camp Fire, which fields were recorded, which carryUnknown, which are blank, split by assessed and inaccessible structures. This renderssite/incidents/<slug>.htmlfor every incident from the existing artifact, with the incident's name and number as published, its record count, its damage-value counts, and the per-field three-state table in the same layout as the file-level page, plusincidents/index.htmlin name order.Why it matters
The README's argument for the per-incident table is that "an average across the file describes no incident in particular", and the same holds one level down: a per-incident completeness percentage describes no field in particular. The data is already computed and gated; the gap is rendering. Static pages with no script keep the current posture; the WCAG, reflow, contrast, and prose-number gates run over all of them, which is the cost and the reason to do it with the existing tooling rather than a filter widget. No address, parcel, or coordinate appears; an incident with no assessed records prints "none assessed" in words.
Scope
render.py: incident page template and index; slugs derived deterministically from incident number and name with collision handling recorded in the artifact.pages.ymlandsite-offlinebuild all pages; gates parametrized over the directory.dins.htmllinks to its page; each page links back and to the data artifact.Out of scope
Done when
incidents_detail.Pointers
src/perimeter/render.py,coverage.py(IncidentCoverage),site/data/dins-coverage.json(incidents_detail)tools/a11y.mjs,tools/a11y_browser/,tests/test_pages_html.pyProposed with AI assistance.