Нормализатор OCR: при конфликте label и единодушных кодов строк тип документа — по кодам (#30) #31

Merged
aep merged 1 commits from feat/30-type-by-codes into main 2026-10-09 19:08:44 +03:00
Owner

Закрывает #30.

Что было

ИС Сканирование вернула ОФР ООО «Нижегородские нивы» (job f37d677c-…) с label.form_name = "Бухгалтерский баланс" при 23 строках с кодами 2110…2910. По правилу спеки «label и коды разошлись → тип по label» документ ушёл как BALANCE с предупреждением и needs_check; аналитику пришлось бы менять тип вручную.

Что стало

  • Коды строк данных единодушны (все 1xxx или все 2xxx) и противоречат сопоставленному label → тип по кодам, предупреждение тип по label (<label>) не совпал с кодами: взят <тип>, статус needs_check (критерий D-6 «тип совпал с label» не менялся).
  • Коды смешанные (шум OCR) → как раньше: тип по label, предупреждение тип по кодам (<тип>) не совпал с label (<label>).
  • label не сопоставлен → коды по большинству (без изменений).
  • header.form_name остаётся текстом label как распознан (первичка не мутируется).

Код: rows.table_type_by_unanimous_codes, document._resolve_type. Спека openspec/specs/image-recognition-gateway/spec.md (правило document_type, два новых сценария), README (таблица предупреждений), CLAUDE.md сервиса.

Проверка

make check-full: ruff/mypy чисто, 1020 unit + 11 integration passed, docker-build ок. Golden-эталоны fixtures не затронуты (в aep_* label и коды согласны).

Rulings I made

  • R-1. Порог «кодам верим» — единодушие (ни одного кода другой группы), а не большинство: один ошибочно распознанный код в балансе не должен переворачивать тип. Цена ошибки: таблица с одним «шумовым» кодом другой группы при неверном label останется с типом по label (и needs_check).
  • R-2. Bounded-задача: спека openspec/specs/ правится прямо в PR, без OpenSpec change.
  • R-3. header.form_name не подменяется на тип по кодам — это распознанный текст ИС.

🤖 Generated with Claude Code

Закрывает #30. ## Что было ИС Сканирование вернула ОФР ООО «Нижегородские нивы» (job `f37d677c-…`) с `label.form_name = "Бухгалтерский баланс"` при 23 строках с кодами 2110…2910. По правилу спеки «label и коды разошлись → тип по label» документ ушёл как `BALANCE` с предупреждением и `needs_check`; аналитику пришлось бы менять тип вручную. ## Что стало - Коды строк данных единодушны (все `1xxx` или все `2xxx`) и противоречат сопоставленному `label` → тип по кодам, предупреждение `тип по label (<label>) не совпал с кодами: взят <тип>`, статус `needs_check` (критерий D-6 «тип совпал с label» не менялся). - Коды смешанные (шум OCR) → как раньше: тип по `label`, предупреждение `тип по кодам (<тип>) не совпал с label (<label>)`. - `label` не сопоставлен → коды по большинству (без изменений). - `header.form_name` остаётся текстом `label` как распознан (первичка не мутируется). Код: `rows.table_type_by_unanimous_codes`, `document._resolve_type`. Спека `openspec/specs/image-recognition-gateway/spec.md` (правило `document_type`, два новых сценария), README (таблица предупреждений), CLAUDE.md сервиса. ## Проверка `make check-full`: ruff/mypy чисто, 1020 unit + 11 integration passed, docker-build ок. Golden-эталоны fixtures не затронуты (в `aep_*` label и коды согласны). ## Rulings I made - R-1. Порог «кодам верим» — единодушие (ни одного кода другой группы), а не большинство: один ошибочно распознанный код в балансе не должен переворачивать тип. Цена ошибки: таблица с одним «шумовым» кодом другой группы при неверном label останется с типом по label (и `needs_check`). - R-2. Bounded-задача: спека `openspec/specs/` правится прямо в PR, без OpenSpec change. - R-3. `header.form_name` не подменяется на тип по кодам — это распознанный текст ИС. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 1 commit 2026-10-09 19:07:47 +03:00
ИС Сканирование вернула ОФР с label «Бухгалтерский баланс» при кодах 2110…2910;
по прежнему правилу побеждал label, и документ уходил в ядро как BALANCE.
Теперь: все коды данных одной группы и противоречат label — тип по кодам,
предупреждение «тип по label (…) не совпал с кодами: взят …», needs_check;
смешанные коды — по-прежнему label. header.form_name не меняется.
Спека image-recognition-gateway, README и CLAUDE.md обновлены.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
aep merged commit d49fa63e55 into main 2026-10-09 19:08:44 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-scan-gateway#31
No description provided.