fix(ci): use @ for Sentry release id (slash is rejected by Sentry)#20
Merged
Conversation
Sentry's release-version validator rejects slashes ("Invalid release
version. Slashes and certain whitespace characters are not permitted."),
so passing `<action>/<version>` to `sentry-cli releases new` aborts the
sentry-release job. Decouple the two identifiers:
- *Git tag* stays `<action>/<version>` (slash) — what the consumer
syntax `uses: fern-api/actions@<action>/<version>` requires.
- *Telemetry release identifier* (Sentry release, RELEASE_TAG baked
into the bundle, PostHog $lib_version, log+API actions_version) uses
`<action>@<version>` (at-sign) — the conventional Sentry shape that
the validator accepts.
The Sentry release id must match the bundle's RELEASE_TAG so source-map
deobfuscation resolves, so both changed together.
Updates the per-release ledger to render `Tag:` with `/` and
`Sentry release:` with `@`, matching what each system actually stores.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Swimburger
approved these changes
May 20, 2026
6 tasks
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.

Follow-up fix to PR #19. A real dispatch of the release workflow against
verify-token@v0.0.1-testfailed at the sentry-release step:Summary
Sentry's release-version validator rejects slashes, so the post-#19 format
<action>/<version>is unusable as a Sentry release identifier. Decouple the two identifiers — they were always conceptually separate, just happened to share a string until now:<action>/<version>(slash). That's what the consumer syntaxuses: fern-api/actions@<action>/<version>requires, and that part already works (verified by the dispatch reaching sentry-release in the first place).RELEASE_TAGbaked into the bundle, PostHog$lib_version, log payloadactions_version, and Lightweight API eventactions_version— uses<action>@<version>(at-sign). That's the conventional Sentry release shape (my-app@1.2.3) the validator accepts, and the@poses no problem for these systems because they're identifiers, not refs.RELEASE_TAGis what the SDK passes toSentry.init({ release }), so it must match the release name that the Sentry CLI creates viagetsentry/action-release. Changing one without the other would break source-map deobfuscation. So both changed together.Changes
.github/workflows/release.ymlRELEASE_TAGenv andsentry-release.with.versionswitched to<action>@<version>. Comments added explaining why the two formats coexist.scripts/append-release-entry.mjsTag:line stays/;Sentry release:line switches to@.packages/shared/src/telemetry/build-constants.tsRELEASE_TAGupdated to reflect the@format and the divergence from the git tag.CONTRIBUTING.mdTest plan
pnpm typecheck— cleanactionlint .github/workflows/release.yml— cleanscripts/append-release-entry.mjswithACTION=verify-token VERSION=v1.0.0—Tag:renders with/,Sentry release:renders with@release.ymlforverify-tokenwithv0.0.1-test(or a freshv0.0.2-test). Verify:verify-token@v0.0.1-testverify-token/v0.0.1-testverify-token@v0.0.1-test:git show verify-token/v0.0.1-test:dist/index.js | grep -F 'verify-token@v0.0.1-test'Sentry.init({ release })value matches the Sentry release id (otherwise sourcemap deobfuscation won't resolve)Why this wasn't caught in #19
The sentry-release job auto-skips when
FERN_SENTRY_AUTH_TOKENisn't provisioned (intentional, so the pipeline can run end-to-end before Sentry is set up). All my pre-#19 smoke tests ran without Sentry credentials, so the validator path was never exercised locally. First real dispatch with the token configured surfaced it immediately.