Срез 0: контракт v1.0, compose-окружение (профиль services), проверки качества, OQ-48…OQ-84 #3

Merged
aep merged 68 commits from feat/1-slice-0-skeleton into main 2026-10-04 18:39:31 +03:00
Owner

Issue #1 — реализация сквозной части change slice-0-skeleton (64 коммита после merge proposal #2). Не закрывает issue: закрытие — командой «закрывай» после merge PR сервисов.

Что сделано

  • Контракт v1.0 (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).
  • Compose (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.
  • Проверки качества вместо CI: 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 — ack processing, повторная публикация, 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).
  • Открытые вопросы: OQ-31…OQ-47 (макет, контракт, seed) и OQ-48…OQ-84 (из open-questions-proposal.md трёх сервисов: правила элиминации, JWT РАИСА, аудит, ack при несовместимой версии, дедупликация, PUBLISH_RETRIES, фикстуры OCR, расхождение целей Makefile и др.); кандидаты DBML v5.14 — только как OQ-строки, версия DBML не создавалась.

Проверка (реальная, не только тесты)

docker compose --profile services up -d --build rc 0; up -d --wait arm-core tabular-parser scan-gateway scan-emulator rc 0; /healthcheck на :8000/:8001/:8002 → 200, nats: ok, у шлюза hotfolder: ok. Сквозные сценарии через реальный compose:

  • tabular: реальная ОСВ из fixtures/osv → queued → published → processing → error, error_code = NOT_IMPLEMENTED (3 прогона; published/processing держатся 14–51 мс — порядок доказан метками времени и логом).
  • image: aep_5.PDF → published → processing (≈5 с) → error INVALID_DOCUMENT («Не удалось определить тип документа.»), raw/<job_id>.json в MinIO (2 прогона). Это реальный ответ-ошибка ИС: обе фикстуры OCR (aep_5, aep_8_form4) сами являются ошибками, успешный путь image на имеющихся данных не проверить (OQ-76).
  • dlq: 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); имя проекта compose arm-ka, порты на 127.0.0.1; неофициальные образы MinIO alpine/minio и bitnamilegacy/minio-client (официальных нет — см. ниже); user: "0:0" для minio только dev; эталон Makefile.common — scan-gateway; одноразовый arm-core-migrate; рассогласования закрыты правкой spec/документов, а не кода: при несовместимом MAJOR schema_version сервис отвечает error SCHEMA_MISMATCH без ack, нечитаемый запрос — без ответа (ядро закроет по NO_ACK/dlq), PUBLISH_RETRIES = 1 попытка + 3 повтора, ack — только на корректный запрос. Файлы схем и примеров после фазы 1 не менялись — копии в сервисах актуальны.

Что нужно решить человеку

  1. Образы MinIO: minio/minio и minio/mc недоступны (Docker Hub denied), взяты неофициальные, только dev. Заменить на официальные или банковский реестр.
  2. N-1 (исправлено): общий dev/.env.example годится arm-core как есть; scan-gateway отвергает OPENBAO__DATABASE__*, tabular-parser — ещё и OPENBAO__SMB__* (extra_forbidden). Запуск сервисов из venv не проверялся ни в одном сервисе (OQ-84); раздел README остаётся черновиком.
  3. Выровнять сервисы под dev/checks.md: make up/check-full/ARM_KA_* расходятся (OQ-80, OQ-81); .env.test попадает в образ arm-core (OQ-82).
  4. Чистый старт без локальных образов (up -d без --build) не прогонялся (T3.7): auto-режим заблокировал down -v + docker image rm; порядок зависимостей проверен ревью.
  5. Решения со статусом «вопрос»: OQ-56, 73, 76, 77, 78, 79.

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

Issue #1 — реализация сквозной части change `slice-0-skeleton` (64 коммита после merge proposal #2). Не закрывает issue: закрытие — командой «закрывай» после merge PR сервисов. ## Что сделано - **Контракт v1.0** (`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`). - **Compose** (`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`. - **Проверки качества вместо CI:** `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 — ack `processing`, повторная публикация, `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`). - **Открытые вопросы:** OQ-31…OQ-47 (макет, контракт, seed) и OQ-48…OQ-84 (из `open-questions-proposal.md` трёх сервисов: правила элиминации, JWT РАИСА, аудит, ack при несовместимой версии, дедупликация, `PUBLISH_RETRIES`, фикстуры OCR, расхождение целей Makefile и др.); кандидаты DBML v5.14 — только как OQ-строки, версия DBML не создавалась. ## Проверка (реальная, не только тесты) `docker compose --profile services up -d --build` rc 0; `up -d --wait arm-core tabular-parser scan-gateway scan-emulator` rc 0; `/healthcheck` на :8000/:8001/:8002 → 200, `nats: ok`, у шлюза `hotfolder: ok`. Сквозные сценарии через реальный compose: - **tabular:** реальная ОСВ из `fixtures/osv` → `queued → published → processing → error`, `error_code = NOT_IMPLEMENTED` (3 прогона; `published`/`processing` держатся 14–51 мс — порядок доказан метками времени и логом). - **image:** `aep_5.PDF` → `published → processing (≈5 с) → error INVALID_DOCUMENT` («Не удалось определить тип документа.»), `raw/<job_id>.json` в MinIO (2 прогона). Это реальный ответ-ошибка ИС: **обе фикстуры OCR (`aep_5`, `aep_8_form4`) сами являются ошибками**, успешный путь image на имеющихся данных не проверить (OQ-76). - **dlq:** `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); имя проекта compose `arm-ka`, порты на `127.0.0.1`; **неофициальные образы MinIO** `alpine/minio` и `bitnamilegacy/minio-client` (официальных нет — см. ниже); `user: "0:0"` для minio только dev; эталон `Makefile.common` — scan-gateway; одноразовый `arm-core-migrate`; **рассогласования закрыты правкой spec/документов, а не кода:** при несовместимом MAJOR `schema_version` сервис отвечает `error SCHEMA_MISMATCH` без ack, нечитаемый запрос — без ответа (ядро закроет по `NO_ACK`/`dlq`), `PUBLISH_RETRIES` = 1 попытка + 3 повтора, ack — только на корректный запрос. Файлы схем и примеров после фазы 1 не менялись — копии в сервисах актуальны. ## Что нужно решить человеку 1. **Образы MinIO:** `minio/minio` и `minio/mc` недоступны (Docker Hub denied), взяты неофициальные, только dev. Заменить на официальные или банковский реестр. 2. **N-1 (исправлено):** общий `dev/.env.example` годится `arm-core` как есть; `scan-gateway` отвергает `OPENBAO__DATABASE__*`, `tabular-parser` — ещё и `OPENBAO__SMB__*` (`extra_forbidden`). Запуск сервисов из venv не проверялся ни в одном сервисе (OQ-84); раздел README остаётся черновиком. 3. Выровнять сервисы под `dev/checks.md`: `make up`/`check-full`/`ARM_KA_*` расходятся (OQ-80, OQ-81); `.env.test` попадает в образ arm-core (OQ-82). 4. Чистый старт без локальных образов (`up -d` без `--build`) не прогонялся (T3.7): auto-режим заблокировал `down -v` + `docker image rm`; порядок зависимостей проверен ревью. 5. Решения со статусом «вопрос»: OQ-56, 73, 76, 77, 78, 79. ## 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) https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 64 commits 2026-10-04 06:27:08 +03:00
docs/superpowers/plans/2026-10-03-slice-0-skeleton*.md сгенерирован 1:1 из openspec/changes/slice-0-skeleton/tasks.md
(заголовки «Task N» для скриптов subagent-driven-development, Global Constraints из спеки и CLAUDE.md).
.gitignore: .codegraph/, .superpowers/, .bounded, .DS_Store.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- title без «ЧЕРНОВИК v1, уточнить в Срезе 2»
- $comment о правилах версионирования (MAJOR.MINOR)
- NOT_IMPLEMENTED в перечне error.code
- пустой documents допустим только при status = error (if/then, minItems: 1 для done и needs_check)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Конверт на subject recognition.result: status processing | done | needs_check | error,
условные обязательные поля через if/then (done/needs_check → result_s3 и
result_schema_version; error → error). group_schema в конверт не входит.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
PostgreSQL 16, NATS 2.10 без JetStream, MinIO и minio-init с бакетом arm-ka;
имя проекта arm-ka, порты и учётные данные из .env, версии образов зафиксированы.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Черновик: профиль services, запуск из venv и интеграционные тесты помечены
как планируемые и дописываются в задачах 5.x.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Спека и R-7 (design №18): dev/.env.example остаётся единственным источником для запуска из venv,
поэтому в него добавлены OPENBAO__SMB__* и NATS_ENABLED=true; README отделяет текущие цели
Makefile arm-core от планируемых по spec quality-checks.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- schema_version: const "1.0" заменён на pattern ^1\.\d+$ во всех трёх схемах (I-1, R-8);
  в $comment добавлено правило раскатки нового MINOR сначала на потребителей
- границы 0–100 для organization_name_confidence, inn_confidence, line_code_confidence,
  line_name_confidence (I-2)
- description recognition-result-message: две формы Nats-Msg-Id на recognition.result (M-5)

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
- убрана устаревшая пометка «черновик» у recognition-result.schema.json (M-1)
- в строку ack добавлен schema_version, metrics и raw_s3_key помечены как опциональные,
  правило версионирования дополнено принятием любого MINOR и порядком раскатки (M-2)

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>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Цели venv, lint, test, test-integration, check, docker-build, check-full, up
по эталону scan-gateway; различия сервисов вынесены в переменные
(MYPY_PATHS, IMAGE, COMPOSE_*, CHECK_FULL_STEPS).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Уточнены: fixtures только в arm-core, mypy scripts у arm-core, формулировка
про инфраструктуру compose и «одинаковую семантику» целей.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Сервисы собираются из соседних репозиториев (../../<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
Порты хоста ARM_CORE_PORT/TABULAR_PARSER_PORT/SCAN_GATEWAY_PORT (8000/8001/8002, в контейнере 8000);
раздел «Профиль services»: команды, таблица портов, порядок старта, фактический вывод healthcheck,
коды возврата up -d --wait (в т.ч. scan-gateway scan-emulator — 0), пересборка; сброс только с
--profile services; предупреждение об интеграционных тестах при поднятом профиле.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
- T3.3: риск общих queue group подтверждён чтением тестов tabular-parser и
  scan-gateway (test_roundtrip, боевые *.request); тесты arm-core изолированы
  (временная БД, уникальный subject результатов); команда проверки подписчиков.
- T3.4: «Остаточные тома» — down -v только с --profile services.
- T3.5: GET / отвечает 307 на // и затем 404.
- T3.6: up -d --build <сервис> пересоздаёт сервис и зависимости: arm-core-migrate
  пересоздаётся вместе с arm-core, scan-emulator со scan-gateway — нет (проверено).

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
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Вопросы из open-questions-proposal.md трёх сервисов (с дедупликацией), кандидаты
DBML v5.14 (только как строки реестра) и находки сквозной проверки окружения.
У каждой строки — репозиторий и маркер источника. OQ-45/46/47 переведены в
«допущение принято и применено» с фактами seed и ORM.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
В OpenBAOSettings scan-gateway нет поля DATABASE (extra_forbidden), поэтому общий dev/.env.example
годится только arm-core как есть. Исправлены комментарий в .env.example, раздел dev/README.md,
решение №44 в design.md и OQ-84.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 1 commit 2026-10-04 12:34:00 +03:00
§11 05-domain-rules.md переписан по реальным ответам ИС: data_ocr — объект, table_structure — список таблиц,
успех — error.code == "", в каталоге ответа несколько json (склейка), confidence 0–100. OQ-13/14/77/78/79 закрыты или
уточнены, OQ-56 — осознанный техдолг, OQ-76 — частично (образцы добавлены), новый OQ-85 — возможность JetStream
на платформе (проверить позже). OQ-73 остаётся открытым.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 1 commit 2026-10-04 12:38:23 +03:00
Тип документа задаёт label таблицы; несколько таблиц одного типа (баланс по страницам) — части одного документа
(уникальный индекс document в DBML: один ББ и один ОФР на файл); в одном json может быть несколько таблиц.
Допущение вынесено в OQ-77 для подтверждения на реальном ответе.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
aep added 1 commit 2026-10-04 13:08:46 +03:00
Разбиение одной формы на несколько таблиц в образцах не встречалось; наблюдается только несколько таблиц разных
форм в одном json (баланс + ОФР). Нештатный случай (повтор label) — NEEDS_CHECK, правило — Срез 3.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Author
Owner

Обновление по ответам владельца (04.10.2026)

  • Формат ответа ИС по реальным образцам (aep_3, aep_6; PR fixtures RSHB/arm-ka-fixtures#1): §11 05-domain-rules.md переписан — data_ocr объект, table_structure список таблиц, успех = error.code == "", в каталоге ответа несколько json (склейка), confidence 0–100. В одном json бывает несколько таблиц разных форм (баланс + ОФР); разбиение одной формы на сегменты не наблюдалось и не предполагается.
  • Реестр OQ: закрыты/уточнены OQ-13, 14, 77, 78, 79; OQ-56 — осознанный техдолг; OQ-76 — частично (образцы добавлены, нормализатор — Срез 3); новый OQ-85 — возможен ли JetStream на платформе (проверить позже); OQ-73 (дедуп по job_id или (job_id, attempt)) не рассмотрен.
  • dev/README.md, «Проверка окружения» приведён в соответствие с доработкой scan-gateway (склейка ответов, NOT_IMPLEMENTED на успешных образцах, metrics.warnings, ~10 с до результата, общие тома down -v); комментарий в dev/docker-compose.yml про набор файлов эмулятора.
  • Решения человека: образы MinIO (alpine/minio, bitnamilegacy/minio-client) для dev приемлемы; package-lock/npm audit — платформенные, без действий.

Известный мелкий рассинхрон в README: в сценарии 2 верхние строки (JOB=46b0c90b…, 02:12) и raw/ ниже (0ea16933…, 11:23:58) из разных прогонов — на смысл не влияет.

## Обновление по ответам владельца (04.10.2026) - **Формат ответа ИС по реальным образцам** (`aep_3`, `aep_6`; PR fixtures RSHB/arm-ka-fixtures#1): §11 `05-domain-rules.md` переписан — `data_ocr` объект, `table_structure` список таблиц, успех = `error.code == ""`, в каталоге ответа несколько json (склейка), `confidence` 0–100. В одном json бывает несколько таблиц **разных** форм (баланс + ОФР); разбиение одной формы на сегменты не наблюдалось и не предполагается. - **Реестр OQ:** закрыты/уточнены OQ-13, 14, 77, 78, 79; OQ-56 — осознанный техдолг; OQ-76 — частично (образцы добавлены, нормализатор — Срез 3); **новый OQ-85 — возможен ли JetStream на платформе (проверить позже)**; OQ-73 (дедуп по `job_id` или `(job_id, attempt)`) не рассмотрен. - **`dev/README.md`, «Проверка окружения»** приведён в соответствие с доработкой scan-gateway (склейка ответов, `NOT_IMPLEMENTED` на успешных образцах, `metrics.warnings`, ~10 с до результата, общие тома `down -v`); комментарий в `dev/docker-compose.yml` про набор файлов эмулятора. - Решения человека: образы MinIO (`alpine/minio`, `bitnamilegacy/minio-client`) для dev приемлемы; `package-lock`/`npm audit` — платформенные, без действий. Известный мелкий рассинхрон в README: в сценарии 2 верхние строки (`JOB=46b0c90b…`, 02:12) и `raw/` ниже (`0ea16933…`, 11:23:58) из разных прогонов — на смысл не влияет.
aep added 1 commit 2026-10-04 15:21:04 +03:00
Раздел «Проверка окружения» приведён в соответствие с доработанным 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>
aep merged commit 8ee998d189 into main 2026-10-04 18:39:31 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-ka-docs#3
No description provided.