Срез 0 реализован и влит (PR #3), change перенесён в openspec/changes/archive, спеки — в openspec/specs. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
77 lines
7.9 KiB
Markdown
77 lines
7.9 KiB
Markdown
# Tasks: Срез 0 — сквозной скелет
|
||
|
||
Порядок — по зависимостям между репозиториями. Префикс в квадратных скобках — репозиторий. Задачи сервисов перечислены
|
||
кратко; их детализация — в `tasks.md` дочерних change'ей. Каждая задача ≤ половины дня.
|
||
|
||
## 1. Контракт v1.0 (первым — от него зависят все сервисы)
|
||
|
||
- [x] 1.1 [docs] `docs/contracts/recognition-result.schema.json`: снять «ЧЕРНОВИК» из title, добавить `$comment` о
|
||
версионировании, добавить `NOT_IMPLEMENTED` в `error.code`; проверить `python -m jsonschema` на файле схемы
|
||
(метасхема 2020-12 валидна)
|
||
- [x] 1.2 [docs] Новый `docs/contracts/recognition-request.schema.json` по spec `recognition-contract` (поля, enum,
|
||
форматы uuid/date-time); проверить метасхемой
|
||
- [x] 1.3 [docs] Новый `docs/contracts/recognition-result-message.schema.json` (конверт: `status` ∈ processing | done |
|
||
needs_check | error; условные обязательные поля через `if/then`); проверить метасхемой
|
||
- [x] 1.4 [docs] Примеры `docs/contracts/examples/`: `request-tabular.json`, `request-image.json`,
|
||
`result-message-processing.json`, `result-message-done.json`, `result-message-error.json`, `result-osv-minimal.json`,
|
||
`result-statement-minimal.json`, `result-error.json`; скрипт `docs/scripts/validate_contracts.py` валидирует все
|
||
примеры схемами и возвращает 0
|
||
- [x] 1.5 [docs] `03-architecture.md`: таблица «Контракт обмена через NATS» — ссылки на три файла схем, правила
|
||
`Nats-Msg-Id`, ack через `processing`, повторная публикация; проверить, что текст ссылается на существующие файлы
|
||
|
||
## 2. Инфраструктура разработки
|
||
|
||
- [x] 2.1 [docs] `docs/dev/docker-compose.yml`: сервисы `postgres` (16), `nats` (2.10, без `--jetstream`), `minio`,
|
||
`minio-init` (создаёт бакет `arm-ka`), healthcheck'и, именованные тома; `docs/dev/.env.example`; проверка:
|
||
`docker compose up -d` → все healthy, `mc ls` видит бакет, `curl :8222/varz` отвечает
|
||
- [x] 2.2 [docs] `docs/dev/README.md`: запуск инфраструктуры, переменные, сброс томов, запуск сервисов из venv без Nexus
|
||
(`make venv` фильтрует `raisa_*`), черновик — дописывается в 5.4
|
||
|
||
## 3. Ядро (детали — `arm-core/openspec/changes/slice-0-skeleton/tasks.md`)
|
||
|
||
- [x] 3.1 [arm-core] Инструменты: `api/pyproject.toml` (ruff, mypy), `requirements-dev.txt` с `-r requirements.txt`,
|
||
`Dockerfile` (`python:3.11-slim`, + строка убрана из `.gitignore`), `Makefile` (общие цели + `migrate`, `seed`),
|
||
`ENV_FILE` в Settings, `raisa-*` в `web/package.json` → `optionalDependencies`
|
||
- [x] 3.2 [arm-core] ORM 1:1 с DBML v5.13 + миграция 0001 + `check_dbml_vs_orm.py`; проверка: upgrade → downgrade → upgrade
|
||
на compose-PostgreSQL 16, скрипт сверки — 0 расхождений
|
||
- [x] 3.3 [arm-core] Seed справочников/ролей/прав + dev-пользователи; auth (JWT, dev-эмитент, `require(permission)`), `GET /api/v1/me`
|
||
- [x] 3.4 [arm-core] Вендоренный контракт + outbox-паблишер + подписка `recognition.result` (queue group `arm-core`): ack
|
||
`processing`, повторная публикация без ack, дедуп по `result_msg_id`, `dlq`, вахтёр `reply_deadline`; интеграционный
|
||
тест на compose: queued → published → processing → done; дубликат результата игнорируется; потерянный запрос
|
||
публикуется повторно
|
||
- [x] 3.5 [arm-core] `make check-full` зелёный; итог — в описание PR
|
||
|
||
## 4. Проверки качества (параллельно с 3.x, после первых тестов)
|
||
|
||
- [x] 4.1 [docs] `docs/dev/checks.md`: общие цели `Makefile` (`up`, `test`, `test-integration`, `lint`, `check`,
|
||
`check-full`), что делает каждая, порядок перед PR, как пропускаются тесты без фикстур/docs; проверка: цели
|
||
`arm-core` соответствуют описанию
|
||
- [x] 4.2 [docs] Эталонный фрагмент `docs/dev/Makefile.common` (включается в `Makefile` сервисов через `include` или
|
||
копируется); проверка: `make check` в трёх репозиториях вызывает одинаковые команды (`diff` общих целей)
|
||
|
||
## 5. Сервисы распознавания (детали — в их change'ах) и профиль `services`
|
||
|
||
- [x] 5.1 [tabular-parser] Вырезать фронт/БД, вендоренный контракт, подписчик queue group `tabular-parser` с ack
|
||
`processing` и заглушкой `NOT_IMPLEMENTED`, Dockerfile 3.11, `make check-full`
|
||
- [x] 5.2 [scan-gateway] Вырезать фронт/БД, вендоренный контракт, горячие папки (local/smb), эмулятор, подписчик queue group
|
||
`scan-gateway` с ack и таймаутом, Dockerfile 3.11, `make check-full`
|
||
- [x] 5.3 [docs] `docker-compose.yml`: профиль `services` — `arm-core` (8000), `tabular-parser` (8001), `scan-gateway`
|
||
(8002), `scan-emulator` (том `hotfolder`, `../../fixtures/ocr:ro`); проверка: `--profile services up --build`,
|
||
все `/healthcheck` 200 с `nats = ok`
|
||
- [x] 5.4 [docs] Сквозная проверка руками по README: вставить `recognition_job` в БД через `psql` (или тестовый скрипт
|
||
arm-core) → паблишер публикует → `tabular-parser` отвечает ack и `NOT_IMPLEMENTED` → `recognition_job.status`
|
||
проходит `published → processing → error`, `error_code = NOT_IMPLEMENTED`; то же для `image` через эмулятор
|
||
(`raw/{job_id}.json` появляется в MinIO); остановить `tabular-parser`, вставить задание — через 30 с повторная
|
||
публикация, после трёх — `dlq`; зафиксировать в README как «проверка окружения»
|
||
|
||
## 6. Документы контекста и закрытие
|
||
|
||
- [x] 6.1 [docs] `06-test-data.md` §6: `fixtures/directories/` — только тестовые ЮЛ/ГК (Срез 1); план счетов, правила
|
||
элиминации, права — `arm-core/api/seed/`; `09-delivery-plan.md` Срез 0: решение D-1 по пакету контрактов,
|
||
ссылка на `docs/dev/`, проверки вместо CI
|
||
- [x] 6.2 [docs] `07-open-questions.md`: OQ по итогам Среза 0 (контракт `data_type = NU` vs enum `osv_data_type`;
|
||
обязательность ОСВ расширенного подхода; источник полного плана счетов 1С) и расхождения макета из задачи B;
|
||
статусы допущений
|
||
- [x] 6.3 [docs] Итоговая проверка: `openspec validate slice-0-skeleton --strict` зелёный в четырёх репозиториях; ссылки
|
||
между документами ведут на существующие файлы (`grep` по именам файлов)
|