From 222d7e08fc15537fa14dac86ed0cbe21f1272f04 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 21:17:54 +0400 Subject: [PATCH 1/2] =?UTF-8?q?docs(#122):=20=D1=87=D0=B8=D1=81=D0=BB?= =?UTF-8?q?=D0=B0=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B5=D0=B5=20=D1=82=D0=B0?= =?UTF-8?q?=D0=B1=D0=BB=D0=B8=D1=86=D1=8B=20=D1=84=D0=BE=D1=80=D0=BC=D1=8B?= =?UTF-8?q?=20=E2=80=94=20=D0=BD=D0=B5=20=D0=BA=D0=BE=D0=BB=D0=BE=D0=BD?= =?UTF-8?q?=D0=BA=D0=B8=20=D1=81=D1=83=D0=BC=D0=BC=20(=D1=88=D0=B0=D0=B3?= =?UTF-8?q?=202,=20NUMBERS=5FOUTSIDE=5FTABLE)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Решение владельца 18.10.2026 (Р-31 плана 4, #116). Co-Authored-By: Claude Opus 5.5 --- context/05-domain-rules.md | 11 +++++++++ .../specs/statement-normalization/spec.md | 24 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index b6f7f0f..a411fa0 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -1301,6 +1301,16 @@ file:<имя json>;table:`; документа у такой таблицы (`error`, колонка); аналитик ставит дату через PATCH (§9.5 п. 9); иначе пропуск. Колонка без даты не мешает периоду формы (эффективная дата), но межформенная проверка и гудвилл «на отчётную дату» по ней не считаются, пока дата не проставлена. Уверенность подписи — `label_confidence` (Excel — 100, подписи нет — `null`). + **Числа правее таблицы формы** (решение владельца 18.10.2026, Р-31 плана 4; пример — Межениновская 2025-Q3, ББ, формулы + аналитика `=M45*5/100` в столбцах U–W над пустой шапкой): если среди колонок значений сегмента есть хотя бы одна с + подписью периода (дата или относительная подпись бланка), то столбец **без текста подписи**, лежащий правее последней + такой колонки, колонкой сумм не считается: его числа в значения строк не попадают, `COLUMN_WITHOUT_DATE` нет, + выдаётся одно предупреждение `NUMBERS_OUTSIDE_TABLE` (`info`, документ) с адресами ячеек («числа правее таблицы формы + не учитываются: V45, W57, …»: в тексте первые 10 адресов, дальше «и ещё N»; Excel — `<лист>!`, OCR — `row:`). + Адреса собираются по всем сегментам формы в одно предупреждение. На статус документа предупреждение не влияет. Не + меняется: подписанных колонок нет вовсе; столбец без подписи **между** подписанными — `COLUMN_WITHOUT_DATE`; столбец + правее с **нечитаемой** подписью (OCR-мусор «| | г») — `COLUMN_WITHOUT_DATE`, как раньше. Правило общее для Excel и + OCR и живёт в пакете `arm_statements` (шаг 2), не в адаптере хоста. 7. **Столбец наименования** — подпись, начинающаяся с «наименование», в строке заголовка; иначе столбец левее кода с наибольшим числом текстов, кроме «Пояснения» (пустые или ≤ 3 символов); наименование строки — ячейка этого столбца, пуста — ближайшая текстовая ячейка левее кода, кроме «Пояснения». @@ -1565,6 +1575,7 @@ III (aep_3). Алгоритм: четырёхзначные коды строк | `VALUE_OUT_OF_RANGE` | info | число Excel длиннее 16 целых цифр | — | | `SHEET_OTHER` | info, файл | лист Excel «прочее» без типа и кодов (`locator = sheet:<имя>`; документа нет) | — | | `ROW_SPLIT` | info | разлеплена склеенная строка | — | +| `NUMBERS_OUTSIDE_TABLE` | info | числа правее последней подписанной колонки значений не учтены (шаг 2, п. 6); адреса ячеек — в тексте | — | | `OSV_*` | info | предупреждения листа ОСВ (§1) | — | | `CODE_NOT_IN_DICTIONARY`, `CODE_NOT_IN_EDITION`, `NAME_MISMATCH`, `STATEMENTS_VERSION_MISMATCH` | info, ядро | проверки ядра (§9.3, §9.5) | пересчёт | | `RESULT_STATUS_INCONSISTENT` | info, ядро | `document.status = done` из результата противоречит строкам, `needs_review`, нарушениям или предупреждениям документа — ядро считает его `needs_check` (§9.3) | пересчёт после правки | diff --git a/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md b/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md index 469fff1..fbe4f8f 100644 --- a/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md +++ b/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md @@ -313,6 +313,14 @@ tabular-parser и шаблоны `dates.py` scan-gateway; строки `test_dat года, 31 декабря предыдущего и предшествующего ему года; иначе предупреждение `COLUMN_DATE_UNCERTAIN` (`error`, `column_index`). Уверенность подписи — `label_confidence` (у Excel 100; подписи нет — `null`). +Если среди колонок значений сегмента есть хотя бы одна с подписью периода (абсолютной или относительной), столбец без +текста подписи правее **последней** такой колонки SHALL НЕ считаться колонкой сумм: его числа не попадают в значения +строк, `COLUMN_WITHOUT_DATE` не выдаётся, вместо этого выдаётся одно предупреждение `NUMBERS_OUTSIDE_TABLE` (`info`) с +адресами ячеек, собранными по всем сегментам формы (в тексте — первые 10, дальше «и ещё N»). Предупреждение SHALL НЕ +влиять на статус документа. Решение владельца 18.10.2026 (Р-31). Правило общее для Excel и OCR и живёт в пакете. +Без подписанных колонок, а также для столбца без подписи между подписанными и для столбца с нечитаемой подписью +поведение прежнее (`COLUMN_WITHOUT_DATE`). + Подтверждение SHALL опираться только на уверенные источники, чтобы неуверенное не подтверждало само себя: для неуверенной подписи эффективная дата — дата отчёта с уверенностью 100, иначе самая поздняя абсолютная дата колонок с уверенной подписью (`label_confidence = 100`); такой нет — подпись не подтверждена. Неуверенная дата отчёта (шаг 8, поля @@ -337,6 +345,21 @@ tabular-parser и шаблоны `dates.py` scan-gateway; строки `test_dat - **THEN** колонка остаётся, `period_date = null`, `period_kind = none`, предупреждение `COLUMN_WITHOUT_DATE` уровня `error` с `column_index`, документ `needs_check` +#### Scenario: Числа справа от таблицы +- **WHEN** у ББ подписи периодов стоят над столбцами M, Q, S, а правее таблицы в строках с кодами лежат формулы + аналитика (V45, W57, U58, V58, V72, W72) над пустой шапкой (Межениновская 2025-Q3) +- **THEN** колонок значений три, числа U–W в значения не попадают, `COLUMN_WITHOUT_DATE` и `SEGMENT_COLUMNS_MISMATCH` + нет; одно предупреждение `NUMBERS_OUTSIDE_TABLE` уровня `info` с адресами этих ячеек; документ `done`, если нет других + причин + +#### Scenario: Столбец без подписи между подписанными +- **WHEN** между колонками с подписями периода стоит столбец без подписи с числами +- **THEN** он остаётся колонкой с `COLUMN_WITHOUT_DATE` уровня `error`, `NUMBERS_OUTSIDE_TABLE` нет + +#### Scenario: Подписанных колонок нет +- **WHEN** ни у одного столбца значений нет подписи периода +- **THEN** правило «числа справа от таблицы» не применяется, столбцы с числами — колонки с `COLUMN_WITHOUT_DATE` + #### Scenario: Колонка «Изменение» - **WHEN** правее периодов колонка «Изменение, %» - **THEN** колонка пропускается, предупреждение `COLUMN_SKIPPED` уровня `info` @@ -791,6 +814,7 @@ report_date`). У бланка только с относительными по | `VALUE_OUT_OF_RANGE` | info | число Excel длиннее 16 целых цифр | | `SHEET_OTHER` | info (файл) | лист Excel «прочее» без `type_hint` и кодов; документа нет | | `ROW_SPLIT` | info | разлеплена склеенная строка | +| `NUMBERS_OUTSIDE_TABLE` | info | числа правее последней подписанной колонки значений не учтены; адреса ячеек в тексте | Предупреждения пути ОСВ — уровня `info`, код с префиксом `OSV_`. Новый код предупреждения вводится словарём пакета и таблицей §11 `05-domain-rules.md`; `code` в контракте — строка `^[A-Z][A-Z0-9_]*$`, не перечисление. -- 2.47.2 From aafa656bc047f7882eea8c7a567ac973ca29744a Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 18 Oct 2026 21:27:53 +0400 Subject: [PATCH 2/2] =?UTF-8?q?docs(#122):=20=D1=80=D0=B5=D0=B2=D1=8C?= =?UTF-8?q?=D1=8E=20=E2=80=94=20=D0=A0-44=20=D0=B2=20design.md,=20=D0=BB?= =?UTF-8?q?=D0=B8=D1=81=D1=82=D1=8B-=D0=BF=D1=80=D0=BE=D0=B4=D0=BE=D0=BB?= =?UTF-8?q?=D0=B6=D0=B5=D0=BD=D0=B8=D1=8F,=20=D0=BF=D0=BE=D0=B4=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=BD=D1=8B=D0=B9=20=D1=81=D1=82=D0=BE?= =?UTF-8?q?=D0=BB=D0=B1=D0=B5=D1=86=20=D0=B1=D0=B5=D0=B7=20=D1=87=D0=B8?= =?UTF-8?q?=D1=81=D0=B5=D0=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 5.5 --- context/05-domain-rules.md | 9 ++++++--- .../changes/unified-statement-normalization/design.md | 7 ++++++- .../specs/statement-normalization/spec.md | 8 +++++--- 3 files changed, 17 insertions(+), 7 deletions(-) diff --git a/context/05-domain-rules.md b/context/05-domain-rules.md index a411fa0..789ac55 100644 --- a/context/05-domain-rules.md +++ b/context/05-domain-rules.md @@ -1301,15 +1301,18 @@ file:<имя json>;table:`; документа у такой таблицы (`error`, колонка); аналитик ставит дату через PATCH (§9.5 п. 9); иначе пропуск. Колонка без даты не мешает периоду формы (эффективная дата), но межформенная проверка и гудвилл «на отчётную дату» по ней не считаются, пока дата не проставлена. Уверенность подписи — `label_confidence` (Excel — 100, подписи нет — `null`). - **Числа правее таблицы формы** (решение владельца 18.10.2026, Р-31 плана 4; пример — Межениновская 2025-Q3, ББ, формулы + **Числа правее таблицы формы** (решение владельца 18.10.2026, Р-44; ответ на вопрос Р-31 плана 4; пример — Межениновская 2025-Q3, ББ, формулы аналитика `=M45*5/100` в столбцах U–W над пустой шапкой): если среди колонок значений сегмента есть хотя бы одна с подписью периода (дата или относительная подпись бланка), то столбец **без текста подписи**, лежащий правее последней такой колонки, колонкой сумм не считается: его числа в значения строк не попадают, `COLUMN_WITHOUT_DATE` нет, выдаётся одно предупреждение `NUMBERS_OUTSIDE_TABLE` (`info`, документ) с адресами ячеек («числа правее таблицы формы не учитываются: V45, W57, …»: в тексте первые 10 адресов, дальше «и ещё N»; Excel — `<лист>!`, OCR — `row:`). - Адреса собираются по всем сегментам формы в одно предупреждение. На статус документа предупреждение не влияет. Не + Адреса собираются по всем сегментам формы в одно предупреждение; у сегмента без подписанных колонок (лист-продолжение + без шапки) столбцы без текста подписи сверх числа колонок документа тоже считаются числами правее таблицы (иначе + `SEGMENT_COLUMNS_MISMATCH`). Подписанный столбец без чисел в строках с кодами (потерянная подпись объединённой ячейки) + границей таблицы не служит. На статус документа предупреждение не влияет. Не меняется: подписанных колонок нет вовсе; столбец без подписи **между** подписанными — `COLUMN_WITHOUT_DATE`; столбец - правее с **нечитаемой** подписью (OCR-мусор «| | г») — `COLUMN_WITHOUT_DATE`, как раньше. Правило общее для Excel и + правее с **любым текстом подписи**, не разобранным ни как период, ни как исключение (OCR-мусор «| | г», «Проверка»), — `COLUMN_WITHOUT_DATE`, как раньше. Правило общее для Excel и OCR и живёт в пакете `arm_statements` (шаг 2), не в адаптере хоста. 7. **Столбец наименования** — подпись, начинающаяся с «наименование», в строке заголовка; иначе столбец левее кода с наибольшим числом текстов, кроме «Пояснения» (пустые или ≤ 3 символов); наименование строки — ячейка этого столбца, diff --git a/openspec/changes/unified-statement-normalization/design.md b/openspec/changes/unified-statement-normalization/design.md index 2140b05..34ae640 100644 --- a/openspec/changes/unified-statement-normalization/design.md +++ b/openspec/changes/unified-statement-normalization/design.md @@ -776,7 +776,7 @@ line_name, line_name_confidence, parent_ref, values}`: `line_code` — разо `07-open-questions.md` (Р-15). Вопрос о сопоставлении файлового наименования со справочным закрыт Р-16: для неуверенных кодов это условие `RECOGNIZED`, для остальных — только показ справочного имени. -### Решения владельца (Р-1…Р-19 — 17.10.2026, Р-20…Р-43 — 18.10.2026) +### Решения владельца (Р-1…Р-19 — 17.10.2026, Р-20…Р-44 — 18.10.2026) - **Р-1** (шаг 1, п. 2) — **копия по скрипту.** Платформа не собирает Python-пакеты и не кладёт их в свой Nexus, поэтому общий код — dataclass-ы шага 1 (сериализуемые в json), шаги 2–8, словари §7, периодов, заголовков форм, перечни и @@ -913,6 +913,11 @@ line_name, line_name_confidence, parent_ref, values}`: `line_code` — разо - **Р-31** (план 4 В-2, план 5 Q-3) — если на прогоне реальных файлов (РБ, Счастливочная, НПЗ, Межениновская) форма получает `needs_check` по правилу, которое спека считает законным, исполнитель останавливается и поднимает вопрос владельцу по конкретному случаю; адаптер под файл не подгоняется. +- **Р-44** (план 4, ответ на Р-31; 18.10.2026) — числа правее таблицы формы не колонки сумм: при наличии колонки с + подписью периода столбец без текста подписи правее последней такой колонки в значения не попадает, вместо + `COLUMN_WITHOUT_DATE` — `NUMBERS_OUTSIDE_TABLE` (`info`, адреса ячеек), статус не меняется (пример — Межениновская + 2025-Q3, формулы аналитика в U–W). Уточняет P1-17 (№ 120). Цена ошибки: настоящая колонка сумм с потерянной подписью + будет отброшена с `info`; поэтому подписанный столбец без чисел границей не служит. Единые для Excel и OCR. - **Р-32** (план 5 Q-1) — успешный json ИС без таблиц даёт `JSON_FAILED`, а не молчаливый пропуск. - **Р-33** (план 5 Q-2) — если все json набора ошибочны, конверт `error` перечисляет `JSON_FAILED` каждого json; код ошибки файла — от первого. diff --git a/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md b/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md index fbe4f8f..e8b45c3 100644 --- a/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md +++ b/openspec/changes/unified-statement-normalization/specs/statement-normalization/spec.md @@ -317,9 +317,11 @@ tabular-parser и шаблоны `dates.py` scan-gateway; строки `test_dat текста подписи правее **последней** такой колонки SHALL НЕ считаться колонкой сумм: его числа не попадают в значения строк, `COLUMN_WITHOUT_DATE` не выдаётся, вместо этого выдаётся одно предупреждение `NUMBERS_OUTSIDE_TABLE` (`info`) с адресами ячеек, собранными по всем сегментам формы (в тексте — первые 10, дальше «и ещё N»). Предупреждение SHALL НЕ -влиять на статус документа. Решение владельца 18.10.2026 (Р-31). Правило общее для Excel и OCR и живёт в пакете. -Без подписанных колонок, а также для столбца без подписи между подписанными и для столбца с нечитаемой подписью -поведение прежнее (`COLUMN_WITHOUT_DATE`). +влиять на статус документа. Решение владельца 18.10.2026 (Р-44). Правило общее для Excel и OCR и живёт в пакете. +У сегмента без подписанных колонок (лист-продолжение без шапки) столбцы без текста подписи сверх числа колонок документа +SHALL считаться числами правее таблицы. Подписанный столбец без чисел в строках с кодами границей таблицы не служит. +Адрес ячейки — `<лист>!` у Excel и `row:` у OCR. Без подписанных колонок, а также для столбца без подписи между +подписанными и для столбца с любым текстом подписи, не разобранным как период или исключение, поведение прежнее (`COLUMN_WITHOUT_DATE`). Подтверждение SHALL опираться только на уверенные источники, чтобы неуверенное не подтверждало само себя: для неуверенной подписи эффективная дата — дата отчёта с уверенностью 100, иначе самая поздняя абсолютная дата колонок с -- 2.47.2