47 Commits

Author SHA1 Message Date
Andrey Epifancev
54197a07db docs: README — адрес по умолчанию 0.0.0.0, а .env.example сужает до 127.0.0.1
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:33:45 +04:00
Andrey Epifancev
1bbcdc433e chore: отметка 5.1 — make check-full зелёный
Два подряд прогона: ruff/mypy чисто, unit 247 passed, integration 8 passed,
образ tabular-parser собран.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:31:05 +04:00
Andrey Epifancev
e0b2aaca9a docs: оговорка про queue group в интеграционных тестах, правка CLAUDE.md (T10.3, T3.3)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:29:28 +04:00
Andrey Epifancev
67a4311150 docs: докстринги контракта с точки зрения tabular-parser, паритет subjects с arm-core (T6.1-T6.3)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:29:28 +04:00
Andrey Epifancev
6491fdd538 test: проверка остановки воркера по снятым задачам и устойчивый teardown uploads (T10.1, T10.2)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:29:28 +04:00
Andrey Epifancev
5c96189146 docs: решения R-29..R-33 (интеграционный тест 4.4) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:27:30 +04:00
Andrey Epifancev
a62d2e24b1 test: интеграционный round-trip сервиса против compose-NATS и MinIO (задача 4.4)
Приложение поднимается в процессе теста через lifespan с NATS_ENABLED=True; тест в роли ядра кладёт исходник в
uploads/, публикует запрос и собирает recognition.result по своему job_id: ack processing, затем error
NOT_IMPLEMENTED с правильными Nats-Msg-Id и валидные по схеме конверты; повтор запроса — только ещё один ack
(второго результата нет в окне тишины QUIET_WINDOW). Плюс сценарии spec: нет объекта в S3 -> FILE_READ_ERROR и
сервис работает дальше; schema_version 2.0 -> один SCHEMA_MISMATCH без ack.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:23:35 +04:00
Andrey Epifancev
c16a7f6bf6 docs: решения R-27, R-28 (фикс-раунд задачи 4.3) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:19:59 +04:00
Andrey Epifancev
b7d4f0c17a test, docs: порядок старта и проверка бакета в тестах приложения; README/CLAUDE.md без устаревших «добавляется задачей», spec без номера рулинга
T9.2: события старта worker.start → nats.start; _connect_s3 — info/warning/error по ответу проверки бакета, клиент
остаётся. T9.3: spec без «R-17». T9.4: README и CLAUDE.md описывают уже существующие файлы без отсылок к будущим задачам.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:18:09 +04:00
Andrey Epifancev
18276e607e fix: воркер — задание не теряется молча при остановке во время ack, невалидный дубль job_id не публикует SCHEMA_MISMATCH
I9.1: после ack повторная проверка приёма — warning error_category=shutdown, job_id снимается из «в работе».
T9.7: невалидное тело с job_id в работе/обработанным — warning и сброс (msg-id настоящего результата не занимается).
T9.5: error.message исхода парсера — одной строкой, ≤ 1000 символов. T9.6: docstring stop() про to_thread.
T9.1: тест конкуренции без опроса со sleep.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:17:11 +04:00
Andrey Epifancev
82756b8c97 docs: D-6 — значение nats=off в healthcheck (R-17)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:15:53 +04:00
Andrey Epifancev
e2d31b894c docs: решения R-18..R-26 (воркер, задача 4.3) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:10:59 +04:00
Andrey Epifancev
cfba21b615 docs: предложения P-1–P-3 по контракту из задачи 4.3; отметки Task 9 / 4.3
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:09:06 +04:00
Andrey Epifancev
f7cbe968e1 chore: удалён шаблонный core/nats_callback.py (R-4), CLAUDE.md актуализирован
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:09:06 +04:00
Andrey Epifancev
a7862c1843 feat: запуск воркера в lifespan при NATS_ENABLED и поле nats = ok | down | off в /healthcheck
Подписка — через on_connected NatsConnection; остановка: воркер (дорабатывает очередь) → NATS → S3. Клиент S3
остаётся и при неудачной проверке бакета, отсутствие бакета — warning (T2.1). Тест lifespan и healthcheck с фейками
(T8.7); формулировки nats в README, .env.example и spec приведены к R-17.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:09:06 +04:00
Andrey Epifancev
e1231dcdb4 feat: воркер распознавания src/core/worker.py — ack до чтения S3, дедуп job_id, таблица ошибок D-5
on_request: валидация (pydantic + MAJOR = 1) → повторный job_id получает только ack → ack processing → очередь;
рабочие корутины: S3 get → Parser через asyncio.to_thread → файл результата → конверт с metrics.duration_ms →
публикация с Nats-Msg-Id result:<job_id>:<attempt>. SCHEMA_MISMATCH без ack, FILE_READ_ERROR, UNKNOWN_ERROR,
NatsPublishError — error-лог. Docstring протокола Parser: ожидаемые сбои — исход error (T7.1).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:05:47 +04:00
Andrey Epifancev
ff3ec5684a docs: решение R-17 (значение nats=off в healthcheck) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:59:24 +04:00
Andrey Epifancev
6c8d7b6e9b fix: NATS — PUBLISH_RETRIES как повторы после первой попытки (R-16), flush после подписки, снятие подписок при сбое on_connected, проброс отмены в stop(), error-лог самопроизвольного закрытия
Находки ревью Task 8: T8.2–T8.6.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:57:23 +04:00
Andrey Epifancev
a8dc5cc314 docs: решения R-15, R-16 в design.md, уточнена формулировка R-14
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:53:18 +04:00
Andrey Epifancev
6525939888 test: интеграционные тесты NATS (заголовок Nats-Msg-Id, queue group) и S3Storage против compose; отметки Task 8 / 4.2
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:48:26 +04:00
Andrey Epifancev
b545143f9e refactor: lifespan подключается к NATS через core/nats.py (фоново, старт не ждёт NATS)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:47:47 +04:00
Andrey Epifancev
ff08905580 feat: слой NATS src/core/nats.py — фоновое подключение (nkeys/без), подписка на запросы в queue group, публикация с повторами
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:47:17 +04:00
Andrey Epifancev
4c32cd36ac feat: S3Storage.get_bytes/put_json и протокол Storage вместо шаблонных put_object/get_object
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:45:25 +04:00
Andrey Epifancev
5d5b1b7f3b docs: решения R-13, R-14 в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:43:07 +04:00
Andrey Epifancev
84b5404215 feat: интерфейс парсера (Parser, ParseOutcome), NullParser с NOT_IMPLEMENTED, get_parser
Заглушка Среза 0 не читает входные байты; отметки Task 7 / 4.1.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:41:02 +04:00
Andrey Epifancev
b7af0d1824 docs: README каталога api/rules (словари синонимов парсера)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:41:02 +04:00
Andrey Epifancev
6a8f0d119a chore: make test без обёртки над кодом 5 pytest; отметки Task 6 / 3.1
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:38:17 +04:00
Andrey Epifancev
5b913803b4 feat: pydantic-модели контракта v1.0 (src/contract) и unit-тесты контракта
Запрос, конверт (processing|done|needs_check|error), файл результата, ОСВ и формы,
деньги Decimal <-> строка, subject'ы и Nats-Msg-Id. Тесты: идентичность с docs
(skip без docs, ARM_KA_DOCS), примеры, round-trip, согласованность моделей и схем.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:38:17 +04:00
Andrey Epifancev
f8a584af15 chore: копии схем контракта v1.0 и примеров в api/contracts
Скопировано из ../docs/contracts байт в байт (cp, diff -r чистый).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:38:17 +04:00
Andrey Epifancev
e676e75c38 docs: решения R-11, R-12 в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:36:16 +04:00
Andrey Epifancev
ebf87f39da chore: Dockerfile (python:3.11-slim), api/.env.example и api/.env.test
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:35:48 +04:00
Andrey Epifancev
8e15696913 chore: pyproject.toml (ruff, mypy), requirements-dev.txt, Makefile, маркеры pytest
Задача 2.1. make test допускает код 5 pytest (тестов пока нет). README: все цели Makefile создаются в 2.1 (T3.1).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:32:49 +04:00
Andrey Epifancev
a24fee09c6 style: форматирование ruff остальных файлов шаблона и тип уровня в InterceptHandler
Нужно для зелёного make lint (R-8).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:32:49 +04:00
Andrey Epifancev
85839a0fbf docs: решение R-10 (расположение .env.example/.env.test) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:30:19 +04:00
Andrey Epifancev
ffaa982fb1 docs: README с описанием сервиса и актуализация CLAUDE.md после выреза шаблона
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:30:05 +04:00
Andrey Epifancev
1b87cd2fdf fix: бесконечное автопереподключение NATS и логирование разрывов
max_reconnect_attempts=-1 (D-6), колбэки disconnected/reconnected/closed,
options типизирован как dict[str, Any].

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:27:43 +04:00
Andrey Epifancev
9cdc62b26d chore: упрощены app.py, config.py и requirements.txt после выреза шаблона
Убраны SPA, CORS, SMB, РАИСА, SQLAlchemy-обработчики и зависимости БД/SMB;
настройки: ENV_FILE, SERVICE_NAME, NATS_ENABLED, WORKER_CONCURRENCY,
PUBLISH_RETRIES, DONE_CACHE_SIZE, MINIO_SECURE.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:25:35 +04:00
Andrey Epifancev
b428f68e9e chore: вырезан фронт и БД из шаблона
Удалены web/, setup/.npmrc, api/alembic/, api/alembic.ini, api/src/db/,
api/src/models/, api/src/repositories/; из setup/setup.sh убраны npm-шаги,
из .gitignore убрана строка Dockerfile. Задача 1.1 отмечена выполненной.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:22:43 +04:00
Andrey Epifancev
e991999dfb docs: решения без обсуждения R-1..R-9 (pre-flight SDD) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 02:21:52 +04:00
Andrey Epifancev
723d4b5511 chore: .gitignore — перенос строки после .cursorignore (шаблон без завершающего перевода строки)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 17:54:50 +04:00
Andrey Epifancev
716d80902d chore: план исполнения SDD из tasks.md change'а, служебные каталоги в .gitignore
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>
2026-10-03 17:53:56 +04:00
aep
9ef7b9af48 Merge pull request 'Срез 0 (proposal): соглашения шаблона в CLAUDE.md, change slice-0-skeleton — скелет tabular-parser' (#2) from feat/1-slice-0-skeleton into main
Reviewed-on: #2
2026-10-03 16:43:22 +03:00
Andrey Epifancev
7a35b79d5e docs: change slice-0-skeleton под факты платформы — NATS без JetStream, Python 3.11, без CI и Nexus
Обмен с ядром на core NATS: подписка queue group, ack status=processing сразу по получении, process-local
LRU job_id против повторных запросов, публикация результата с повторами; удалены durable consumer / max_deliver /
ack_wait. Dockerfile python:3.11-slim; make check / make check-full вместо CI; raisa_* фильтруются при
dev-установке. Обновлены proposal, design (решения без обсуждения), specs, tasks, CLAUDE.md, openspec/config.yaml.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 16:21:45 +04:00
Andrey Epifancev
1661ec2fca docs: соглашения шаблона в CLAUDE.md и OpenSpec change slice-0-skeleton
Срез 0 (issue #1): раздел «Соглашения шаблона» (что оставлено от шаблона команды, что
вырезается, что добавляется); change openspec/changes/slice-0-skeleton — proposal, design
с таблицей «Decisions made without discussion», спеки и tasks; в openspec/config.yaml
строки с двоеточием взяты в кавычки (YAML разбирал их как словари).

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-03 02:43:38 +04:00
Andrey Epifancev
124f63b729 chore: openspec init + контекст и правила change'ей 2026-10-03 00:26:45 +04:00
Andrey Epifancev
1bd97a3672 chore: вычищены остатки доменного кода, каркас проходит tsc/biome/rsbuild 2026-10-02 23:34:58 +04:00
Andrey Epifancev
29e5cc5bf4 chore: каркас из шаблона команды (DKB_ARMKA@ba172f8, доменный код удалён) 2026-10-02 23:15:38 +04:00