Файлы в контексте консолидации: stored_file.consolidation_id, маршруты /consolidations/{id}/legal-entities/{le}/files (DBML v5.18, #96) #97

Merged
aep merged 8 commits from feat/96-console-files into main 2026-10-10 08:59:59 +03:00
Owner

Closes #96. Спека: openspec change console-files (этот репозиторий), сквозной дизайн — docs #90 / PR #91 (DBML v5.18). Зависит от docs PR (DBML v5.18); arm-web — RSHB/arm-web#26.

Что сделано

  • Миграция 0006_dbml_v5_18: stored_file.consolidation_id (nullable FK, последняя колонка), индекс (legal_entity_id, consolidation_id), backfill по consolidation_document (самый ранний период: год, затем квартал).
  • GET /consolidations/{cid}/legal-entities/{le}/files — рабочий стол консолидации для ЮЛ (consolidation_id ИЛИ документ привязан к версии консолидации); FileOut.consolidation_id.
  • POST /consolidations/{cid}/legal-entities/{le}/files — загрузка в консолидацию; версии «в работе» с ЮЛ в периметре INITIATED -> DOCUMENTS_PROCESSING. У POST /legal-entities/{id}/files query consolidation_version_id удалён.
  • Автозамена: новый файл без контекста наследует consolidation_id первого заменённого файла со значением.
  • README, CLAUDE.md, delta-спека consolidations-api.

Rulings I made

  • R-7: trailer коммита Task 4 переписан amend'ом (локально, до push) на Claude Fable 5.1 по требованию плана. Цена ошибки: нулевая (только сообщение коммита).
  • R-8: одна fix-волна после финального ревью (I-2, M-1, M-2, T1.1, T3.1, T4.1); остальное оставлено deferred. Цена ошибки: низкая (согласованность спеки/докстрингов, редкая гонка в T3.1); I-1 требует follow-up до перевыкладки контура.
  • Пре-флайт скан плана: конфликтов нет, рулингов не потребовалось.

Находки

Маркер Суть Статус
T1.1 docstring «DBML v5.17» в models/*.py fixed 4abfa03
T1.2 backfill без фильтра статуса версии rejected: соответствует DBML v5.18
T1.3 check-full не гонялся в Task 1 fixed: прогнан на 4abfa03 (ниже)
T2.1 EDIT/NOT_FOUND не использовались до Task 3 fixed 1e888d4
T3.1 EXISTS членства не пересчитывается после ожидания FOR UPDATE fixed 4abfa03
T3.2 members() в цикле вместо одного EXISTS deferred
T3.3 нет теста 422 при двух версиях «в работе», ЮЛ ни в одной deferred
T4.1 перенос строк в docstring supersede_previous fixed 4abfa03
T4.2 нет теста: непустые значения у обоих заменяемых deferred
T5.1 CLAUDE.md:76 длинная строка deferred
T5.2 / T5.3 стиль колонки прав README:669; историческое README:25 rejected
O-1 haiku-implementer поставил trailer Haiku вместо Fable fixed 25307ed
I-1 arm-core/web/src/services/api/files.ts:19 всё ещё ��лёт ?consolidation_version_id= — ядро его игнорирует, переход версии при загрузке из arm-core/web не произойдёт deferred: follow-up «синхронизация arm-core/web с arm-web» до перевыкладки контура
I-2 основная спека consolidations-api противоречит primary-files fixed 4abfa03
M-1 тест 0006: порядок кварталов внутри года fixed 4abfa03
M-2 тест 404 для чужого ЮЛ в столе fixed 4abfa03
M-3 порядок 404 в GET и POST различается (утечки нет) deferred
M-4 OpenAPI 422: UploadResult vs ErrorDetail deferred
M-5 основные спеки data-model/directories-api: «v5.17» deferred: при openspec archive

make check-full (на 4abfa03), EXIT=0

896 passed, 1281 deselected in 345.68s (0:05:45)   # test-integration
1 passed, 2176 deselected in 4.18s                  # e2e
lint, dbml-check, check-infra, docker-build, web-check — зелёные

🤖 Generated with Claude Code

Closes #96. Спека: openspec change `console-files` (этот репозиторий), сквозной дизайн — docs #90 / PR #91 (DBML v5.18). Зависит от docs PR (DBML v5.18); arm-web — RSHB/arm-web#26. ## Что сделано - Миграция `0006_dbml_v5_18`: `stored_file.consolidation_id` (nullable FK, последняя колонка), индекс `(legal_entity_id, consolidation_id)`, backfill по `consolidation_document` (самый ранний период: год, затем квартал). - `GET /consolidations/{cid}/legal-entities/{le}/files` — рабочий стол консолидации для ЮЛ (`consolidation_id` ИЛИ документ привязан к версии консолидации); `FileOut.consolidation_id`. - `POST /consolidations/{cid}/legal-entities/{le}/files` — загрузка в консолидацию; версии «в работе» с ЮЛ в периметре `INITIATED` -> `DOCUMENTS_PROCESSING`. У `POST /legal-entities/{id}/files` query `consolidation_version_id` удалён. - Автозамена: новый файл без контекста наследует `consolidation_id` первого заменённого файла со значением. - README, CLAUDE.md, delta-спека `consolidations-api`. ## Rulings I made - R-7: trailer коммита Task 4 переписан amend'ом (локально, до push) на `Claude Fable 5.1` по требованию плана. Цена ошибки: нулевая (только сообщение коммита). - R-8: одна fix-волна после финального ревью (I-2, M-1, M-2, T1.1, T3.1, T4.1); остальное оставлено deferred. Цена ошибки: низкая (согласованность спеки/докстрингов, редкая гонка в T3.1); I-1 требует follow-up до перевыкладки контура. - Пре-флайт скан плана: конфликтов нет, рулингов не потребовалось. ## Находки | Маркер | Суть | Статус | |---|---|---| | T1.1 | docstring «DBML v5.17» в models/*.py | fixed 4abfa03 | | T1.2 | backfill без фильтра статуса версии | rejected: соответствует DBML v5.18 | | T1.3 | check-full не гонялся в Task 1 | fixed: прогнан на 4abfa03 (ниже) | | T2.1 | EDIT/NOT_FOUND не использовались до Task 3 | fixed 1e888d4 | | T3.1 | EXISTS членства не пересчитывается после ожидания FOR UPDATE | fixed 4abfa03 | | T3.2 | `members()` в цикле вместо одного EXISTS | deferred | | T3.3 | нет теста 422 при двух версиях «в работе», ЮЛ ни в одной | deferred | | T4.1 | перенос строк в docstring supersede_previous | fixed 4abfa03 | | T4.2 | нет теста: непустые значения у обоих заменяемых | deferred | | T5.1 | CLAUDE.md:76 длинная строка | deferred | | T5.2 / T5.3 | стиль колонки прав README:669; историческое README:25 | rejected | | O-1 | haiku-implementer поставил trailer Haiku вместо Fable | fixed 25307ed | | I-1 | `arm-core/web/src/services/api/files.ts:19` всё ещё ��лёт `?consolidation_version_id=` — ядро его игнорирует, переход версии при загрузке из arm-core/web не произойдёт | deferred: follow-up «синхронизация arm-core/web с arm-web» до перевыкладки контура | | I-2 | основная спека consolidations-api противоречит primary-files | fixed 4abfa03 | | M-1 | тест 0006: порядок кварталов внутри года | fixed 4abfa03 | | M-2 | тест 404 для чужого ЮЛ в столе | fixed 4abfa03 | | M-3 | порядок 404 в GET и POST различается (утечки нет) | deferred | | M-4 | OpenAPI 422: `UploadResult` vs `ErrorDetail` | deferred | | M-5 | основные спеки data-model/directories-api: «v5.17» | deferred: при `openspec archive` | ## make check-full (на 4abfa03), EXIT=0 ``` 896 passed, 1281 deselected in 345.68s (0:05:45) # test-integration 1 passed, 2176 deselected in 4.18s # e2e lint, dbml-check, check-infra, docker-build, web-check — зелёные ``` 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 8 commits 2026-10-10 01:35:51 +03:00
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
I-2: delta MODIFIED consolidations-api «Статусы Среза 4» (загрузка в консолидацию).
T1.1: шапки моделей — DBML v5.18.
T3.1: lock_versions_of_consolidation — двухшаговая блокировка (FOR UPDATE без членства, затем выборка членов);
тесты гонки и выборки.
M-1: тест миграции 0006 — порядок кварталов внутри года.
M-2: тест 404 для ЮЛ чужого филиала на столе своей консолидации.
T4.1: docstring supersede_previous — перенос строк.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
aep merged commit 9be7d7508b into main 2026-10-10 08:59:59 +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#97
No description provided.