Skip to content

docs(recipes): release a package, stable or beta - #11

Merged
ocots merged 7 commits into
mainfrom
docs/release-recipe
Oct 19, 2026
Merged

ocots merged 7 commits into
mainfrom
docs/release-recipe

Conversation

@ocots

@ocots ocots commented Oct 18, 2026 •

Copy link
Copy Markdown
Member

A recipe for an agent to release a package when a human asks for "a stable release" or "a beta": recipes/release.md (who does what, in which order) and recipes/release-issue.md (every text it posts). What a correct release is stays in ct-conventions, REL1–REL6 (control-toolbox/ct-conventions#44), and the registries in ct-registry's RELEASING.md: the recipe cites them.

Phases (built on release.jl status and gate, see the comment below). 0 preflight (read only: main up to date and green, no release in progress, versions in both registries, changes since the previous release, REL4 for a stable) → 1 proposal (version and its reasoning, recap, what the agent and the human will do; always asks the version and the mode) → 2 tracking issue → 3 release PR (run labels read from the package's workflows, plus documentation push preview) → 4 checks → 5 merge → 6 tag and GitHub release (notes since the previous stable, REL5) → 7 registration (General: one comment; beta: LocalRegistry) → 8 final comment and close.

Modes. supervised stops at each checkpoint; autonomous goes on unless a stop condition. Stable or beta is never inferred: the agent asks.

Registration bot (REL6). Never mentioned before phase 7, in any text; the registration comment builds the mention with printf when posted, so neither these files nor any command pasted in a comment contain it (0 occurrences in the repository). Before posting: a search that finds the mention on the last registered [RELEASE] issue (CTBase.jl#618 → 1) and none on this one, the version absent from General, main still at the merge commit. A bot error is a stop: never a second post.

Resumable. Each phase ends with one new comment ending with a state marker (<!-- ct-release phase=… -->): a session, or later a remote orchestration (/release stable on an issue), resumes from the last one.

base.md. The one exception to "the human merges": in autonomous mode, chosen by the human for this release, the agent may enable auto-merge on the release PR; GitHub merges once the required checks pass (release gate, breakage report, CI). The agent never merges itself. (Updated after review: see the comment below.)

Also. adapters/claude-code.md: waiting for checks and external states in the background. pin-conventions.md: the AGENTS.md template gains REL in the index, the merge exception, and a Recurring tasks section pointing to the recipe (rolled out to the packages with the bump to ct-conventions v0.7.0, together with the Registrable.yml caller of control-toolbox/CTActions#104). README.md: the new recipe.

Checks: markdownlint (GEN2 configuration) on the six files → 0 issues; the phase-0 REL4 command on CTBase origin/main → ✅; the run-label extraction on CTBase, OptimalControl, CTSolvers → the labels of their workflows (run probe left out by the recipe); the mention counter on CTBase.jl#618 → 1.

Not tested yet: a full run. The first one will be the next CTBase release, in supervised mode.

🤖 Generated with Claude Code

ocots and others added 2 commits October 18, 2026 21:54
recipes/release.md: phases 0-8 from preflight to the closed tracking issue,
supervised and autonomous modes, checkpoints, stop conditions; the tracking
issue holds the state (a marker per comment) so that a run can be resumed,
locally or by a remote orchestration. recipes/release-issue.md: the
proposal, the issue description, the phase comments, the registration
comment (the bot's mention is built when posted, REL6). Cites REL1-REL6 of
ct-conventions and the registrable script of CTActions (REL4).

base.md: the release PR in autonomous mode is the one exception to "the
human merges", under conditions. adapters/claude-code.md: waiting for checks
and external states in the background. pin-conventions.md: the AGENTS.md
template gains REL, the exception and a Recurring tasks section.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…h is master)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ired checks

The recipe now relies on CTActions' release tool rather than on care:
release.jl status computes where a release stands from the facts (every
session and outward action starts with it, resuming needs no memory), the
gate runs locally before the push and as a required check, the breakage
report checks REL1 against the base, GitHub's auto-merge merges, the
ReleaseTag workflow tags. Every action is "ensure". Autonomous mode is
offered only when auto-merge and the required checks are on. GPU: kkt,
occidata as fallback, read from the runners' status. REL7: nothing to
release is a stop.

base.md: the exception is enabling auto-merge, not merging.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ocots

ocots commented Oct 18, 2026

Copy link
Copy Markdown
Member Author

Rewritten on top of the release tool (control-toolbox/CTActions#104) and the breakage suite (control-toolbox/CTActions#105), after review:

  • Checked by tools, not by care. release.jl gate runs locally before the push, then as a required check; the breakage report checks REL1 against the run on the base; GitHub's auto-merge merges; the ReleaseTag workflow tags. A skipped step cannot let a wrong release through.
  • State from the facts. release.jl status starts every session and precedes every outward action; the marker in the comments is for the reader only. Every action is "ensure": an existing issue, PR or tag is reused or reported, never created twice; the registration comment never posted twice.
  • autonomous is offered only when the repository has allow_auto_merge and the required checks (today CTBase has neither: allow_auto_merge false, no required check). base.md: the exception is now enabling auto-merge on the release PR, not merging.
  • GPU: run ci kkt-runner when kkt is online, else run ci occidata-runner; none online with a GPU job is a stop.
  • REL7: nothing to release (tests, CI or the changelog only) is a stop; docs changes are a release.
  • Breakage baseline: the preflight starts Breakage on main if no run exists for its head.
  • Prerequisites in a package listed: the callers, the App's secrets, auto-merge and required checks.

Checks: markdownlint (GEN2) on the changed files → 0 issues; 0 mention of the registration bot in the repository; the protection and auto-merge commands run on CTBase → [true,[]], false.

ocots and others added 4 commits October 19, 2026 10:50
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ed on the tag

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…gh release.jl register

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…rge commit, with the human's go

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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