Andrey Epifancev 69fc0cc581 chore: отметить задачу 4.1 выполненной
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-04 05:25:21 +04:00

77 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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`)
- [ ] 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`
- [ ] 3.2 [arm-core] ORM 1:1 с DBML v5.13 + миграция 0001 + `check_dbml_vs_orm.py`; проверка: upgrade → downgrade → upgrade
на compose-PostgreSQL 16, скрипт сверки — 0 расхождений
- [ ] 3.3 [arm-core] Seed справочников/ролей/прав + dev-пользователи; auth (JWT, dev-эмитент, `require(permission)`), `GET /api/v1/me`
- [ ] 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; дубликат результата игнорируется; потерянный запрос
публикуется повторно
- [ ] 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` соответствуют описанию
- [ ] 4.2 [docs] Эталонный фрагмент `docs/dev/Makefile.common` (включается в `Makefile` сервисов через `include` или
копируется); проверка: `make check` в трёх репозиториях вызывает одинаковые команды (`diff` общих целей)
## 5. Сервисы распознавания (детали — в их change'ах) и профиль `services`
- [ ] 5.1 [tabular-parser] Вырезать фронт/БД, вендоренный контракт, подписчик queue group `tabular-parser` с ack
`processing` и заглушкой `NOT_IMPLEMENTED`, Dockerfile 3.11, `make check-full`
- [ ] 5.2 [scan-gateway] Вырезать фронт/БД, вендоренный контракт, горячие папки (local/smb), эмулятор, подписчик queue group
`scan-gateway` с ack и таймаутом, Dockerfile 3.11, `make check-full`
- [ ] 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`
- [ ] 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. Документы контекста и закрытие
- [ ] 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
- [ ] 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` по именам файлов)