ОСВ: ложное «Требует проверки» — периоды, нетто-ребёнок, иерархия по отступам (AURORA-1823, 1863, 1858) #79

Merged
aep merged 5 commits from feat/78-osv-false-check into main 2026-10-28 10:07:44 +03:00
Owner

Closes #78. Jira: AURORA-1823, AURORA-1863, AURORA-1858.

Три ложных «Требует проверки» ОСВ при верных данных (§1.4).

  • AURORA-1863 — развёрнутое сальдо счёта над свёрнутым субсчётом (Каныгин, счёт 76 над 76.07): сальдо сверяется по нетто, только если среди прямых детей есть строка, сама сошедшаяся лишь по нетто; признак идёт вверх только по цепочке таких строк. Обороты — по колонкам.
  • AURORA-1823 — разрез «Период» (period_groups в osv_groups.yaml, флаг is_period): родитель сверяется цепочкой — обороты = Σ периодов, начало = первый, конец = последний, сальдо непрерывно между периодами.
  • AURORA-1858 — иерархия по отступам (ОСВОКТ-24, листы 68/90/91): подуровень счёта 68.01.1 на том же отступе вкладывается в 68.01; безымянная строка закрытия с теми же оборотами — ребёнок счёта; вложенность аналитики по суммам — только у родителя с нарушением и только при трёх защитах (шапка «Субконто» без вида, дети на одном отступе, без ИНН), с откатом.

Правило — arm-ka-docs#177 (05 §1.3–1.4, риски RR-5, RR-6). Golden — arm-ka-fixtures#32, сливать первым.

Проверки

  • make check-full зелёный: 3125 passed, интеграция 10 passed, ruff/mypy чистые, statements-check 0, docker build.
  • make golden-check чистый (164 снимка): меняется только НКЗ 58+66+67 (лист 58 → done) и добавлен s47.
  • Регрессия по 1601 файлу (fixtures/osv, osv-dkb, все ОСВ банка первичных документов): 15 листов needs_check → done, ни один done не стал needs_check, новых нарушений нет. Целевые файлы (Каныгин, НКЗ, ОСВОКТ-24) — done.

Rulings I made

  • R-1 — для 1863 выбран узкий вариант нетто (решение владельца); «нетто всегда» отклонён.
  • R-2 — вложение по суммам сверяет детей мягко: пары, где у детей пусто, не считаются (90/91 несут сальдо только в строке счёта).
  • R-3 — NEST_SCAN_LIMIT = 50 соседей при вложении по суммам (защита от O(n²)); в спеке.
  • R-4 — правило А применяется, только если все пары «код → подкод» на одном отступе, раскладка однозначна и родитель после перекладки сходится (иначе ломались НКЗ 76 и плоские списки 60/60.01/60.02).
  • R-5 — правило Б требует, чтобы обороты безымянной строки равнялись оборотам счёта и были ненулевыми.
  • R-6 — R-21 расширен по решению владельца 28.10.2026; в CLAUDE.md сервиса и докстринге checks.py — ссылка на решение, запрет «не расширять без обсуждения» сохранён.
  • R-7 — ожидания синтетики s47 (indent, 2024 Q3, 3 документа).
  • R-8 — защита «дети на одном отступе» = прямые дети родителя имеют один indent.
  • R-9 — нетто-признак общий для начала и конца: раздельный вариант возвращал в needs_check d3d89933 и cbbbd8ae (схлопнутая пара 76.07 видна только симметрично).

Находки

Маркер Суть Статус
C-1 вложение по суммам прятало реальную ошибку и делало контрагента договором соседа fixed e1760c0 (три защиты, риск RR-6 — решение владельца)
I-1 правило не записано в 05-domain-rules, CLAUDE.md сервиса fixed 133b31a + arm-ka-docs#177
I-2 нетто-признак проходил через уровень, сошедшийся по колонкам fixed 133b31a
I-3 цепочка периодов без непрерывности fixed 133b31a
M-1 сдвиг глубины перезаписывался fixed e1760c0
M-2 код без разделителя вкладывался под тёзку fixed e1760c0
M-3 строка закрытия при нулевых оборотах fixed e1760c0
M-4 дублирование цикла sums, константы fixed e1760c0 (_greedy_ends, MIN_NESTABLE_CHILDREN)
M-5 нет реальных фикстур Каныгина и ОСВОКТ-24 deferred
M-6 спека не говорила, что вложение меняет rows fixed 133b31a
O-4 14 файлов банка (одна организация): счёт 68/71 расходится с субсчетами на одинаковую сумму Дт/Кт (0,05; 137,00; 5 939,76) без свёрнутого ребёнка — остаются needs_check rejected: по данным не отличить схлопнутую пару от потерянной, широкий вариант отклонён владельцем
O-9 «ОСВ по счету 50 … ЗОЛОТАЯ НИВА» (e896559f): parent_sum по 50.01 со статьями ДДС — другой дефект, не периоды deferred

Deferred

  • M-5 — положить в fixtures файл Каныгина (вложение AURORA-1705) и листы ОСВОКТ-24 как реальную регрессию.
  • O-9 — счёт 50 со статьями ДДС без сальдо (Золотая Нива): needs_check по 50.01.

🤖 Generated with Claude Code

Closes #78. Jira: AURORA-1823, AURORA-1863, AURORA-1858. Три ложных «Требует проверки» ОСВ при верных данных (§1.4). - **AURORA-1863** — развёрнутое сальдо счёта над свёрнутым субсчётом (Каныгин, счёт 76 над 76.07): сальдо сверяется по нетто, только если среди прямых детей есть строка, сама сошедшаяся лишь по нетто; признак идёт вверх только по цепочке таких строк. Обороты — по колонкам. - **AURORA-1823** — разрез «Период» (`period_groups` в `osv_groups.yaml`, флаг `is_period`): родитель сверяется цепочкой — обороты = Σ периодов, начало = первый, конец = последний, сальдо непрерывно между периодами. - **AURORA-1858** — иерархия по отступам (ОСВОКТ-24, листы 68/90/91): подуровень счёта `68.01.1` на том же отступе вкладывается в `68.01`; безымянная строка закрытия с теми же оборотами — ребёнок счёта; вложенность аналитики по суммам — только у родителя с нарушением и только при трёх защитах (шапка «Субконто» без вида, дети на одном отступе, без ИНН), с откатом. Правило — arm-ka-docs#177 (05 §1.3–1.4, риски RR-5, RR-6). Golden — arm-ka-fixtures#32, **сливать первым**. ## Проверки - `make check-full` зелёный: 3125 passed, интеграция 10 passed, ruff/mypy чистые, statements-check 0, docker build. - `make golden-check` чистый (164 снимка): меняется только НКЗ 58+66+67 (лист 58 → done) и добавлен s47. - Регрессия по 1601 файлу (fixtures/osv, osv-dkb, все ОСВ банка первичных документов): 15 листов needs_check → done, ни один done не стал needs_check, новых нарушений нет. Целевые файлы (Каныгин, НКЗ, ОСВОКТ-24) — done. ## Rulings I made - R-1 — для 1863 выбран узкий вариант нетто (решение владельца); «нетто всегда» отклонён. - R-2 — вложение по суммам сверяет детей мягко: пары, где у детей пусто, не считаются (90/91 несут сальдо только в строке счёта). - R-3 — `NEST_SCAN_LIMIT = 50` соседей при вложении по суммам (защита от O(n²)); в спеке. - R-4 — правило А применяется, только если все пары «код → подкод» на одном отступе, раскладка однозначна и родитель после перекладки сходится (иначе ломались НКЗ 76 и плоские списки 60/60.01/60.02). - R-5 — правило Б требует, чтобы обороты безымянной строки равнялись оборотам счёта и были ненулевыми. - R-6 — R-21 расширен по решению владельца 28.10.2026; в CLAUDE.md сервиса и докстринге `checks.py` — ссылка на решение, запрет «не расширять без обсуждения» сохранён. - R-7 — ожидания синтетики s47 (indent, 2024 Q3, 3 документа). - R-8 — защита «дети на одном отступе» = прямые дети родителя имеют один `indent`. - R-9 — нетто-признак общий для начала и конца: раздельный вариант возвращал в needs_check d3d89933 и cbbbd8ae (схлопнутая пара 76.07 видна только симметрично). ## Находки | Маркер | Суть | Статус | |---|---|---| | C-1 | вложение по суммам прятало реальную ошибку и делало контрагента договором соседа | fixed e1760c0 (три защиты, риск RR-6 — решение владельца) | | I-1 | правило не записано в 05-domain-rules, CLAUDE.md сервиса | fixed 133b31a + arm-ka-docs#177 | | I-2 | нетто-признак проходил через уровень, сошедшийся по колонкам | fixed 133b31a | | I-3 | цепочка периодов без непрерывности | fixed 133b31a | | M-1 | сдвиг глубины перезаписывался | fixed e1760c0 | | M-2 | код без разделителя вкладывался под тёзку | fixed e1760c0 | | M-3 | строка закрытия при нулевых оборотах | fixed e1760c0 | | M-4 | дублирование цикла sums, константы | fixed e1760c0 (`_greedy_ends`, `MIN_NESTABLE_CHILDREN`) | | M-5 | нет реальных фикстур Каныгина и ОСВОКТ-24 | deferred | | M-6 | спека не говорила, что вложение меняет rows | fixed 133b31a | | O-4 | 14 файлов банка (одна организация): счёт 68/71 расходится с субсчетами на одинаковую сумму Дт/Кт (0,05; 137,00; 5 939,76) без свёрнутого ребёнка — остаются needs_check | rejected: по данным не отличить схлопнутую пару от потерянной, широкий вариант отклонён владельцем | | O-9 | «ОСВ по счету 50 … ЗОЛОТАЯ НИВА» (e896559f): parent_sum по 50.01 со статьями ДДС — другой дефект, не периоды | deferred | ## Deferred - M-5 — положить в fixtures файл Каныгина (вложение AURORA-1705) и листы ОСВОКТ-24 как реальную регрессию. - O-9 — счёт 50 со статьями ДДС без сальдо (Золотая Нива): needs_check по 50.01. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 5 commits 2026-10-28 10:02:00 +03:00
Узкий вариант: нетто сальдо допустимо, если среди прямых детей есть нетто-ребёнок
(прошёл сверку только по нетто либо имеет такого потомка); обороты — по колонкам.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
period_groups в osv_groups.yaml, признак is_period у ClassifiedRow; родитель, все дети которого
периоды: обороты = Σ, начало = начало первого, конец = конец последнего. НКЗ лист 58 убран
из манифеста ожидаемых needs_check.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
В strategy_indent: счёт, чей код продолжает код соседа того же отступа (68.01 → 68.01.1), — ребёнок;
безымянная строка с оборотами счёта сразу за ним — его строка закрытия; аналитика на одном отступе
вкладывается по суммам только внутри родителя с нарушением и только если он после этого сходится.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
C-1: nest_by_sums включается из osv.py, если схема шапки не называет группы после счёта; строка с ИНН не вкладывается
и не становится родителем; прямые дети родителя должны быть на одном отступе. M-1: сдвиги складываются.
M-2: код без разделителя сегментов не вкладывается. M-3: строка закрытия — только с ненулевыми оборотами.
M-4: общий жадный перебор _greedy_ends для strategy_sums и вложенности, граница NEST_SCAN_LIMIT под тестом.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
I-2: в netted попадает только строка, сама сошедшаяся с детьми лишь по нетто; сошедшаяся по колонкам признак не
передаёт. I-3: сальдо конца периода = сальдо начала следующего (по колонкам либо по нетто), разрыв — нарушение.
M-6: сценарии спеки (защиты вложения по суммам, цепочка нетто-строк, непрерывность периодов); CLAUDE.md и докстринг
checks.py ссылаются на решения владельца 28.10.2026.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
aep merged commit a8c9605499 into main 2026-10-28 10:07:44 +03:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RSHB/arm-tabular-parser#79
No description provided.