docs(#116): Р-4 решено — повторы кодов законны, все строки хранятся, дальше суммой по коду

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Andrey Epifancev 2026-10-17 18:27:25 +04:00
parent 3e51a95862
commit 0f57ceb5f1

View File

@ -415,8 +415,9 @@ sheet:<A>,<B>`. `DISCLOSURE` и форма без колонки кодов —
**Единый выход:** `RawLine[]` — по строке на каждую строку сетки с ролью `data`, у которой есть код или хотя бы одно
число: `ref`, ячейка кода, `code_status` (`ok` | `unreadable` — код есть, но не разобран | `missing` — кода нет, суммы
есть | `duplicate` — код уже встречался), ячейка наименования, ячейки значений по колонкам раскладки. Строка без кода
и без чисел (заголовок раздела «АКТИВ», «в том числе:») — не строка. Счётчиков отброшенных нет — есть статусы.
есть), ячейка наименования, ячейки значений по колонкам раскладки. Строка без кода и без чисел (заголовок раздела
«АКТИВ», «в том числе:») — не строка. Счётчиков отброшенных нет — есть статусы. Повтор кода — не статус: по правилам
отчётности один код может стоять у нескольких строк с разными наименованиями, все они `ok`.
- **1. Код-мусор** — статус `unreadable`, строка сохраняется с сырым текстом кода (AURORA-1462: «ИЧ,250» видна, аналитик назначает 1250)
- scan-gateway: счётчик → статус
@ -424,10 +425,10 @@ sheet:<A>,<B>`. `DISCLOSURE` и форма без колонки кодов —
- **2. Склейка двух строк в одну** — одно правило: ячейка кода содержит N кодов через перевод строки и ячейки значений — N частей → N строк (OQ-156); у Excel не срабатывает
- scan-gateway: как сейчас, через общее правило
- tabular-parser: правило общее, no-op
- **3. Повтор кода** — статус `duplicate` у второй и последующих строк; строки сохраняются; текстовое предупреждение и `checks.duplicate_line_codes` уходят; что показывать и как считать — ядро (Р-4)
- scan-gateway: «оставлена первая» → обе строки
- tabular-parser: `duplicates` → статус
- **4. Отброшенная строка** — строки не отбрасываются: `unreadable` / `missing` / `duplicate` идут дальше со статусом (AURORA-1634, 1462, 1406); ядро не достраивает вместо них пустую шаблонную строку молча
- **3. Повтор кода** — **решение владельца (17.10.2026):** повтор кода — законный случай (один код, разные наименования), не ошибка и не предупреждение. Все строки сохраняются как есть со статусом `ok`; текстовое предупреждение и `checks.duplicate_line_codes` уходят. Для проверок §7, подтверждения и всего, что идёт после, значения одного кода идут суммой (см. «Что уходит из ядра»; договорённость ДБД в AURORA-1431). Неверно прочитанный код, случайно совпавший с существующим, ловит §7 через сумму
- scan-gateway: «оставлена первая» → все строки
- tabular-parser: `duplicates` уходит
- **4. Отброшенная строка** — строки не отбрасываются: `unreadable` / `missing` идут дальше со статусом (AURORA-1634, 1462, 1406); ядро не достраивает вместо них пустую шаблонную строку молча
- scan-gateway: счётчики → статусы
- tabular-parser: счётчики → статусы
@ -460,7 +461,8 @@ sheet:<A>,<B>`. `DISCLOSURE` и форма без колонки кодов —
**Единый выход:** `StatementLine {line_status, line_code, line_code_text, line_code_confidence, line_name,
line_name_confidence, values}`: `line_code` — разобранный код (4–5 цифр) или `null` при `unreadable` / `missing`;
`line_code_text` — сырой текст ячейки кода; `line_status` = `code_status` шага 3.
`line_code_text` — сырой текст ячейки кода; `line_status` = `code_status` шага 3 (`ok` | `unreadable` | `missing`).
Несколько строк с одним кодом — обычные строки `ok`, порядок как в файле.
- **1. Источник наименования** — одно правило: наименование — из файла, с уверенностью источника; справочник наименование не подменяет. Справочное имя по коду и редакции добавляет ядро из своего (единственного) словаря, экран показывает справочное, файловое — рядом (Р-3; AURORA-1406, 1522)
- scan-gateway: имя из `statement_lines.yaml` → имя из OCR
@ -499,7 +501,8 @@ line_name_confidence, values}`: `line_code` — разобранный код (4
**Единый выход:** `StatementChecks` у обоих: `relations_failed[]`, `soft_relations_failed[]` (каждое нарушение — с
кодами слагаемых и `column_index`, чтобы экран подсветил ячейки), `line_warnings[]` (код не из редакции формы по дате
отчёта, код не в словаре). `duplicate_line_codes` уходит в `line_status`.
отчёта, код не в словаре). `duplicate_line_codes` уходит: соотношения считаются по сумме значений одного кода в
колонке (повтор кода — законный случай, шаг 3 п. 3); нарушение подсвечивает все строки этого кода.
- **1. Проверки только у парсера; словарь §7 в двух копиях; ядро результат не читает** — проверки — общий код с одним словарём `statement_checks.yaml` у обоих сервисов; для OCR нарушение §7 — главный признак неверно прочитанной цифры; ядро читает `checks` из результата и пересчитывает тем же кодом только после правок аналитика (PATCH)
- scan-gateway: добавляет шаг
@ -553,13 +556,17 @@ column_index?}`, а не строка.
### Что уходит из ядра
- `build_statement`: повторная дедупликация колонок, кодов и значений (контракт гарантирует уникальность колонок;
повторы строк приходят со статусом `duplicate`).
повторы кодов — законные строки, хранятся все как пришли).
- Повторы кодов (решение владельца 17.10.2026): в `financial_statement_line` хранятся все строки; уникальный индекс
`(meta_id, line_code)` из DBML v5.18 снимается (DBML v5.19, миграция). Для проверок §7, подтверждения и всего, что
идёт после (КФО, выгрузки, сверки), документ читается через агрегат по коду — сумма значений, справочное имя —
чистой функцией, без хранения (DECISION-5). Экран показывает строки как в файле.
- `statement_status` (D-6): `RECOGNIZED` ⇔ `document.status = done` ∧ ИНН ≠ `MISMATCH` (единственное знание ядра);
остальные признаки D-6 не пересчитываются.
- §7 при загрузке: `checks` берутся из результата; пересчёт общим кодом — только после PATCH.
- Словарь строк и словарь §7: единственный экземпляр в общем коде (Р-1); копии ядра и шлюза удаляются.
- Достройка шаблонных строк: по тому же словарю; строки `missing` / `unreadable` / `duplicate` показываются как
пришли, с подсветкой.
- Достройка шаблонных строк: по тому же словарю; строки `missing` / `unreadable` показываются как пришли, с
подсветкой; код, у которого есть хотя бы одна строка из файла, шаблоном не достраивается.
- Экран: подсветка ячеек только по `needs_review` (уверенность, `is_recognized` и нарушения §7 уже сведены сервисом);
строк — по `line_status`; предупреждения документа — с привязкой к месту.
@ -572,8 +579,9 @@ column_index?}`, а не строка.
подсветка «не распознано», как сейчас (больше ложных подсветок, AURORA-1524).
- **Р-3** (шаг 5, п. 1) — наименование: из файла в сервисах, справочное — в ядре (= решение № 2 по спринту 2,
AURORA-1406 / 1522; договорённость ДБД «из справочника» выполняется на экране).
- **Р-4** (шаг 3, п. 3) — повторы кодов: сервисы отдают обе строки со статусом; показ обеих и сумма по договорённости
ДБД (AURORA-1431) — в ядре и на экране.
- **Р-4** (шаг 3, п. 3) — **решено владельцем 17.10.2026:** повторы кодов законны; все строки сохраняются и
показываются, для проверок и всех операций после подтверждения или автоподтверждения — суммой по коду. Следствие:
снять уникальность `(meta_id, line_code)` в DBML.
- **Р-5** (шаг 8, п. 1) — порог уверенности для `done` (= решение № 7 по спринту 2, AURORA-1519 / 1524); предложение —
100, как сейчас.
- **Р-6** (шаг 2, п. 6) — неизвестная числовая колонка без периода: оставлять без даты с предупреждением (`needs_check`)