feat(release): пакет публичный 0.1.0 + publish-workflow; ENGINE_VERSION отвязан от версии пакета - #2
Merged
Merged
Conversation
…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, который его сломал.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Слайс выпуска
@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