ungovr.providers.sgit.ai / The coverage measurement, and the query that produced it
The coverage measurement, and the query that produced it
A number without its query is an assertion, and this site exists to argue the opposite. So both computations are here with the exact question, the seed, the sampling frame, the byte hashes of the frames, and the date they were run.
Prose from the government-graph vault dkeclt5r, 9 September 2026. Both computations were run in this session against bytes retrieved in this session. When the vault moves ahead, this page is behind — and says so rather than guessing.
Computation 1 — the edge they publish
The question. Of UnGovr's entities, how many carry a non-empty open_records.law?
Before the number, the framing, because the number is easy to misread. A missing law reference is not an error. It is an entity whose records law has not been mapped yet, and for much of the world it may not exist in a mappable form. The result below measures how far the join can currently reach. It is not a defect count, and there is a build check that refuses to publish the figure on any page that omits this paragraph.
open_records.lawWhat this number is not. A missing law reference is not an error. It is an entity whose records law has not been mapped yet, and for much of the world it may not exist in a mappable form. The number measures how far the join can currently reach.
By stratum
| Stratum | sampled | with law | coverage | what it is |
|---|---|---|---|---|
| us-ca-full-depth | 25 | 0 | 0.0% | Every descendant of California: counties, cities, school and special districts |
| us-top-level | 12 | 0 | 0.0% | The 99 direct children of the United States: states, territories, federal categories |
| gb-top-level | 6 | 0 | 0.0% | The direct children of the United Kingdom |
| fr-top-level | 3 | 0 | 0.0% | The direct children of France |
| de-top-level | 3 | 0 | 0.0% | The direct children of Germany |
By entity type
| type | sampled | with law |
|---|---|---|
special_district | 15 | 0 |
state | 7 | 0 |
interstate_compact | 4 | 0 |
elected_office | 4 | 0 |
jpa | 2 | 0 |
integrated_care_board | 2 | 0 |
region | 2 | 0 |
ministry | 2 | 0 |
charter_school | 1 | 0 |
community_college | 1 | 0 |
city | 1 | 0 |
other | 1 | 0 |
police_department | 1 | 0 |
regulated_utility | 1 | 0 |
department | 1 | 0 |
school_district | 1 | 0 |
territory | 1 | 0 |
agency | 1 | 0 |
academy | 1 | 0 |
The query that produced it
Of UnGovr's entities, how many carry a non-empty open_records.law?
method stratified random sample of per-entity detail documents
seed 20260909
frames the retrieved bytes in data/raw/, sha256 in the retrieval log
run 2026-09-09T01:52:18Zopen_records appears only in /v1/entities/detail/{slug}.json, one request per entity; it is absent from every bulk surface. A census of 327,138 entities is 327,138 requests against a 100/day open tier.
Why this is a sample and not a census
open_records appears in exactly one place in the API: the per-entity detail document, one HTTP request per entity. It is absent from every bulk surface — UnGovr's own OpenAPI describes the full-depth index as "a compact record ({slug, name, type, parent_slug?, population?})". verified 9 Sep 2026
So a census of 327,138 entities is 327,138 requests, against a free tier of 100 a day: about 9 years, or $327.14 metered. projected 9 Sep 2026 Nobody on the open tier can compute this number exactly, including us. What can be done honestly is a stratified random sample with a published seed and an interval — which is what is above.
What would make this wrong
- If UnGovr already publish this figure, then computation 1 is not new and the honest response is to cite theirs and check it. No such figure was found on their published pages on 9 September 2026; if one exists, this section is the one to correct.
- If the sample missed a populated stratum. 49 draws across five strata cannot rule out pockets of coverage; the 95% interval says so — the true rate could be anything up to 7.3%. It cannot be high, which is the only thing this measurement needs to establish.
- If
open_recordsis populated on entity types not sampled. Seventeen types were drawn, including states, counties, cities, school and special districts, utilities and ministries. A type not in that list is not covered by this claim.
Computation 2 — the edge we would have to infer
The first computation measures how far the join falls short. This one measures how far it would reach if we drew it ourselves — and, more importantly, where drawing it would be wrong.
Assertion class: inferred — UnGovr does not make this claim. Every edge in this table is one we would have to draw ourselves. It is the only edge in the demonstration that crosses from their data into our model, and it is drawn as inferred everywhere it appears.
The rule. longest law jurisdiction that is a path-prefix of the entity slug.
| Frame | entities | a law matches | none matches | matched, needs a human | ||
|---|---|---|---|---|---|---|
| entities-us-ca-all.json | 16,071 | 15,529 | 96.6% | 542 | 3,302 | 20.5% |
| entities-us.json | 99 | 99 | 100.0% | 0 | 43 | 43.4% |
| entities-gb.json | 869 | 869 | 100.0% | 0 | 0 | 0.0% |
| entities-fr.json | 79 | 79 | 100.0% | 0 | 0 | 0.0% |
| entities-de.json | 46 | 46 | 100.0% | 0 | 0 | 0.0% |
“Needs a human” counts the bodies whose governing records law is not reliably given by geography: interstate compacts, federal categories, tribal nations, regulated utilities and charter schools. They are counted separately rather than folded into the headline, because they are exactly the bodies a requester most often wants.
The rule, in full
An entity slug is a path: us/ca/santa-barbara/spd/goleta-west-sanitary-district. A law in the records corpus is keyed by a jurisdiction that is a path of the same shape: us, us/ca, ar/b, mx/baja-california. So for each entity, take the longest law jurisdiction that is a path-prefix of its slug.
us/ca/santa-barbara/spd/goleta-west-sanitary-district us/ca/santa-barbara us/ca <- longest match: California Public Records Act us (Freedom of Information Act — the shorter, wrong answer)
This is not a claim UnGovr make. They publish the entities and they publish the laws; they do not join them. Every edge the rule produces is inferred, and the graph draws it that way everywhere it appears. Rendered as an assertion it would be a lie about the source.
Where the rule breaks, which is the point
Slug hierarchy is geography. Records law is jurisdiction. They coincide for general-purpose local government and they come apart for exactly the bodies a requester most often wants:
| Body | Why geography gives the wrong law |
|---|---|
| Interstate compacts | Governed by their compact and by member-state law, not by where they sit |
| Federal categories and agencies | Federal FOIA applies, whatever state the building is in |
| Tribal nations | Sovereign. Neither state nor federal records law simply applies |
| Regulated utilities | Often private bodies with statutory duties, not public agencies |
| Charter schools | Chartered under their own act, with varying records obligations |
That is the 20.5%. measured 9 Sep 2026 It is why the edge carries an assertion class rather than being silently added, and it is the whole reason the vault has assertion classes at all.
Reproducing both
# the frames, hashed as they land — the raw bytes, unmodified ./fetch.sh https://data.ungovr.org/v1/entities/us/ca/all.json data/raw/entities-us-ca-all.json ./fetch.sh https://data.ungovr.org/v1/laws/records/index.json data/raw/laws-records-index.json python3 bin/coverage-sample.py --plan # print the sample, fetch nothing python3 bin/coverage-sample.py --run # 49 requests, writes data/computation-1.json python3 bin/inferred-join.py # local only, writes data/computation-2.json
Both scripts are downloadable and both are the originals. The seed is 20260909 and the frames are pinned by sha256 in the retrieval log, so the same run selects the same entities — which is acceptance test 7, and the reason to build any of this.