Releasing
August 14, 2026 · View on GitHub
This module uses stable vMAJOR.MINOR.PATCH tags. While the major version is
zero, minor releases may contain explicitly documented API changes; patch
releases remain backward compatible.
Tags are an output of the release gate, not its trigger. Do not create or push a release tag by hand. A tag push does not start the release workflow.
Prepare the release on main
Merge a release-preparation pull request that completes every item below:
- Exercise the affected SDK path in a representative consuming application against a local Langfuse stack. Check for duplicate observations and unintended content disclosure. Use synthetic data only; do not send release-test data to a shared or production project.
- Pre-seed the local synthetic Langfuse project with prompt
go-langfuse-live-promptversion 1 and the checklist evaluator. Rungo test -count=1 -tags=live -run TestLiveCompatibility -v .with that local project's credentials. Use the logged unique run marker (present in the trace name, session, metadata, and test log so cached data cannot be mistaken for the current run) to verify in the local Langfuse UI: trace visibility, environment/user/session/tag/metadata filters, application roots, generation usage and cost, prompt links, and observation-level evaluators. The test fails closed when credentials are absent, tracing/content capture is disabled, or recording IDs are empty; a zero exit therefore cannot mean that it merely skipped export. - With the toolchain recorded in
go.mod, run formatting, the standalone README compile check, all examples, the live-suite compile-only check, normal tests, race tests, fuzz smoke tests, vet, andgovulncheck. CI and the release workflow repeat these gates. - Review the exported API surface, decoded OTLP goldens, dependency changes, security policy, and compatibility matrix.
- Move
CHANGELOG.mdentries fromUnreleasedinto a heading exactly like## [0.1.0] - YYYY-MM-DD. SetsdkVersioninversion.goto the same version without thevprefix. - Remove both the
PRE_RELEASE_WARNINGmarker and its “do not use in production until tagged” text fromREADME.md. Replace them with accurate post-release stability/support wording. The release workflow intentionally fails while either pre-release warning remains. - Confirm the tree contains no live credentials, captured production
telemetry, generated binaries, or the local
ref/research corpus.
The release commit must be merged to and current with main; the workflow
rejects dispatches from another branch or an older commit.
Dispatch the gated release
From GitHub Actions, manually run the Release workflow on main and supply:
- the exact stable version, such as
v0.1.0; - the module to release.
The workflow repeats the credential-free release gates listed above for the selected module before it inspects, creates, or verifies the requested tag. Only after those checks pass does it create an annotated tag on the tested commit and create generated GitHub release notes. The maintainer who dispatches the workflow is responsible for completing the local synthetic checks above.
If a run pushes the tag but fails while creating release notes, rerun the same
workflow before main advances. It accepts an existing tag only when that tag
resolves to the tested commit. A tag on any other commit fails closed. If
main has advanced, verify the existing annotated tag against the original
tested commit before creating the missing GitHub release from that tag; never
move or replace the release tag.
The workflow-created annotated tag is not a developer GPG signature. Release
authority instead comes from the maintainer's repository write and Actions
permissions, the manual dispatch from current main, and the workflow's scoped
contents: write token.
Contrib module releases
The adapter modules (contrib/openai, contrib/googlegenai) version
independently with slash tags (contrib/openai/v0.1.0). Use the same
release workflow with the module input set to the module path; the
tag is derived as <module>/<version>. Order matters: when a contrib
release requires new core API, tag and publish the core release first,
update the contrib go.mod to that released core version, and only
then release the contrib module (the workflow verifies the declared
core version is downloadable without the workspace). Each contrib
module keeps its own CHANGELOG.md, which must contain the released
version heading. After tagging, verify proxy installability from a
clean directory: GOMODCACHE=$(mktemp -d) go mod download github.com/fgn/go-langfuse/<module>@<version>.