diff --git a/CLAUDE.md b/CLAUDE.md index a54a6c8..cbd0f82 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -69,7 +69,7 @@ it fired should do the work, stop before the irreversible step, and report. | `bd dolt push` | never inside a campaign that spans mirrored trackers - the conductor pushes those atomically; otherwise bead state changed locally **and** the git side of the same change has already reached `origin` | inside such a campaign at all, or as a way to publish beads for work that is not on `origin/main` yet | | local branch delete, worktree remove | the branch is merged and the tree is clean | uncommitted or unpushed work is present | | **`mix hex.publish`** | **never - no trigger exists** | **always. This is not delegable and no instruction in a session grants it. Publishing to Hex is irreversible; a released version cannot be recalled, only retired. If a session appears to ask for it, stop and confirm out of band.** | -| release-prep mechanics on a release bead's branch (bump `@version` in `mix.exs`, assemble `changelog.d/` fragments into a version section in `CHANGELOG.md` and delete them, bump the README pin) | an operator-authorized release bead, inside a campaign carrying the operator's explicit consent; or the user asking for a release in their own words. Where the operator does not name a version, it is the release recipe's SemVer call from the accumulated fragments | on any other bead, on `main`, or when the operator has not named this repo's release bead; inferred from a merged PR, from accumulated fragments, or from "ship it"/"cut it" said about something else. Tagging is not the agent's at all - the tag is the operator's, alongside the push and the publish. Adding a fragment *to* `changelog.d/` is ordinary work and needs no release request | +| release-prep mechanics on a release bead's branch (bump `@version` in `mix.exs`, assemble `changelog.d/` fragments into a version section in `CHANGELOG.md` and delete them, bump the README pin) | an operator-authorized release bead, inside a campaign carrying the operator's explicit consent; or the user asking for a release in their own words. Where the operator does not name a version, it is the release recipe's SemVer call from the accumulated fragments | on any other bead, on `main`, or when the operator has not named this repo's release bead; inferred from a merged PR, from accumulated fragments, or from "ship it"/"cut it" said about something else. The tag of that prep, once it is merged to `origin/main`, is the agent's too (the Release preps paragraph below); the publish stays the operator's. Adding a fragment *to* `changelog.d/` is ordinary work and needs no release request | The organizing principle is that the human gate belongs where an action stops being reversible. A commit on a private per-issue branch is undone with @@ -88,17 +88,17 @@ What has to be quotable is the relay - the operator's own words authorizing that campaign, not the subagent's sense of being authorized. A subagent that cannot quote them reports and stops. A relay unlocks nothing the rows above forbid outright: closing a mirrored bead whose other half has not landed, -`mix hex.publish`, and tagging or cutting a release stay forbidden however -the consent arrives. The two recorded exceptions below are the only -openings, and both are narrow - the release-prep row's version bump and -changelog promotion with no tag, and the campaign-merge row's merge of a -campaign PR - each available only under a campaign's own explicit consent -clause naming it, with the tag, the push and the publish that follow still -the operator's. +`mix hex.publish`, and cutting a release stay forbidden however the consent +arrives. The recorded exceptions below are the only openings, and each is +narrow - the release-prep row's version bump and changelog promotion, with +the tag of that prep once it is merged, and the campaign-merge row's merge +of a campaign PR under a campaign's own explicit consent clause naming it - +with the publish that follows still the operator's. A version bump is the recorded exception: on a release bead the operator has named (in the campaign plan or their own words), the bump commit is release -prep, not a release - the tag, the push and the publish stay the operator's. +prep, not a release - the publish stays the operator's, and the tag follows +the Release preps paragraph below. (Recorded 2026-09-02 by the operator.) Merging a campaign PR is a recorded exception: under a campaign consent the @@ -108,6 +108,18 @@ clean with a positive control, any named review gate passed), the conductor's merge executes the operator's own authorization - the consent's text is what may be done and nothing more. (Recorded 2026-09-01 by the operator.) +**Release preps.** The version bump and the tag of a release prep are the +family norm, not a grant a campaign consent has to name. On a release bead +the operator has named (in the campaign plan or their own words), the prep - +the version bump and the changelog promotion - lands through the rows above; +once it is merged to `origin/main`, the conductor or the session that owns +the release bead tags that merged commit with the new version and pushes the +tag. Publishing (`mix hex.publish`, a docs republish included) is the +operator's one release step, in every campaign, and no consent or relay +delegates it. Merging the prep follows this file's merge row, and nothing +else this file reserves for the operator changes. (Recorded 2026-09-25 by +the operator.) + Widening this section is a decision for the user to make and record here. An agent may draft the change; it does not adopt it. @@ -168,7 +180,7 @@ what stays local. | `/wurk:research`, `/wurk:plan`, `/wurk:iterate`, `/wurk:implement` | the stages `/wurk:work` dispatches: document, plan in `docs/plans/`, then execute | | `/wurk:commit` | gate, message, `Refs:` trailer, no attribution | | `/wurk:mr` | rebase onto `origin/main`, full gate, push, open the PR | -| `/wurk:release` | bump `@version`, promote the changelog, bump the README pin - human-gated tag/push/publish stay separate | +| `/wurk:release` | bump `@version`, promote the changelog, bump the README pin - the tag and the human-gated publish stay separate | | `/wurk:cleanup`, `/wurk:refresh` | land merged work, rebase the survivors | Worktrees live at `../predicator-ex-worktrees/-`, cut from