Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
3.8 KiB
3.8 KiB
Tasks: Срез 3a — горячие папки и нормализатор OCR
Репозиторий — scan-gateway; команды make — из корня, pytest — из api/. Нумерация и состав задач — как в плане
docs/superpowers/plans/2026-10-06-slice-3a-ocr-normalizer.md (Task 0–17); пошаговый код и проверки — там. Исполнение —
subagent-driven-development: один коммит на задачу плюс правки ревью. CI нет — проверки локальные (make check,
make test-integration, make check-full).
- 0 Контракт v1.2 в ветке и окружение:
origin/mainвлит, схемы байт-в-байт равны../docs/contracts,make venv,make checkзелёный;CONTRACT_VERSIONостаётся1.0(решение №14) - 1 Настройки и справочники:
SCAN_CLEANUP,SCAN_RULES_DIR;api/rules/(statement_lines.yamlс редакциями66nи пустойfsbu4,ocr_lookalikes.yaml,statement_labels.yaml);src/normalizer/rules.py(load_rules,OcrRules) - 2 Очистка текста (
src/normalizer/ocr/text.py): двойники вплотную к цифре,|как разделитель клеток,clean_value - 3 Разбор дат (
ocr/dates.py):parse_date, дословный переносdate_utilsстарого ядра - 4 Суммы (
ocr/amounts.py):parse_amount,is_blank(решения №12, №13) - 5 Раскладка колонок (
ocr/layout.py):build_layoutпо шапке «Код»,infer_layoutпо данным - 6 Строки таблицы (
ocr/rows.py): шапка настоящая или синтетическая, классы строк, тип по кодам - 7 Шапка файла (
ocr/header.py): организация, ИНН, единицы, дата отчёта - 8 Сборка документа (
ocr/document.py): тип, колонки, строки, значения сis_recognized, редакции (решения №15, №16, №19, №21–25) - 9
OcrNormalizer: статусыdone/needs_check/error RECOGNITION_FAILED, предупреждения,metrics.rows, подключение вcreate_app - 10 Golden на реальных ответах
../fixtures/ocr/*.json(эталоныexpected_normalize/— в fixtures),make golden-update - 11 Горячая папка
local: имя<job_id>.<ext>,.partвTmp, запись без замены (os.link),cleanupподSCAN_CLEANUP(решения №17, №26, №27) - 12 Горячая папка
smb:smbclient.renameбез замены,cleanupпод флагом - 13 Воркер и приложение: очистка после сохранения
raw/(под флагом),RECOGNITION_FAILEDбез расширения,OcrNormalizerв lifespan - 14 Эмулятор: пара по sha256 содержимого,
SCAN_EMULATOR_DEFAULT, входящий<uuid>.<ext>, игнор.part/.tmp/.done - 15 Сквозной сценарий, README и CLAUDE.md сервиса:
test_roundtrip.py(документы,ok_doc, неизвестное содержимое,SCAN_CLEANUP=true, файл результата по схеме), README, CLAUDE.md, этот файл - 16 Документы workspace (репозиторий docs, bounded-PR):
03-architecture.md,05-domain-rules.md§11.1, OQ,09-delivery-plan.md, dev-compose иqa-guide.md - 17 Завершение: синхронизация с
main,make check-full,openspec validate --strict, PR fixtures с эталонами, PR scan-gateway