docs(openspec): решения №28–29 — статус при ошибочном файле набора, предупреждение о пропущенных строках

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
This commit is contained in:
Andrey Epifancev 2026-10-07 03:06:52 +04:00
parent 140ec5b713
commit 02c6bc8762
2 changed files with 7 additions and 1 deletions

View File

@ -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 |

View File

@ -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 |`) пропускается, на таблицу выдаётся одно предупреждение
`пропущено строк с нечисловым кодом: <N>` (решение №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:<i>: <текст>`, уровня
иначе `status = needs_check`. Если среди файлов набора есть ошибочный (при хотя бы одном успешном), статус не может быть
`done` — `needs_check` (потерян документ набора; решение №28). Предупреждения уровня таблицы SHALL иметь вид `<имя json>: table:<i>: <текст>`, уровня
файла — `<имя json>: <текст>`; `metrics.rows` — сумма строк всех документов.
#### Scenario: Ни одной таблицы