Шаг 2: нумерация со сбоем OCR под заголовком и повтор шапки со склеенной нумерацией (#8, AURORA-1517) #9

Merged
aep merged 1 commits from feat/8-numbering-ocr-noise into main 2026-10-22 15:44:39 +03:00
Owner

Closes #8. AURORA-1517 (ретест 20–21.10.2026, Салмин): строки нумерации столбцов оставались в данных ББ/ОФР как unreadable.

Что сделано

  • layout.is_numbering_row(..., noisy=True) — мягкая проверка для строки сразу под строкой заголовка сегмента (segment_roles): ячейка со сбоем OCR даёт своё единственное целое («• ■ 1» → 1, «3гола» → 3, «гола\n4» → 4), ячейка без цифр («/», «V») — пропуск, два целых в ячейке — не нумерация. Дальше прежние условия (≥ 3 чисел, шаг +1, начало 1 или 2, один пропуск). В остальных строках — только строгая проверка.
  • layout.caption_text — подпись шапки без хвоста-номера столбца («Коды\n2» → «коды»): поиск подписи кода и наименования, эталон и сравнение повторной шапки (segments._caption_cells, _is_repeat_header). Шапка второй страницы «Будамшинского», склеенная с нумерацией, становится шапкой сегмента.

Проверка

  • make check: ruff, mypy, 285 тестов (golden без изменений). Новые тесты — test_segments.py: четыре вида сбоя под шапкой, сбой под повторной шапкой, склеенная шапка (колонки сопоставлены по датам), защитный — строка вне шапки и строка с кодом формы остаются данными.
  • Прогон адаптером scan-gateway (main) на 9 ответах ИС Сканирование (7 из fixtures/ocr/ + 2 из AURORA-1517), до/после: из данных ушли ровно 5 строк — «Светлый путь» ББ row:19; «Будамшинское» ББ row:1, row:17, ОФР row:1, row:20. Остальные строки и статусы документов не изменились; суммы пассива «Будамшинского» легли в свои периоды.

Rulings I made

  • R-1: мягкая проверка — только строка сразу под последней строкой заголовка сегмента; нумерация, отделённая от шапки другой строкой, по-прежнему строгая. Цена ошибки — такая строка останется unreadable, как до правки.
  • R-2: хвост-номер — \s+[0-9]{1,2}$ после normalize_caption; подписи с годом на конце («на 31.12.2024») не затрагивает (нет пробела перед цифрами или больше двух цифр).

Вне задачи

  • Склеенные OCR строки с двумя кодами (1250\n1260, 1550\n1500, 2420\n2460) остаются unreadable — другой дефект.
  • «Будамшинское» ББ row:36 (1700): во 2-й и 3-й колонках мусор OCR («332076\nФСБУ 42023 Б хг») — пусто, как и до правки.

После merge

docs/scripts/sync-statements.sh в scan-gateway, tabular-parser, arm-core. Правило — RSHB/arm-ka-docs#153 (05-domain-rules.md §11.3 п. 5).

🤖 Generated with Claude Code

Closes #8. AURORA-1517 (ретест 20–21.10.2026, Салмин): строки нумерации столбцов оставались в данных ББ/ОФР как `unreadable`. ## Что сделано - `layout.is_numbering_row(..., noisy=True)` — мягкая проверка для строки **сразу под строкой заголовка** сегмента (`segment_roles`): ячейка со сбоем OCR даёт своё единственное целое («• ■ 1» → 1, «3гола» → 3, «гола\n4» → 4), ячейка без цифр («/», «V») — пропуск, два целых в ячейке — не нумерация. Дальше прежние условия (≥ 3 чисел, шаг +1, начало 1 или 2, один пропуск). В остальных строках — только строгая проверка. - `layout.caption_text` — подпись шапки без хвоста-номера столбца («Коды\n2» → «коды»): поиск подписи кода и наименования, эталон и сравнение повторной шапки (`segments._caption_cells`, `_is_repeat_header`). Шапка второй страницы «Будамшинского», склеенная с нумерацией, становится шапкой сегмента. ## Проверка - `make check`: ruff, mypy, 285 тестов (golden без изменений). Новые тесты — `test_segments.py`: четыре вида сбоя под шапкой, сбой под повторной шапкой, склеенная шапка (колонки сопоставлены по датам), защитный — строка вне шапки и строка с кодом формы остаются данными. - Прогон адаптером scan-gateway (main) на 9 ответах ИС Сканирование (7 из `fixtures/ocr/` + 2 из AURORA-1517), до/после: из данных ушли ровно 5 строк — «Светлый путь» ББ `row:19`; «Будамшинское» ББ `row:1`, `row:17`, ОФР `row:1`, `row:20`. Остальные строки и статусы документов не изменились; суммы пассива «Будамшинского» легли в свои периоды. ## Rulings I made - R-1: мягкая проверка — только строка сразу под последней строкой заголовка сегмента; нумерация, отделённая от шапки другой строкой, по-прежнему строгая. Цена ошибки — такая строка останется `unreadable`, как до правки. - R-2: хвост-номер — `\s+[0-9]{1,2}$` после `normalize_caption`; подписи с годом на конце («на 31.12.2024») не затрагивает (нет пробела перед цифрами или больше двух цифр). ## Вне задачи - Склеенные OCR строки с двумя кодами (`1250\n1260`, `1550\n1500`, `2420\n2460`) остаются `unreadable` — другой дефект. - «Будамшинское» ББ `row:36` (1700): во 2-й и 3-й колонках мусор OCR («332076\nФСБУ 42023 Б хг») — пусто, как и до правки. ## После merge `docs/scripts/sync-statements.sh` в scan-gateway, tabular-parser, arm-core. Правило — RSHB/arm-ka-docs#153 (`05-domain-rules.md` §11.3 п. 5). 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-22 15:36:43 +03:00
Строка сразу под строкой заголовка сегмента проверяется на нумерацию мягко: ячейка со сбоем OCR
даёт своё единственное целое («• ■ 1», «3гола», «гола\n4»), ячейка без цифр («/», «V») — пропуск.
Подписи шапки сравниваются без хвоста-номера столбца («Коды\n2» → «коды»), поэтому склеенная с
нумерацией повторная шапка становится шапкой сегмента.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit 25b2bb8119 into main 2026-10-22 15:44:39 +03:00
This repo is archived. You cannot comment on pull requests.
No Reviewers
No Label
1 Participants
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-statements#9
No description provided.