156 Commits

Author SHA1 Message Date
Andrey Epifancev
6cd2ea8a7a test(statements): failed_relations в манифесте, статус документа по критерию парсера, строгая шапка (T14.I2)
Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 21:04:50 +04:00
Andrey Epifancev
d82940a8ac fix(statements): actual нарушенного соотношения — ближайший вариант abs_terms (T14.I1)
Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 21:04:50 +04:00
Andrey Epifancev
1b17f2e748 fix(statements): relations_failed и soft_relations_failed попадают в wire
StatementChecks собирался пустым и дополнялся append, а to_wire сериализует только
заданные поля: нарушения не доходили до JSON. Списки теперь задаются явно, пустой
список у проверенного документа сериализуется (checks.relations_failed = []).

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 20:55:43 +04:00
Andrey Epifancev
976fc809fe openspec: сценарии «Знаки 1С», «Баланс на пяти листах», воркер — по факту (R-14, O-9)
Знаки 1С доказываются на ОФР Межениновской; ОФР НПЗ и Унагранде расходятся из-за
единиц (OQ-137). У НПЗ INCOME на двух листах, лист с одной строкой 2400 пропускается.

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 20:52:44 +04:00
Andrey Epifancev
07d57cbd07 test(statements): манифест реальных форм, property-тест, golden форм, покрытие словарей форм
Манифест statements_manifest.yaml по 18 реальным файлам statements-xlsx (сверен
прогоном парсера, R-13, OQ-137), property-тест по манифесту, снимки форм в
golden_helpers/golden_update/test_golden, словари форм в покрытии, синтетика
st06 для вариантов заголовков. Мёртвые записи словаря удалены (name_caption,
метки okved и okud_label) либо покрыты st06.

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 20:50:25 +04:00
Andrey Epifancev
b6d2089199 openspec: баланс НПЗ needs_check по 1600 = 1700, полные формы — только Межениновская (R-13, решение №23)
Баланс НПЗ расходится по 1600 = 1700 на 1.94 / 9.02 / 2.48 руб. (значения в
рублях при шапке «тыс. руб.», OQ-137): статус книги needs_check, допуск ±1
не меняется. Сценарий «Полные формы сходятся» ограничен формами Межениновской.

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 20:44:33 +04:00
Andrey Epifancev
4907935e46 test(statements): st02 согласованные данные, безусловные проверки, шапка документа не верхняя строка заголовка (T13.I1, T13.I2)
Генератор st02: значения ST02_VALUES сходятся по всем жёстким соотношениям. _upper_header_row: верхняя строка берётся,
только если подпись склеивается с датой в период. Refs #14

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 19:29:08 +04:00
Andrey Epifancev
e7552dcdb0 fix(statements): верхняя строка двухстрочного заголовка без подписи «Код» не теряется (T13.I2)
Без подписи «Код» строкой заголовка выбиралась нижняя строка с датами; верхняя («На 31 декабря», «Изменение, %»)
оставалась над заголовком: колонка без периода не попадала в skipped_labels, метки периодов не склеивались.
Тест синтетики st02 проверяет точное предупреждение, две колонки и отсутствие значений «Изменение, %».

Refs #14

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 19:09:35 +04:00
Andrey Epifancev
fad0c10412 fix(statements): исправлены данные st02, расширены тесты сценариев спеки, выпрямлены фикстуры
T13 round 1/5:
- st02: 1100=200, 1210=-50, 1200=-50 для выполнения всех проверок (1600 = 1100 + 1200, 1700 = 1300)
- Расширены тесты st01-st05: проверка колонок, типов документов, значений
- Исправлена фикстура _require_synthetic: используется statement_synthetic_skip_reason
- Добавлены константы для магических чисел
- Русские комментарии в коде

Refs #14
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 18:58:08 +04:00
Andrey Epifancev
d64ba71098 test(statements): синтетика st01…st05 и сценарии спеки на ней; параметры statement_file
Refs #14
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 18:33:58 +04:00
Andrey Epifancev
6f0f05f7c7 openspec: решения №21–22 (продолжение без колонки кодов, НПЗ needs_check)
Refs #14

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 18:19:50 +04:00
Andrey Epifancev
10b5bda550 feat(statements): конвейер форм — блоки, склейка продолжений, статус документа; подключение в get_parser
StatementParser заменяет SkippingStatementParser; продолжение присоединяется к последнему открытому документу;
duplicate_line_codes — уникальные коды; потерянный лист-продолжение (нет колонки кодов) даёт needs_check.

Refs #14

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 18:12:27 +04:00
Andrey Epifancev
b9e6e319cf style(task-11): format checks.py (ruff)
Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:50:59 +04:00
Andrey Epifancev
d73836e30a test(task-11): T11.I2 — цель отсутствует, члены=0; real abs_terms values
T11.I2: + test_target_absent_no_violations (INCOME: нет 2200; BALANCE: нет 1100)
T11.I2: + test_target_present_members_absent_as_zero (1100=100 без подстатей → нарушение)
test_relation_holds_with_abs_terms: Добавлены ненулевые значения 2210/2220/2330/2350
  1С: 2210=-50, 2220=-30, 2330=-20, 2350=-10
  66н: 2210=50, 2220=30, 2330=20, 2350=10

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:49:50 +04:00
Andrey Epifancev
72e565621c fix(task-11): R-6…R-9 — цель в данных, общий допуск, валидация 4-цифр, тесты
R-6: проверка только если цель присутствует (в колонке)
R-8: убран zero tolerance для подстрок, общий tolerance
R-7: тесты с полными данными (подкомпоненты)
R-9: валидация — явные правила 4-цифр, подстроки 5-цифр
R-7: усиление abs_terms теста (цепочка 2100→2200→2300)

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:40:02 +04:00
Andrey Epifancev
c5aa02c8ec openspec: решения №17–20 (проверка соотношений: цель, словарь, допуск подстрок, валидация кодов)
Refs #14

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:36:35 +04:00
Andrey Epifancev
7bcd324194 feat(statements): соотношения §7 из словаря — жёсткие/мягкие, abs_terms, допуск, подстроки
Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:28:32 +04:00
Andrey Epifancev
aad6310b97 fix(statements/lines): T10.I1+I2 — порог дробных значений в словаре, тесты границ
Перенесено FRACTIONAL_SHARE в api/rules/statement_headers.yaml как fractional_share_percent (1..100),
добавлена валидация в StatementHeaderRules, целочисленное сравнение: fractional * 100 >= numeric * percent.
Добавлены тесты границ: ровно 10% (2 из 20), ниже 10% (1 из 12), без падения при нулевых числовых значениях.
Проверено RED мутацией: смена >= на > → падение теста граничного условия.

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 17:12:38 +04:00
Andrey Epifancev
55b60f58b2 feat(statements): строки с кодом, значения Decimal, дубликаты кодов, предупреждение о единицах
Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:59:02 +04:00
Andrey Epifancev
cb0bd062d4 test(statements): test_inn_not_taken_from_auditor_block_above_organization_inn (Fix round 3)
Добавлен тест, проверяющий, что ИНН аудитора НИКОГДА не берётся, даже когда
аудиторский блок расположен РАНЬШЕ (выше) строк с ИНН организации.

Лист:
- Строка 3-5: блок аудитора (auditor_from=3)
  - Строка 4: аудиторский ИНН = 7716021332
- Строки 6-8: организация
  - Строка 8: org ИНН = 3249004697

С охраной min(last_row, auditor_from-1) = min(9, 2) = 2:
  Поиск в строках 1-2, ИНН не найден → header.inn is None ✓ GREEN

Без охраны (поиск в строках 1-9):
  Аудиторский ИНН найден первым → header.inn = 7716021332 ✗ RED

Этот тест доказывает, что guard критически важен для исключения аудитора.

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:42:03 +04:00
Andrey Epifancev
e6696fa440 fix(statements): cleanup guard tests — удалены ложноположительные тесты (Fix round 2)
Обнаружено: test_inn_from_auditor_above_organization_inn_line не тестирует guard,
т.к. org INN всегда раньше auditor block в реальных файлах. Без guard первый найденный
INN всё равно организации (появляется раньше). Guard не differentiates этот сценарий.

Удалены:
- test_inn_skips_auditor_block — ложноположительный, docstring утверждал Review Focus,
  но тест проходит из-за порядка (org INN раньше auditor), не из-за guard.
  Функциональность покрыта test_one_c_header.
- test_inn_from_auditor_above_organization_inn_line — guard не differentiates;
  добавлен в попытке тестировать сценарий, невозможный по дизайну.

Оставлен test_inn_from_auditor_block_only_is_none — единственный тест, где guard
реально нужен: без org INN, только auditor блок → guard исключает его, возвращает None.

Guard работает корректно: тестирует edge case отсутствия org INN.

Итог: 6 тестов, все честны относительно требований к guard.

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:35:55 +04:00
Andrey Epifancev
27ffde426a style(statements): form atting — test_header.py
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:29:04 +04:00
Andrey Epifancev
b50ac38a73 fix(statements): улучш. тесты guard для _inn — исключение ИНН аудитора (Fix round 1)
Обнаружена важная находка (T9.I1): test_inn_skips_auditor_block в ONE_C fixture
проходил из-за структуры данных (org INN выше auditor INN), не благодаря guard.
Добавлены два явных guard-теста, которые ПАДАЮТ БЕЗ guard и ПРОХОДЯТ с guard:

(a) test_inn_from_auditor_block_only_is_none — только block аудитора в шапке:
    Без guard (last_row): _inn находит auditor INN = 9999999999 ✗
    С guard (min(last_row, auditor_from-1)): находит Nothing = None ✓

(b) test_inn_from_auditor_above_organization_inn_line — org INN до auditor block:
    Оба случая находят org INN = 1234567890, но без guard мог бы найти auditor ✓

Дополнительно:
- Удалён импорт приватной _FULL_CONFIDENCE; использован литерал 100 с noqa
- Убрана необходимая кавычка в аннотации _report_date (datetime.date | None)
- Все 8 тестов зелены: 2085 passed в make check

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:28:02 +04:00
Andrey Epifancev
55a75112aa feat(statements): шапка формы по меткам — организация, ИНН не аудитора, дата, единицы, ОКПО/ОКОПФ/ОКФС, адрес
Реализация Task 9: parse_header() извлекает значения полей из шапки документа ББ/ОФР
по меткам словаря Rules.statement_headers с особыми правилами:
- ИНН ниже блока аудитора пропускается (Review Focus)
- Организация ищется после метки, при пустом значении — выше с признаком ОПФ
- Дата из подзаголовка формы или тройки число/месяц/год
- Единицы, адрес, ОКПО, ОКОПФ/ОКФС по меткам; все найденные поля получают confidence=100
- При отсутствии продолжения блока метка берётся как form_name, остальные поля None

Тесты: 6 базовых сценариев + test_inn_skips_auditor_block (обязательный).

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:20:09 +04:00
Andrey Epifancev
f279157486 fix(osv): границы периода по названным месяцам («Январь - Май 2025 г.», один месяц) (T8.I1)
Refs #14

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:08:26 +04:00
Andrey Epifancev
8990ab26fe feat(osv): границы периода period_start/period_end и is_from_year_start в шапке (контракт v1.2, OQ-131)
Refs #14

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 16:00:32 +04:00
Andrey Epifancev
43ee753d74 refactor(parser): BookParser — оркестратор книги; OsvParser — конвейер листа ОСВ; заглушка форм до конвейера
Листы-продолжения форм (STATEMENT_CONTINUATION) идут в конвейер форм, а не в разбор ОСВ (R-5).

Refs #14

Co-Authored-By: Claude Sonnet <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 15:49:27 +04:00
Andrey Epifancev
bc96f2ff5d openspec: решения №15–16 (контракт заморожен, продолжение листа до задачи 7)
Refs #14

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 15:42:01 +04:00
Andrey Epifancev
b8bf2f29e4 feat(statements): блоки форм, тип по заголовку и ОКУД, листы-продолжения; classify_sheet без statement_markers
Refs #14
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 15:36:26 +04:00
Andrey Epifancev
c3df9ff32c feat(statements): колонка кодов, заголовок таблицы и колонки-периоды по содержимому
Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-10-06 15:16:39 +04:00
Andrey Epifancev
6a3661c41b fix(statements): OKUD pattern для DISCLOSURE — диапазон 0710003-0710099 без дефисов в классах
Паттерн из брифа \b07100(0[3-9]|[1-9]\d)\b содержал дефисы в диапазонах и отвергался валидатором.
Переписан с альтернацией: \b07100(0(3|4|5|6|7|8|9)|(1|2|3|4|5|6|7|8|9)\d)\b
Добавлены граничные тесты для OKUD кодов (0710003, 0710010 → DISCLOSURE; 0710000 → None).

Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 15:04:54 +04:00
Andrey Epifancev
d21884e334 feat(statements): словари форм — заголовки и ОКУД, метки шапки, периоды, соотношения §7 как данные
Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 14:55:07 +04:00
Andrey Epifancev
ed516d837c openspec: решение №14 (golden schema_version 1.2 раньше плана)
Refs #14

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 14:41:20 +04:00
Andrey Epifancev
cb0cad68f6 openspec: решения №12–13 (раскатка копий контракта v1.2, отложенные минор-находки)
Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 14:33:56 +04:00
Andrey Epifancev
3a08b990dd feat(contract): модели v1.2 — DISCLOSURE, StatementChecks, границы периода ОСВ; копия схемы
Refs #14

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 14:23:27 +04:00
Andrey Epifancev
37b25e0f4b Merge remote-tracking branch 'origin/main' into feat/14-slice-2b-statement-parser 2026-10-06 14:09:32 +04:00
aep
3b32462910 Merge pull request 'test(fixtures): тесты и golden для osv-dkb/** (#10)' (#17) from feat/10-osv-dkb-tests into main
Reviewed-on: #17
2026-10-06 13:05:50 +03:00
aep
5cb8e9c003 Merge pull request 'feat(osv): форматы пакета ДКБ — период-диапазон, Итого по Σ уровня 0, «Итого развернутое», шапка ОСВ 63 (#11)' (#13) from feat/11-dkb-formats into main
Reviewed-on: #13
2026-10-06 13:04:21 +03:00
aep
ae1e872e3e Merge pull request 'feat(osv): ИНН из названия контрагента, ИНН строкой выше, ИНН/КПП в ячейке (#9)' (#15) from feat/9-inn-in-text into feat/11-dkb-formats
Reviewed-on: #15
2026-10-06 13:00:36 +03:00
Andrey Epifancev
d6d795787b openspec: сценарий двухстрочного заголовка — на синтетике st02, шаблоны — отдельный сценарий
Шаблоны ФСБУ разносят год по ячейкам «20» и « г.», по тексту дату не собрать; требование к ним — разбор без ошибки
и needs_check.

Refs #14

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:54:00 +04:00
Andrey Epifancev
f6e8da9cf6 test(fixtures): обобщение тестов и golden на osv-dkb/** (многолистовые книги, ожидаемые needs_check, период каталога)
- test_osv_dkb.py: на каждом из 25 файлов пакета ДКБ — статусы листов по манифесту osv_dkb_expectations.yaml (данные, не
  if по имени файла), период по каталогу (2025-Q3, 2024-10_2025-09), структура строк, контракт, время разбора.
- golden: osv-dkb/** до порога GOLDEN_MAX_BYTES = 1 МиБ (22 из 25 файлов; три файла Агрокомплекса 9–14 МБ — без снимков);
  golden_update, golden_helpers (подкаталог osv-dkb/), conftest (dkb_file, dkb_golden_file), хелперы.
- dkb_helpers: expected_period, манифест; юнит-тесты без каталога fixtures.

Stacked on #15. Closes #10

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:23:34 +04:00
Andrey Epifancev
76b2b36f21 openspec: спека Среза 2b — парсер ББ и ОФР из Excel (statement-parsing), контракт v1.2
Proposal, design (D-1…D-11, решения без обсуждения №1–№11), новая capability statement-parsing,
дельта tabular-recognition-service (BookParser, schema_version 1.2), tasks. Решения владельца 06.10.2026:
только парсер и контракт; страницы-продолжения без склейки между файлами; единицы как есть; пятизначные
подстроки как строки; контракт MINOR 1.2; без запасного пути по именам.

Refs #14

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:21:27 +04:00
Andrey Epifancev
a592c68509 feat(osv): ИНН из текста названия контрагента, ИНН строкой выше, «ИНН/КПП» в ячейке
- OQ-100: ИНН в конце названия («Полиграф, 3528315710», «(ИНН …)», пробел) уходит в counterparty_inn, имя — без ИНН
  и разделителя; колонка ИНН приоритетнее; только для COUNTERPARTY.
- OQ-130: строка без сумм с одним ИНН над строкой с суммами того же уровня склеивается со следующей и не уходит в OTHER.
- «ИНН/КПП» в ячейке колонки ИНН даёт ИНН.
- Правила — osv_headers.yaml (counterparty_inn_suffix, inn_only_row, inn_kpp_cell), не код.
- Синтетика s17–s19 (генератор, тесты); golden — в репозитории fixtures (feat/9-golden).

Stacked on #13 (feat/11-dkb-formats).
Closes #9

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:13:44 +04:00
Andrey Epifancev
af8ec918c5 feat(osv): шапка ОСВ без меток и «Счет: Код / Наименование» (ОСВ 63 Новоросметалл), «Итого» ↔ Σ уровня 0 по нетто
- header: период отдельной ячейкой (periods.yaml: standalone), тип данных отдельной ячейкой («Бухгалтерский»,
  data_types.yaml: standalone_header), организация — хвост названия ведомости; код счёта — из первой строки-счёта
  таблицы (с предупреждением), если «по счету» в шапке нет.
- classify/detect: текст строки может стоять правее колонки текста (колонка задаёт уровень), подписи «Код»/
  «Наименование» (osv_headers.yaml: column_captions) — не группировки, строка сумм без подписи в конце таблицы —
  «Итого» (с предупреждением).
- checks: сумма уровня 0 сверяется с «Итого» по правилу R-21 (свёрнутое сальдо «Итого» — по нетто), как у родителя.
- tests: osv_dkb_files, покрытие словарей включает osv-dkb/**; README.

Refs #11

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 13:04:31 +04:00
Andrey Epifancev
1c26e7810e style(osv): длина строк докстрингов
Refs #11

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 12:50:46 +04:00
Andrey Epifancev
6fd7adde22 feat(osv): «Итого» сверяется с суммой строк уровня 0; «Итого развернутое» — вторая итоговая строка
- checks: «Итого» = первый корень ACCOUNT либо сумма всех строк уровня 0 (лист без строки корневого счёта,
  верхний уровень 58.01/58.03; OQ-106, OQ-133). Прежнее правило «= первому корню» остаётся достаточным;
  строки-показатели в сумму не входят; основная «Итого» — первая TOTAL листа.
- classify/hierarchy: вторые итоговые строки сразу за «Итого» (osv_headers.yaml: total_row_secondary) остаются
  в таблице как TOTAL уровня 0, а не уходят в OTHER; без обычной «Итого» вторая служит единственной итоговой.

Refs #11

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 12:50:35 +04:00
Andrey Epifancev
30f78c42e7 feat(osv): период-диапазон месяцев «Октябрь 2024 г. – Сентябрь 2025 г.» (скользящий, не с начала года)
Раньше первый месяц диапазона давал «2024 Q4, нарастающий». Теперь словарь periods.yaml (months, range)
разбирает диапазон: период режется по году конца, январь–конец квартала — нарастающий, ровно квартал — квартальный,
остальное (скользящие 12 месяцев) — год конца, квартал и is_cumulative = null + предупреждение «не с начала года».
Контракт v1.1 не менялся.

Refs #11

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 12:49:11 +04:00
aep
e3eeda8d84 Merge pull request 'test(fixtures): 72 реальных ОСВ и 88 golden-снимков (Счастливочная 1 кв 2025)' (#12) from feat/10-fixtures-72 into main
Reviewed-on: #12
2026-10-06 11:29:30 +03:00
Andrey Epifancev
fafe11349b test(fixtures): 72 реальных ОСВ — Счастливочная 1 кв 2025 (02, 58, 62, 66, 67, 76), 88 golden-снимков
EXPECTED_FILES 66 → 72, порог покрытия словарей, имя теста без числа, CLAUDE.md. Снимки — arm-ka-fixtures#7.
make test-fixtures: 873 passed (ошибка только у roundtrip без NATS).

Refs #10

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-06 12:24:18 +04:00
aep
1f7ddff6af Merge pull request 'openspec: архив change slice-2a-osv-parser' (#8) from chore/archive-slice-2a-osv-parser into main
Reviewed-on: #8
2026-10-05 19:46:02 +03:00