# research-records-2026-09-01.csv.gz — column reference

One row = one measurement of one page of one website at one moment.
95 524 rows, 11 902 websites (11 923 host names — see the note on `www`),
51 US states and territories. Snapshot date: 2026-09-01.

This table is a flat, spreadsheet-friendly view of the same measurements
published as `traversal-log-2026-09-01.jsonl.gz`. Both files describe the
same 95 524 records; the JSONL keeps every internal field, the CSV keeps
the fields that can be checked from outside.

| column | meaning |
|---|---|
| `url` | the exact page address that was opened. NOT the site — page 1 is the home page, pages 2–8 are subpages, so one site appears in up to 8 rows with different URLs. |
| `state` | US state or territory (two letters). |
| `city` | municipality name as recorded in the source registry. |
| `page_no` | 1–8, which of the eight standard pages this row is. |
| `page_type` | `home`, `payment`, `contact`, `meetings`, `documents`, `jobs`, `311_request`, `calendar`. |
| `verdict` | outcome of the keyboard traversal — see the table of verdicts below. |
| `checker_said` | what an automated rule-checker reported for this page: `checker_clean` (no violation) or `checker_flagged`. This is the column that makes the disagreement rate computable. |
| `steps_to_goal` | how many Tab presses were spent. `0` means the page did not open. |
| `seconds` | wall-clock duration of this measurement. |
| `focus_visible` | `true` / `false` / empty. Whether the visible focus ring survived on the element the traversal reached. EMPTY where the page never opened or the goal was never reached — in those cases nothing is known about the focus ring, and the field is deliberately left blank rather than guessed. Derived from the engine's own wording in `reason` (`outline: none` branch), which is why `reason_source_ru` is shipped alongside: the derivation is checkable. |
| `field_labels` | `True` if at least 70 % of visible inputs on the page had a label, an enclosing `<label>`, or an `aria-label`. Pages with no inputs count as `True`. |
| `contrast_ok` | `False` if the traversal met text below 12 px on the way. This is a coarse proxy, not a WCAG contrast computation — do not quote it as a contrast-ratio finding. |
| `vendor` | website platform vendor where it could be identified from response fingerprints. |
| `measured_at` | ISO timestamp of the measurement. Empty for 10 759 rows (11,3 %) whose original timestamp was lost before this snapshot was assembled; the date of the snapshot still applies. |
| `reason` | one sentence in English saying what happened, generated by the engine at measurement time and translated by pattern. |
| `reason_source_ru` | the original Russian sentence, verbatim. Kept so that the English column can be verified rather than trusted. |

## Verdicts

| value | meaning | rows |
|---|---|---|
| `unmeasurable_or_unreachable` | the page did not open and the cause was not one of the specific ones below | 38 328 |
| `formally_accessible_but_barrier_in_practice` | the page opened, but the goal was NOT reached within 40 Tab presses | 21 305 |
| `partial_focus_or_labelling_barrier` | the goal WAS reached, but the focus ring was removed or fields lacked labels | 13 972 |
| `reachable_by_a_person` | the goal was reached with a visible focus ring and labelled fields | 11 994 |
| `no_dns_record` | the host name does not resolve | 3 950 |
| `blocked` | HTTP 401/403 — the server refused the visit | 3 609 |
| `server_silent` | timeout or connection refused | 1 290 |
| `broken_tls` | certificate or TLS failure | 874 |
| `server_error` | HTTP 5xx | 202 |

## Two numbers people ask about

**11 902 vs 11 923.** `11 923` is the number of distinct host names in the
`url` column. `11 902` is the number of distinct sites after folding
`www.example.gov` into `example.gov`. Both are correct; they count
different things, and the published summary uses 11 902.

**The 53,8 % figure.** Among pages where the automated checker reported no
violation AND the traversal was measurable — 25 966 rows — a person hit a
barrier on 13 972 of them (53,8 %). It is a DISAGREEMENT RATE between two
methods, not a claim that 53,8 % of municipal websites are inaccessible.
Of those 13 972, in 11 436 (81,8 %) the barrier was the removed focus ring.

## What this data does not support

A verdict describes one page at one moment. Timeouts and silent servers
reproduce in only 55–61 % of repeat runs; overall reproducibility measured
on a repeat pass is 96 % by verdict and 89,9 % by issue count. Rows with
`unmeasurable_or_unreachable`, `blocked` or `server_silent` say what
happened during our visit, not what the site is.

**`server_silent` is a navigation timeout, not proof of a dead server.**
The verdict is written when `page.goto` does not reach its load event within
the timeout. A screenshot is taken anyway, and in most cases it shows an
empty browser error page — but not always. We checked all 1 290
`server_silent` rows against their screenshots by file size: 1 109 (86,0 %)
are under 30 KB and consistent with an error page, 148 are between 30 and
300 KB, and 33 (2,6 % of the verdict, 0,035 % of the dataset) are over
300 KB. Opening those large ones shows fully rendered municipal pages —
menus, headings, service tiles. For those rows the site was reachable and
our client gave up first. They are being re-measured; until then treat
`server_silent` as "our visit timed out", never as "the server is down".

Licence: CC BY 4.0 · Method: https://aifa.works/research/methodology
Contact: contact@codeofdigitaleternity.com
