Releasing Marina
A maintainer checklist for cutting a Marina release, in order. It describes the tooling that exists today; steps without tooling are listed under Release steps without tooling. Release qualification defines the test gate this checklist runs; Compatibility and upgrades defines what a release may change.
Everything here needs only a GitHub repository, its Actions runners and a local checkout. No cloud account is part of the release path. Deploying a released revision anywhere is the operator’s choice; the repository’s Deploy to EC2 workflow is the maintainers’ own optional deployment, not a release step, and a fork never needs it.
How a release is made
Section titled “How a release is made”A release is one pull request titled release: X.Y.Z that bumps every version and finalizes
the changelog, followed by an annotated vX.Y.Z tag on the merged commit. Past releases
(v0.5.0 to v0.8.0) followed this shape; the tag message is a one-line summary ending
“See CHANGELOG.md.” Marina follows Semantic Versioning;
while it is 0.x, a minor release may remove deprecated surfaces under the
version policy.
1. Pre-flight
Section titled “1. Pre-flight”-
mainis green. The latestmaincommit must pass CI, Secret scan and Supply Chain, and the most recent Nightly run must pass itsqualify:releasejob:Terminal window gh run list --branch main --workflow CI --limit 1gh run list --branch main --workflow "Supply Chain" --limit 1gh run list --workflow Nightly --limit 1 -
Run the deterministic release gate on a clean checkout of the release commit:
Terminal window bun install --frozen-lockfilebun run qualify:releaseIt needs the pinned Syft scanner (supply-chain verification) and Chromium for the browser suite. A missing prerequisite is a failure, not a skip. It covers the SBOM,
check:versions,schema:check,qualify:sdk, typecheck, lint, backend and dashboard tests, the dashboard build,qualify:server, the browser suite, the site build andbun audit. -
Qualify the packaged artifacts you intend to ship:
Terminal window docker build -t marina-release .bun run qualify:image marina-release # CONTAINER_RUNTIME=podman also worksbun run qualify:native # builds dist/marina and runs it outside the checkout -
Run the provider-backed qualifications that match the release’s claims. These spend money or need a live target, so they are not in
qualify:release. Do not describe a skipped or unavailable gate as passed; keep reports outside the public checkout.Script Needs qualify:promptA running instance serving marina:answerer;--url/--keyorMARINA_URLandMODEL_API_KEYSqualify:autonomy/qualify:evolutionA running instance with live agents (URL argument or MARINA_URL)qualify:agents:handoff --directory PATHOPENAI_API_KEY; a new directory outside the checkoutqualify:coding --directory PATH --budget-usd NOPENAI_API_KEY; see live model command acceptanceLive model acceptance workflow Manual dispatch on main; thelive-modelenvironment,OPENAI_API_KEYandLIVE_EVIDENCE_PUBLIC_KEYqualify:decisions --backend …Credentials for each backend compared (for example OPENROUTER_API_KEY)qualify:investigations:live --model M --budget-usd N --liveModel provider credentials plus TAVILY_API_KEY(default retriever) orOPENROUTER_API_KEYqualify:memory:benchmarkwith--model/--judgeA running instance; see memory-delta benchmark qualify:flywheelA live Flywheel target; see Flywheel live qualification qualify:sdk,qualify:server,qualify:native,qualify:participation:loadandqualify:investigationsneed no provider and already run in pull-request CI orqualify:release. The memory qualifications are described in the scripts reference; run the ones a memory claim depends on.
2. Bump the version
Section titled “2. Bump the version”Work on a branch (for example release/X.Y.Z); never push to main. There is no version-bump
script. Change the version by hand in:
- every versioned
package.jsonthatbun run check:versionslists (the root,dashboard,examples/coding-agent-demo,examples/usecase-ui, the threeextensions/*,marina-desktop,siteandsrc/sdk); extensions/marina-market/marina-plugin.json(version);src/routing/agent-adapters.ts(the app-serverclientInfoversion).
Then refresh the workspace entries in bun.lock and check:
bun installbun run check:versionsbun install --frozen-lockfilegit grep -n '"OLD.VERSION"' -- ':!CHANGELOG.md' ':!bun.lock' # anything left is deliberate or a missLeave compatibility floors alone (for example marina-market’s minMarinaVersion default) and
version fixtures in tests; name them in the release PR body.
3. Finalize the changelog
Section titled “3. Finalize the changelog”In CHANGELOG.md:
- Rename
## [Unreleased]to## [X.Y.Z] — YYYY-MM-DDand add a fresh empty## [Unreleased]above it. - Start the version with
### Upgrade notes: behaviour a living world notices on upgrade, new migrations, changed defaults, deprecations with their replacement, and operator action required. Link the upgrade procedure in Compatibility and upgrades; a dedicated upgrading guide is being added separately and becomes the link target once it exists. - Make sure every merged user-visible PR since the last tag has an entry
(
git log --oneline vPREVIOUS..HEAD), under Keep a Changelog headings (Added,Changed,Fixed,Security,Performance). - Update the compare links at the bottom:
[Unreleased]comparesvX.Y.Z...HEADand a new[X.Y.Z]line comparesvPREVIOUS...vX.Y.Z.
Before opening the release PR run bun run format, bun run typecheck,
bun --no-env-file test test/docs-contract.test.ts and bun run test:fast. Merge it only after
required checks pass on its latest revision.
4. Tag and publish the GitHub release
Section titled “4. Tag and publish the GitHub release”Tag the merged release commit on main with an annotated tag:
git fetch origin && git checkout --detach origin/maingit log -1 --oneline # must be the "release: X.Y.Z" commitgit tag -a vX.Y.Z -m "Marina X.Y.Z — <one-line summary>. See CHANGELOG.md."git push origin vX.Y.ZExtract the release notes from the changelog and create the release:
awk '/^## \[X.Y.Z\]/{f=1;next} /^## \[/{f=0} f' CHANGELOG.md > /tmp/marina-X.Y.Z-notes.mdgh release create vX.Y.Z --verify-tag --title "Marina X.Y.Z" \ --notes-file /tmp/marina-X.Y.Z-notes.mdEarlier versions were published as tags only, without a GitHub release object.
5. Artifacts built by workflows
Section titled “5. Artifacts built by workflows”Pushing vX.Y.Z triggers Supply Chain (supply-chain.yml), which:
- generates the CycloneDX repository inventory (
bun run sbom); - builds the dashboard and memory bundle and packs
marina.tgz(bun pm pack); - signs SLSA build provenance and an SBOM statement bound to the package digest.
It uploads them as workflow artifacts (marina-package-<sha>, marina-attestations-<sha>,
retained 90 days); it does not attach them to the release. To ship them, download and attach:
gh run list --workflow "Supply Chain" --event push --limit 5 # find the tag's run idgh run download RUN_ID --dir dist/releasegh release upload vX.Y.Z dist/release/marina-package-*/* dist/release/marina-attestations-*/*Users verify them as described in supply-chain verification. No workflow builds, signs or publishes a container image, standalone executable or SDK package for a server tag.
6. SDK
Section titled “6. SDK”@marina/agent-sdk (src/sdk/package.json) is not published to a package registry and has no
publish workflow. qualify:sdk (part of qualify:release) builds it, packs it and imports the
packed archive from a clean Node consumer. To attach the SDK tarball to the release:
bun run build:sdkmkdir -p dist/release(cd src/sdk && npm pack --ignore-scripts --pack-destination ../../dist/release)gh release upload vX.Y.Z dist/release/marina-agent-sdk-X.Y.Z.tgz7. Desktop
Section titled “7. Desktop”Desktop Release (desktop-release.yml) runs on a desktop-v* tag or manual dispatch
(canary or stable). It builds macOS arm64, Windows x64 and Linux x64 with
bun run build:<env> in marina-desktop, inventories and attests every file, and, for a tag,
creates a draft GitHub release with all payloads. To build the desktop app for X.Y.Z:
git tag -a desktop-vX.Y.Z -m "Marina desktop X.Y.Z"git push origin desktop-vX.Y.ZmacOS signing needs the ELECTROBUN_DEVELOPER_ID secret and certificate; notarization also needs
APPLE_ID, APPLE_TEAM_ID and APPLE_PASSWORD. Without them the build is unsigned. Windows
signing and an update feed are not configured. Check each installer on its target OS before
publishing the draft; see the desktop README.
8. Documentation site
Section titled “8. Documentation site”Deploy site (site-deploy.yml) publishes the site to GitHub Pages on every push to main
that touches site/, docs/guides/ or the generated API reference, so the release PR’s merge
normally redeploys it. Redeploy by hand if needed and check the result:
gh workflow run site-deploy.ymlgh run list --workflow "Deploy site" --limit 19. Security fixes and advisories
Section titled “9. Security fixes and advisories”Handle vulnerabilities through coordinated disclosure:
- Triage the report in its private GitHub security advisory.
- Develop the fix in the advisory’s temporary private fork, with its tests, so neither the fix nor the problem is public before release.
- Merge the fix, cut a release containing it, and describe the operator action under
### Securityand### Upgrade notesin the changelog without exploit detail. - Publish the advisory at the same time as the release, naming the fixed version and crediting the reporter unless they asked otherwise.
A security fix may shorten a deprecation window only with an explicit upgrade advisory (version policy).
10. After the release
Section titled “10. After the release”- Confirm the tag, the GitHub release and its assets, the Supply Chain attestations and the site.
- Add the release’s upgrade fixture:
bun scripts/generate-upgrade-fixture.ts vX.Y.Z, then committest/fixtures/upgrade/vX.Y.Z.*in a PR, so every later release proves it upgrades this release’s real database (see Release qualification). mainstays at the released version with an empty## [Unreleased]; there is no-devversion bump. The next release PR moves the version.- Every user-visible PR adds a line under
[Unreleased](the PR template asks).
Release steps without tooling
Section titled “Release steps without tooling”These release steps have no tooling today:
- Public container image. The
Dockerfileis qualified (qualify:image, Trivy Image Scan) but no workflow builds, signs or publishes an image for a tag; users build it themselves. - SDK publishing.
@marina/agent-sdkand theextensions/*packages are not published to a registry; the tarball is attached by hand. - Standalone executable.
bun run build:nativebuildsdist/marinaand CI qualifies it on Linux, but no workflow builds, signs or attaches executables for other platforms. - Server release assets. The signed
marina.tgzand its attestations stay workflow artifacts until a maintainer attaches them; no workflow creates the server’s GitHub release. - Version bump and notes. No script bumps versions or extracts release notes.
- Desktop. Windows signing, a desktop update feed and target-OS install-over-upgrade
acceptance are not configured; desktop tags (
desktop-v*) are separate from server tags.
