From 0847e6786c91361ff383b2a24cc559b3de1a142d Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Fri, 9 Oct 2026 20:07:25 +0400 Subject: [PATCH] =?UTF-8?q?fix(normalizer):=20=D0=BF=D1=80=D0=B8=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=BD=D1=84=D0=BB=D0=B8=D0=BA=D1=82=D0=B5=20label=20?= =?UTF-8?q?=D1=81=20=D0=B5=D0=B4=D0=B8=D0=BD=D0=BE=D0=B4=D1=83=D1=88=D0=BD?= =?UTF-8?q?=D1=8B=D0=BC=D0=B8=20=D0=BA=D0=BE=D0=B4=D0=B0=D0=BC=D0=B8=20?= =?UTF-8?q?=D1=81=D1=82=D1=80=D0=BE=D0=BA=20=D1=82=D0=B8=D0=BF=20=D0=B4?= =?UTF-8?q?=D0=BE=D0=BA=D1=83=D0=BC=D0=B5=D0=BD=D1=82=D0=B0=20=E2=80=94=20?= =?UTF-8?q?=D0=BF=D0=BE=20=D0=BA=D0=BE=D0=B4=D0=B0=D0=BC=20(#30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ИС Сканирование вернула ОФР с 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 --- CLAUDE.md | 4 +-- README.md | 3 ++- api/src/normalizer/ocr/document.py | 24 ++++++++++++++---- api/src/normalizer/ocr/rows.py | 21 ++++++++++++++-- api/tests/unit/normalizer/test_document.py | 25 +++++++++++++++++-- api/tests/unit/normalizer/test_rows.py | 21 +++++++++++++++- .../specs/image-recognition-gateway/spec.md | 17 +++++++++++-- 7 files changed, 100 insertions(+), 15 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 36608b2..a47c1e3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -42,8 +42,8 @@ Ошибочные файлы — в `metrics.warnings` (`<имя>: <код>: <сообщение>`); все файлы ошибочны → код первого; есть успешный — документы из успешных файлов, статус не выше `needs_check` (№28). `NOT_IMPLEMENTED` сервис больше не публикует (`NullNormalizer` остался только для тестов воркера). -- В одном json может быть несколько таблиц разных форм (баланс, ОФР); тип документа задаёт `label` таблицы (запасной - путь — коды строк). `checks` в документах не передаются — их считает ядро (Срез 3b). +- В одном json может быть несколько таблиц разных форм (баланс, ОФР); тип документа задаёт `label` таблицы; если все коды + строк одной группы (`1xxx`/`2xxx`) и противоречат `label` — тип по кодам с предупреждением (#30); `label` не сопоставлен — коды по большинству. `checks` в документах не передаются — их считает ядро (Срез 3b). - Dev-режим: эмулятор ИС Сканирование (`make emulator`, то же, что `python -m src.scan_emulator` из `api/`; в контейнере — тот же образ с `command: python -m src.scan_emulator`): по входящему `.` считает sha256 содержимого, находит пару в `SCAN_FIXTURES_DIR` (PDF + `<имя>.json` + `<имя>_*.json`) и кладёт в `Output//` набор как `.json` / diff --git a/README.md b/README.md index 340d7b2..c9ebe66 100644 --- a/README.md +++ b/README.md @@ -260,7 +260,8 @@ pydantic-валидацией; битый файл (код не из 4–5 ци | таблица | `колонка без даты: <подпись колонки>` | | таблица | `нет колонок значений` | | таблица | `повторная шапка изменила число колонок значений` (одно на таблицу; значения лишних колонок отброшены, недостающие — «ячейки нет») | -| таблица | `тип по кодам (<тип>) не совпал с label (