OpenSpec: change slice-2c-osv-ingest (DBML v5.15, правила маппинга ОСВ в ядре, OQ) и data-model-v5.15.dbml

Issue: RSHB/arm-ka-docs#16

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
This commit is contained in:
Andrey Epifancev 2026-10-05 21:08:49 +04:00
parent 8130eed1e6
commit c821e0fbfe
5 changed files with 1396 additions and 0 deletions

1321
model/data-model-v5.15.dbml Normal file

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,3 @@
schema: spec-driven
created: 2026-10-05
skip_specs: true

View File

@ -0,0 +1,25 @@
# Design: Срез 2c (сквозное, docs)
## Context
См. proposal и `arm-core/openspec/changes/slice-2c-osv-ingest/design.md` (D-1…D-13).
## Decisions
### D-1. v5.15 без expression-индекса
`lower(email)` как уникальный индекс не поддерживается сверкой ORM↔DBML (индексы сравниваются по колонкам). Вместо
этого email нормализуется в нижний регистр при записи, уникальность — прежний UNIQUE. Миграция приводит данные.
### D-2. Правила маппинга фиксируются в §1.3/§9 после реализации
Как в Срезе 2a: задача docs-change «по факту» выполняется после merge дочернего change'а, расхождения — правкой §.
### D-3. Автозамена — новый §9.5
Решение владельца 05.10.2026: новый файл с документом того же типа/счёта/периода заменяет прежние (в т.ч. `CONFIRMED`,
с пометкой в аудите); удаление файла — пока нет `CONFIRMED` и файл никого не заменял; после Среза 4 — ограничение по консолидациям.
## Decisions made without discussion
| № | Дата | Решение | Обоснование | Цена ошибки |
|---|---|---|---|---|
| 1 | 2026-10-05 | D-1: email в нижнем регистре вместо `lower(email)`-индекса | сверка DBML | индекс в v5.16 |
| 2 | 2026-10-05 | D-3: §9.5 автозамена/удаление по решению владельца; удаление заменившего файла запрещено | целостность цепочки версий | ослабить |
| 3 | 2026-10-05 | `period_check = UNKNOWN` до Среза 4 | нет версии консолидации | пересчёт в Срезе 4 |

View File

@ -0,0 +1,37 @@
# Proposal: Срез 2c (сквозное) — DBML v5.15, правила маппинга ОСВ в ядре по факту, OQ
**Срез:** 2, подсрез 2c (загрузка файлов, очередь, маппинг результата парсера в `document`/`osv_entry`). **Репозиторий:**
arm-ka-docs. **Issue:** RSHB/arm-ka-docs#16. **Дочерний change:** `arm-core/openspec/changes/slice-2c-osv-ingest` (RSHB/arm-core#14).
## Why
Решения владельца 05.10.2026 (OQ-45 `NU` хранить; OQ-59 регистр email; OQ-01/02/05; автозамена файлов) требуют новой
версии модели и фиксации правил маппинга, которых в §1.3/§3/§9 нет в деталях (кто ставит статусы файла, как
разделены inbox и маппинг, что делать с повтором счёта в файле, что такое `period_check` без консолидации).
## What Changes
- **DBML v5.15** (`model/data-model-v5.15.dbml`, v5.14 остаётся): `osv_data_type + NU`; `app_user.email` в нижнем
регистре (структура без изменений); уточнения семантики `stored_file.status`/`recognition_job.group_schema` в changelog.
`entities-v5.15.md`, `04-data-model-guide.md`, ссылки в `CLAUDE.md`/`repo-templates` — на v5.15.
- **`05-domain-rules.md`**: §1.3 — маппинг в ядре по факту (TOTAL не хранится, нормализация кода, `account_root` при
нечисловом первом сегменте, повтор счёта в файле); §1.5 — `period_check = UNKNOWN` до Среза 4, `is_cumulative` по Q1;
§3 п. 4 — резолв без policy, нормализация имени ЮЛ как алиаса; §9.2 — таблица «кто ставит статус файла»; §9.3 — условия
`RECOGNIZED`/`NEEDS_CHECK`; новый §9.5 «Автозамена и удаление файлов» (решение владельца).
- **`03-architecture.md`**: цикл маппинга как третий фоновый процесс ядра (outbox, вахтёр, маппинг), OQ-69 закрыт.
- **`07-open-questions.md`**: закрыты OQ-67, OQ-69, OQ-70, OQ-59 (реализацией), OQ-109 (лимит на загрузке у ядра);
новые OQ: удаление файлов после появления консолидаций (ANL-020 — уточнить условие), ретеншн `expires_at` (связь с OQ-22).
- **`09-delivery-plan.md`**: 2c по факту; **`dev/qa-guide.md`**: сценарии загрузки ОСВ, статусы, просмотр строк через API.
## Capabilities
Change документный (`skip_specs: true`); поведение описывают спеки дочернего change'а.
## Impact
- Таблицы: `osv_entry` (enum), `app_user` (данные). Правила: §1.3, §1.5, §3, §9. Потребители: arm-core (миграция 0003,
`DBML_VERSION`), tabular-parser — без изменений (контракт не меняется).
## Non-goals
- UI (2d), ББ/ОФР (2b/Срез 3), replay заданий, JetStream, аудит обмена (OQ-55).

View File

@ -0,0 +1,10 @@
# Tasks: Срез 2c (docs)
- [x] 1.1 `model/data-model-v5.15.dbml` — changelog v5.15, `osv_data_type + NU`, note на `app_user.email`; проверка: 43 таблицы, 27 enum.
- [ ] 1.2 `model/entities-v5.15.md` (копия v5.14 + «Что изменилось в v5.15»), `context/04-data-model-guide.md`, `CLAUDE.md` workspace и
`repo-templates/arm-core.CLAUDE.md` → v5.15. Ссылка на DBML в `openspec/specs/quality-checks/spec.md` (там ещё v5.13) —
отдельным bounded-коммитом в этой же ветке с пометкой в описании PR (дельты в change со `skip_specs` нет).
- [ ] 2.1 После реализации (дочерний change, задачи 2–4): §1.3, §1.5, §3 п. 4, §9.2–9.3, новый §9.5 в `05-domain-rules.md`;
`03-architecture.md` — цикл маппинга; `07-open-questions.md` — закрыть OQ-67/69/70/59/109, новые OQ (удаление после консолидаций,
ретеншн при удалении); `09-delivery-plan.md` — 2c по факту; `dev/qa-guide.md` — сценарии загрузки и просмотра ОСВ через API.
- [ ] 2.2 После merge дочернего change: `openspec archive slice-2c-osv-ingest`.