openspec init (config с контекстом docs-репозитория) и change slice-0-skeleton: proposal, design (11 решений без обсуждения, открытые вопросы к человеку), спеки recognition-contract, dev-environment, ci-template, tasks в порядке зависимостей между репозиториями. 06-test-data.md §6: справочники продукта — seed arm-core, не фикстуры. 09-delivery-plan.md: Срез 0 по факту (change'и, compose в docs/dev, контракт копией без общего пакета, seed). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
71 lines
7.1 KiB
Markdown
71 lines
7.1 KiB
Markdown
# Tasks: Срез 0 — сквозной скелет
|
||
|
||
Порядок — по зависимостям между репозиториями. Префикс в квадратных скобках — репозиторий. Задачи сервисов перечислены
|
||
кратко; их детализация — в `tasks.md` дочерних change'ей. Каждая задача ≤ половины дня.
|
||
|
||
## 1. Контракт v1.0 (первым — от него зависят все сервисы)
|
||
|
||
- [ ] 1.1 [docs] `docs/contracts/recognition-result.schema.json`: снять «ЧЕРНОВИК» из title, добавить `$comment` о
|
||
версионировании, добавить `NOT_IMPLEMENTED` в `error.code`; проверить `python -m jsonschema` на файле схемы
|
||
(метасхема 2020-12 валидна)
|
||
- [ ] 1.2 [docs] Новый `docs/contracts/recognition-request.schema.json` по spec `recognition-contract` (поля, enum,
|
||
форматы uuid/date-time); проверить метасхемой
|
||
- [ ] 1.3 [docs] Новый `docs/contracts/recognition-result-message.schema.json` (конверт результата, условные
|
||
обязательные поля через `if/then`); проверить метасхемой
|
||
- [ ] 1.4 [docs] Примеры `docs/contracts/examples/`: `request-tabular.json`, `request-image.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
|
||
- [ ] 1.5 [docs] `03-architecture.md`: таблица «Контракт обмена через NATS» — ссылки на три файла схем, правила
|
||
`Nats-Msg-Id`, убрать `group_schema` из конверта; проверить, что текст ссылается на существующие файлы
|
||
|
||
## 2. Инфраструктура разработки
|
||
|
||
- [ ] 2.1 [docs] `docs/dev/docker-compose.yml`: сервисы `postgres` (15), `nats` (2.10, `--jetstream`), `minio`,
|
||
`minio-init` (создаёт бакет `arm-ka`), healthcheck'и, именованные тома; `docs/dev/.env.example`; проверка:
|
||
`docker compose up -d` → все healthy, `mc ls` видит бакет
|
||
- [ ] 2.2 [docs] `docs/dev/README.md`: запуск инфраструктуры, переменные, сброс томов, запуск сервисов из venv (черновик,
|
||
дописывается в 5.2)
|
||
|
||
## 3. Ядро (детали — `arm-core/openspec/changes/slice-0-skeleton/tasks.md`)
|
||
|
||
- [ ] 3.1 [arm-core] Инструменты: `api/pyproject.toml` (ruff, mypy), `requirements-dev.txt` с `-r requirements.txt`,
|
||
`Dockerfile` (+ строка убрана из `.gitignore`), `Makefile` (up/test/lint/migrate), `ENV_FILE` в Settings
|
||
- [ ] 3.2 [arm-core] ORM 1:1 с DBML v5.13 + миграция 0001 + `check_dbml_vs_orm.py`; проверка: upgrade → downgrade → upgrade на compose-PostgreSQL, скрипт сверки — 0 расхождений
|
||
- [ ] 3.3 [arm-core] Seed справочников/ролей/прав + dev-пользователи; auth (JWT, dev-эмитент, `require(permission)`), `GET /api/v1/me`
|
||
- [ ] 3.4 [arm-core] Вендоренный контракт + outbox-паблишер + consumer `recognition.result` + вахтёр `reply_deadline`;
|
||
интеграционный тест на compose: queued → published → результат → done, дубликат игнорируется
|
||
- [ ] 3.5 [arm-core] `.gitea/workflows/ci.yml` из шаблона 4.1 (после его готовности), job `web`
|
||
|
||
## 4. CI-шаблон (после того как хотя бы один сервис имеет тесты)
|
||
|
||
- [ ] 4.1 [docs] `docs/dev/ci/python-service.yml`: job'ы `lint`, `test` (services: postgres/nats/minio), `contract`,
|
||
`build`; опциональные шаги arm-core (`migrations`, `dbml-check`); checkout `arm-ka-docs`/`arm-ka-fixtures` по
|
||
секретам с graceful skip; проверка: workflow проходит в `arm-core` на ветке среза
|
||
- [ ] 4.2 [docs] `docs/dev/ci/web.yml` (фрагмент job `web` для arm-core: npm ci, biome, tsc, build); проверка — зелёный run в arm-core
|
||
- [ ] 4.3 [docs] `docs/dev/ci/README.md`: как копировать шаблон, какие секреты нужны (`DOCS_TOKEN`, `FIXTURES_TOKEN`,
|
||
реестр образов), правило «отличия только в блоке env»
|
||
|
||
## 5. Сервисы распознавания (детали — в их change'ах) и профиль `services`
|
||
|
||
- [ ] 5.1 [tabular-parser] Вырезать фронт/БД, вендоренный контракт, worker NATS/S3 с заглушкой `NOT_IMPLEMENTED`, Dockerfile, CI
|
||
- [ ] 5.2 [scan-gateway] Вырезать фронт/БД, вендоренный контракт, горячие папки (local/smb), эмулятор, worker с
|
||
таймаутом, Dockerfile, CI
|
||
- [ ] 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, stream `RECOGNITION` создан
|
||
- [ ] 5.4 [docs] Сквозная проверка руками по README: вставить `recognition_job` в БД через `psql` (или тестовый скрипт
|
||
arm-core) → паблишер публикует → `tabular-parser` отвечает `NOT_IMPLEMENTED` → `recognition_job.status = error`,
|
||
`error_code = NOT_IMPLEMENTED`; то же для `image` через эмулятор (`raw/{job_id}.json` появляется в MinIO);
|
||
зафиксировать в README как «проверка окружения»
|
||
|
||
## 6. Документы контекста и закрытие
|
||
|
||
- [ ] 6.1 [docs] `06-test-data.md` §6: `fixtures/directories/` — только тестовые ЮЛ/ГК (Срез 1); план счетов, правила
|
||
элиминации, права — `arm-core/api/seed/`; `09-delivery-plan.md` Срез 0: решение D-1 по пакету контрактов,
|
||
ссылка на `docs/dev/`
|
||
- [ ] 6.2 [docs] `07-open-questions.md`: OQ по итогам Среза 0 (контракт `data_type = NU` vs enum `osv_data_type`;
|
||
обязательность ОСВ расширенного подхода; источник полного плана счетов 1С) и расхождения макета из задачи B;
|
||
статусы допущений
|
||
- [ ] 6.3 [docs] Итоговая проверка: `openspec validate slice-0-skeleton --strict` зелёный в четырёх репозиториях; ссылки
|
||
между документами ведут на существующие файлы (`grep` по именам файлов)
|