feat: complete published registry contracts and gated SRO ingestion
All checks were successful
Mostovik Backend CI/CD / Tests and lint (push) Successful in 3m55s
Mostovik Backend CI/CD / Build linux/amd64 release images (push) Successful in 3m43s
Mostovik Backend CI/CD / Deploy and verify internal main (push) Has been skipped
Mostovik Backend CI/CD / Deploy customer main (push) Has been skipped
Mostovik Backend CI/CD / Deploy dev (push) Successful in 1m45s

This commit is contained in:
Aleksandr Meshchryakov
2026-09-14 17:01:02 +02:00
parent 49cbfd265c
commit 18971d33ec
76 changed files with 33156 additions and 311 deletions

View File

@@ -0,0 +1,57 @@
# Полный контракт записей источников — 14.09.2026
Основание: `source-records-backend-improvements.md`, присланный пользователем.
Пользователь явно включил весь документ, включая СРО, специальные фильтры МСП
и полный detail бюджета. Запрет на сообщения Глебу сохраняется.
База backend: `49cbfd2`, ветка `codex/source-records-contract`.
14.09 штатный SSH-маршрут оказался недоступен на первом переходе; доступ
восстановлен через существующий российский узел Tailscale с проверенными ключами.
Свежий fetch подтвердил backend `49cbfd2`, frontend origin/dev `c6f2ec7`;
проверки генерации выполняются в отдельном worktree, рабочий frontend не меняется.
## Задачи и владельцы
1. Budget/SME normalization и named list/detail payload schemas — агент Mostovik.
Файлы budget_registry.py, sme_support.py, новые payload-модули и тесты.
2. СРО: нормализация, разрешённый HTTP loader, staging, models/descriptors/tasks,
access gate, миграции и тесты — агент требований.
3. Cards/dashboard/jobs/logs/export typed contracts и counts — агент State Corp.
Реализация находится исключительно в Mostovik backend.
4. Root: organization-source-records validation/search/filter/order/pagination,
serializer integration, discriminated OpenAPI, generated client checks.
5. Независимое ревью, регрессия SQLite/PostgreSQL, migration/OpenAPI, dev release
и доступные живые проверки после восстановления соединения.
## Согласование общих границ
| Участки | Общая поверхность | Решение |
| --- | --- | --- |
| 1/4 | Payload normalizers и response serializer | Агент создаёт отдельные typed payload serializers и нормализатор старого payload; root подключает их в serializers.py. |
| 2/3 | Source cards и parser run | Агент 2 передаёт descriptor/task/gate интерфейсы; source_cards.py и parser views редактирует агент 3. |
| 1/2 | Snapshot infrastructure | Переиспользуется registry_snapshots.py; изменения общего механизма согласуются сообщением. |
| 3/4 | Record export actions | source_record_export.py — агент 3; organizations/views.py — root по переданному интерфейсу. |
| 1 | Известные/неизвестные поля | Не угадывать коды и значения; unknown blocks сохраняются с lineage и метрикой. |
| 2 | Upstream approval | Default disabled; до разрешения владельца upstream оба ручных запуска дают typed409 до enqueue. Задача повторно проверяет gate. |
| 3 | Counts | Для трёх новых источников весь published dataset; ОПК coverage отдельно. Legacy источники сохраняют scope. |
| 4 | Совместимость | Legacy payload/search сохраняются. Новые source-specific поля валидируются и не игнорируются. |
Ruling: канонический ticket flow остаётся ready201 → native form download200,
как в новом handoff и действующем frontend; устаревшее требование preparing202
в SME/SRO source-first docs синхронизируется с этим контрактом. Стоимость ошибки:
если требуется отдельная on-demand генерация, понадобится согласованный frontend polling.
Ruling: публикация СРО без согласованного доступа не запускается. Реализация и
fixture acceptance обязательны; отсутствие разрешения отражается typed409,
а не успешной пустой загрузкой. Стоимость: СРО останется без живого snapshot до разрешения.
## Проверки завершения
- Все требования отмечаются результатами в этом документе, пропуски отдельно.
- Runtime и OpenAPI: required/nullable, source variants, errors, page metadata.
- Фильтры, null-last ordering и ties UID до пагинации на PostgreSQL.
- Fixtures: empty/one/many, Budget partial/large/unknown blocks, SME mixed units,
документы/нарушения, несколько СРО, unsafe URL и идентификационные конфликты.
- Генерация `bun run apigen`, затем `bun run type-check` без ручного изменения generated.
- Совместимость опубликованных данных и сохранение предыдущего snapshot при ошибке.
- Миграции, pytest, scope review, dev release только после сверки remote.