203 Commits

Author SHA1 Message Date
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
aep
d0d3c79824 Merge pull request 'openspec: архив nats-env-config (#31)' (#38) from chore/31-archive-nats-env-config into main
Reviewed-on: #38
2026-10-13 12:59:46 +03:00
Andrey Epifancev
04d7f47787 openspec: архив nats-env-config (#31)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:57:00 +04:00
aep
143744b80d Merge pull request 'NATS: subject'ы и JWT по окружению из OpenBao (OPENBAO__NATS__*) (#31)' (#37) from feat/31-nats-env-config into main
Reviewed-on: #37
2026-10-13 12:55:04 +03:00
Andrey Epifancev
1b50d652af Правки финального ревью: умолчания subject'ов не называем фактическими
M-3: docstring воркера, T5.4: docstring и сообщение roundtrip-теста, M-5: CLAUDE.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:38:50 +04:00
Andrey Epifancev
7f7a856c40 openspec: nats-env-config — отмечены выполненные пункты tasks.md (#31)
check-full: tests/fixtures падают только из-за отставания ветки от main (после merge main — 2313 passed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:38:50 +04:00
Andrey Epifancev
4f0636f627 Fix-wave ревью nats-env-config: тесты subject'ов, JWT в healthcheck, лог старта, subject is not None
T4.1, T2.1, T2.2, T5.1, T5.2, T5.3 (тесты); T5.6 (subscribe_requests: пустая строка не подменяется умолчанием).
Отмечены пункты tasks.md 1.1, 1.2, 2.x, 3.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:38:50 +04:00
Andrey Epifancev
1d059993f0 NATS: подписка, публикация и /healthcheck.subjects по настройкам; roundtrip на своих subject'ах (#31)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:38:50 +04:00
Andrey Epifancev
f794ebabcb NATS: subject'ы и JWT из OPENBAO__NATS__*, SecretStr, скрытие входа в ошибках (#31)
- NATSSettings: subject'ы запроса и ответа из окружения (имена контракта по умолчанию), проверка формата и попарного
  различия; NATS_SEED и NATS_JWT — SecretStr; request_subjects() для request_subject(pipeline, subjects).
- hide_input_in_errors во всех классах настроек: ошибка «нет поля» не печатает вход группы с JWT и seed.
- build_nats_auth читает секреты через get_secret_value().
- Схемы контракта скопированы из docs/contracts (request, result-message).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:38:50 +04:00
Andrey Epifancev
52e760fd9d openspec: change nats-env-config — subject'ы и JWT NATS по окружению из OpenBao
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 13:38:50 +04:00
aep
b342b54002 Merge pull request 'ОСВ: реквизит «Контрагенты.ИНН» строкой под контрагентом — ИНН родителю, без «.0» (#32)' (#33) from feat/32-osv-inn-subconto into main
Reviewed-on: #33
2026-10-13 11:20:50 +03:00
Andrey Epifancev
02ad8be018 ОСВ: реквизит «Контрагенты.ИНН» и в шапке варианта 1 (#32)
Строка блока заголовка «Контрагенты.ИНН» под «Контрагенты» — тот же реквизит,
что элемент списка субконто варианта 2: в group_schema не попадает, у владельца
has_inn, строки склеиваются glue_inn_attributes. Общая часть вариантов —
_attach_inn_attribute и _positions.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 12:03:10 +04:00
Andrey Epifancev
bb78f81094 ОСВ: реквизит «Контрагенты.ИНН» строкой под контрагентом — ИНН родителю, без «.0» (#32)
В шапке варианта 2 «субконто: Контрагенты, Контрагенты.ИНН» 1С выводит ИНН
отдельной строкой на уровень глубже контрагента. Парсер принимал реквизит за
второй уровень контрагентов: строка ИНН становилась контрагентом с именем
«2370012036.0» и без ИНН, у наименования ИНН тоже не было, в свод ядра
попадали обе строки.

- header: элемент «<группировка>.ИНН» — InnAttribute, в group_schema не
  попадает, у владельца has_inn = true; GroupSchema.positions держит позицию
  для классификатора;
- classify: строка реквизита — OTHER с ИНН ячейки (column_inn, R-24);
  glue_inn_attributes отдаёт ИНН контрагенту, убирает строку, поднимает её
  детей; не склеилось (несколько строк, суммы не равны, ИНН не распознан или
  расходится) — OTHER, предупреждение, needs_check; пустая ячейка (физлицо) —
  склейка без ИНН (R-1);
- readers: целый float из xls читается как int — без «.0».

Файл банка: 713 из 716 контрагентов с ИНН, 3 физлица без ИНН, status done.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 11:11:06 +04:00
aep
18eea82d2e Merge pull request 'openspec: архив nats-files-subjects (#28)' (#30) from chore/28-archive-nats-files-subjects into main 2026-10-08 22:50:51 +03:00
Andrey Epifancev
fc9d6d4902 openspec: архив nats-files-subjects (#28)
Change слит PR #29; спеки обновлены (subject'ы files.tabular_uploaded,
files.img_uploaded, files.tabular_parsed).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-08 23:50:24 +04:00
aep
46ef814b10 Merge pull request 'NATS: subject'ы как в старом АРМ — files.*_uploaded, files.tabular_parsed (#28)' (#29) from feat/28-nats-files-subjects into main
Reviewed-on: #29
2026-10-08 22:48:21 +03:00
Andrey Epifancev
817487b976 nats: subject'ы как в старом АРМ — files.*_uploaded, files.tabular_parsed (#28)
Решение владельца 08.10.2026: recognition.tabular.request → files.tabular_uploaded,
recognition.image.request → files.img_uploaded, recognition.result →
files.tabular_parsed (общий subject ack и результатов; files.img_parsed не
используется). Тела сообщений, Nats-Msg-Id, queue group'ы и schema_version не
меняются. Константы api/src/contract/subjects.py, докстринги, тесты, README,
CLAUDE.md; копии схем api/contracts/ из docs/contracts/ побайтно; change
nats-files-subjects с дельтой спеки. Сквозной change — RSHB/arm-ka-docs#74.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-08 23:46:19 +04:00
aep
49f725d238 Merge pull request 'Счета без сальдо по аналитике (91, 99) вне тождества строк — OQ-132 (#11 п. 2)' (#26) from feat/11-osv-91-no-saldo into main
Reviewed-on: #26
2026-10-07 23:24:55 +03:00
Andrey Epifancev
49400682bc feat(osv): счета без сальдо по аналитике (91, 99) вне тождества строки (OQ-132, #11 п. 2)
У 91 и 99 строки аналитики несут только обороты, сальдо закрыто на субсчёт закрытия
(91.09), поэтому каждая ОСВ 91 получала needs_check. Список счетов — данные
api/rules/osv_checks.yaml (accounts_without_analytic_balance: 91, 99; 90 не входит).

- тождество строки на таких счетах не проверяется;
- «сумма детей = родитель» сохраняется: обороты всегда, сальдо — только у родителя
  с дочерними субсчетами (корень -> субсчета); у родителя с одной аналитикой сальдо
  не сверяется;
- «Итого» сверяется как обычно;
- строка относится к счёту списка по коду ближайшего счёта ветки (91, 91.01; не 910).

Тесты: unit checks/rules, манифест osv_dkb_expectations (две ОСВ 91 теперь done).
README, CLAUDE.md, openspec/specs/osv-parsing, api/rules/README.md обновлены.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-08 00:18:36 +04:00
aep
76f8df48d2 Merge pull request 'openspec/config.yaml: источник истины DBML v5.13 → v5.17 (#24)' (#25) from feat/24-config-v517 into main
Reviewed-on: #25
2026-10-07 22:43:52 +03:00
Andrey Epifancev
6b03ec1cfa openspec/config.yaml: источник истины DBML v5.13 → v5.17 (#24)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012vJkmBGKKqMoEMzvsXG3y2
2026-10-07 23:41:52 +04:00
aep
a4221e0b6e Merge pull request 'feat(config): несекретные настройки из OpenBao через OPENBAO__APP__<ИМЯ> (#22)' (#23) from feat/22-openbao-app-settings into main
Reviewed-on: #23
2026-10-07 17:42:28 +03:00
Andrey Epifancev
be67828cbb feat(config): несекретные настройки из OpenBao через OPENBAO__APP__<ИМЯ> (#22)
Тот же источник настроек, что в arm-core#44: приоритет обычный env -> OPENBAO__APP__* -> .env -> умолчание;
неизвестное имя — ошибка при старте; ключ APP не ломает OpenBAOSettings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-07 18:39:31 +04:00
aep
8be2cf1096 Merge pull request 'fix(statements): округление итогов мягкое (OQ-138), слабые продолжения, подстроки по порядку (#20)' (#21) from fix/20-continuation-tolerance into main
Reviewed-on: #21
2026-10-06 22:21:59 +03:00
Andrey Epifancev
e0a24bc835 chore(contract): копия docs/contracts — $comment без «1.1», пример Excel done, OCR-пример без checks, описание мягких нарушений (M-12, OQ-138)
Refs #20

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 23:17:26 +04:00
Andrey Epifancev
c780dfd858 fix(statements): округление итогов не портит статус (OQ-138), слабые продолжения только сразу после формы и той же формы, подстроки по порядку строк
- OQ-138 (решение владельца 06.10.2026): единицы шапки верны; жёсткое расхождение до rounding_tolerance_percent = 0,001 %
  от наибольшего по модулю числа соотношения — округление итогов: soft_relations_failed + предупреждение, статус не
  меняется. НПЗ, ОФР стр. 1 Унагранде Компани и Групп теперь done.
- N-1/N-2: лист с 1–2 кодами — продолжение только сразу после листа формы, коды из диапазона формы открытого документа;
  присоединение видно в предупреждениях. N-3: негативные тесты BookParser и StatementParser.
- M-9: пятизначная подстрока относится к ближайшей четырёхзначной строке выше с теми же тремя цифрами (12310 под 1230).
- N-4: на продолжении без шапки колонка «Пояснения» узнаётся по коротким значениям и не даёт line_name.
- T7.1: ответ с ошибкой листа ОСВ называет неразобранные листы форм; T7.2: metrics.rows для форм — в спеке.
make check-full: 2217 passed, интеграция 10 passed; golden 138/138 (снимки — arm-ka-fixtures fix/20-golden).

Refs #20

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 23:14:21 +04:00
aep
9947da9121 Merge pull request 'openspec: архив change slice-2b-statement-parser' (#19) from chore/archive-slice-2b-statement-parser into main
Reviewed-on: #19
2026-10-06 21:43:51 +03:00
Andrey Epifancev
cc78937673 openspec: архив change slice-2b-statement-parser (2026-10-06), спека statement-parsing, дельта tabular-recognition-service
Refs #14

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 22:40:41 +04:00
aep
1b9296f966 Merge pull request 'feat(statements): парсер ББ и ОФР из Excel, контракт v1.2 (Срез 2b)' (#16) from feat/14-slice-2b-statement-parser into main
Reviewed-on: #16
2026-10-06 21:37:58 +03:00
Andrey Epifancev
15fb561cd8 openspec: O-9 решено, D-11 по факту (needs_check), tasks.md по факту, решение №27 (R-16)
Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 21:58:24 +04:00
Andrey Epifancev
1abe212524 fix(statements): финальная волна ревью — I-1 (O-9), M-10, I-2, I-3, M-5, M-8, M-11, T13.5, M-6, M-7, T15.1, T15.2
I-1: лист с 1–2 кодами после листа формы — продолжение (min_codes_continuation в словаре).
M-10: тип формы маркера продолжения запрещает присоединение к документу иного типа.
I-2: одиночный месяц не задаёт границы при дате на число/квартале (not_single_month).
I-3: название строки из ближайшей текстовой ячейки левее кодов, пустое имя без confidence.
M-5: units_thousands и okud_code в словаре, без type: ignore в detect.py.
M-8: строка нумерации и нули не считаются строкой без кода с суммами.
M-11: предупреждение о дробных значениях — одно на документ.
T13.5: _upper_header_row возвращает верхнюю строку при склейке хотя бы одной колонки.
M-6/M-7/T15.1/T15.2: остатки statement_markers, описание fractional_share_percent, README, тест воркера.

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 21:58:24 +04:00
Andrey Epifancev
336f4d61d7 chore: api/uv.lock вне git, uv.lock в .gitignore (M-1)
Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EAKRDNzXtRrwmWz9z6PZu3
2026-10-06 21:58:24 +04:00
Andrey Epifancev
be47e82e72 docs/openspec: перенумерация OQ-137…142 -> OQ-138…143 (R-15)
Номер OQ-137 в main docs занят вопросом о раскладке горячих папок; design: решение №26.

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 21:28:25 +04:00
Andrey Epifancev
3a370d4872 docs(statements): README и CLAUDE.md — парсер форм; интеграционный тест книги НПЗ через воркер
Тест ожидает needs_check (рубли при шапке «тыс. руб.», OQ-137).

Refs #14

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: cedd7915-2efe-41e5-988c-a9117033598b
2026-10-06 21:11:36 +04:00
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