2026-10-27 17:06:45 +04:00

92 lines
10 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## ADDED Requirements
### Requirement: Библиотека общего кода `arm_statements`
Общий код нормализации ББ/ОФР SHALL жить в репозитории `RSHB/pylib_ai_arm_statements` Python-библиотекой: дистрибутив
`pylib-ai-arm-statements`, импорт — `arm_statements`, свои тесты, конфиг линтеров и `make check`. Библиотека SHALL
содержать: типы шага 1 (`FormCandidate`, `Cell`; сериализуемые в json dataclass-ы), шаги 2–8, общие разборы текста
(двойники, даты, суммы, коды), словари — проверок §7 `statement_checks.yaml` (полный и упрощённый наборы), периодов
`statement_periods.yaml`, заголовков форм и ОКУД, подписей колонок («Код», «Наименование», исключения), букв-двойников,
единиц измерения `statement_units.yaml` (написания и коды ОКЕИ), упорядоченные перечни кодов форм по редакциям (`66n`,
`fsbu4`) и вариантам (`full`, `simplified`) без наименований — байтовая копия `docs/contracts/statement-code-orders.yaml`
как `arm_statements/rules/statement_code_orders.yaml`, диапазоны кодов — и загрузчик словарей. Словари SHALL входить в
дистрибутив данными пакета (wheel и sdist), установленная библиотека читает их без исходного репозитория. Словаря
«код → наименование» в библиотеке MUST NOT быть (Р-3). Библиотека SHALL владеть своими типами входа и выхода;
конвертацию выхода в модель контракта делает потребитель. Golden-тесты — внутри библиотеки на синтетических и
обезличенных данных; тесты на реальных фикстурах остаются в сервисах и соседние репозитории не читают. Зависимости
библиотеки — только те, что есть в зеркале банка (сейчас PyYAML), Python — 3.11 (версия платформы).
В tabular-parser, scan-gateway и arm-core библиотека SHALL подключаться зависимостью и импортироваться по имени
`arm_statements`; поставку, версию и порядок её подъёма задаёт требование «Поставка библиотеки потребителям».
#### Scenario: Наименований в библиотеке нет
- **WHEN** ревьюер ищет в библиотеке соответствие «код → наименование»
- **THEN** его нет: в перечне кодов только коды, наименования строк — словарь ядра
#### Scenario: Словари в установленном пакете
- **WHEN** wheel библиотеки установлен в чистое окружение без исходного репозитория
- **THEN** `import arm_statements` и загрузка стандартных правил работают, все YAML-словари на месте
### Requirement: Поставка библиотеки потребителям
Версия библиотеки SHALL быть семантической (`MAJOR.MINOR.PATCH`), записываться в файл `VERSION` корня репозитория
библиотеки и помечаться тегом `v<версия>` на коммите выпуска; опубликованная версия MUST NOT пересобираться с другим
содержимым. Публикацию в Nexus выполняет платформа (CI в Gitea нет).
Потребители (`arm-core`, `tabular-parser`, `scan-gateway`) SHALL держать в `api/requirements.txt` строку
`pylib_ai_arm_statements==<версия>`; копии исходников библиотеки в потребителях MUST NOT быть. На платформе библиотека
ставится из Nexus по этой строке. Вне банка `make venv` SHALL пропускать строки `pylib_ai*` (как `raisa_*`) и ставить
библиотеку из локального checkout `STATEMENTS_DIR` (по умолчанию `../pylib_ai_arm_statements`); `make install`
переустанавливает её без пересоздания окружения. Обе цели SHALL сначала сверять checkout (цель `statements-version`):
`VERSION` checkout не равен версии из `requirements.txt` или checkout нет — ошибка; checkout не на теге `v<версия>` —
предупреждение (правка библиотеки до выпуска). `STATEMENTS_TAG` по умолчанию — `v<версия>` из `requirements.txt`.
`make docker-build` SHALL передавать checkout библиотеки контекстом сборки `statements` и отказывать, если `HEAD`
checkout не совпадает с тегом `STATEMENTS_TAG`.
`ruff` и `mypy` потребителя библиотеку не проверяют (она проверяется своим `make check`), `arm_statements` в конфиге
`ruff` потребителя — сторонний пакет.
Маркер версии в результате (`service.statements_version`) и версия ядра для `STATEMENTS_VERSION_MISMATCH` SHALL
браться из метаданных установленного дистрибутива (`importlib.metadata`). У заданий, посчитанных до перехода, в
`recognition_job.statements_version` остаётся хэш коммита копии; расхождение с версией ядра даёт
`STATEMENTS_VERSION_MISMATCH` (`info`) — это ожидаемо и не исправляется (решение владельца 26.10.2026).
Порядок правки перечня кодов: PR в docs (`contracts/statement-code-orders.yaml`) → PR в библиотеку (байтовая копия
yaml) и новая версия → подъём версии в потребителях «сначала ядро». Пока цепочка не дошла до библиотеки,
`statements-orders-check` в docs предупреждает, но не краснеет. Подъём версии в потребителях выкладывается одной
поставкой ядра и обоих сервисов.
#### Scenario: Версия общего кода в результате
- **WHEN** сервис собирает результат с установленной библиотекой версии `0.1.1`
- **THEN** в результате `service.statements_version = "0.1.1"`
#### Scenario: Сборка образа не с того коммита
- **WHEN** в `../pylib_ai_arm_statements` checkout стоит на коммите после тега `v0.1.1`, а `STATEMENTS_TAG = v0.1.1`
- **THEN** `make docker-build` завершается ошибкой «HEAD библиотеки не совпадает с v0.1.1», образ не собирается
#### Scenario: Checkout библиотеки другой версии
- **WHEN** в `api/requirements.txt` сервиса `pylib_ai_arm_statements==0.1.2`, а в `../pylib_ai_arm_statements` `VERSION` = `0.1.1`
- **THEN** `make venv` и `make install` завершаются ошибкой с обеими версиями, библиотека не ставится
#### Scenario: Задание до перехода
- **WHEN** аналитик правит форму, посчитанную сервисом с копией (`statements_version` — хэш коммита), а у ядра
установлена библиотека `0.1.1`
- **THEN** пересчёт пишет `STATEMENTS_VERSION_MISMATCH` (`info`), на статус и подтверждение это не влияет
#### Scenario: Перечень кодов в docs новее библиотеки
- **WHEN** в docs в `statement-code-orders.yaml` добавлен код, а библиотека ещё не выпущена с ним
- **THEN** `make -C docs check` печатает предупреждение `statements-orders-check` и называет файл, код возврата 0
## REMOVED Requirements
### Requirement: Пакет общего кода `arm_statements` и его копии
**Reason**: копии пакета в сервисах заменены установленной библиотекой (AURORA-1677), репозиторий `arm-statements`
архивирован, код перенесён в `RSHB/pylib_ai_arm_statements`.
**Migration**: требования «Библиотека общего кода `arm_statements`» и «Поставка библиотеки потребителям».
### Requirement: `sync-statements` — копии пакета в потребителях
**Reason**: копии `api/arm_statements/` в сервисах заменены установленной библиотекой (AURORA-1677); раскладывать и
сверять нечего, скрипт `docs/scripts/sync-statements.sh` и цели `sync-statements`, `statements-check`,
`test-sync-statements` удалены.
**Migration**: поставка и версия — требование «Поставка библиотеки потребителям»; сверка перечня кодов docs с
библиотекой — цель `statements-orders-check` в `make -C docs check`; сверка словаря имён ядра с перечнем —
тест ядра `test_name_dictionary_codes_in_code_orders`.