From 92b46c9dbee36e0b14b0187895f35187458f301a Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Tue, 6 Oct 2026 02:52:32 +0400 Subject: [PATCH] =?UTF-8?q?spec(slice-4):=20=D0=B4=D0=BE=D0=BA=D1=83=D0=BC?= =?UTF-8?q?=D0=B5=D0=BD=D1=82=D0=BD=D1=8B=D0=B9=20OpenSpec=20change=20?= =?UTF-8?q?=E2=80=94=20DBML=20v5.16,=20=D0=BF=D1=80=D0=B0=D0=B2=D0=B8?= =?UTF-8?q?=D0=BB=D0=B0=20=C2=A72/=C2=A73/=C2=A79/=C2=A710=20=D0=BF=D0=BE?= =?UTF-8?q?=20=D1=84=D0=B0=D0=BA=D1=82=D1=83,=20OQ-03/19/110=20=D0=B8=20?= =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B5=20OQ?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Proposal, design и tasks сквозного change'а Среза 4: enum counterparty_match_kind и колонка osv_entry.counterparty_match_kind, правила приведения периодов (ключ, пробел), явная привязка документов, статусы Среза 4, контракт API для фронта. Refs RSHB/arm-ka-docs#19 Co-Authored-By: Claude Fable 5.1 Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2 --- .../slice-4-consolidation/.openspec.yaml | 3 ++ .../changes/slice-4-consolidation/design.md | 31 +++++++++++ .../changes/slice-4-consolidation/proposal.md | 52 +++++++++++++++++++ .../changes/slice-4-consolidation/tasks.md | 9 ++++ 4 files changed, 95 insertions(+) create mode 100644 openspec/changes/slice-4-consolidation/.openspec.yaml create mode 100644 openspec/changes/slice-4-consolidation/design.md create mode 100644 openspec/changes/slice-4-consolidation/proposal.md create mode 100644 openspec/changes/slice-4-consolidation/tasks.md diff --git a/openspec/changes/slice-4-consolidation/.openspec.yaml b/openspec/changes/slice-4-consolidation/.openspec.yaml new file mode 100644 index 0000000..d4c9260 --- /dev/null +++ b/openspec/changes/slice-4-consolidation/.openspec.yaml @@ -0,0 +1,3 @@ +schema: spec-driven +created: 2026-10-06 +skip_specs: true diff --git a/openspec/changes/slice-4-consolidation/design.md b/openspec/changes/slice-4-consolidation/design.md new file mode 100644 index 0000000..75ca12a --- /dev/null +++ b/openspec/changes/slice-4-consolidation/design.md @@ -0,0 +1,31 @@ +# Design: Срез 4 (сквозное) — документы + +## Context + +Дочерний change в arm-core (`slice-4-consolidation`) держит технические решения D-1…D-16. Здесь — что меняется в +документах контекста и модели и почему. + +## Decisions + +### D-1. Новая версия DBML ради одной колонки +`osv_entry.counterparty_match_kind` — ручное решение аналитика (DECISION-5 разрешает хранить ручные решения), а +`INN/NAME/ALIAS` — зафиксированный шаг автоматического резолва, нужный для подсветки строк к проверке. Вычислять на +чтение нельзя (алиас после ручного связывания маскирует ручное). Версия 5.16, v5.15 остаётся в репозитории. + +### D-2. §2 переписывается из «[открыто]» в правило +Формула остаётся; добавляются ключ, выбор источников, пробел и нули. OQ-03 закрывается решением владельца 06.10.2026. + +### D-3. §3 п. 1 меняет «последние подтверждённые» на явную привязку +Подхват при создании версии и расширении периметра заменяет fallback «если версия ещё не зафиксировала документы». +Фраза убирается, чтобы код и правило не расходились. + +### D-4. Контракт API для фронта — отдельный документ в `docs/dev/` +Разработчик фронта не читает OpenSpec arm-core. `api-contract-slice-4.md` — выжимка: маршруты, схемы, фильтры, коды +ошибок, соответствие экранам макета. Источник истины — спеки arm-core; документ помечен как производный. + +## Decisions made without discussion + +| # | Дата | Решение | Обоснование | Цена ошибки | +|---|---|---|---|---| +| 1 | 2026-10-06 | OQ-40 закрывается допущением `reporting_date` по правилу банка, макет помечен неточным | владелец не возражал на двух срезах; правило банка — в DBML note | одно поле, правится миграцией данных | +| 2 | 2026-10-06 | Контракт для фронта выносится в `docs/dev/api-contract-slice-4.md`, а не в `docs/contracts/` | `docs/contracts/` — JSON Schema между сервисами с версией; API фронта описывает OpenAPI | дублирование OpenAPI текстом; помечено «производный» | diff --git a/openspec/changes/slice-4-consolidation/proposal.md b/openspec/changes/slice-4-consolidation/proposal.md new file mode 100644 index 0000000..c915b0c --- /dev/null +++ b/openspec/changes/slice-4-consolidation/proposal.md @@ -0,0 +1,52 @@ +# Proposal: Срез 4 (сквозное) — DBML v5.16, правила консолидации и сводной ОСВ по факту, OQ + +**Срез:** 4 (консолидация: версии, периметр, блокировка, привязка документов, сводная ОСВ, экспорт). **Репозиторий:** +arm-ka-docs. **Issue:** RSHB/arm-ka-docs#19. **Дочерний change:** `arm-core/openspec/changes/slice-4-consolidation` +(RSHB/arm-core#18). Объём по решению владельца 06.10.2026: бэкенд + API + экспорт xlsx; UI — другой разработчик. + +## Why + +Решения владельца 06.10.2026 закрывают OQ-03 (пропуск квартала → пробел; ключ (счёт, контрагент)), OQ-19 +(блокировка закрывает все правки версии, перехват по `CONSOLIDATION_EDIT` с причиной), фиксируют автоматику статусов +Среза 4, явную привязку документов к версии при подтверждении и требование показывать в API способ сопоставления +контрагента. Последнее требует новой версии модели: `osv_entry` хранит только `counterparty_id`, и после ручного +сопоставления появляется алиас, по которому ручное неотличимо от автоматического. + +## What Changes + +- **DBML v5.16** (`model/data-model-v5.16.dbml`, v5.15 остаётся): enum `counterparty_match_kind` (`INN`, `NAME`, + `ALIAS`, `MANUAL`, `PROPAGATED`), колонка `osv_entry.counterparty_match_kind` (NULL ⇔ `counterparty_id` NULL); + changelog в шапке; уточнение note `consolidation_document` (точки привязки/отвязки) и `consolidation_lock` + (без истечения). `entities-v5.16.md`, `04-data-model-guide.md` (DECISION-5: «что не хранится» дополнено способом + сопоставления и пробелами), ссылки в `CLAUDE.md`/`repo-templates`/`arm-core/openspec/config.yaml` — на v5.16. +- **`05-domain-rules.md`**: §2 — ключ склейки (счёт, контрагент по сырому имени и ИНН), договоры внутри контрагента, + пропуск квартала → пробел по паре (ЮЛ, счёт), правило выбора источников (нарастающий > квартальные), нули для + отсутствующего квартала, дубль ключа внутри квартала; §3 — явная привязка `consolidation_document` (вместо «последние + подтверждённые»), дорезолв на чтение не сохраняется, `counterparty_match_kind`, кандидаты (`group`/`all`), перенос + алиаса без `DIRECTORY_DELETE`, автоприменение по всем ОСВ версии; §9.1 — таблица переходов Среза 4 (кто/чем), остальные + переходы — Срез 7; §9.3 — `period_check` остаётся `UNKNOWN` (OQ-120); §9.5 — отвязка при автозамене, удаление файла + с документом в версии (OQ-110 закрыт для Среза 4); §10 — policy «в работе + своя блокировка». +- **`03-architecture.md`**: пакет консолидаций, чистый домен свода (D-1), порядок блокировок «файл → документ → версия». +- **`07-open-questions.md`**: закрыты OQ-03, OQ-19, OQ-110 (Срез 4), OQ-40 (допущение принято); новые OQ-118 (запрет + загрузки/подтверждения после `DATA_CORRECTION`, ТЗ 03_9 A1 — Срез 7), OQ-119 (истечение блокировки), OQ-120 + (`period_check` документа по версиям), OQ-121 (порог размера свода для кэша), OQ-122 (ячейка `PROCESSING` чек-листа до + маппинга), OQ-123 (общие строки `osv_entry` у нескольких версий — ручное сопоставление в одной меняет все). +- **`09-delivery-plan.md`**: Срез 4 по факту (чек-лист перенесён из Среза 3; UI — отдельно); **`10-user-journey.md`**: + шаги 2.1–2.6, 3.1 — ссылки на эндпоинты; **`dev/qa-guide.md`**: §7 «Консолидация через API» (создание, блокировка, + загрузка с версией, подтверждение, чек-лист, свод, сопоставление, экспорт). +- **`dev/api-contract-slice-4.md`** (новый): перечень эндпоинтов, схем и кодов ошибок для разработчика фронта (экраны + `34`–`37`, `42`, `30`, `32-*`, `31-00`). + +## Capabilities + +Change документный (`skip_specs: true`); поведение описывают спеки дочернего change'а. + +## Impact + +- Таблицы: `osv_entry` (колонка), `consolidation_document`/`consolidation_lock` (семантика). Правила: §2, §3, §9, §10. + Потребители: arm-core (миграция 0004, `DBML_VERSION`), фронт (контракт API); tabular-parser — без изменений. + +## Non-goals + +- Маршрут согласования, УОБ, ЕХ, «Добавить версию», `CONFIRM`, `EXTENDED` (Срезы 6–7); шахматка и ВГО (Срез 5); + ББ/ОФР (2b), PDF (3); UI (другой разработчик); CSV чек-листа. diff --git a/openspec/changes/slice-4-consolidation/tasks.md b/openspec/changes/slice-4-consolidation/tasks.md new file mode 100644 index 0000000..ade35a0 --- /dev/null +++ b/openspec/changes/slice-4-consolidation/tasks.md @@ -0,0 +1,9 @@ +# Tasks: Срез 4 — arm-ka-docs + +- [ ] 1 **DBML v5.16.** `model/data-model-v5.16.dbml` (copy v5.15 + changelog v5.16 + enum + колонка + notes), + `model/entities-v5.16.md`, `04-data-model-guide.md` (DECISION-5, переименования без изменений), ссылки на v5.16 в + `CLAUDE.md`, `repo-templates/*`, `arm-core/openspec/config.yaml` (в дочернем change). +- [ ] 2 **Правила.** `05-domain-rules.md` §2, §3, §9.1, §9.3, §9.5, §10 по proposal; `03-architecture.md`. +- [ ] 3 **Вопросы и план.** `07-open-questions.md` (закрытия и OQ-118…123), `09-delivery-plan.md`, `10-user-journey.md`. +- [ ] 4 **Контракт и QA.** `dev/api-contract-slice-4.md`, `dev/qa-guide.md` §7 — после того как эндпоинты arm-core зафиксированы + (последняя задача, синхронно с 5.2 arm-core).