From 02c6bc8762c68ceaa6b63a07bc45c7019947fd13 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 7 Oct 2026 03:06:52 +0400 Subject: [PATCH] =?UTF-8?q?docs(openspec):=20=D1=80=D0=B5=D1=88=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F=20=E2=84=9628=E2=80=9329=20=E2=80=94=20?= =?UTF-8?q?=D1=81=D1=82=D0=B0=D1=82=D1=83=D1=81=20=D0=BF=D1=80=D0=B8=20?= =?UTF-8?q?=D0=BE=D1=88=D0=B8=D0=B1=D0=BE=D1=87=D0=BD=D0=BE=D0=BC=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B5=20=D0=BD=D0=B0=D0=B1=D0=BE=D1=80=D0=B0?= =?UTF-8?q?,=20=D0=BF=D1=80=D0=B5=D0=B4=D1=83=D0=BF=D1=80=D0=B5=D0=B6?= =?UTF-8?q?=D0=B4=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=BE=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=BF=D1=83=D1=89=D0=B5=D0=BD=D0=BD=D1=8B=D1=85=20=D1=81=D1=82?= =?UTF-8?q?=D1=80=D0=BE=D0=BA=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2 --- openspec/changes/slice-3a-ocr-normalizer/design.md | 2 ++ .../specs/image-recognition-gateway/spec.md | 6 +++++- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/openspec/changes/slice-3a-ocr-normalizer/design.md b/openspec/changes/slice-3a-ocr-normalizer/design.md index 363dfc7..d501732 100644 --- a/openspec/changes/slice-3a-ocr-normalizer/design.md +++ b/openspec/changes/slice-3a-ocr-normalizer/design.md @@ -167,3 +167,5 @@ docs: bounded-PR (`03-architecture.md`, OQ-137, §11.1 п. 6 и 9, новые OQ | 25 | 2026-10-07 | R-6. Таблица без колонок значений (`columns = []`) → предупреждение «нет колонок значений», `needs_check` | иначе документ без колонок мог оказаться `done` | — | | 26 | 2026-10-07 | R-8. `.part`, ставший целью успешной публикации (`os.link` → назначение), снимается самой записью независимо от `SCAN_CLEANUP`; ошибка его снятия подавляется. Флаг управляет остатками: осиротевшие `.part`, `.part` при уже существующем назначении, ответы, входящий файл, `.done` | иначе при `SCAN_CLEANUP=false` на каждое задание оставалась бы жёсткая ссылка; ошибка удаления на шаре с неподтверждёнными правами не должна превращать доставленный файл в `RECOGNITION_FAILED` | на ФС без права удаления в `Tmp` у каждого задания останется `.part`-ссылка (место не занимает) | | 27 | 2026-10-07 | R-9. При `SCAN_CLEANUP=false` сервис ничего не удаляет и не логирует «осиротевший `.part`»; сценарий «Очистка выключена» приведён к «все файлы остаются на месте» | в слое горячих папок нет логгера, а поиск сирот потребовал бы обхода `Tmp` на каждое задание; ценность — только диагностическая | сироты в `Tmp` при выключенной очистке накапливаются без заметки в логе; чистятся вручную или включением флага | +| 28 | 2026-10-07 | R-10. Ошибочный файл набора при хотя бы одном успешном понижает статус до `needs_check` (`done` невозможен) | спека «Ошибка одного из документов»: потерянный документ (например, ОФР) не должен остаться незамеченным под `done`; строка об ошибке уже в `metrics.warnings` | чаще `needs_check`; в D-6 («только документы») — уточнение | +| 29 | 2026-10-07 | R-11. На таблицу — одно предупреждение `пропущено строк с нечисловым кодом: N` для строк с непустым нечисловым кодом, отброшенных `classify_row`; строки с пустым кодом — без предупреждения | иначе строки данных с мусорным кодом (aep_3: «Выручка» `211(1 |`, `БАЛАНС`) терялись молча; поведение источника (отбрасывание) не меняется | таблица с отброшенными строками всегда `needs_check`; восстановление таких строк — OQ-149 | diff --git a/openspec/changes/slice-3a-ocr-normalizer/specs/image-recognition-gateway/spec.md b/openspec/changes/slice-3a-ocr-normalizer/specs/image-recognition-gateway/spec.md index 3401f24..28b8b01 100644 --- a/openspec/changes/slice-3a-ocr-normalizer/specs/image-recognition-gateway/spec.md +++ b/openspec/changes/slice-3a-ocr-normalizer/specs/image-recognition-gateway/spec.md @@ -183,6 +183,9 @@ `report_date_text` — сырой текст `date.form_name`, `report_date` — `parse_date` после `fix_lookalikes` (`null`, если текст не дата); `okud`, `okpo`, `okopf`, `okfs`, `address` — `null` (ИС их не отдаёт). - `checks` MUST NOT присутствовать. +Строка с непустым нечисловым кодом (`1150 :`, `211(1 |`) пропускается, на таблицу выдаётся одно предупреждение +`пропущено строк с нечисловым кодом: ` (решение №29); строки с пустым кодом (заголовки групп, «в том числе») — без +предупреждения. Двойники букв и цифр (`fix_lookalikes`) SHALL применяться к тексту дат (дата отчёта и подписи колонок) только вплотную к цифрам; `|` SHALL считаться разделителем клеток, если первая строка значения состоит из цифр, пробелов и знаков пунктуации. Коды очищаются `clean_value`, суммы — `parse_amount`, ИНН — выделением цифр (как в проверенном на стенде @@ -245,7 +248,8 @@ `status = done` только когда у всех документов `inn_confidence`, `organization_name_confidence` равны 100, `report_date` и все `period_date` заполнены, все `line_code_confidence` и `line_name_confidence` равны 100, все значения `is_recognized`, тип совпал с `label`, редакция определена по дате и заполнена, и нет предупреждений уровня таблицы; -иначе `status = needs_check`. Предупреждения уровня таблицы SHALL иметь вид `<имя json>: table:: <текст>`, уровня +иначе `status = needs_check`. Если среди файлов набора есть ошибочный (при хотя бы одном успешном), статус не может быть +`done` — `needs_check` (потерян документ набора; решение №28). Предупреждения уровня таблицы SHALL иметь вид `<имя json>: table:: <текст>`, уровня файла — `<имя json>: <текст>`; `metrics.rows` — сумма строк всех документов. #### Scenario: Ни одной таблицы