Строки-показатели ОСВ: колонка «Показатели», «В валюте», BU по умолчанию (#58) #60

Merged
aep merged 14 commits from feat/58-osv-indicators into main 2026-10-19 12:05:00 +03:00
Owner

Closes RSHB/arm-tabular-parser#58. Jira: AURORA-1613, AURORA-1661 (валютная часть). Парные PR: arm-ka-fixtures (синтетика s33–s36 и golden), arm-ka-docs (§1.3/§1.4, OQ-132, 06-test-data §7). Порядок слияния: fixtures → tabular-parser → docs; трек A раньше трека B (#59).

Что сделано

Строки ОСВ, которые не являются данными БУ (метки колонки «Показатели»: НУ, Кол., Вал., ПР, ВР; строка «В валюте»), больше не ломают дерево и проверки строк БУ и не попадают в свод. Признак indicator — флаг строки (не data_type), считается при сборе строк (indicators.py). Показатель привязан к предыдущей строке данных. Вид данных строки: метка колонки → шапка → иначе BU с предупреждением (header.data_type остаётся null). Счёт 90 добавлен в список OQ-132 (решение владельца 19.10.2026). Контракт и DBML не менялись. Спека: openspec/changes/osv-indicator-column/.

Проверки

  • make check: 2936 passed; make check-full: rc=0 (после последнего коммита); openspec validate --strict: valid.
  • Golden реальных файлов, пакета ДКБ, s01–s32 — без diff (golden-check: 156 файлов, 0 изменений на конец ветки).
  • Контур (33 файла, локальная сверка, не в git): оборот Дт корня по БУ до/после одинаков, удвоения нет; needs_check → done у 25 из 31 файлов с «Показатели»; parent_sum нигде не вырос. После добавления счёта 90 три из четырёх оставшихся файлов (3e74526e, 667d1ee1, ec075a82) стали done; 7983e91b остался needs_check (O-3).

Rulings I made

  • R-1 (решение владельца через сессию): синтетика s33–s36 вместо s40–s43 — s40–s44 заняты треком B. Цена: переименование файлов и golden.
  • R-2: трейлер «Claude Sonnet 5.5» вместо «Opus 5.5» из плана. Цена: правка трейлеров (коммиты 656486a и docs 87cdf8b несут «Opus 5.5»; не переписывались).
  • R-3: Task 3 (по плану haiku) исполнен sonnet — проза с рефакторингом. Цена: стоимость.
  • R-4: T6.1/T6.3 исправлены до записи golden. Цена: один лишний коммит.
  • R-5: golden s34 обновлён владельцем вручную (классификатор отказал в make golden-update); diff — одна строка предупреждения.
  • Решения без обсуждения (T1.1 «Вал» без точки в колонке, T4.1 неизвестная метка после «Итого») записаны в design.md.

Таблица находок

Маркер Суть Статус
T1.1 В колонке «Показатели» ^вал\.?$ допускает «Вал» без точки deferred (решение записано в design.md)
T1.2 Паттерн заголовка по нормализованному тексту fixed 43653f1
T2.1 Тест s33 требует row_value «НУ» у NU-«Итого» fixed ef07ced / 8924dd1
T2.2 Тест s35 по статусу зелёный до исправления deferred
T3.1 Негативный тест заголовка без приманки deferred
T4.1 is_indicator_total истинна для любой не-БУ метки deferred (решение в design.md)
T4.2 Текст предупреждения «вне проверок» вместо спеки fixed d6dd341 (как I-2)
T4.3 Нет теста «Итого» + НУ в текстовой колонке deferred
T5.1 Два показателя подряд — сиблинги, не закреплено тестом deferred
T5.2 Нет теста на trivial после фильтрации показателей (лист с одной строкой данных + «Вал.»/«Кол.») deferred
T6.1 defaulted по body, а не glue.rows fixed 598d2c8
T6.2 Тест исключения показателя не отличал флаг от data_type fixed d6dd341
T6.3 Реэкспорт row_data_type из classify fixed 598d2c8
T6.4 Нет osv-level теста «размеченный лист с немаркированным «Итого»» deferred
T6.5 Типизация _labelled_sheet; нет теста на склеенную ИНН-строку без метки deferred
I-1 В spec.md остались s40–s43 fixed d6dd341
I-2 Текст предупреждения в коде ≠ спека fixed d6dd341 (golden s34 в fixtures)
M-1 README: устаревшие фразы §1.4 fixed d6dd341
M-2 README: «НУ» → NU fixed d6dd341
M-3 design.md: устаревшее описание fixed d6dd341
M-4 design.md: решения T1.1, T4.1 fixed d6dd341
M-5 _is_unlabelled_total не пропускает indicator_col: лист с колонкой «Показатели» и «Итого» без подписи → needs_check (как на main) deferred
M-6 Трейлер Opus 5.5 у 656486a и docs 87cdf8b rejected (переписывать запушенное не стоит)
O-1 Счёт 90 в списке OQ-132 fixed 1d2a46f (решение владельца 19.10.2026)
O-2 Плоские 270b41da/738bfcf5: «В валюте» → CURRENCY, parent_sum 2→1, needs_check остался deferred (трек B)
O-3 Контур 7983e91b: needs_check, 1 parent_sum на корне счёта 90 (строка 7, BU; обороты 942289724.62 не сходятся с суммой детей; строка 8 NU с сальдо, строка 9 — 90.01 BU); не разобран deferred

Deferred

T1.1, T2.2, T3.1, T4.1, T4.3, T5.1, T5.2, T6.4, T6.5, M-5, O-2, O-3 — в follow-up issue при закрытии.

Вопрос владельцу

O-3: файл 7983e91b (счёт 90) остался needs_check из-за одного нарушения «сумма детей = родитель» на корне; разбирать ли в рамках этого PR или отдельной issue?

Прогноз конфликтов с треком B (#59, feat/59-osv-flat-form)

Пробное слияние: конфликты в checks.py, classify.py, osv.py, generate.py, test_synthetic_files.py, test_classify.py, test_rules.py; hierarchy.py и osv_headers.yaml сливаются чисто.

  1. checks.py _total: фильтр not item.indicator применять первым, затем secondary, затем fallback на первую не-показательную TOTAL. Сигнатуры _total_warning и total_matches_root получают secondary.
  2. classify.py _classify_row: в версии B doc_data_type должен стать own = item.label_data_type or doc_data_type, иначе метка «БУ» перестанет перебивать шапку.
  3. ClassifiedRow и его конструктор: сохранить оба поля, indicator и counterparty_by_account.
  4. osv.py: levels_with_indicators(body, total_row, deadline, header_account=...) потребует нового ключевого параметра в indicators.py, передаваемого в resolve_levels.
  5. _leading_totals трека B: просто добавить or is_indicator_total нельзя — это втянет НУ-строку последней строки данных. Шагать через показатели можно только когда выше них стоит вторичная итоговая строка.
  6. Синтетика и golden: оставить обе стороны; test_generate.py трека B ожидает [*range(1,33), *range(40,45)] → range(1,37); golden s40–s44 после слияния обновить (make golden-update: BU по умолчанию и предупреждение); число golden в CLAUDE.md станет 136.

🤖 Generated with Claude Code

Closes RSHB/arm-tabular-parser#58. Jira: AURORA-1613, AURORA-1661 (валютная часть). Парные PR: arm-ka-fixtures (синтетика s33–s36 и golden), arm-ka-docs (§1.3/§1.4, OQ-132, 06-test-data §7). Порядок слияния: fixtures → tabular-parser → docs; трек A раньше трека B (#59). ## Что сделано Строки ОСВ, которые не являются данными БУ (метки колонки «Показатели»: НУ, Кол., Вал., ПР, ВР; строка «В валюте»), больше не ломают дерево и проверки строк БУ и не попадают в свод. Признак `indicator` — флаг строки (не `data_type`), считается при сборе строк (`indicators.py`). Показатель привязан к предыдущей строке данных. Вид данных строки: метка колонки → шапка → иначе BU с предупреждением (`header.data_type` остаётся `null`). Счёт 90 добавлен в список OQ-132 (решение владельца 19.10.2026). Контракт и DBML не менялись. Спека: `openspec/changes/osv-indicator-column/`. ## Проверки - `make check`: 2936 passed; `make check-full`: rc=0 (после последнего коммита); `openspec validate --strict`: valid. - Golden реальных файлов, пакета ДКБ, s01–s32 — без diff (golden-check: 156 файлов, 0 изменений на конец ветки). - Контур (33 файла, локальная сверка, не в git): оборот Дт корня по БУ до/после одинаков, удвоения нет; needs_check → done у 25 из 31 файлов с «Показатели»; parent_sum нигде не вырос. После добавления счёта 90 три из четырёх оставшихся файлов (3e74526e, 667d1ee1, ec075a82) стали `done`; 7983e91b остался `needs_check` (O-3). ## Rulings I made - R-1 (решение владельца через сессию): синтетика s33–s36 вместо s40–s43 — s40–s44 заняты треком B. Цена: переименование файлов и golden. - R-2: трейлер «Claude Sonnet 5.5» вместо «Opus 5.5» из плана. Цена: правка трейлеров (коммиты 656486a и docs 87cdf8b несут «Opus 5.5»; не переписывались). - R-3: Task 3 (по плану haiku) исполнен sonnet — проза с рефакторингом. Цена: стоимость. - R-4: T6.1/T6.3 исправлены до записи golden. Цена: один лишний коммит. - R-5: golden s34 обновлён владельцем вручную (классификатор отказал в `make golden-update`); diff — одна строка предупреждения. - Решения без обсуждения (T1.1 «Вал» без точки в колонке, T4.1 неизвестная метка после «Итого») записаны в design.md. ## Таблица находок | Маркер | Суть | Статус | |---|---|---| | T1.1 | В колонке «Показатели» `^вал\.?$` допускает «Вал» без точки | deferred (решение записано в design.md) | | T1.2 | Паттерн заголовка по нормализованному тексту | fixed 43653f1 | | T2.1 | Тест s33 требует row_value «НУ» у NU-«Итого» | fixed ef07ced / 8924dd1 | | T2.2 | Тест s35 по статусу зелёный до исправления | deferred | | T3.1 | Негативный тест заголовка без приманки | deferred | | T4.1 | `is_indicator_total` истинна для любой не-БУ метки | deferred (решение в design.md) | | T4.2 | Текст предупреждения «вне проверок» вместо спеки | fixed d6dd341 (как I-2) | | T4.3 | Нет теста «Итого» + НУ в текстовой колонке | deferred | | T5.1 | Два показателя подряд — сиблинги, не закреплено тестом | deferred | | T5.2 | Нет теста на `trivial` после фильтрации показателей (лист с одной строкой данных + «Вал.»/«Кол.») | deferred | | T6.1 | `defaulted` по `body`, а не `glue.rows` | fixed 598d2c8 | | T6.2 | Тест исключения показателя не отличал флаг от data_type | fixed d6dd341 | | T6.3 | Реэкспорт `row_data_type` из classify | fixed 598d2c8 | | T6.4 | Нет osv-level теста «размеченный лист с немаркированным «Итого»» | deferred | | T6.5 | Типизация `_labelled_sheet`; нет теста на склеенную ИНН-строку без метки | deferred | | I-1 | В spec.md остались s40–s43 | fixed d6dd341 | | I-2 | Текст предупреждения в коде ≠ спека | fixed d6dd341 (golden s34 в fixtures) | | M-1 | README: устаревшие фразы §1.4 | fixed d6dd341 | | M-2 | README: «НУ» → NU | fixed d6dd341 | | M-3 | design.md: устаревшее описание | fixed d6dd341 | | M-4 | design.md: решения T1.1, T4.1 | fixed d6dd341 | | M-5 | `_is_unlabelled_total` не пропускает `indicator_col`: лист с колонкой «Показатели» и «Итого» без подписи → needs_check (как на main) | deferred | | M-6 | Трейлер Opus 5.5 у 656486a и docs 87cdf8b | rejected (переписывать запушенное не стоит) | | O-1 | Счёт 90 в списке OQ-132 | fixed 1d2a46f (решение владельца 19.10.2026) | | O-2 | Плоские 270b41da/738bfcf5: «В валюте» → CURRENCY, parent_sum 2→1, needs_check остался | deferred (трек B) | | O-3 | Контур 7983e91b: needs_check, 1 parent_sum на корне счёта 90 (строка 7, BU; обороты 942289724.62 не сходятся с суммой детей; строка 8 NU с сальдо, строка 9 — 90.01 BU); не разобран | deferred | ## Deferred T1.1, T2.2, T3.1, T4.1, T4.3, T5.1, T5.2, T6.4, T6.5, M-5, O-2, O-3 — в follow-up issue при закрытии. ## Вопрос владельцу O-3: файл 7983e91b (счёт 90) остался needs_check из-за одного нарушения «сумма детей = родитель» на корне; разбирать ли в рамках этого PR или отдельной issue? ## Прогноз конфликтов с треком B (#59, feat/59-osv-flat-form) Пробное слияние: конфликты в checks.py, classify.py, osv.py, generate.py, test_synthetic_files.py, test_classify.py, test_rules.py; hierarchy.py и osv_headers.yaml сливаются чисто. 1. `checks.py _total`: фильтр `not item.indicator` применять первым, затем secondary, затем fallback на первую не-показательную TOTAL. Сигнатуры `_total_warning` и `total_matches_root` получают `secondary`. 2. `classify.py _classify_row`: в версии B `doc_data_type` должен стать `own = item.label_data_type or doc_data_type`, иначе метка «БУ» перестанет перебивать шапку. 3. `ClassifiedRow` и его конструктор: сохранить оба поля, `indicator` и `counterparty_by_account`. 4. `osv.py`: `levels_with_indicators(body, total_row, deadline, header_account=...)` потребует нового ключевого параметра в `indicators.py`, передаваемого в `resolve_levels`. 5. `_leading_totals` трека B: просто добавить `or is_indicator_total` нельзя — это втянет НУ-строку последней строки данных. Шагать через показатели можно только когда выше них стоит вторичная итоговая строка. 6. Синтетика и golden: оставить обе стороны; `test_generate.py` трека B ожидает `[*range(1,33), *range(40,45)]` → `range(1,37)`; golden s40–s44 после слияния обновить (`make golden-update`: BU по умолчанию и предупреждение); число golden в CLAUDE.md станет 136. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
aep added 14 commits 2026-10-19 12:00:08 +03:00
Колонка «Показатели», строки-показатели, «В валюте», BU по умолчанию (AURORA-1613, AURORA-1661 — валютная часть).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Словари для колонки вида суммы «Показатели» (БУ/НУ/Кол./Вал./ПР/ВР) и строки «В валюте» (AURORA-1613, AURORA-1661).
Код их пока не читает — это Task 2–3 плана.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Сценарии намеренно красные: воспроизводят баги AURORA-1613 и AURORA-1661.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
aep merged commit b70d2866e8 into main 2026-10-19 12:05:00 +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#60
No description provided.