Срез 0: контракт v1.0, compose-окружение (профиль services), проверки качества, OQ-48…OQ-84 #3
Loading…
x
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/1-slice-0-skeleton"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Issue #1 — реализация сквозной части change
slice-0-skeleton(64 коммита после merge proposal #2). Не закрывает issue: закрытие — командой «закрывай» после merge PR сервисов.Что сделано
contracts/): три схемы —recognition-request,recognition-result-message(статусыprocessing | done | needs_check | error,if/then),recognition-result;schema_version—^1\.\d+$(принимается любой MINOR); 8 примеров вcontracts/examples/;scripts/validate_contracts.py(валидирует примеры схемами, включаяformat: uuid/date-time).dev/docker-compose.yml, проектarm-ka): PostgreSQL 16, NATS 2.10 без JetStream, MinIO +minio-init(бакетarm-ka); порты на127.0.0.1(BIND_ADDR); профильservices—arm-core-migrate(alembic +seed --dev),arm-core:8000,tabular-parser:8001,scan-gateway:8002,scan-emulator;dev/.env.example,dev/README.md.dev/checks.md(общие целиup,test,test-integration,lint,check,check-full, сверены с тремя реальными Makefile),dev/Makefile.common(эталон),docs/Makefileс цельюcheck.03-architecture.md(соглашения шаблона команды, раскладкаapi/src, обмен через NATS без JetStream — ackprocessing, повторная публикация,dlq/NO_ACK),00-workspace-layout.md,06-test-data.md§6,09-delivery-plan.md,10-user-journey.md,mockup/INDEX.md(+22 снимка,scripts/mockup_crawl_extra.py).open-questions-proposal.mdтрёх сервисов: правила элиминации, JWT РАИСА, аудит, ack при несовместимой версии, дедупликация,PUBLISH_RETRIES, фикстуры OCR, расхождение целей Makefile и др.); кандидаты DBML v5.14 — только как OQ-строки, версия DBML не создавалась.Проверка (реальная, не только тесты)
docker compose --profile services up -d --buildrc 0;up -d --wait arm-core tabular-parser scan-gateway scan-emulatorrc 0;/healthcheckна :8000/:8001/:8002 → 200,nats: ok, у шлюзаhotfolder: ok. Сквозные сценарии через реальный compose:fixtures/osv→queued → published → processing → error,error_code = NOT_IMPLEMENTED(3 прогона;published/processingдержатся 14–51 мс — порядок доказан метками времени и логом).aep_5.PDF→published → processing (≈5 с) → error INVALID_DOCUMENT(«Не удалось определить тип документа.»),raw/<job_id>.jsonв MinIO (2 прогона). Это реальный ответ-ошибка ИС: обе фикстуры OCR (aep_5,aep_8_form4) сами являются ошибками, успешный путь image на имеющихся данных не проверить (OQ-76).tabular-parserостановлен → повторные публикации через +30/+60/+90 с с тем жеNats-Msg-Id,dlq / NO_ACKчерез ~120 с,metrics.republish_count = 3(2 прогона).validate_contracts.py: 8 примеров, rc 0.openspec validate slice-0-skeleton --strict— valid во всех четырёх репозиториях.Rulings I made
Полный список —
openspec/changes/slice-0-skeleton/design.md, таблица «Decisions made without discussion» (№1–44). Ключевые: контракт вендорится копией;group_schemaне в конверте;schema_version—^1\.\d+$вместоconst "1.0"(R-8 фазы 1); имя проекта composearm-ka, порты на127.0.0.1; неофициальные образы MinIOalpine/minioиbitnamilegacy/minio-client(официальных нет — см. ниже);user: "0:0"для minio только dev; эталонMakefile.common— scan-gateway; одноразовыйarm-core-migrate; рассогласования закрыты правкой spec/документов, а не кода: при несовместимом MAJORschema_versionсервис отвечаетerror SCHEMA_MISMATCHбез ack, нечитаемый запрос — без ответа (ядро закроет поNO_ACK/dlq),PUBLISH_RETRIES= 1 попытка + 3 повтора, ack — только на корректный запрос. Файлы схем и примеров после фазы 1 не менялись — копии в сервисах актуальны.Что нужно решить человеку
minio/minioиminio/mcнедоступны (Docker Hub denied), взяты неофициальные, только dev. Заменить на официальные или банковский реестр.dev/.env.exampleгодитсяarm-coreкак есть;scan-gatewayотвергаетOPENBAO__DATABASE__*,tabular-parser— ещё иOPENBAO__SMB__*(extra_forbidden). Запуск сервисов из venv не проверялся ни в одном сервисе (OQ-84); раздел README остаётся черновиком.dev/checks.md:make up/check-full/ARM_KA_*расходятся (OQ-80, OQ-81);.env.testпопадает в образ arm-core (OQ-82).up -dбез--build) не прогонялся (T3.7): auto-режим заблокировалdown -v+docker image rm; порядок зависимостей проверен ревью.Deferred (в follow-up issue при закрытии)
T3.7, O-6, T2.2, N-2, пункты scan-gateway 7, 8, 9, 13, 14, 15 (список — в design №41); всё остальное — как OQ-строки.
Порядок слияния
Сервисные PR читают
../docsв тесте идентичности контракта: этот PR должен влиться раньше или одновременно сRSHB/arm-core#3,RSHB/arm-tabular-parser#3,RSHB/arm-scan-gateway#3. Эмулятор «из того же образа в compose» (требование scan-gateway I-2) доставлен здесь:up -d --wait scan-gateway scan-emulator→ rc 0.🤖 Generated with Claude Code
https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
JSON Schema 2020-12 по spec recognition-contract: schema_version, job_id, file_id (uuid), pipeline, file_type, original_name, s3 {bucket, key}, reply_deadline (date-time), attempt (>= 1). Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>- pg_isready с -h 127.0.0.1: временный сервер initdb слушает только сокет (M-3) - README: mc и psql берут учётные данные из переменных окружения контейнера, а не зашитые значения (M-4) - порты postgres/nats/minio публикуются на ${BIND_ADDR:-127.0.0.1}; BIND_ADDR добавлен в .env.example и README, примечание про безопасность обновлено (M-6, R-9) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>Сервисы собираются из соседних репозиториев (../../<repo>), образы <repo>:dev; порты хоста 8000/8001/8002 на ${BIND_ADDR:-127.0.0.1}, внутри контейнера все слушают 8000. Одноразовый arm-core-migrate выполняет alembic upgrade head и seed --dev до старта arm-core. Фрагмент scan-gateway/scan-emulator взят из open-questions-proposal.md scan-gateway; образ каждого репозитория собирается одним сервисом (arm-core, scan-gateway), второй использует тег с pull_policy: never. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2Помощники dpsql/dmc/new_job/poll и фактический вывод трёх сценариев на профиле services (2026-10-04): tabular → error/NOT_IMPLEMENTED; image → эмулятор ИС → error/INVALID_DOCUMENT (ответ-ошибка из фикстуры aep_5) и raw/{job_id}.json в MinIO; tabular-parser остановлен → 3 повтора через 30 с → dlq/NO_ACK (~120 с). Что сквозная проверка Среза 0 не покрывает. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2Обновление по ответам владельца (04.10.2026)
aep_3,aep_6; PR fixtures RSHB/arm-ka-fixtures#1): §1105-domain-rules.mdпереписан —data_ocrобъект,table_structureсписок таблиц, успех =error.code == "", в каталоге ответа несколько json (склейка),confidence0–100. В одном json бывает несколько таблиц разных форм (баланс + ОФР); разбиение одной формы на сегменты не наблюдалось и не предполагается.job_idили(job_id, attempt)) не рассмотрен.dev/README.md, «Проверка окружения» приведён в соответствие с доработкой scan-gateway (склейка ответов,NOT_IMPLEMENTEDна успешных образцах,metrics.warnings, ~10 с до результата, общие томаdown -v); комментарий вdev/docker-compose.ymlпро набор файлов эмулятора.alpine/minio,bitnamilegacy/minio-client) для dev приемлемы;package-lock/npm audit— платформенные, без действий.Известный мелкий рассинхрон в README: в сценарии 2 верхние строки (
JOB=46b0c90b…, 02:12) иraw/ниже (0ea16933…, 11:23:58) из разных прогонов — на смысл не влияет.Раздел «Проверка окружения» приведён в соответствие с доработанным scan-gateway (склейка всех *.json каталога ответа в raw/{job_id}.json, ошибочные файлы набора в metrics.warnings), по результатам сквозной проверки Task 6 (04.10.2026): - сценарий 2: размер и формат raw/ (`{"job_id", "files": [...]}`), лог эмулятора с каталогом набора, processing ~10 с (задержка эмулятора + SCAN_POLL_SECONDS + SCAN_SETTLE_SECONDS), абзац про фикстуры ИС (успешные ответы есть); - добавлен сценарий 2а: aep_3 / aep_6 -> успешный ответ ИС -> NOT_IMPLEMENTED, metrics.warnings про aep_3_ofr.json; - абзац про прогон рецепта: проверены оба пути вставки legal_entity (чистая БД и on conflict); - «не покрывает»: нормализатор шлюза Среза 0 даёт NOT_IMPLEMENTED, у ошибок scan-gateway в metrics только warnings, оговорка, что `down -v` удаляет общие тома postgres-data/minio-data всех worktree; - dev/docker-compose.yml: комментарий про фикстуры ответов ИС — набор <имя>.json + <имя>_*.json (поведение не менялось). Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>