Skip to content

feat(release): пакет публичный 0.1.0 + publish-workflow; ENGINE_VERSION отвязан от версии пакета - #2

Merged
alexnikolskiy merged 1 commit into
mainfrom
feat/npm-release
Jul 26, 2026
Merged

feat(release): пакет публичный 0.1.0 + publish-workflow; ENGINE_VERSION отвязан от версии пакета#2
alexnikolskiy merged 1 commit into
mainfrom
feat/npm-release

Conversation

@alexnikolskiy

Copy link
Copy Markdown
Contributor

Слайс выпуска @trdlabs/engine в npm. Основная развилка вскрылась при подготовке и решена владельцем.

Развилка: что такое ENGINE_VERSION

Константа едет внутри канонического трейса, а значит и внутри RunEvidence каждого потребителя. Если приравнять её версии пакета, то выпуск 0.1.0 сдвинул бы замороженный анкер этого репо (refresh-expectations --force) и все три голдена backtester'а — при том что семантика не изменилась ни на байт.

Это ровно та конфляция, которую решение (A) диагностировало на 017.2 → 017.3 и отказалось повторять: идентичность прогона становилась заложником изменения не того рода.

Решение владельца 2026-07-26: ENGINE_VERSION — версия СЕМАНТИКИ исполнения, отвязанная от версии пакета. Версия пакета — факт дистрибуции (релиз, бамп зависимости, опечатка в комментарии). ENGINE_VERSION — факт идентичности. Поэтому выпуск 0.1.0 не сдвинул ничего: рефы всех девяти expectations прежние, --force по анкеру не понадобился.

Чем развязка закреплена

Развязка, которую никто не проверяет, — один рефактор до «починки» синхронизацией двух чисел. Закреплена с обеих сторон:

  • refresh-expectations отказывается двигать рефы, пока ENGINE_VERSION стоит на месте. Сдвиг парити-анкера есть смена семантики, и она обязана назвать своё ядро — иначе каждый трейс продолжит утверждать, что его произвело прежнее поведение. Идемпотентный ре-ран, который ничего не двигает, бампа не требует.
  • test/versioning.test.ts пинует и саму развязку (ENGINE_VERSION !== pkg.version), и публикуемость манифеста, и то, что анкер записывает, какой генерацией семантики он отчеканен.

Release-машинерия

Портирована с @trdlabs/backtester-sdk: workflow_dispatch, fail-closed преflight (semver, совпадение введённой версии с package.json, лицензия, provenance, отказ публиковать уже существующую версию), затем все четыре гейта и publish с OIDC provenance. Тег и GitHub-release создаются после публикации как release note — канал доставки один, npm.

release:preflight заведён и в обычный CI: манифест, который нельзя опубликовать, должен падать в том PR, который его сломал, а не в workflow_dispatch через три недели.

Проверено

Локально зелены все гейты: typecheck, determinism (clean), tape-integrity (3 ленты), 100 тестов, build, preflight (@trdlabs/engine@0.1.0 is publishable). Diff по expected-traces.json — ровно одна добавленная строка заголовка engineVersion, ни один реф не двинулся.

Чего этот PR не делает

Не публикует. Для workflow_dispatch нужен секрет NPM_TOKEN в этом репозитории (или trusted publisher на npmjs.com) — это действие владельца. Переезд backtester'а с submodule-пина на версионную зависимость — отдельный шаг после того, как пакет появится в реестре.

🤖 Generated with Claude Code

…ON отвязан от версии пакета

Решение владельца 2026-07-26: ENGINE_VERSION — версия СЕМАНТИКИ исполнения, а не
версия npm-пакета. Они отвечают на разные вопросы. Версия пакета — факт
дистрибуции: двигается от релиза, бампа зависимости, опечатки в комментарии.
ENGINE_VERSION едет внутри канонического трейса, поэтому каждое его значение
инвалидирует все замороженные хеши ниже по течению (ленты этого репо и голдены
каждого потребителя — backtester ребейзил три штуки на Ф3 ровно по этой причине).

Связать их значило бы, что patch-релиз молча инвалидирует парити-анкер — та же
конфляция, которую решение (A) диагностировало на 017.2→017.3 и отказалось
повторять. Поэтому выпуск 0.1.0 не сдвинул НИЧЕГО: рефы лент прежние, --force по
анкеру не понадобился.

Развязка, которую никто не проверяет, — один рефактор до «починки» синхронизацией
двух чисел, поэтому она закреплена с обеих сторон:
  • refresh-expectations отказывается двигать рефы, пока ENGINE_VERSION стоит на
    месте (сдвиг анкера ЕСТЬ смена семантики и обязан назвать своё ядро);
  • test/versioning.test.ts пинует и саму развязку, и публикуемость манифеста.

Плюс release-workflow, портированный с @trdlabs/backtester-sdk: workflow_dispatch,
fail-closed преflight (semver, совпадение с package.json, лицензия, provenance,
отказ публиковать существующую версию), затем все четыре гейта и publish с OIDC
provenance. release:preflight заведён и в обычный CI — манифест, который нельзя
опубликовать, должен падать в том PR, который его сломал.
@alexnikolskiy
alexnikolskiy merged commit e61cc21 into main Jul 26, 2026
4 checks passed
@alexnikolskiy
alexnikolskiy deleted the feat/npm-release branch July 26, 2026 17:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant