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

8.1 KiB
Raw Blame History

Proposal: Срез 0 — сквозной скелет (контракт v1.0, окружение разработки, CI-шаблон)

Срез: 0 «Скелет» (docs/context/09-delivery-plan.md). Репозиторий: arm-ka-docs (сквозная часть). Issue: RSHB/arm-ka-docs#1. Дочерние change'и: arm-core/openspec/changes/slice-0-skeleton (arm-core#1), tabular-parser/openspec/changes/slice-0-skeleton (arm-tabular-parser#1), scan-gateway/openspec/changes/slice-0-skeleton (arm-scan-gateway#1).

Why

Три сервисных репозитория развёрнуты из шаблона команды, но между ними ещё нет ничего общего: контракт результата распознавания помечен «черновик», сообщения NATS описаны только таблицей в 03-architecture.md, локально поднять PostgreSQL + NATS + MinIO + ИС Сканирование нечем, CI-конфигурации у шаблона нет. Без этого Срез 1 (справочники) и Срез 2 (парсер) нельзя начать параллельно в трёх репозиториях: каждый сервис придумает свой формат сообщений и своё окружение. Срез 0 фиксирует общие точки один раз и проверяет их end-to-end на пустых обработчиках.

What Changes

  • Контракт распознавания v1.0 (docs/contracts/):
    • recognition-result.schema.json — снять пометку «черновик», schema_version = "1.0", добавить код ошибки NOT_IMPLEMENTED (сервис не поддерживает тип документа в текущей версии); структура документов (osvDocument, statementDocument) не меняется — она уточняется в Срезе 2/3 версией 1.x (additive) или 2.0 (breaking).
    • Новое: recognition-request.schema.json — тело сообщения recognition.{tabular|image}.request (job_id, file_id, pipeline, file_type, original_name, s3 {bucket, key}, reply_deadline, attempt).
    • Новое: recognition-result-message.schema.json — тело сообщения recognition.result (конверт: job_id, file_id, status, error, service, result_s3 {bucket, key}, result_schema_version, raw_s3_key, metrics). Поле group_schema в конверт не входит — ядро берёт его из documents[].group_schema файла результата (правка таблицы в 03-architecture.md).
    • Правила заголовков NATS: Nats-Msg-Id запроса = <job_id>:<attempt>, результата = result:<job_id>:<attempt>.
    • Примеры сообщений и результата — docs/contracts/examples/ (валидируются в CI сервисов).
  • Окружение разработки docs/dev/:
    • docker-compose.yml workspace-уровня: PostgreSQL 15, NATS 2.10 с JetStream, MinIO (+ init-контейнер: бакет arm-ka), эмулятор ИС Сканирование (образ scan-gateway, команда эмулятора, общая папка горячих каталогов), сервисы arm-core, tabular-parser, scan-gateway (профиль services; сборка из соседних каталогов workspace).
    • .env.example c переменными шаблона (OPENBAO__*, DEBUG) и флагами разработки (AUTH_DEV_ISSUER, SCAN_EMULATOR).
    • README.md: как поднять инфраструктуру, как запустить сервисы из venv против compose, как прогнать интеграционные тесты.
  • CI-шаблон docs/dev/ci/: workflow Gitea Actions для Python-сервиса (ruff, mypy, pytest с сервисами PostgreSQL/NATS/MinIO, проверка идентичности вендоренного контракта с docs/contracts, сборка образа; для arm-core — плюс миграции с нуля и назад, check_dbml_vs_orm.py, job для web/: biome, tsc, rsbuild build). Checkout arm-ka-fixtures в ../fixtures (или ARM_KA_FIXTURES) — через секрет с правом чтения.
  • Документы контекста: 03-architecture.md — раздел «Соглашения шаблона команды», раскладка api/src/, схема dkb, один бакет S3, конверт результата без group_schema; 00-workspace-layout.md — worktree-workspace .wt/<срез>/; 06-test-data.md §6 — справочники для seed продукта (план счетов, правила элиминации, права) живут в arm-core/api/seed/, в fixtures/directories/ остаются только тестовые справочники (ЮЛ и ГК группы «Русский бисквит», Срез 1); 09-delivery-plan.md — решение по пакету контрактов (без общего пакета, см. design); 07-open-questions.md — новые OQ.
  • Сверка макета (задача B kickoff): 10-user-journey.md, mockup/INDEX.md, новые снимки mockup/screens/, scripts/mockup_crawl_extra.py; расхождения — в 07-open-questions.md.

Capabilities

New Capabilities

  • recognition-contract: контракт обмена между ядром и сервисами распознавания — тела сообщений NATS, файл результата в S3, правила версионирования и идемпотентности.
  • dev-environment: воспроизводимое локальное окружение workspace (PostgreSQL, NATS JetStream, MinIO, эмулятор ИС Сканирование, три сервиса) с одним docker compose up.
  • ci-template: обязательный набор проверок CI для сервисных репозиториев и порядок их выполнения.

Modified Capabilities

Impact

  • Читают контракт: arm-core (outbox публикует запрос, consumer читает конверт результата и файл результата), tabular-parser и scan-gateway (читают запрос, пишут результат и конверт). Каждый сервис вендорит копию схем в api/contracts/ и проверяет идентичность с docs/contracts в CI.
  • Таблицы DBML v5.13, которые опираются на контракт: recognition_job (request_msg_id, result_msg_id, schema_version, result_schema_version, service_name/version, result_s3_object_id, metrics, group_schema, error_code), s3_object (bucket_role, bucket, key, created_by), stored_file (file_type). Новых полей нет.
  • Внешние зависимости: Docker/Compose у разработчика; Gitea Actions с раннером, умеющим services: и docker build (вопрос к человеку — см. design «Open Questions»).

Non-goals

  • Финальная структура osvDocument/statementDocument (уточняется в Срезах 2–3 по реальным файлам; здесь только фиксируется версия и правила эволюции).
  • Контракт ex-payload-v1.schema.json (Срез 7).
  • Production-значения инфраструктуры банка (адреса NATS/S3/OpenBao, nkeys) — compose только для разработки.
  • Публикация общего python-пакета контрактов (решено: не делать, см. design D-1).
  • Какие-либо экраны фронта.