Andrey Epifancev 0c04127aec docs: OpenSpec change slice-0-skeleton — сквозной скелет Среза 0
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>
2026-10-03 02:44:14 +04:00

7.1 KiB
Raw 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 (конверт результата, условные обязательные поля через 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 по именам файлов)