10 KiB
Raw Blame History

Design

Context

См. proposal.md, Why и What Changes. Это ретроспективная фиксация перехода, затронувшего два репозитория. Текущий arm-core больше не содержит встроенного api/arm_statements/, но его Python-импорты остаются прежними. Дистрибутив называется pylib-ai-arm-statements; запись с подчёркиваниями в requirements обозначает тот же нормализованный идентификатор Python-пакета.

На момент оформления обнаружены остатки прежней схемы: api/pytest.ini содержит arm_statements/tests, Ruff считает arm_statements first-party, mypy содержит overrides старого пакета. В Makefile из lint исчез не только аргумент arm_statements, но и весь вызов mypy. Эти факты фиксируются для проверки при apply, без изменения кода сейчас.

Основные спецификации ещё содержат формулировки «копия пакета» и sync-statements --check; дельты этого change уточняют источник библиотеки. Документирование перехода не означает, что дельты уже синхронизированы или change архивирован.

Goals / Non-Goals

Goals: воспроизводимая установка кода и ресурсов, сохранение имени импорта, определение версии установленного пакета, документирование сделанного и оставшихся проверок.

Non-Goals: менять алгоритмы §7/§11 общих правил, DTO, обязательность версии, БД и денежные единицы. Decimal и существующие единицы формы сохраняются. Документы в ../docs и выпуск внешней библиотеки не изменяются этим локальным workflow.

Decisions

Разделить имя дистрибутива и Python-модуля

pylib-ai-arm-statements устанавливается как arm_statements. Это сохраняет адаптер StatementsEngine, доменную сборку StoredForm и тесты. Выполненная ранее замена импортов на pylib_ai_arm_statements отменена вместе с временным override follow_untyped_imports; она не является итогом задачи.

Альтернатива — переименовать все импорты — отвергнута пользователем и не нужна для подключения дистрибутива.

Использовать окружение backend и явную переустановку

STATEMENTS_DIR ?= ../pylib_ai_arm_statements; uv venv --python 3.11 --allow-existing создаёт или использует окружение; uv pip install --python ... --reinstall-package pylib-ai-arm-statements ... переустанавливает библиотеку. Обычная установка выбрана вместо editable: установленное дерево должно содержать весь необходимый код и YAML. Переустановка нужна и при неизменившемся номере локальной версии.

make venv фильтрует только основные requirements по ^(raisa_|pylib_ai), dev-файл обрабатывается прежним фильтром ^-r. Текущий Makefile также устанавливает локальную библиотеку после requirements. Это уточняет первоначальное описание двух отдельных команд: make install остаётся доступным для обновления без полного запуска venv.

Включать YAML в дистрибутив

В ../pylib_ai_arm_statements/MANIFEST.in исправлены два пути на arm_statements и arm_statements/rules. Имеющийся include_package_data = True позволяет включать ресурсы. Ручное копирование YAML в site-packages не использовалось: оно не исправляет последующие установки. make install успешно переустановил исправленный пакет; загрузка правил проверена тестами движка.

Сохранить маркер и добавить fallback на метаданные

В библиотеке arm_statements/version.py стандартный непустой VERSION имеет приоритет. При отсутствующем/пустом стандартном файле вызываются метаданные pylib-ai-arm-statements. При PackageNotFoundError возвращается None. Явно переданный отсутствующий/пустой файл сохраняет старое поведение None.

Альтернатива — ослабить валидацию RecognitionResultV2 — отвергнута: для форм версия остаётся обязательной. Искусственный VERSION в site-packages также не решает поставку пакета.

Уточнить документацию и границы изменений

В arm-core обновлены README, CLAUDE.md, комментарии api/src/models/files.py, api/src/contract/result_v2.py, api/src/api/dependencies/files.py, описание api/contracts/recognition-result.schema.json, комментарии конфигурации и dev requirements. В историческом плане и архивных change добавлены пометки о прежней схеме. Конкретные заголовки/сценарии доменных требований сохранены в дельтах.

В рабочем дереве также наблюдаются удаление встроенной копии, pin 0.1.1, отключение statements-check и изменения Makefile пользователем. Они относятся к контексту перехода; изменения .env.test и test_config.py, случайные HTML/PDF/XML и служебные файлы не входят в этот change.

Risks / Trade-offs

  • [Локальная переустановка меняет содержимое без нового номера версии] → удобна для разработки; опубликованные артефакты требуют уникальных версий. Равенство номера не доказывает равенство исходников.
  • [Другие сервисы ещё передают хеш копии вместо версии дистрибутива] → существующий STATEMENTS_VERSION_MISMATCH остаётся информационным; согласование выпуска выносится в отдельный change общих docs.
  • [Ошибки пакета исправлены в соседнем репозитории] → нужен отдельный коммит/поставка библиотеки; один коммит arm-core не включает эти файлы.
  • [Потеря проверки типов при удалении встроенного пакета] → отдельно проверить конфигурацию и восстановить проверку исходников arm-core при apply; анализировать библиотеку её собственными средствами.
  • [Устаревшая pytest testpath и first-party-настройки] → проверить и убрать привязки к удалённому дереву в рамках завершения перехода.
  • [Полный прогон не подтверждён] → повторить интеграционный тест с доступной инфраструктурой. Предыдущий запуск завис и был остановлен; успех не заявляется.

Migration Plan

Сделано: исправлена и переустановлена локальная библиотека; проверены версия 0.1.1 и 11 тестов tests/test_statements_engine.py. Ранее 24 профильных теста проходили на промежуточном варианте с другими импортами; этот результат не считается проверкой окончательного состояния.

Осталось: проверки собранного дистрибутива и граничных вариантов VERSION, согласование pytest/Ruff/mypy, повтор теста test_intake_statements_version_mismatch, общий прогон подходящих проверок, отдельные коммиты по репозиториям. Сценарий поставки проверяется на установленном пакете; регрессия нормализации — на существующих реальных фикстурах, без введения искусственных форм ради упаковки.

Для отката установки используется предыдущий исправный дистрибутив в окружении backend. Возвращать синхронизируемую копию исходников ради частичного отката не требуется; миграций БД нет. Для возврата к схеме до перехода нужен согласованный откат зависимости и удаления копии отдельным изменением.