Follow-ups from #1 #5

Open
opened 2026-10-04 18:45:56 +03:00 by aep · 0 comments
Owner

Отложенное из Среза 0 (issue #1 в arm-ka-docs, arm-core, arm-tabular-parser, arm-scan-gateway; PR #2 proposal и #3 реализация в каждом). Маркер — одна строка — откуда. Полные формулировки — в таблицах design.md и open-questions-proposal.md заархивированных change'ей (openspec/changes/archive/2026-10-04-slice-0-skeleton/).

Нужны напоминания и решения человека

  • OQ-85 JetStream: выяснить у платформы, можно ли подключить JetStream (серверный дедуп, durable consumer'ы) — решение человека 04.10.2026 «проверить позже»; напомнить перед Срезом 2 и при следующем разговоре о надёжности доставки.
  • OQ-73 / I-3: ключ дедупа job_id или (job_id, attempt); сейчас replay с attempt+1 получает только ack (tabular-parser P-3, scan-gateway R-17).
  • OQ-72: нужен ли ack при несовместимой schema_version; сейчас — ошибка без ack (правка docs, R-16/R-20).
  • OQ-56: append-only audit_event на уровне БД (триггер или REVOKE UPDATE, DELETE) — осознанный техдолг (arm-core O-8).
  • JWT РАИСА: алгоритм, источник ключей, claims, aud/iss; обязательный aud в проде (arm-core T16.2).
  • Версия Node для web/ (пока node:22).
  • I-4: сценарий «NATS перезапущен, подписка ≤ 20 с» не автоматизирован и не прогонялся (tabular-parser I-4, scan-gateway T11.7).
  • Реальная SMB-шара: первый прогон на стенде ИС; при TIMEOUT на каждом задании — сверять smbclient.stat().st_size (scan-gateway T2.3); фактические имена каталогов Input/Output/Tmp.
  • OQ-84: запуск сервисов из venv против compose не проверен; общий dev/.env.example годится только arm-core (scan-gateway и tabular-parser отвергают OPENBAO__DATABASE__*/SMB — extra_forbidden).
  • T3.7 (docs): чистый старт без локальных образов (up -d без --build) не прогонялся.
  • OQ-76 / OQ-13/14 / OQ-77: нормализация ответа ИС (образцы aep_3, aep_6 есть) — Срез 3; реальный многотабличный/многостраничный случай подтвердить на данных.
  • Образы MinIO в dev/docker-compose.yml — неофициальные (alpine/minio, bitnamilegacy/minio-client): приемлемо для dev (решение человека), заменить при доступе к официальным/банковскому реестру.

arm-core

  • T1.2 dev-зависимости без constraint на прод-пины; T8.3 required_document_rule NULLS NOT DISTINCT (кандидат DBML v5.14); T12.2 смена кода права / переименование ГО в seed → IntegrityError / второй ГО; T13.5 названия-заглушки субсчетов (OQ-47); T14.1–T14.3 правило 1: исключения, резервный 01, составные статьи.
  • T15.4 seed --dev без guard по DEBUG; T16.2 aud/iss не обязательны; T17.2 403-ветки не логируются, нет аудита LOGIN_FAILED; T20.7 result_schema_version допускает любой MAJOR.
  • T22.2 ошибки прав NATS логируются как «нет связи»; T22.9 / T24.9 / I-6 последовательный NATS-callback + длинный маппер Среза 2 → ложный republish/dlq NO_ACK (развести быстрый inbox и маппинг до Среза 2); T23.1 replay: сброс republish_count/reply_deadline; T23.9 пропускная способность 50 заданий/5 с; T24.3 проверка префикса ключа результата и роли бакета до маппера; T24.6 FOR NO KEY UPDATE.
  • T26.1 вписывать вывод check-full в описание PR; T26.2 web/package-lock.json не в репозитории, npm audit 6 high (платформенные зависимости — без действий); M-1 import src.* создаёт Settings/app; M-5 verifier строится лениво → 500 на первом запросе; M-6 recognition_exchange.py ~786 строк; M-8 seed не отзывает убранные из yaml права; M-10 литерал 52 в тесте, Numeric(asdecimal=False) не ловится.
  • Прочее: 404 вместо 405 для неверного метода под /api/v1; stored_file.status не обновляется inbox (Срез 2); CORS * + credentials, ProxyHeadersMiddleware(["*"]), /docs открыт в проде; аудит LOGIN/LOGIN_FAILED; .dockerignore пускает api/.env.test в образ (OQ-82); в образе нет фронта (GET / → 404, OQ-62); три коммита задачи 2 переписаны (трейлеры).

arm-tabular-parser

  • M-6 cert_check=False для MinIO; M-9 /healthcheck ok при незавершённом on_connected, закрытие клиента терминально; M-10 сырой текст исключений S3/парсера в error.message (Срез 2); O-5 модели контракта продублированы в трёх репозиториях; O-8 enqueue=True в шаблонном logger.py (leaked semaphore при SIGTERM).
  • stop() при отмене вызывающего оставляет клиент NATS не закрытым; asyncio.to_thread не отменяется при STOP_TIMEOUT; для Среза 2: неограниченная очередь, файл целиком в памяти (лимит 1 ГБ), reply_deadline не проверяется; P-1 нечитаемый запрос без ответа, P-4 порт сервиса в docs README.

arm-scan-gateway

  • T1.12 tasks.md 7.0 «№54–62» (история); T2.3 (см. выше, SMB stat); T2.5 неточный docstring вытеснения; T3.2 NaN/Infinity попадают в raw (до Среза 3); T3.4 один суррогат переводит raw в ASCII-escape; T3.5 лишнее копирование фикстур в test_merge.
  • T4.2 spy на os.replace патчит глобально; T4.3 rmtree + rename существующего Output/<uuid> неатомарны (только dev-эмулятор); T4.4 широкий except FileNotFoundError; T4.5 имя staging зависит только от uuid; T5.2 интеграция не проверяет settle (покрыто unit); T5.4 гонка .done в check_files; T6.5 aep_30 не проверяется в compose; T6.7 нет привязки образа к SHA; O-3 шум loguru в двух старых тестах; O-7 проверка SETTLE < TIMEOUT не учитывает + POLL, сдвиг номеров строк, README:59–60.
  • T12.5 штатная остановка не публикует конверты отменённых заданий: деплой = окончательный timeout для заданий в работе (приоритетно); зависший poll/put по SMB до 60 с не прерывается дедлайном (нужен connection_timeout); json.loads ответа ИС в event loop; worker.py 600+ строк; /healthcheck всегда 200 при недоступном NATS (читать поле nats); nats.py логирует NATS_URL (креды в URL); S3Storage.get_bytes без лимита размера; до 4 зависших SMB-потоков в executor; параллельные интеграционные тесты arm-core и шлюза делят queue group scan-gateway; индекс codegraph устарел.

arm-ka-docs

  • T2.2 .DEFAULT_GOAL в Makefile.common; N-2 design №18 («игнорируемые» против №44); O-6 Makefile.common в docs не запускается самостоятельно; O-1/O-2/O-4/O-5 расхождения целей Makefile сервисов с эталоном dev/checks.md (up, check-full, mypy scripts, ARM_KA_*; OQ-80, OQ-81); пункты 7, 8, 9, 13, 14, 15 таблицы предложений scan-gateway; OQ-45 (data_type = NU vs enum osv_data_type), 50, 51, 55, 57, 59 — кандидаты DBML v5.14; мелкий рассинхрон прогонов в dev/README.md сценарий 2 (JOB=46b0c90b… / 0ea16933…); open-questions-proposal.md сервисов остаются в архивах change'ей, их OQ уже внесены в 07-open-questions.md (OQ-48…OQ-85).
  • Процесс: проектный хук .claude/hooks/guard-main.sh не имеет исключения для openspec archive (глобальный хук имеет) — архив пришлось вести через PR; добавить исключение «коммит затрагивает только openspec/» или принять процесс «архив через PR».

🤖 Generated with Claude Code

https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2

Отложенное из Среза 0 (issue #1 в `arm-ka-docs`, `arm-core`, `arm-tabular-parser`, `arm-scan-gateway`; PR #2 proposal и #3 реализация в каждом). Маркер — одна строка — откуда. Полные формулировки — в таблицах `design.md` и `open-questions-proposal.md` заархивированных change'ей (`openspec/changes/archive/2026-10-04-slice-0-skeleton/`). ## Нужны напоминания и решения человека - [ ] **OQ-85 JetStream:** выяснить у платформы, можно ли подключить JetStream (серверный дедуп, durable consumer'ы) — решение человека 04.10.2026 «проверить позже»; напомнить перед Срезом 2 и при следующем разговоре о надёжности доставки. - [ ] **OQ-73 / I-3:** ключ дедупа `job_id` или `(job_id, attempt)`; сейчас replay с `attempt+1` получает только ack (tabular-parser P-3, scan-gateway R-17). - [ ] **OQ-72:** нужен ли ack при несовместимой `schema_version`; сейчас — ошибка без ack (правка docs, R-16/R-20). - [ ] **OQ-56:** append-only `audit_event` на уровне БД (триггер или `REVOKE UPDATE, DELETE`) — осознанный техдолг (arm-core O-8). - [ ] **JWT РАИСА:** алгоритм, источник ключей, claims, `aud`/`iss`; обязательный `aud` в проде (arm-core T16.2). - [ ] **Версия Node** для `web/` (пока `node:22`). - [ ] **I-4:** сценарий «NATS перезапущен, подписка ≤ 20 с» не автоматизирован и не прогонялся (tabular-parser I-4, scan-gateway T11.7). - [ ] **Реальная SMB-шара:** первый прогон на стенде ИС; при `TIMEOUT` на каждом задании — сверять `smbclient.stat().st_size` (scan-gateway T2.3); фактические имена каталогов `Input`/`Output`/`Tmp`. - [ ] **OQ-84:** запуск сервисов из venv против compose не проверен; общий `dev/.env.example` годится только arm-core (scan-gateway и tabular-parser отвергают `OPENBAO__DATABASE__*`/`SMB` — `extra_forbidden`). - [ ] **T3.7 (docs):** чистый старт без локальных образов (`up -d` без `--build`) не прогонялся. - [ ] **OQ-76 / OQ-13/14 / OQ-77:** нормализация ответа ИС (образцы `aep_3`, `aep_6` есть) — Срез 3; реальный многотабличный/многостраничный случай подтвердить на данных. - [ ] Образы MinIO в `dev/docker-compose.yml` — неофициальные (`alpine/minio`, `bitnamilegacy/minio-client`): приемлемо для dev (решение человека), заменить при доступе к официальным/банковскому реестру. ## arm-core - T1.2 dev-зависимости без constraint на прод-пины; T8.3 `required_document_rule` NULLS NOT DISTINCT (кандидат DBML v5.14); T12.2 смена кода права / переименование ГО в seed → IntegrityError / второй ГО; T13.5 названия-заглушки субсчетов (OQ-47); T14.1–T14.3 правило 1: исключения, резервный 01, составные статьи. - T15.4 seed `--dev` без guard по DEBUG; T16.2 `aud`/`iss` не обязательны; T17.2 403-ветки не логируются, нет аудита `LOGIN_FAILED`; T20.7 `result_schema_version` допускает любой MAJOR. - T22.2 ошибки прав NATS логируются как «нет связи»; **T22.9 / T24.9 / I-6 последовательный NATS-callback + длинный маппер Среза 2 → ложный republish/`dlq NO_ACK`** (развести быстрый inbox и маппинг до Среза 2); T23.1 replay: сброс `republish_count`/`reply_deadline`; T23.9 пропускная способность 50 заданий/5 с; T24.3 проверка префикса ключа результата и роли бакета до маппера; T24.6 `FOR NO KEY UPDATE`. - T26.1 вписывать вывод `check-full` в описание PR; T26.2 `web/package-lock.json` не в репозитории, `npm audit` 6 high (платформенные зависимости — без действий); M-1 `import src.*` создаёт Settings/app; M-5 verifier строится лениво → 500 на первом запросе; M-6 `recognition_exchange.py` ~786 строк; M-8 seed не отзывает убранные из yaml права; M-10 литерал 52 в тесте, `Numeric(asdecimal=False)` не ловится. - Прочее: 404 вместо 405 для неверного метода под `/api/v1`; `stored_file.status` не обновляется inbox (Срез 2); CORS `*` + credentials, `ProxyHeadersMiddleware(["*"])`, `/docs` открыт в проде; аудит LOGIN/LOGIN_FAILED; `.dockerignore` пускает `api/.env.test` в образ (OQ-82); в образе нет фронта (`GET /` → 404, OQ-62); три коммита задачи 2 переписаны (трейлеры). ## arm-tabular-parser - M-6 `cert_check=False` для MinIO; M-9 `/healthcheck` `ok` при незавершённом `on_connected`, закрытие клиента терминально; M-10 сырой текст исключений S3/парсера в `error.message` (Срез 2); O-5 модели контракта продублированы в трёх репозиториях; O-8 `enqueue=True` в шаблонном `logger.py` (`leaked semaphore` при SIGTERM). - `stop()` при отмене вызывающего оставляет клиент NATS не закрытым; `asyncio.to_thread` не отменяется при `STOP_TIMEOUT`; для Среза 2: неограниченная очередь, файл целиком в памяти (лимит 1 ГБ), `reply_deadline` не проверяется; P-1 нечитаемый запрос без ответа, P-4 порт сервиса в docs README. ## arm-scan-gateway - T1.12 `tasks.md` 7.0 «№54–62» (история); T2.3 (см. выше, SMB `stat`); T2.5 неточный docstring вытеснения; T3.2 NaN/Infinity попадают в raw (до Среза 3); T3.4 один суррогат переводит raw в ASCII-escape; T3.5 лишнее копирование фикстур в `test_merge`. - T4.2 spy на `os.replace` патчит глобально; T4.3 `rmtree` + rename существующего `Output/<uuid>` неатомарны (только dev-эмулятор); T4.4 широкий `except FileNotFoundError`; T4.5 имя staging зависит только от uuid; T5.2 интеграция не проверяет settle (покрыто unit); T5.4 гонка `.done` в `check_files`; T6.5 `aep_30` не проверяется в compose; T6.7 нет привязки образа к SHA; O-3 шум loguru в двух старых тестах; O-7 проверка `SETTLE < TIMEOUT` не учитывает `+ POLL`, сдвиг номеров строк, README:59–60. - **T12.5 штатная остановка не публикует конверты отменённых заданий: деплой = окончательный `timeout` для заданий в работе** (приоритетно); зависший `poll`/`put` по SMB до 60 с не прерывается дедлайном (нужен `connection_timeout`); `json.loads` ответа ИС в event loop; `worker.py` 600+ строк; `/healthcheck` всегда 200 при недоступном NATS (читать поле `nats`); `nats.py` логирует `NATS_URL` (креды в URL); `S3Storage.get_bytes` без лимита размера; до 4 зависших SMB-потоков в executor; параллельные интеграционные тесты arm-core и шлюза делят queue group `scan-gateway`; индекс codegraph устарел. ## arm-ka-docs - T2.2 `.DEFAULT_GOAL` в `Makefile.common`; N-2 design №18 («игнорируемые» против №44); O-6 `Makefile.common` в docs не запускается самостоятельно; O-1/O-2/O-4/O-5 расхождения целей Makefile сервисов с эталоном `dev/checks.md` (`up`, `check-full`, `mypy scripts`, `ARM_KA_*`; OQ-80, OQ-81); пункты 7, 8, 9, 13, 14, 15 таблицы предложений scan-gateway; OQ-45 (`data_type = NU` vs enum `osv_data_type`), 50, 51, 55, 57, 59 — кандидаты DBML v5.14; мелкий рассинхрон прогонов в `dev/README.md` сценарий 2 (`JOB=46b0c90b…` / `0ea16933…`); `open-questions-proposal.md` сервисов остаются в архивах change'ей, их OQ уже внесены в `07-open-questions.md` (OQ-48…OQ-85). - Процесс: проектный хук `.claude/hooks/guard-main.sh` не имеет исключения для `openspec archive` (глобальный хук имеет) — архив пришлось вести через PR; добавить исключение «коммит затрагивает только `openspec/`» или принять процесс «архив через PR». 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
Sign in to join this conversation.
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

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