Skip to content

fix(release): 0.1.0 уехала без провенанса — починить и проверять факт, а не намерение - #5

Merged
alexnikolskiy merged 1 commit into
mainfrom
fix/provenance
Jul 26, 2026
Merged

Conversation

@alexnikolskiy

Copy link
Copy Markdown
Contributor

Опубликованная 0.1.0 не несёт аттестации, хотя шаг называется «with provenance», а preflight требует provenance: true. Реестр подтверждает: attestations у @trdlabs/engine@0.1.0 пусты.

Две молчаливые причины

  1. В манифесте не было repository. npm документирует публичный repository, совпадающий с источником публикации, как предусловие провенанса. Без него publish всё равно успешен — просто без аттестации.
  2. pnpm publish пропустил генерацию. Он сначала пробует собственный OIDC-обмен; тот вернул 404 (trusted publisher для пакета не настроен), pnpm откатился на токен и провенанс не сгенерировал, напечатав при этом ✅ Published.

Починено

  • Добавлено repository.
  • Publish переведён на npm publish --access public --provenance — npm CLI берёт Sigstore-идентичность прямо из id-token: write. Это ровно то, чем публикуется @trdlabs/sdk, у которого аттестации на месте.
  • Preflight теперь требует repository, иначе падает (проверено от обратного).

Главное — не эти две строки

Шаг утверждал провенанс, и ничто это не проверяло. Поэтому после публикации workflow спрашивает сам реестр — единственную инстанцию, которая знает, что реально прикрепилось, — и падает, если аттестации нет, прямо сообщая, что версия в npm неизменяема и чинится только следующим патчем. Ограниченный ретрай, потому что чтение свежей публикации отстаёт (мы это уже наблюдали: пакет появился в реестре через ~2 минуты после publish).

Версия поднята до 0.1.1: 0.1.0 исправить в реестре нельзя.

Смежная находка (вне этого PR)

У @trdlabs/backtester-sdk аттестаций нет ни в одной версии — 0.3.0, 0.4.0, 0.8.0 — хотя его workflow публикует с --provenance, а комментарий в нём утверждает, что «the published version carries a verifiable build attestation». У @trdlabs/sdk провенанс есть. Причину там не искал, чтобы не расширять скоуп; вынес отдельно.

Проверено

Preflight @trdlabs/engine@0.1.1 is publishable, typecheck чист, 100 тестов, clean-consumer OK, workflow gate OK.

🤖 Generated with Claude Code

…, а не намерение

Опубликованная 0.1.0 не несёт аттестации, хотя шаг называется «with provenance»,
а preflight требует provenance: true. Реестр это подтверждает: у @trdlabs/engine@0.1.0
attestations пусты. Причин две, и обе молчаливые.

1. В манифесте не было поля repository. npm документирует публичный repository,
   совпадающий с источником публикации, как ПРЕДУСЛОВИЕ провенанса. Без него
   publish всё равно успешен — просто без аттестации.

2. pnpm publish сначала пробует собственный OIDC-обмен; тот вернул 404 (trusted
   publisher для пакета не настроен), pnpm откатился на токен и пропустил
   генерацию провенанса, напечатав при этом «✅ Published».

Починено: добавлен repository; publish переведён на `npm publish --provenance`
(npm CLI берёт Sigstore-идентичность прямо из id-token: write); preflight теперь
требует repository.

Но главный урок не в этих двух строках: шаг УТВЕРЖДАЛ провенанс, и ничто это не
проверяло. Поэтому после публикации workflow спрашивает сам реестр — единственную
инстанцию, которая знает, что реально прикрепилось, — и падает, если аттестации
нет, прямо говоря, что версия в npm неизменяема и чинится только следующим патчем.

Версия поднята до 0.1.1: 0.1.0 исправить в реестре нельзя.
@alexnikolskiy
alexnikolskiy merged commit 8c19d4e into main Jul 26, 2026
4 checks passed
@alexnikolskiy
alexnikolskiy deleted the fix/provenance branch July 26, 2026 19:12
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