When a declaration lands, which agencies' data can we use under terms signed in advance? Is it arriving as fast as the provider agreed? And what is still missing? One number answers all three: COVERED UNDER AGREEMENT n of 10.
The app makes none of these happen. It moves no data and mints or revokes no access. It tells the coordinator what the agreements say should now be true, checks whether it is, and drafts what to send.
“Develop agreements between geospatial professional teams at the municipal, state, and federal levels to predetermine the data and products to be used, generated, and shared during a disaster.”
NIMS (2017) asks for agreements “in place … at the time of an incident”, including data format standards, and publishes no format for one. Partners not knowing what they may share is a GAO finding on the record (GAO-20-396).
Doctrine asks for agreements made in advance, covering “connection of networks, data format standards, and cybersecurity”. It gives no form, schema or register for one. EMAC shows the pattern, agreeing the package in advance so that activation becomes selection, but EMAC covers personnel and equipment only.
DCAT-US 3.0 describes a dataset, its distributions and its access and use restrictions. It has no field for an agreement, a named recipient, an activation condition or an agreed refresh cadence. Everything DCAT leaves out goes into the compact.
Its 16 messages cover “emergency equipment, supplies, people and teams”. None of them requests a dataset. The app exports a data request in an EDXL-RM envelope, labels the envelope as borrowed, and never claims conformance.
So the app holds the missing record as a register, with one field for each piece of doctrine: provider and subscriber, the package in DCAT terms, the activation condition, the agreed cadence, the access and use restrictions, and the recovery tail. Then it checks real endpoints against that register.
| Benchmark | What it does | Ties a standing agreement to a declaration, and measures delivery against the agreed cadence? |
|---|---|---|
| HDX (Data Grids · Connect) | completeness per humanitarian crisis; freshness against the publisher's own frequency | Partly: freshness for anyone, with no agreement and no declaration |
| Copernicus EMS Rapid Mapping | activates products made for you by pre-registered users | No: these are not partners' datasets |
| FEMA GeoPlatform · CA Geoportal · Cal OES hub | discovery by event, name and place | No: it shows that data exists, not that you may use it |
| Juvare WebEOC · Veoci · Intterra | share boards and incidents; “activate your EOC in one click” | No: they activate the EOC, not the data |
| Esri collaborations · Delta Sharing | trust between organisations; revocable, audited shares | No: plumbing that is not aware of emergencies |
| Oregon OEM sample GIS DSA | activation, “periodic updates”, termination: “discontinue use… destroy” | Written down, but nothing checks it |
| The Compact | the register, the declaration trigger and measured freshness against what was agreed | Yes, and every input is public |
HDX can say available and up to date. It cannot say “as agreed, for this declaration.” A portal can say exists. It cannot say “we may use it now, and it is late.”
OpenFEMA's declarations record, read and never interpreted. Since January 2025, every California declaration has been FM or EM, and the last major disaster was DR-4856 on 2025-01-08. So “the declaration” cannot mean a DR only. Each agreement names its own condition, and state or local proclamations are entered by hand and labelled MANUAL.
The record holds county rows and no geometry. It is joined by FIPS to the California Geoportal's county polygons. “In the declared area” means a polygon intersection, sent by POST, never a radius or a bounding box. The SEMS operational area is the natural boundary for a compact.
9 packages from 7 real providers, with 31 grants: CAL FIRE perimeters and DINS, NIFC WFIGS, Cal OES evacuations and outages, LA County alert areas, CHHS open shelters, Caltrans lane closures and HCAI facilities. Each one is that agency's own public endpoint, probed, with its fields and cadence quoted.
The open-shelter layer is rebuilt daily at about 07:00 PT and lags a day, and its licence says “not to be aggregated”, so the package carries that restriction. The evacuation layer advertises a five-minute rebuild but only writes when something changes. The federal declarations dataset's own refresh stamp is a year older than its newest row.
Without $top, OpenFEMA returned 1,000 California rows with metadata.count 0. Nothing in the response said that 691 rows were missing. Only $count=true reports the real total of 1,691. The app sends both and prints capped when they disagree. Its CDN cache can also surface a new declaration up to ~12 minutes late, so the app prints the rundate beside the fetch time.
The denominator is always 10. A gap is counted, never dropped, and the breakdown always sums to ten.
The package is in force for this declaration and its delivery stamp is younger than its staleAfter. This is the only state counted in n.
The endpoint writes only on change, so “arrived on time” cannot be told from “nothing happened” from outside. The app prints the time of record and does not count the need.
It is in force and verifiable, but older than agreed. The agreed cadence and the measured age are printed side by side.
The last poll failed. The last good reading is kept and dated, and only that package's indicator degrades.
A package exists, but this declaration does not meet its condition. The failing clause is printed, and Draft request asks the provider to share anyway.
No package serves the need. The reason and the likely holder are printed, and a request is offered. This is never drawn as zero and never as covered.
Colour is never the only channel. Every state has a glyph and a word on screen, in the annex and in the JSON. Every state ink clears 4.5:1 on every surface in both modes, and the lowest is 4.72:1. Each figure was computed, not eyeballed.
FM declarations carry no end date in the federal record, so for those the stand-down date is entered by hand and labelled MANUAL. The app produces a checklist for the providers to act on. It revokes nothing.
The recipe's XML used SenderID and DateTimeSent. Those are EDXL-DE envelope names, and EDXL-RM has neither. It also makes OriginatingMessageID and ContactInformation mandatory. The live suite now fetches the OASIS text and checks every emitted name against it.
WFIGS's refresh stamp sat still across two reads 13 minutes apart, early in the morning. So nothing hard-codes the first-screen n. The suites assert the relations, and at another hour N2 correctly reads ◷ STALE. The same probe found NIFC's own line: refreshed from IRWIN every 5 minutes.
The offline suite caught the Esri-to-GeoJSON converter treating a county's second outer ring as a hole, because the sign test was backwards. A browser run found Undo unreachable after a confirmation, and a phone screenshot showed Calaveras overflowing its 40 % map. All three are fixed and asserted.
Reading the figures: the declarations, county geometry and nine endpoints are real, public and measured. The compact is ILLUSTRATIVE: no agreement exists. The terms are seeded and labelled on every card, cell and export. Seeded terms never enter a measured figure, because freshness is always measured and only its threshold comes from the register.
Every one of these is written into the delivered application's README, and most are printed on its face. A data-sharing tool that overstates its reach is the incident's next problem.
Import your own compact (members, packages, terms and grants) and the illustrative one is replaced. The import is local and validated, and every endpoint is probed. The next declaration then reads against your agreements and your providers' measured delivery.
Swappable by configuration, not by code: the ten core needs, the packages, the activation conditions, the cadences and the recovery tails are all one JSON register. No agency's terms are hardcoded. The compact is a shape the app renders, not a list of Californian agreements it ships. Run Blue sky drills before the season, so that on the day, activation is selection.