# SDD ledger — plan: docs/superpowers/plans/2026-10-06-slice-2b-statement-parser.md Прогон 1: задачи 1–3. Задачи 4–17 — следующий прогон по этому же ledger. Plan file (абс.): /Users/andrey.epifancev/projects/awp-ca/.wt/slice-2b/docs/docs/superpowers/plans/2026-10-06-slice-2b-statement-parser.md Spec: tabular-parser/openspec/changes/slice-2b-statement-parser/ и docs/openspec/changes/slice-2b-statement-parser/ (прочитаны реализаторами по брифу, контроллер — выборочно). Setup: tabular-parser venv создан, codegraph init выполнен (worktree), .superpowers/ в .gitignore docs — есть. ## Pre-flight scan (по всему плану, 17 задач) | Пара задач / задача | Разделяют | Производит / потребляет | Найдено | |---|---|---|---| | T1 -> T2 | схема v1.2, примеры | T1 пишет DOCS/contracts; T2 cp в API/contracts, байт в байт | согласовано; T2 зависит от коммита T1 (порядок есть) | | T1 -> T3 | схема, примеры | T3 копирует DOCS/contracts в arm-core/scan-gateway | согласовано | | T2 <-> T3 | правки result.py (модели) | T3 повторяет модели T2 в двух репо; CONTRACT_VERSION не менять | согласовано; в T3 пути тестов существуют (arm-core/api/tests/test_contract.py, scan-gateway/api/tests/unit/test_contract.py) | | T4 -> T5,T6,T9,T11 | rules.py, statement_*.yaml | T4 производит Rules.statement_*; потребляют T5/T6/T9/T11 | согласовано | | T4 <-> T6 | rules.py, osv_headers.yaml | T6 удаляет statement_markers после T4 | порядок последовательный, конфликта нет | | T5 -> T6,T9,T10 | TableLayout, line_code, cell_label | интерфейсы совпадают с Consumes | согласовано | | T6 -> T9,T12 | FormBlock, classify_statement_sheet | согласовано | | | T7 <-> T8 <-> T12 | osv.py, book.py, test_book_parser.py | T7 создаёт book.py и SkippingStatementParser, T8 правит osv.py::_header, T12 удаляет заглушку | порядок последовательный; согласовано | | T10 -> T11 -> T12 | StatementLine, checks | согласовано | | | T13 -> T14 -> T15 | fixtures_helpers, синтетика, golden | T13/T14 пишут в fixtures worktree feat/14-statements-golden | зависимость от fixtures PR; вне прогона 1 | | T16, T17 | docs, PR | вне прогона 1 | | | Каждая задача (само-согласованность) | | T1: тест-скрипт в scratchpad и шаги согласованы. T2: файла result_contract.py нет (указано «нет»), grep "1.1" в tests пока пуст — шаг допустим. T3: в плане сказано "Не менять CONTRACT_VERSION" — консистентно. Задачи 4–17 проверены по Files/Interfaces (grep), содержимое шагов будет сверено в прогоне 2. | | Конфликтов плана с Global Constraints и review rubric в Files/Interfaces не обнаружено. Ruling: R-1 — план требует в Task 1 Step 1 временный скрипт в scratchpad; использую путь scratchpad контроллера — тот же что в плане — цена ошибки нулевая. Замечания по окружению: T1 в плане использует `API/.venv/bin/python` tabular-parser (jsonschema есть); T3 — командой `make venv` в arm-core/scan-gateway. BASE T1: docs ca8615e Task 1: implementer haiku DONE, commit 82ad2ab (docs). Review dispatched (sonnet). Task 1: minor T1.1 (deferred): $comment схемы упоминает «1.1» — plan-mandated не трогать; поправить в follow-up. Task 1: minor T1.2 (deferred): format:date не проверяется без format_checker в check-скрипте; не влияет на контракт. Task 1: minor T1.3 (rejected: косметика примера, число «3» произвольно). Task 1: complete (commits ca8615e..82ad2ab, review clean) Task 2: BASE tabular-parser 37b25e0; implementer haiku dispatched Task 2: implementer DONE, commit 3a08b99; tests 2028 passed. O-1: implementer запустил make golden-update, что переписало 113 golden-файлов (только schema_version 1.1->1.2) в ОСНОВНОМ checkout fixtures на main (через симлинк; не закоммичено). Откат (git restore) заблокирован классификатором — оставлено человеку. Статус: deferred (человек: git -C fixtures restore -- golden, либо оставить для Task 14, где golden пересоздаются в worktree feat/14-statements-golden). Правка вне плана (план: golden только в worktree-ветке + отдельный коммит). Task 2: minor T2.1 (deferred): $comment схемы «1.1» (= T1.1, plan-mandated). Task 2: minor T2.2 (deferred): пример result-statement-excel.json status needs_check при одном мягком нарушении — вводит в заблуждение; поправить в docs (plan-mandated пример). Task 2: minor T2.3 (deferred): result-statement-minimal.json (OCR) получил checks с пустыми списками, что противоречит семантике «нет объекта = не проверялось»; plan-mandated. Task 2: minor T2.4 (rejected: необязательные негативные тесты, вне брифа). Task 2: complete (commits 37b25e0..3a08b99, review clean) Task 3: implementer DONE: arm-core 46d17e6, scan-gateway e2f1bb5; make check: arm-core 1108 passed, scan-gateway 749 passed. Ruling: R-2 — в scan-gateway копия схемы отставала на v1.1 (не было OsvRow.extra и примера result-osv-needs-check.json); принят догон v1.1 вместе с v1.2 (копия обязана совпадать с docs побайтно) — если неверно: лишний необязательный OsvRow.extra в scan-gateway, откатывается отдельным коммитом (design #13, см. design.md). Task 3: minor T3.1 (fixed в описании PR: упомянут догон v1.1). Task 3: minor T3.2 (fixed в описании PR: CONTRACT_VERSION остаётся 1.0). Task 3: complete (arm-core origin/main..46d17e6, scan-gateway origin/main..e2f1bb5, review clean) R-2 (design #12). PR: arm-core#27, arm-scan-gateway#5 созданы. design.md решения №12–13 закоммичены в tabular-parser. Пауза после Task 3: ждём мержа PR копий схемы ## Прогон 2 Ruling: R-3 — golden schema_version 1.1->1.2 пересозданы в worktree fixtures (.wt/slice-2b/fixtures-wt, ветка feat/14-statements-golden, коммит bf8c88f, diff только schema_version, 113 файлов); симлинк fixtures переключён на fixtures-wt (шаг 1 T13 выполнен контроллером); основной checkout fixtures не тронут (O-1 остаётся человеку) — чтобы make check был зелёным на каждой задаче; цена ошибки: коммит в fixtures-ветке раньше плана, откат — reset ветки (design #14). Task 4: BASE tabular-parser ed516d8; implementer haiku dispatched Ruling: R-4 (от координатора, design #15) — docs/contracts/** после задачи 1 заморожены, в задаче 16 НЕ править; T1.1/T2.1/T2.2/T2.3 остаются deferred и идут в follow-up issue при закрытии — копии в arm-core#27 и scan-gateway#5 на ревью и должны остаться байт в байт; цена ошибки: три косметических замечания живут до следующего MINOR. Task 4: implementer haiku DONE d21884e; 2046 passed. Review (sonnet): spec ❌ 1 Important: okud DISCLOSURE pattern statement_headers.yaml:103 `\b0710(?!001|002)` вместо брифа `\b07100(0[3-9]|[1-9]\d)\b` (T4.I1). Task 4: minor T4.1 (deferred): RelationRule.target/.terms перепарсиваются на каждый доступ. Task 4: minor T4.2 (deferred): шесть одинаковых any(...) методов — хелпер _any. Task 4: minor T4.3 (deferred): нет проверки lo<=hi в _LineCodeRules._check. Task 4: minor T4.4 (deferred): FormType не в __all__. Task 4: minor T4.5 (deferred): нет негативных тестов (_check_required_keys, abs_terms, target in codes, группы периода, okopf vs okopf_okfs, границы okud). Task 4: minor T4.6 (deferred): комментарий statement_periods.yaml:5 про обязательные группы неточен, m1 не валидируется. Task 4: fix round 1/5 (1 addressed, 0 open — T4.I1 okud pattern; commits d21884e..6a3661c) Task 4: complete (commits ed516d8..6a3661c, review clean) Task 5: BASE 6a3661c; implementer haiku dispatched Task 5: implementer haiku DONE c3df9ff; make check (контроллер) 2058 passed. Review sonnet: spec ✅, approved. Task 5: minor T5.1 (deferred): мёртвые noqa columns.py:136,211. T5.2 (deferred): шумные константы в test_columns.py. T5.3 (deferred): ветка code_col_empty and no_numbers не покрыта тестом (plan-mandated). T5.4 (deferred): лишние вычисления до проверки following