OpenSpec-спеки по коду: DBML v5.17 (КПП), схема из DB_SCHEMA (#55) #56

Merged
aep merged 1 commits from feat/55-specs-v517 into main 2026-10-07 22:43:48 +03:00
Owner

Closes #55.

Bounded-задача: PR #52 (КПП, DBML v5.17) и #53 (DB_SCHEMA) слиты без обновления openspec/specs/, а спека — источник истины. Найдено при аудите документации (RSHB/arm-ka-docs#60). Код не менялся.

Что сделано

  • data-model: v5.16 → v5.17 — колонка kpp в legal_entity/legal_entity_history (последняя, nullable, без уникальности), миграция 0005_dbml_v5_17. Схема берётся из настройки DB_SCHEMA (по умолчанию dkb, в контуре OPENBAO__APP__DB_SCHEMA, валидация идентификатора), сверка с DBML идёт в эталонной dkb. Цепочка миграций доведена до 0005. Константа версии — 5.17 (в спеке было 5.15), enum-типов 28 (было 27). Новые сценарии: «КПП добавляется и откатывается», «Нестандартная схема».
  • directories-api: v5.14 → v5.17. В требование о ЮЛ добавлен kpp: формат, нормализация, запрет у ИП, INVALID_KPP, PATCH с null очищает, смена типа на ИП при непустом КПП даёт 422, поиск q идёт и по КПП. Сценарии «КПП у ИП», «Очистка КПП».
  • directory-import: необязательная колонка КПП, код INVALID_KPP (проверяется после ИНН и до дубля), при update пустая ячейка КПП не стирает. Сценарий «КПП у ИП в файле».

Каждое утверждение сверено с кодом 99669cd (domain/kpp.py, services/legal_entities.py, domain/directory_import.py, core/config.py, models/__init__.py, миграция 0005) и с README. Новые сценарии покрыты существующими тестами: test_migrations.py::test_upgrade_0005_adds_nullable_kpp_columns, test_db_schema.py::test_migrations_and_app_work_in_custom_schema, test_domain_kpp.py, test_domain_directory_import.py::test_kpp_for_sole_proprietor_skips_row_with_warning_line.

Проверки

  • openspec validate --specs --strict: 15 passed.
  • make check-full не запускал: код и тесты не менялись, правка затрагивает только openspec/specs/.

Rulings I made

  • R-1 — спеки правлю напрямую, без OpenSpec change: поведение не меняется, спека догоняет уже слитый код. Если это ошибка, нужно оформить change задним числом, на код это не влияет.
  • R-2 — сценарий «Откат на один шаг» переименовал в «Откат до v5.14»: после 0004/0005 до 0002 уже три шага, содержание сценария не изменилось.
  • R-3 — в сценарии версии константы пример заменён на 5.18/5.17, чтобы он оставался гипотетическим.

🤖 Generated with Claude Code

https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2

Closes #55. Bounded-задача: PR #52 (КПП, DBML v5.17) и #53 (DB_SCHEMA) слиты без обновления `openspec/specs/`, а спека — источник истины. Найдено при аудите документации (RSHB/arm-ka-docs#60). **Код не менялся.** ## Что сделано - **`data-model`**: v5.16 → v5.17 — колонка `kpp` в `legal_entity`/`legal_entity_history` (последняя, nullable, без уникальности), миграция `0005_dbml_v5_17`. Схема берётся из настройки `DB_SCHEMA` (по умолчанию `dkb`, в контуре `OPENBAO__APP__DB_SCHEMA`, валидация идентификатора), сверка с DBML идёт в эталонной `dkb`. Цепочка миграций доведена до `0005`. Константа версии — `5.17` (в спеке было `5.15`), enum-типов 28 (было 27). Новые сценарии: «КПП добавляется и откатывается», «Нестандартная схема». - **`directories-api`**: v5.14 → v5.17. В требование о ЮЛ добавлен `kpp`: формат, нормализация, запрет у ИП, `INVALID_KPP`, `PATCH` с `null` очищает, смена типа на ИП при непустом КПП даёт 422, поиск `q` идёт и по КПП. Сценарии «КПП у ИП», «Очистка КПП». - **`directory-import`**: необязательная колонка `КПП`, код `INVALID_KPP` (проверяется после ИНН и до дубля), при `update` пустая ячейка КПП не стирает. Сценарий «КПП у ИП в файле». Каждое утверждение сверено с кодом `99669cd` (`domain/kpp.py`, `services/legal_entities.py`, `domain/directory_import.py`, `core/config.py`, `models/__init__.py`, миграция 0005) и с README. Новые сценарии покрыты существующими тестами: `test_migrations.py::test_upgrade_0005_adds_nullable_kpp_columns`, `test_db_schema.py::test_migrations_and_app_work_in_custom_schema`, `test_domain_kpp.py`, `test_domain_directory_import.py::test_kpp_for_sole_proprietor_skips_row_with_warning_line`. ## Проверки - `openspec validate --specs --strict`: 15 passed. - `make check-full` не запускал: код и тесты не менялись, правка затрагивает только `openspec/specs/`. ## Rulings I made - **R-1** — спеки правлю напрямую, без OpenSpec change: поведение не меняется, спека догоняет уже слитый код. Если это ошибка, нужно оформить change задним числом, на код это не влияет. - **R-2** — сценарий «Откат на один шаг» переименовал в «Откат до v5.14»: после 0004/0005 до `0002` уже три шага, содержание сценария не изменилось. - **R-3** — в сценарии версии константы пример заменён на `5.18`/`5.17`, чтобы он оставался гипотетическим. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 1 commit 2026-10-07 22:40:48 +03:00
- data-model: v5.16 → v5.17 (legal_entity(_history).kpp, миграция 0005), схема — настройка DB_SCHEMA
  (по умолчанию dkb), цепочка миграций до 0005, DBML_VERSION = "5.17", 28 enum-типов; сценарии «КПП добавляется
  и откатывается», «Нестандартная схема».
- directories-api: v5.14 → v5.17; kpp в создании/PATCH (null очищает), поиск q по КПП, INVALID_KPP, ИП без КПП.
- directory-import: необязательная колонка «КПП», код INVALID_KPP, пустая ячейка не стирает КПП при update.

Код не менялся: спеки догоняют слитые PR #52 и #53.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep merged commit 53ac9f19ed into main 2026-10-07 22:43:48 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-core#56
No description provided.