89 Commits

Author SHA1 Message Date
Andrey Epifancev
ed401a00a3 openspec: решение R-11 (design №21) — расхождения D-1/tasks 1.3 правятся в Task 13
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 12:15:33 +04:00
Andrey Epifancev
b5a3b480b2 feat(parser): модель листа Sheet и читатели xlsx/xls/xlsb
grid.py: Cell, MergedRange, Sheet (1-based, только непустые ячейки, ленивые
индексы строк и merged; диапазоны больше 10 000 ячеек проверяются перебором),
column_letter для диагностики. errors.py: ParserError и коды контракта.
readers: read_book определяет формат по сигнатуре (zip → XLSX/XLSB по
xl/workbook.bin, OLE2 → XLS), предупреждает о несовпадении с file_type;
ошибки библиотек → UnreadableError одной строкой. Числа — Decimal(str(value)),
bool отдельно, даты как datetime; xlsb без outline/merged с предупреждением.
Тесты: синтетическая книга openpyxl, подмена file_type, мусор/обрезанные
файлы, xlsb через подменённый pyxlsb; 66 реальных ОСВ читаются < 5 с с
outline и merged; xls «62 за 3 квартал 2024»: строка 15 — outline 3.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 12:11:16 +04:00
Andrey Epifancev
38386b53a2 test: доступ к ../fixtures (ARM_KA_FIXTURES), параметризация по 66 ОСВ; зависимости openpyxl/xlrd/pyxlsb
- requirements: openpyxl==3.1.5, pyxlsb==1.0.10, xlrd==2.0.2, et_xmlfile==2.0.0 (транзитивная)
- tests/fixtures_helpers.py, conftest: фикстура fixtures_dir, параметризация osv_file/synthetic_file, skip маркера fixtures
- pyproject: mypy ignore_missing_imports для openpyxl/xlrd/pyxlsb, disallow_untyped_defs для src.parser.*

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 12:02:40 +04:00
Andrey Epifancev
947d2a6a51 contract: v1.1 — OsvRow.extra, CONTRACT_VERSION 1.1, копия схемы
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 11:57:22 +04:00
Andrey Epifancev
f03bfca92d openspec: решения контроллера R-1…R-10 (design №11–20) по pre-flight плана Среза 2a
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 11:54:00 +04:00
Andrey Epifancev
6b37a88f26 openspec: уточнения D-4 и сценария пустой ОСВ
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 11:42:51 +04:00
Andrey Epifancev
a6fd2d0535 OpenSpec: change slice-2a-osv-parser (парсер ОСВ §1 — спека)
proposal, design (D-1…D-10), спеки osv-parsing (новая) и tabular-recognition-service (MODIFIED «Парсер — заменяемый
интерфейс»), tasks (13 задач). Решение владельца 05.10.2026: подсрез 2a — только парсер ОСВ.

Issue: RSHB/arm-tabular-parser#5

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-05 11:41:52 +04:00
Andrey Epifancev
6bb111db38 chore(openspec): архив change slice-0-skeleton
Срез 0 реализован и влит (PR #3), change перенесён в openspec/changes/archive, спеки — в openspec/specs.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-04 19:44:42 +04:00
Andrey Epifancev
6ae072e502 docs: решения R-36..R-40 (финальный фикс-раунд) в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:50:22 +04:00
Andrey Epifancev
c9cdf7592d docs: спека — когда SCHEMA_MISMATCH не публикуется; nats = off в proposal (I-2, M-2)
Требование «Ошибки транспорта превращаются в результат» приведено к коду:
SCHEMA_MISMATCH публикуется, если читаемы job_id, file_id и attempt и job_id
ещё не известен; иначе — лог (error/warning) без ack и результата. Добавлены
два сценария (их покрывают test_unreadable_request_is_logged_and_dropped и
test_malformed_request_for_{job_in_progress,done_job}_is_dropped).
В proposal.md поле healthcheck nats — ok/down/off.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:45:03 +04:00
Andrey Epifancev
ba4dc41b9e docs: решения R-34 (отмена R-11), R-35 в design.md
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:43:00 +04:00
Andrey Epifancev
71e79670c0 docs: предложение P-4 (порт tabular-parser в docs/dev/README.md)
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
2026-10-04 03:35:04 +04:00
Andrey Epifancev
a6da24ba67 chore: отметка 5.2 — прогон DoD пройден (make check-full, ручная проверка, openspec validate)
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
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
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
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
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
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
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
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
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
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
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
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