# traversal-log-v5-2026-10-02.jsonl.gz — schema

Keyboard traversal of U.S. municipal government sites, **version 2 of the dataset**
(instrument v5). Published 2 October 2026 by Maksim Galatin & AIfa. Licence: CC BY-NC 4.0.

| | |
|---|---|
| file | `traversal-log-v5-2026-10-02.jsonl.gz` |
| size | 11,964,344 bytes (gzip) |
| lines | 95,216 — one per pair *domain + page type* |
| domains | 11,902 × 8 page types |
| SHA-256 | `3b78f28dd6e8d7f37aef2964cdabc8464bd003324c135084d38d200faa81fff4` |
| measured | 1–2 October 2026 (UTC) |
| engines | v5.3.1 — 65,462 lines, v5.4 — 29,754 lines |

Version 1 (`traversal-log-2026-09-01.jsonl.gz`, 95,524 records, engine v4) stays
published unchanged. The two versions are **not** comparable figure for figure: the
instrument and the category definitions changed. See "Why the share changed" below.

## The headline figure and how to recompute it

    barrier share = lines with category A == "БАРЬЕР"
                    / lines with category A in ("ДОСТУПНО", "БАРЬЕР")
                  = 8,448 / 25,252 = 33.5 %

    option B (an almost invisible focus ring counts as a barrier):
                  = 8,567 / 25,252 = 33.9 %   (119 pages differ)

Any JSON reader is enough. Python:

    import gzip, json, collections
    c = collections.Counter(json.loads(l)["категория_А"].split(":")[0]
                            for l in gzip.open("traversal-log-v5-2026-10-02.jsonl.gz", "rt", encoding="utf-8"))
    print(c["БАРЬЕР"] / (c["БАРЬЕР"] + c["ДОСТУПНО"]))

The unit is a **page** (domain + page type), not a site.

## Categories (fields `категория_А`, `категория_Б`, `категория_В`)

| category | meaning | lines (A) |
|---|---|---:|
| `ДОСТУПНО` | a keyboard user reaches the goal and the focus is visible | 16,804 |
| `БАРЬЕР` | the goal is not reached, or reached with invisible / hidden / off-screen focus, fields without labels, focus trap | 8,448 |
| `НЕТ_ФУНКЦИИ_ИЛИ_ЦЕЛИ` | the function or goal is not on the site (incl. 6,174 pages handing off to a third-party provider and 552 with the goal in a collapsed menu) | 36,061 |
| `НЕИЗМЕРИМО` | cannot be measured: access denied to the crawler (12,905), server silent, server error, timeout, closed, broken TLS, unstable frame | 18,140 |
| `ВНЕ:<reason>` | outside the denominator: domain does not exist (12,402), parked domain (3,160), home page is an error or login page (201) | 15,763 |

Option A counts an almost invisible focus ring as visible; option B counts it as a
barrier; option C equals A in this release (every focus verdict of engine v5.3 was
re-measured with v5.4, none is left unverified).

## Mapping of the traversal verdict (`вердикт`) to the category

| verdict | category |
|---|---|
| `ДОШЁЛ_ФОКУС_ВИДЕН` | ДОСТУПНО |
| `ДОШЁЛ_ФОКУС_СЛАБЫЙ` | A: ДОСТУПНО, B: БАРЬЕР |
| `ДОШЁЛ_ФОКУС_НЕ_ВИДЕН`, `ДОШЁЛ_ФОКУС_ЗАКРЫТ`, `ДОШЁЛ_ФОКУС_ВНЕ_ЭКРАНА`, `ДОШЁЛ_ПОЛЯ_БЕЗ_МЕТОК`, `НЕ_ДОШЁЛ_ЗА_60`, `ЛОВУШКА_ФОКУСА`, `ФОКУС_ВО_ФРЕЙМЕ` | БАРЬЕР |
| `ФУНКЦИЯ_НЕ_НАЙДЕНА`, `ЦЕЛИ_НЕТ_НА_СТРАНИЦЕ`, `МЯГКИЙ_404`, `ОТКАТ_НА_ГЛАВНУЮ`, `ФУНКЦИЯ_У_ПОСТАВЩИКА`, `ЦЕЛЬ_В_СКРЫТОМ_МЕНЮ` | НЕТ_ФУНКЦИИ_ИЛИ_ЦЕЛИ |
| `ДОСТУП_ЗАПРЕЩЁН`, `СЕРВЕР_МОЛЧИТ`, `ОШИБКА_СЕРВЕРА`, `ТАЙМАУТ`, `ЗАКРЫТ`, `БИТОЕ_ШИФРОВАНИЕ`, `КАДР_НЕСТАБИЛЕН` | НЕИЗМЕРИМО |
| `ДОМЕНА_НЕТ`, `ДОМЕН_ЗАГЛУШКА`, `ГЛАВНАЯ_НЕДОСТУПНА`; parked domains by list; `ОТКАТ_НА_ГЛАВНУЮ` when the home page itself is an error/login page | ВНЕ (outside the denominator) |

For lines measured by engine v5.3.1 whose focus verdict was re-measured, the field
`фокус_перемер_v54` holds the re-measured outcome (`ВИДЕН`, `ВИДЕН_СЛАБО`, `НЕ_ВИДЕН`,
`ФОКУС_ЗАКРЫТ`, `ВНЕ_ЭКРАНА`) and the category follows it, not `вердикт`.
13,230 lines carry this field.

## Other fields

| field | meaning |
|---|---|
| `домен`, `тип_страницы` | domain and one of `home`, `payment`, `contact`, `meetings`, `documents`, `jobs`, `311_request`, `calendar` |
| `организация`, `город`, `штат` | organisation, place and state from the registry |
| `слой_замера` | which measurement the line comes from: `R3_v53` base traversal, `повтор_v54` re-run of 1,768 domains, `домер_v54` focus re-measure of 1,425 domains, `дозамер_v54` re-measure of failed pages |
| `версия_движка`, `когда` | engine version and UTC timestamp |
| `адрес_главной`, `адрес_запрошенный`, `адрес_конечный`, `код` | home URL, requested URL, final URL, HTTP status |
| `путь_фокуса`, `шагов_до_цели`, `целей_на_странице` | texts of elements passed by Tab, number of Tab presses to the goal, number of goal candidates |
| `фокус_виден`, `способ_видимости`, `доля_изменившихся_пикселей`, `outline_boxshadow_до/после` | focus visibility check |
| `метки_доля`, `placeholder_без_метки` | form labelling |
| `axe_контраст` | axe-core run with the single rule `color-contrast`: number of violating and passing rule results (0 or 1 each) |
| `контроль_404*` | soft-404 control request |
| `снимок_*` | screenshot file names (screenshots are not published) |
| `повтор_v53`, `домер_фокуса`, `дозамер_сбоев` | markers written by the v5.4 re-measure runs (present only on their lines) |
| `страна`, `фокус_в_pdf` | written by engine v5.4 only (29,754 lines) |
| `sha256` | SHA-256 of the screenshot file (viewport, taken with the goal focused); `null` when no screenshot was taken |

## What was changed before publication

* E-mail addresses and phone numbers in text fields (mostly in `путь_фокуса` — contact
  details of officials on their own pages: 3,141 addresses, 185 of the form
  name.surname@, 5,210 phone numbers) are replaced with `[e-mail]` and `[phone]`.
* Paths to screenshots on our disk are reduced to file names.
* Nothing else was altered. The categories recomputed from this public file equal the
  figures above (checked with two independent programs, Python and Node).

## Why the share changed from 74.6 % (version 1) to 33.5 % (version 2)

The sites did not become twice as accessible in a month — the instrument changed:

1. pages where the function does not exist on the site are now a separate category,
   not a barrier;
2. the "skip to main content" link is no longer credited as reaching the goal (a flaw
   of version 1 we found on 15 September 2026);
3. focus visibility is checked pixel by pixel and was re-measured where the first
   build of the instrument was wrong;
4. hand-offs to third-party services are counted separately.

Page by page, on the 95,176 pairs shared by both versions: of 35,168 pages version 1
called a barrier, version 2 finds no such function on 18,325, reachable on 7,305,
barrier on 4,540, outside the denominator on 2,731 and unmeasurable on 2,267.
Agreement between the two instruments at the level of a single page is low; the
figure depends heavily on what counts as the goal of a page.
