From 4a5cb87e63a9a1d96f65d6f1c3e6bdb2f7b038f4 Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Wed, 7 Oct 2026 14:35:12 +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=9620=E2=80=9322=20=D0=A1=D1=80?= =?UTF-8?q?=D0=B5=D0=B7=D0=B0=203b;=20=D1=83=D1=82=D0=BE=D1=87=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=81=D1=86=D0=B5=D0=BD=D0=B0=D1=80=D0=B8=D0=B8?= =?UTF-8?q?=20=C2=AB=D0=A4=D0=BE=D1=80=D0=BC=D0=B0=20=D1=81=20=D0=BD=D0=B0?= =?UTF-8?q?=D1=80=D1=83=D1=88=D0=B5=D0=BD=D0=B8=D0=B5=D0=BC=20=D0=BF=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B5=D1=80=D0=BE=D0=BA=C2=BB=20=D0=B8=20=C2=AB?= =?UTF-8?q?=D0=9F=D1=83=D1=81=D1=82=D0=BE=D0=B9=20=D1=80=D0=B5=D0=B7=D1=83?= =?UTF-8?q?=D0=BB=D1=8C=D1=82=D0=B0=D1=82=C2=BB=20(M-6)?= 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 +++ .../slice-3b-statements-api/specs/documents-api/spec.md | 2 +- .../slice-3b-statements-api/specs/osv-result-mapping/spec.md | 4 ++-- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/openspec/changes/slice-3b-statements-api/design.md b/openspec/changes/slice-3b-statements-api/design.md index b97b3fd..c6ceb45 100644 --- a/openspec/changes/slice-3b-statements-api/design.md +++ b/openspec/changes/slice-3b-statements-api/design.md @@ -179,3 +179,6 @@ seed-dev` с нуля. | 17 | 2026-10-07 | R-7: список нарушений `CHECKS_NOT_PASSED` отдаётся в `detail.failures` (строки сумм), не в отдельном ключе `details` | единый формат ошибок ядра `{"detail": {"code","message", **extra}}` | — | | 18 | 2026-10-07 | R-8: при удалении файла (`DELETE /files/{id}`) комментарии `comment(object_type='document')` удалённых документов остаются в таблице | связь полиморфная, FK нет; чтение идёт через видимый документ, наружу строки не попадают; спека о судьбе комментариев молчит | осиротевшие строки `comment` (единицы на файл); чистка — отдельной задачей. **Закрыто (fix wave, T8.2): комментарии удаляются вместе с документами** в `delete_file_rows` — удаление файла и так обязано чистить зависимые от документов строки (формы ББ/ОФР, C-1), лишний `DELETE` дёшев, а осиротевшие строки не нужны никому | | 19 | 2026-10-07 | R-9: значения ячеек CSV чек-листа (название ЮЛ, ИНН) не нейтрализуются от формул Excel (`=`, `+`, `-`, `@`) | спека не требует; названия из справочника ЕЦП внутреннего контура | теоретическая формула в названии ЮЛ откроется в Excel как формула | +| 20 | 2026-10-07 | R-11: цель проверки §7 присутствует в колонке, только если сумма в этой колонке не `NULL`; пустая ячейка цели — соотношение пропускается (как в tabular-parser при отсутствии значения), отсутствующий член правой части = 0 | ядро создаёт ячейку на каждую пару «строка × колонка» (D-2), по БД «нет записи значения» и «запись с `NULL`» неразличимы; иначе пустая ячейка итога давала бы ложное жёсткое нарушение | у tabular-parser запись значения с `amount = null` считается присутствующей (0); в ядре такая ячейка — отсутствующая | +| 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 финального ревью) | потеря второго значения при ошибке парсера (виден в предупреждении) | diff --git a/openspec/changes/slice-3b-statements-api/specs/documents-api/spec.md b/openspec/changes/slice-3b-statements-api/specs/documents-api/spec.md index 4ccb557..3b7bccb 100644 --- a/openspec/changes/slice-3b-statements-api/specs/documents-api/spec.md +++ b/openspec/changes/slice-3b-statements-api/specs/documents-api/spec.md @@ -69,7 +69,7 @@ #### Scenario: Форма с нарушением проверок - **WHEN** подтверждается `BALANCE` с непройденным жёстким соотношением без акцепта -- **THEN** 409 `CHECKS_NOT_PASSED`, в `details` — нарушение; после акцепта подтверждение проходит +- **THEN** 409 `CHECKS_NOT_PASSED`, в `detail.failures` — нарушение; после акцепта подтверждение проходит #### Scenario: Форма без периода - **WHEN** подтверждается форма из OCR, у которой нет ни даты отчёта, ни дат колонок diff --git a/openspec/changes/slice-3b-statements-api/specs/osv-result-mapping/spec.md b/openspec/changes/slice-3b-statements-api/specs/osv-result-mapping/spec.md index 133535e..aef056b 100644 --- a/openspec/changes/slice-3b-statements-api/specs/osv-result-mapping/spec.md +++ b/openspec/changes/slice-3b-statements-api/specs/osv-result-mapping/spec.md @@ -36,8 +36,8 @@ LOCKED`), проверять, что `result_s3_object` относится к б - **THEN** файл `PROCESSED`, создан документ `BALANCE`, ошибки «нет документов ОСВ» нет #### Scenario: Пустой результат -- **WHEN** результат валиден по схеме, но `documents = []` -- **THEN** файл `ERROR` с `metrics.mapping_error = "в результате нет документов"`, повтор не выполняется +- **WHEN** результат без документов (`documents = []`): контракт v1.x такого результата не допускает — его останавливает проверка схемы, а прямой вызов `map_file` даёт `MappingFatal` +- **THEN** файл `ERROR`, причина в `metrics.mapping_error` (при проверке схемы — ошибка схемы, в `map_file` — «в результате нет документов»), повтор не выполняется ## ADDED Requirements