Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 22 additions & 10 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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.

Expand Down Expand Up @@ -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/<bead-id>-<slug>`, cut from
Expand Down
Loading