239 Commits

Author SHA1 Message Date
Andrey Epifancev
acaa5021ce chore(openspec): архив contract-identity-window и unified-normalization-tp (#50, #54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 09:26:49 +04:00
aep
4d1709ae0d Merge pull request 'Формы через arm_statements, контракт результата v2.0 (#54)' (#55) from feat/54-statements-v2 into main 2026-10-19 07:38:05 +03:00
Andrey Epifancev
b583b0472f test: plan_sheets с дедлайном в тесте реальных форм, порядок импортов (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 22:14:48 +04:00
Andrey Epifancev
4d30718689 docs: дельты OpenSpec, design.md, README и CLAUDE.md под контракт 2.0 (#54)
I-3: дельты osv-parsing (листы ОСВ, иерархия, golden, XLS_NO_CODEPAGE) и
перечень словарей api/rules; пункт об архивации (Purpose спек) в tasks.md.
I-4: README, CLAUDE.md и docstring hierarchy.py совпадают с кодом, пример
вывода CLI переснят. M-6: tasks.md, proposal.md, design.md с решениями P4/R.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 22:08:30 +04:00
Andrey Epifancev
0d82b5cf5e fix: черновик продолжения несёт число колонок сумм (#54)
M-1: _separate считает form_amount_columns, следующий лист без маркера
больше не получает ложный SHEET_NOT_JOINED.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 22:05:06 +04:00
Andrey Epifancev
2fce78080b fix: дедлайн при классификации листов и тесты путей отказа форм (#54)
I-1: plan_sheets проверяет дедлайн на каждом листе (регрессия против main).
I-2: тесты исключения пакета на кандидате (RECOGNITION_FAILED с
предупреждениями файла), TIMEOUT в адаптере и конвейере, RulesError в get_parser.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 22:04:37 +04:00
Andrey Epifancev
be5ad8ce86 refactor: удалён собственный конвейер форм и словари форм — шаги 2–8 в arm_statements (#54)
Удалены модули statements/{checks,columns,detect,header,lines,merge,statement,legacy_models}.py, словари
rules/statement_{headers,periods,checks}.yaml и их тесты. Словари форм и шаги 2–8 — в пакете arm_statements.
Rules без полей statement_*; покрытие словарей ОСВ (DICTIONARIES) без словарей форм. Документация сервиса
переписана под адаптер форм, контракт 2.0 и коды OSV_*.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 21:53:29 +04:00
Andrey Epifancev
0f12c0eb3d test: манифест реальных форм и Review Focus под общий код и v2.0 (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 21:41:54 +04:00
Andrey Epifancev
f5d071f602 chore(arm_statements): копия пакета arm-statements@3390f92 (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 21:30:20 +04:00
Andrey Epifancev
9e694796ad test: согласованные формы для статуса книги, test_pipeline, флаг BookRead.no_outline (fix round 1, #54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 21:01:53 +04:00
Andrey Epifancev
71f596cdb7 feat: формы через arm_statements, контракт результата и конверта v2.0, статус и OSV_* у ОСВ (#54)
- копия схем и примеров контракта v2.0 (запрос остаётся v1.0), модели result/common/message/request;
  ResultWarning/FileWarning, статус и предупреждения у документов, строки forms v2.0, service.statements_version
- statements/pipeline.py: кандидаты адаптера -> normalize_candidate -> to_contract / warning_to_contract
- BookParser: статус книги через envelope_status, SHEET_OTHER / FILE_TYPE_MISMATCH / XLS_NO_CODEPAGE как предупреждения
  файла, OSV_* и OSV_XLSB_NO_OUTLINE в документах ОСВ, тексты иерархии по спеке
- воркер, app и CLI получают statements_version из require_statements_version()
- старые модели документа формы вынесены в statements/legacy_models.py до удаления старого конвейера (задача 9)
- OpenSpec: MODIFIED «Парсер — заменяемый интерфейс» в дельте tabular-recognition-service

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:52:52 +04:00
Andrey Epifancev
702ea1dff9 refactor(osv): предупреждения листа ОСВ с кодами OSV_* (вывод 1.x прежний) (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:35:29 +04:00
Andrey Epifancev
ebc1f438da fix(statements): подпись колонки в строке-шапке таблицы не заголовок формы (R-8, #54)
Ячейка в строке с подписью «Код» (словарь пакета) не открывает блок формы:
«Пояснения» на листах-продолжениях НПЗ больше не даёт DISCLOSURE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:28:39 +04:00
Andrey Epifancev
c858a85d85 feat(statements): адаптер шага 1 — книга → FormCandidate, склейка листов, segment_breaks (#54)
Тест test_npz_candidates красный: НПЗ — BLOCKED (Р-31), см. отчёт задачи 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:24:47 +04:00
Andrey Epifancev
12f4701754 feat(statements): блоки форм, вид листа и шапка-ячейки на словарях arm_statements (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:17:11 +04:00
Andrey Epifancev
ce8372d754 feat(statements): ячейка Excel → Cell: текст по числовому формату, value, ref <лист>!<A1> (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 20:07:02 +04:00
Andrey Epifancev
8b9a5a07c4 openspec: change unified-normalization-tp — адаптер Excel, общий код, контракт v2.0 (#54)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 19:55:36 +04:00
aep
0b7b23eda0 Merge pull request 'Подключение копии пакета arm_statements (#52)' (#53) from feat/52-arm-statements-copy into main 2026-10-18 18:50:01 +03:00
Andrey Epifancev
bdb1c7479e chore(arm_statements): копия arm-statements@52857a0 (#52)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:45:10 +04:00
Andrey Epifancev
f5ced4177e build: копия arm_statements в линтерах и тестах, statements-check в check-full (#52)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:42:12 +04:00
Andrey Epifancev
412a322b9d chore(arm_statements): копия пакета arm-statements@6bce80b (#52)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-18 19:38:43 +04:00
aep
6098634d8c Merge pull request 'Тест идентичности копии контракта по MAJOR (шаг 0 docs#116)' (#51) from feat/50-contract-identity-window into main 2026-10-18 17:11:45 +03:00
Andrey Epifancev
71afba5f73 test(#50): тест идентичности копии контракта по MAJOR (S-53, шаг 0 docs#116)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01BJKMLHdxMwSUeYcdkwqX4W
2026-10-18 13:19:37 +04:00
aep
623794936c Merge pull request 'ОСВ: xls без CODEPAGE → cp1251, «Кол-во»/«Вал», таблица кончается на первой «Итого» (#47, AURORA-1662, 1663, 1664)' (#48) from feat/47-osv-encoding-labels-tail into main 2026-10-18 11:15:40 +03:00
Andrey Epifancev
195720c97b Итог ищется по точному «Итого» раньше «Итого …»; хвост — только числа в колонках таблицы (#47, AURORA-1664)
I-1: _find_total сначала берёт первую строку корневого уровня с текстом ровно «Итого»
(новый ключ total_row_exact в osv_headers.yaml) и лишь без неё — первую по total_row.
Контрагент «Итого-Сервис» на плоском листе без outline и отступов больше не обрезает таблицу.
O-3: предупреждение о хвосте считает числа только в колонках таблицы (text_col…right_edge
из TableHeader); контрольные суммы правее таблицы (rb/2024-Q1) его не дают, ослабление
в test_classify_real откачено. Синтетика s32: итог «Итого по счету 60» без точного «Итого»
(нужна тесту покрытия для запасного паттерна total_row).

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 12:04:48 +04:00
Andrey Epifancev
6efe79fec9 Синтетика s29–s31: xls без CODEPAGE, «Вал»/«Кол-во», строки ниже «Итого» (#47, AURORA-1662, 1663, 1664)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 11:50:39 +04:00
Andrey Epifancev
8b91bcae3d «Кол-во» — количество, «Вал» без точки — не валюта; таблица кончается на первой «Итого» (#47, AURORA-1663, AURORA-1664)
AURORA-1663: словарь строк data_types.yaml — «Кол-во» даёт QUANTITY, «Вал» без
точки больше не CURRENCY (материал «Вал» на счёте 10); метка — «Вал.» и код
валюты.

AURORA-1664: _find_total берёт первую «Итого» на корневом уровне оформления
(раньше — последнюю), вторая итоговая строка сразу за ней по-прежнему часть
таблицы; всё ниже вне документа. Числа в хвосте дают предупреждение «ниже
таблицы (после «Итого») есть числа» без смены статуса. Закрывает tp#7 M-2.
Предупреждение появляется и у реальной фикстуры rb/2024-Q1 (контрольные суммы
правее таблицы под «Итого») — тест property допускает его.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 11:50:39 +04:00
Andrey Epifancev
591b3f4434 xls без записи CODEPAGE читается как cp1251 (#47, AURORA-1662)
В BIFF5/7 без CODEPAGE xlrd декодировал байтовые строки как latin-1: кириллица
превращалась в мусор, лист ОСВ не находился (INVALID_DOCUMENT). Теперь такая
книга читается с encoding_override=cp1251 и получает предупреждение уровня книги
«xls без кодовой страницы — строки прочитаны как cp1251». Книги с CODEPAGE и
BIFF8 читаются как прежде. Проба CODEPAGE — on_demand-открытие (только globals).

Для теста добавлен минимальный писатель BIFF5 в контейнере OLE2
(tests/synthetic/xls_writer.py), умеющий не писать CODEPAGE.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 11:50:39 +04:00
aep
3f740c969b Merge pull request 'Пустая детализация не проверяется соотношением подстрок (#45, AURORA-1527)' (#46) from feat/45-subline-empty into main 2026-10-16 18:35:27 +03:00
Andrey Epifancev
f017c37c51 feat(checks): «родитель = Σ подстрок» не проверяется при пустой детализации (#45, AURORA-1527)
По колонке соотношение считается, только если хотя бы одна подстрока родителя имеет значение
(amount не null; ноль — значение). Совпадает с arm-core.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-16 19:10:05 +04:00
aep
295b9924af Merge pull request 'ББ/ОФР из Excel: значение как показывает числовой формат (#42, AURORA-1528)' (#43) from feat/42-xls-number-format into main 2026-10-15 17:37:28 +03:00
Andrey Epifancev
904392ddcb number_format: 15 значащих цифр с округлением вверх, неразобранные условия и >4 секций; признак xlsb по содержимому (#42)
Фикс-волна по финальному ревью: I-1, M-1, M-4, M-5, M-6 (T4.1, T4.2); тесты на ;;;, 5 секций, [$-419], \(…\), [=5]0;[=5]0,.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 17:46:11 +04:00
Andrey Epifancev
388276c261 ББ/ОФР из Excel: значение ячейки — как показывает числовой формат (#42)
statement_money вместо to_money в разборе строк форм, предупреждения о неразобранном формате и об xlsb,
сравнение условий формата с точностью Excel (15 значащих цифр), тесты и тексты.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 17:26:36 +04:00
Andrey Epifancev
0c65e92ffb readers: числовой формат числовых ячеек в Cell (#42)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 17:07:15 +04:00
Andrey Epifancev
3eae1dcf70 parser: отображаемое значение числа по числовому формату ячейки (#42)
Чистый модуль statements/number_format.py (display_amount) и публичная numbers.quantize_money.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 17:00:56 +04:00
aep
c7c98150d5 Merge pull request 'openspec: архив osv-inn-rows-layouts (#35)' (#40) from chore/35-archive-osv-inn-rows-layouts into main
Reviewed-on: #40
2026-10-13 16:53:00 +03:00
Andrey Epifancev
64f836d5a6 openspec: архив osv-inn-rows-layouts (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 17:25:43 +04:00
aep
32090f41d5 Merge pull request 'ОСВ: строки ИНН рядом с контрагентом — восемь раскладок (#35, #34)' (#39) from feat/35-inn-rows-around-counterparty into main
Reviewed-on: #39
2026-10-13 16:24:44 +03:00
Andrey Epifancev
ad1a6ec10e ОСВ: правки финального ревью строк ИНН — реквизит по схеме, подсказка «над», страховка владельца, родитель после склейки (#35)
R-6 (design #22), R-7 (#23), R-8 (#24), R-9 (#25), R-10 (#26), H.1/H.2 (#27); словарь позиций соседей (T2.6/T3.3);
spec/design/README: текст предупреждения, цена ошибки design #1, ссылки на решение владельца 10 (M-3, M-4, M-5, M-8).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
79ffe602f6 Документация: модуль строк ИНН, tasks change (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
ce776f6ab7 Тесты синтетики: s28 — строка 13 в предупреждении и остаётся COUNTERPARTY без ИНН; поправлена шапка generate.py (H.3, T5.2)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
6d97fa2c94 ОСВ: предупреждение о противоречии раскладки ИНН и подсказки шапки, синтетика s28 с неверной контрольной суммой (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
1f96012884 Синтетика: восемь раскладок строки ИНН s20–s27, s18 с верными ИНН (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
26ed11ad28 ОСВ: строки ИНН — подключение прохода, подсказка шапки в обоих порядках, старые склейки удалены (#35)
Хвосты ревью Task 3: формулировка направления листа в spec/design (T3.1), тесты противоречия сведений и приоритета подсказки (T3.2), assert на glue.ok (T3.4).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
71d56bd5ed ОСВ: строки ИНН — соседи по суммам и направление листа (#35)
Строки ИНН не в дереве: с суммами — сосед с теми же суммами (совпали оба — по направлению);
без сумм — сосед по направлению листа: подсказка шапки, иначе единогласные сведения пар по
суммам и однозначных блоков детей. Противоречие или отсутствие сведений — строка без пары.

Хвосты ревью Task 2: тест подразделения переписан на итоговый результат (T2.9); в спеке
уточнены реквизит «нерез.» (только лист, design #14) и защита «над, в дереве» с подсказкой
шапки (design #16) (T2.10); опечатка в докстринге _parent_can_own (T2.11).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
8bfaa4ec19 ОСВ: fix-раунд 1 строк ИНН — реквизит только лист, пара родителя по схеме, защита без подсказки (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
816719ca92 ОСВ: модуль строк ИНН — склейка в дереве и контрольная сумма (#35)
Модуль inn_rows: строка с одним ИНН сопоставляется с наименованием в дереве (родитель или ребёнок), без пары
остаётся с причиной; подсказка шапки InnHint отменяет контрольную сумму. row_data_type стал публичным.
ASCII-проверка ИНН (ревью T1.2), комментарий про zip(strict=False) (T1.3), тест «770123456²» (T1.1).
Решения 12–13 в design.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
1e5f28bd50 ОСВ: контрольная сумма ИНН и ИНН строки (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
a2744b3e40 План: строки ИНН рядом с контрагентом (#35); спека — защита по листу, реквизит «нерез.», ИНН с детьми под контрагентом
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00
Andrey Epifancev
a1c6c10869 Спека: строки ИНН рядом с контрагентом — 8 раскладок (#35)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 16:27:02 +04:00