From 1b20d576167141f4be6d5727badb13eab015169c Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 7 Oct 2026 15:05:17 +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=9623=E2=80=9325=20=D0=A1=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D0=B0=203b=20=E2=80=94=20=D0=BF=D1=80=D0=BE=D1=86?= =?UTF-8?q?=D0=B5=D1=81=D1=81=20=D1=80=D0=B5=D0=B2=D1=8C=D1=8E=20=D0=BF?= =?UTF-8?q?=D0=B0=D0=BA=D0=B5=D1=82=D0=BE=D0=B2=20=D0=B8=20=D0=BE=D1=82?= =?UTF-8?q?=D0=BA=D0=B0=D1=82=D0=B0,=20=D0=B0=D0=B2=D1=82=D0=BE=D0=B7?= =?UTF-8?q?=D0=B0=D0=BC=D0=B5=D0=BD=D0=B0=20=D1=84=D0=BE=D1=80=D0=BC=20?= =?UTF-8?q?=D0=BD=D0=B0=20=D1=83=D1=80=D0=BE=D0=B2=D0=BD=D0=B5=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=B0=20(OQ-154)?= 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-3b-statements-api/design.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/openspec/changes/slice-3b-statements-api/design.md b/openspec/changes/slice-3b-statements-api/design.md index 1dead31..a892139 100644 --- a/openspec/changes/slice-3b-statements-api/design.md +++ b/openspec/changes/slice-3b-statements-api/design.md @@ -182,3 +182,6 @@ seed-dev` с нуля. | 20 | 2026-10-07 | R-11 (отозван): предложенное финальным ревью изменение «цель §7 присутствует в колонке, только если сумма не `NULL`» отклонено и откатано; присутствие цели — наличие строки в форме, пустая сумма (`NULL`) = 0, как `_amounts` в tabular-parser | оба производителя (tabular-parser `lines.py`, scan-gateway `normalizer/ocr/document.py`) отдают значение на каждую колонку каждой кодированной строки, пустая ячейка — `amount = null`; парсер считает такую запись присутствующей, при ненулевых слагаемых даёт жёсткое нарушение; иное поведение отключало бы проверку итога правкой `amount = null` в обход акцепта | — (поведение не менялось; тест фиксирует нарушение при пустой цели) | | 21 | 2026-10-07 | R-12: `PATCH header.inn = null` → 422 `INVALID_INN` (очистить ИНН нельзя) | иначе очистка ИНН переключала бы `counterparty_check` на сверку по имени и обходила `MISMATCH`; спека: «10 или 12 цифр, иначе 422» | аналитик не может стереть мусорный ИНН — только заменить корректным | | 22 | 2026-10-07 | R-13: при повторе `column_index` в `columns[]` результата или повторе пары (строка, колонка) в `values[]` оставляется первое, пишется предупреждение маппинга (документ `NEEDS_CHECK`) | контракт повтор не запрещает; без этого `IntegrityError` ронял маппинг всего файла (I-1 финального ревью) | потеря второго значения при ошибке парсера (виден в предупреждении) | +| 23 | 2026-10-07 | R-10: пакеты доработок A (тесты, PB.1/PB.2) и B отдельного task-ревью не проходили так же, как задачи (B — ревью получил, A — мутационная проверка 4 тестов) | покрываются финальным ревью ветки | пропуск слабого теста до финального ревью (финальное ревью прошло) | +| 24 | 2026-10-07 | R-14: откат M-1 (коммиты 51d322c, 6697194) отдельного ревью не проходил | код `statement_checks.py` побайтно возвращён к состоянию до e851445 (только docstring и комментарии), откат предписан повторным opus-ревью, тест фиксирует поведение | ошибка в новом тесте или docstring | +| 25 | 2026-10-07 | Автозамена файла для форм ББ/ОФР работает на уровне файла (ключ документа: тип, NULL-счёт, год, квартал): исправленный отдельный ОФР заменит прежнюю книгу «ББ + ОФР» того же периода, подтверждённый ББ из неё отвяжется от версий «в работе» | поведение ОСВ (Срезы 2c/4) распространено на формы; замена по документам потребовала бы менять модель замены | замена формы вместе с соседней; вынесено владельцу — OQ-154 |