Andrey Epifancev 49d9eca082 chore(openspec): архив change slice-0-skeleton
Срез 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
2026-10-04 19:44:29 +04:00

7.9 KiB
Raw Permalink Blame History

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 (конверт: status ∈ processing | done | needs_check | error; условные обязательные поля через if/then); проверить метасхемой
  • 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
  • 1.5 [docs] 03-architecture.md: таблица «Контракт обмена через NATS» — ссылки на три файла схем, правила Nats-Msg-Id, ack через processing, повторная публикация; проверить, что текст ссылается на существующие файлы

2. Инфраструктура разработки

  • 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 отвечает
  • 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, после первых тестов)

  • 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 по именам файлов)