Release Maintainer
Ship or inspect Rudder releases without losing source identity, authorization,
or public-surface completeness.
Route Before Reading
Read references/shared.md, then exactly one primary branch:
references/stable.md: stable readiness, publish, public notes, Desktop
update drill, post-stable cleanup, next-version handoff, and the gate before
public announcement.
references/canary.md: automatic canary publication, first npm bootstrap,
Desktop prerelease assets, and temporary pre-stable latest behavior.
references/rollback.md: move npm dist-tags to an already published version
without unpublishing packages or rewriting tags.
references/partial-recovery.md: npm/tag/Release/Desktop/docs surfaces
disagree, a workflow failed after partial publication, or install lookup
returns misleading errors.
references/setup.md: one-time GitHub environment, npm trusted-publishing,
and workflow setup.
references/announcement.md: manual Rudder Discord announcement after a
stable release has converged. This is a stable closeout add-on, not a primary
release branch.
Use a second branch only when the observed state genuinely crosses branches,
such as a stable publish that needs partial recovery. Do not preload every
reference for a readiness question.
For a requested Rudder stable release, read references/announcement.md after
the release surfaces are verified. Zeeland explicitly authorized this default
on 2026-09-08: send one release announcement to Rudder / #announcements unless
the user opts out. Reuse that standing authority without a second confirmation.
Read-only checks, canaries, and publishing only a named non-release surface do
not trigger it. Do not add announcements to Release CI or create a webhook.
Authorization Boundary
An explicit request to release a Rudder version, such as release vX.Y.Z,
ship this version, or 发版 in a version-release context, authorizes the
complete standard release lifecycle below. A request to publish only named docs,
a package, or another surface authorizes that surface and its prerequisites.
Resolve a bare publish from context; do not expand it into a full version release.
- resolve and lock the single consistent version and source SHA;
- land reviewed release source on
main through a PR and required checks when needed;
- run required exact-source CI, preflight, and package validation once;
- publish npm, tag, GitHub Release, Desktop, and production-docs surfaces;
- verify public installation, clean obsolete canary Releases/tags, and advance
the next-version base through its protected-branch PR;
- publish and read back the stable Discord announcement under Zeeland's standing
authorization, unless the user explicitly opts out.
Release and next-version PRs are part of this authorization. Never push directly
to main or bypass its protection. Do not ask for routine second approval after validation.
Ask only when channel, version, source, or destination is materially ambiguous.
Questions such as “how does release work?” or “is this ready?” are read-only.
Implementation requests without a release/publish imperative stop at Review
Ready.
Separate authority is still required for npm unpublish, force-pushing or
retargeting published tags, deleting the active canary line, bypassing CI,
exposing secrets, or expanding to another product/environment.
Cross-Branch Invariants
- Lock stable source to a full immutable commit SHA. Later
main movement does
not silently retarget it, and manual stable dispatch must not use a branch or
tag as source_ref.
- Freeze that source as soon as a stable release imperative arrives. New
unrelated
main work belongs to the next release instead of extending the
active release window.
- Never republish an npm version that already exists.
- npm packages use
@rudderhq; Desktop binaries belong to GitHub Releases.
- Stable uses npm
latest; canary uses canary. A first-public pre-stable
bootstrap may also use latest only after matching Desktop assets exist.
- Canary tags are
canary/vX.Y.Z-canary.N; their GitHub Release title is the
clean vX.Y.Z-canary.N and the Release is prerelease.
- A stable tag points at the reviewed source commit, not a generated handoff
commit.
- Partial publication is repaired from its first missing surface; immutable
npm versions are not republished.
- Public completion requires applicable npm, tag, GitHub Release, Desktop,
changelog/docs, install smoke, and next-version handoff evidence. A Discord
announcement URL is required only when announcement delivery is in scope.
- Canary releases do not receive Discord announcements. Do not add announcement
delivery to Release CI as part of ordinary release execution.
- Cleanup removes obsolete GitHub Releases and
canary/* tags, not published
npm canary versions.
- A stable release takes priority over an in-flight canary for the same or an
older version base once the locked stable source passes its gates. Do not wait
for obsolete canary Desktop assets; record npm/tag state, stop the remaining
canary work when safe, and let stable cleanup remove its Release/tag.
- Keep public install smoke, including slow Windows runtime installation. A slow
real install is product evidence to optimize, not a release gate to delete.
- Once a stable campaign is active, candidate-repair commits use
[skip release]
unless a canary is explicitly needed. CI still validates the repair, while the
automatic canary path does not duplicate the manual stable candidate.
- Do not dispatch a third run after the same stage fails twice on unchanged
inputs. Diagnose and repair that stage, then rerun the new immutable SHA once.
- Preserve unrelated dirty work. Prefer a clean temporary worktree/clone for
hands-on publication.
Operating Loop
- Classify the request as setup, canary, stable, rollback, partial recovery,
or read-only inspection.
- Read
references/shared.md and the selected primary reference.
- Resolve live local and remote state, then freeze the stable SHA immediately;
release truth is temporally unstable.
- When release narratives are missing and subagents are available, start one
bounded release-notes subagent in parallel with read-only preflight. Give it
the locked diff and require drafts for the GitHub notes plus both public
changelogs; the primary agent reviews and integrates the drafts.
- State the selected version, locked source SHA, channel, active workflow run,
last completed stage, and unresolved blockers in a progress update.
- Execute one stable publish path whose machine gates run before mutation; do
not introduce a separate preview dispatch or second human hand-off.
- Verify every applicable public surface from the same locked source.
- For an authorized stable announcement, follow
references/announcement.md: check for an existing
version post, publish the bounded announcement with no default ping, read it
back, and record its direct message URL.
Stable releases include this step by default. Record an explicit opt-out as
skipped by user; missing or unknown delivery means partial closeout. Do not
ask for routine second authorization.
- Report version/ref, workflow runs, npm tags, Release assets, install proof,
changelog/docs state, announcement URL, cleanup, and remaining manual work.
Output
For read-only requests:
Current state:
Blockers:
Next actions:
Authorization:
Verification required:
For hands-on execution:
RESULT: RELEASED | PARTIAL | BLOCKED
Version/channel:
Locked source:
Checks:
Published surfaces:
Install proof:
Announcement:
Cleanup/handoff:
Remaining blocker:
1---2name: release-maintainer-23description: Use when inspecting, preparing, executing, recovering, or verifying Rudder releases across npm, GitHub Releases, Desktop assets, tags, dist-tags, changelogs, Discord announcements, install smoke, stable/canary promotion, rollback, and release workflow failures. Use for both hands-on publish requests and read-only release readiness questions; route to the smallest relevant release reference instead of loading every release branch.4---56# Release Maintainer78Ship or inspect Rudder releases without losing source identity, authorization,9or public-surface completeness.1011## Route Before Reading1213Read `references/shared.md`, then exactly one primary branch:1415- `references/stable.md`: stable readiness, publish, public notes, Desktop16 update drill, post-stable cleanup, next-version handoff, and the gate before17 public announcement.18- `references/canary.md`: automatic canary publication, first npm bootstrap,19 Desktop prerelease assets, and temporary pre-stable `latest` behavior.20- `references/rollback.md`: move npm dist-tags to an already published version21 without unpublishing packages or rewriting tags.22- `references/partial-recovery.md`: npm/tag/Release/Desktop/docs surfaces23 disagree, a workflow failed after partial publication, or install lookup24 returns misleading errors.25- `references/setup.md`: one-time GitHub environment, npm trusted-publishing,26 and workflow setup.27- `references/announcement.md`: manual Rudder Discord announcement after a28 stable release has converged. This is a stable closeout add-on, not a primary29 release branch.3031Use a second branch only when the observed state genuinely crosses branches,32such as a stable publish that needs partial recovery. Do not preload every33reference for a readiness question.3435For a requested Rudder stable release, read `references/announcement.md` after36the release surfaces are verified. Zeeland explicitly authorized this default37on 2026-09-08: send one release announcement to Rudder / #announcements unless38the user opts out. Reuse that standing authority without a second confirmation.39Read-only checks, canaries, and publishing only a named non-release surface do40not trigger it. Do not add announcements to Release CI or create a webhook.4142## Authorization Boundary4344An explicit request to release a Rudder version, such as `release vX.Y.Z`,45`ship this version`, or `发版` in a version-release context, authorizes the46complete standard release lifecycle below. A request to publish only named docs,47a package, or another surface authorizes that surface and its prerequisites.48Resolve a bare `publish` from context; do not expand it into a full version release.49501. resolve and lock the single consistent version and source SHA;512. land reviewed release source on `main` through a PR and required checks when needed;523. run required exact-source CI, preflight, and package validation once;534. publish npm, tag, GitHub Release, Desktop, and production-docs surfaces;545. verify public installation, clean obsolete canary Releases/tags, and advance55 the next-version base through its protected-branch PR;566. publish and read back the stable Discord announcement under Zeeland's standing57 authorization, unless the user explicitly opts out.5859Release and next-version PRs are part of this authorization. Never push directly60to `main` or bypass its protection. Do not ask for routine second approval after validation.61Ask only when channel, version, source, or destination is materially ambiguous.6263Questions such as “how does release work?” or “is this ready?” are read-only.64Implementation requests without a release/publish imperative stop at Review65Ready.6667Separate authority is still required for npm unpublish, force-pushing or68retargeting published tags, deleting the active canary line, bypassing CI,69exposing secrets, or expanding to another product/environment.7071## Cross-Branch Invariants7273- Lock stable source to a full immutable commit SHA. Later `main` movement does74 not silently retarget it, and manual stable dispatch must not use a branch or75 tag as `source_ref`.76- Freeze that source as soon as a stable release imperative arrives. New77 unrelated `main` work belongs to the next release instead of extending the78 active release window.79- Never republish an npm version that already exists.80- npm packages use `@rudderhq`; Desktop binaries belong to GitHub Releases.81- Stable uses npm `latest`; canary uses `canary`. A first-public pre-stable82 bootstrap may also use `latest` only after matching Desktop assets exist.83- Canary tags are `canary/vX.Y.Z-canary.N`; their GitHub Release title is the84 clean `vX.Y.Z-canary.N` and the Release is prerelease.85- A stable tag points at the reviewed source commit, not a generated handoff86 commit.87- Partial publication is repaired from its first missing surface; immutable88 npm versions are not republished.89- Public completion requires applicable npm, tag, GitHub Release, Desktop,90 changelog/docs, install smoke, and next-version handoff evidence. A Discord91 announcement URL is required only when announcement delivery is in scope.92- Canary releases do not receive Discord announcements. Do not add announcement93 delivery to Release CI as part of ordinary release execution.94- Cleanup removes obsolete GitHub Releases and `canary/*` tags, not published95 npm canary versions.96- A stable release takes priority over an in-flight canary for the same or an97 older version base once the locked stable source passes its gates. Do not wait98 for obsolete canary Desktop assets; record npm/tag state, stop the remaining99 canary work when safe, and let stable cleanup remove its Release/tag.100- Keep public install smoke, including slow Windows runtime installation. A slow101 real install is product evidence to optimize, not a release gate to delete.102- Once a stable campaign is active, candidate-repair commits use `[skip release]`103 unless a canary is explicitly needed. CI still validates the repair, while the104 automatic canary path does not duplicate the manual stable candidate.105- Do not dispatch a third run after the same stage fails twice on unchanged106 inputs. Diagnose and repair that stage, then rerun the new immutable SHA once.107- Preserve unrelated dirty work. Prefer a clean temporary worktree/clone for108 hands-on publication.109110## Operating Loop1111121. Classify the request as setup, canary, stable, rollback, partial recovery,113 or read-only inspection.1142. Read `references/shared.md` and the selected primary reference.1153. Resolve live local and remote state, then freeze the stable SHA immediately;116 release truth is temporally unstable.1174. When release narratives are missing and subagents are available, start one118 bounded release-notes subagent in parallel with read-only preflight. Give it119 the locked diff and require drafts for the GitHub notes plus both public120 changelogs; the primary agent reviews and integrates the drafts.1215. State the selected version, locked source SHA, channel, active workflow run,122 last completed stage, and unresolved blockers in a progress update.1236. Execute one stable publish path whose machine gates run before mutation; do124 not introduce a separate preview dispatch or second human hand-off.1257. Verify every applicable public surface from the same locked source.1268. For an authorized stable announcement, follow `references/announcement.md`: check for an existing127 version post, publish the bounded announcement with no default ping, read it128 back, and record its direct message URL.129 Stable releases include this step by default. Record an explicit opt-out as130 skipped by user; missing or unknown delivery means partial closeout. Do not131 ask for routine second authorization.1329. Report version/ref, workflow runs, npm tags, Release assets, install proof,133 changelog/docs state, announcement URL, cleanup, and remaining manual work.134135## Output136137For read-only requests:138139```text140Current state:141Blockers:142Next actions:143Authorization:144Verification required:145```146147For hands-on execution:148149```text150RESULT: RELEASED | PARTIAL | BLOCKED151Version/channel:152Locked source:153Checks:154Published surfaces:155Install proof:156Announcement:157Cleanup/handoff:158Remaining blocker:159```