Skip to content
Merged
Show file tree
Hide file tree
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
11 changes: 6 additions & 5 deletions .claude/wurk/commit.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,11 +42,12 @@ the public API tell the difference? If not, no fragment.

Releases follow SemVer from 2.0.0 on (ADR-0066) and ship to Hex. The
`mix.exs` version field moves only in a release-prep commit - the version
bump plus the changelog promotion, landing alone in its own PR, under a
consent that names it. Once that prep is merged to `origin/main`, the
conductor or the session that owns the release bead tags the merged commit
with the new version; the publish that follows (`mix hex.publish`) is always
the user's. Never edit the version field as part of any other commit; a
bump plus the changelog promotion, landing alone in its own PR, on a
release bead the operator has named (in the campaign plan or their own
words). Once that prep is merged to `origin/main`, the conductor or the
session that owns the release bead tags the merged commit with the new
version; the publish that follows (`mix hex.publish`) is always the user's.
Never edit the version field as part of any other commit; a
diff that touches it alongside other work is a bug in the diff.

## Gate-guard ledger: ADR-0011
Expand Down
22 changes: 11 additions & 11 deletions .claude/wurk/release.md
Original file line number Diff line number Diff line change
Expand Up @@ -129,19 +129,19 @@ boundary:
any other version or commit".
- *a release (`mix hex.publish`, GitHub release)* - trigger **never**, still
unauthorized **always**: "publishing is the operator's, in every campaign".
- *a version bump on a release bead's branch* - allowed only on "an
operator-authorized release bead, inside a campaign carrying the operator's
explicit consent", and still unauthorized "on any other bead, on main, or
when the operator has not named this repo's release bead". The recorded
exception says the same in prose: "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."
- *a version bump on a release bead's branch* - allowed on "a release bead
the operator has named (in the campaign plan or their own words); the bump
is release prep, the family norm, and no campaign consent has to name it",
and still unauthorized "on any other bead, on main, or when the operator
has not named this repo's release bead". The recorded exception says the
same in prose: "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."

So the one thing this recipe performs - the bump plus the step B promotion, on
a named release bead's branch, under a campaign consent that names it - is
release *prep*. `CLAUDE.md`'s changelog rule describes the whole arc, of which
this recipe is the first two thirds: "a release assembles the fragments,
deletes them, and tags." The assembling and the deleting are step B. The
the branch of a release bead the operator has named - is release *prep*.
`CLAUDE.md`'s changelog rule describes the whole arc, of which this recipe is
the first two thirds: "a release assembles the fragments, deletes them, and
tags." The assembling and the deleting are step B. The
tagging follows the merge, outside this recipe: `CLAUDE.md`'s Release preps
paragraph says that once the prep is merged to `origin/main`, the conductor
or the session that owns the release bead tags that merged commit with the
Expand Down
5 changes: 3 additions & 2 deletions .quality.exs
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,9 @@
# way HexDocs and hex.pm will read them. The Docs stage runs `mix docs` and
# fails on any ExDoc warning. The Doc links stage fails on the link rules
# ExDoc accepts silently: a README relative link to a file not in the
# package files, a published relative link to a file that is not an extra,
# two extras sharing a basename, and a silent rewrite to a different extra.
# package files, a relative link in a Markdown extra to a file that is not
# itself an extra (moduledoc links are the Docs stage's), two extras sharing
# a basename, and a silent rewrite to a different extra.
# `:auto` runs both whenever ex_doc is installed, which it is in dev.
docs: [enabled: :auto],
doc_links: [enabled: :auto],
Expand Down
5 changes: 2 additions & 3 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ should do the work, stop before the irreversible step, and report.
| merging a campaign PR | a campaign consent the operator adopted verbatim that names automatic merges, with every named condition met (full gate green, CI green, firewall scan clean with a positive control, any named review gate passed) | outside such a consent; any named condition unmet; any PR the consent's carve-outs hold for the operator |
| `bd close <id>` | never for a mirrored bead whose other half is not merged to its own repo's `origin/main`; a mirrored bead whose other half has ALSO landed may be closed by the campaign conductor under a consent naming this exception, both halves together, each verified against its remote; otherwise the issue's branch is merged into `origin/main`, verified against the remote | for a bead whose description carries a `mirrors:` line while its other half is unlanded, campaign consent included; at commit time, at PR-open time, or on a local merge that has not been pushed |
| `bd dolt push` | bead state changed locally **and** the git side of the same change has already reached `origin` | as a way to publish beads for work that is not on `origin/main` yet; and always inside a campaign that spans mirrored trackers - the conductor pushes those atomically |
| a version bump on a release bead's branch | an operator-authorized release bead, inside a campaign carrying the operator's explicit consent | on any other bead, on main, or when the operator has not named this repo's release bead |
| a version bump on a release bead's branch | a release bead the operator has named (in the campaign plan or their own words); the bump is release prep, the family norm, and no campaign consent has to name it | on any other bead, on main, or when the operator has not named this repo's release bead |
| tagging a release prep | the release bead's version bump is merged to `origin/main`; the tag names that version at the merged commit | before the bump is on `origin/main`; a tag naming any other version or commit |
| a release (`mix hex.publish`, GitHub release) | never | always - publishing is the operator's, in every campaign |
| `git worktree remove`, branch delete | the branch is merged and the worktree is clean | uncommitted or unpushed work is present |
Expand Down Expand Up @@ -106,8 +106,7 @@ operator has adopted verbatim that names automatic merges, with every
condition that consent names met (full gate green, CI green, firewall scan
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, campaign
025 post-wrap queue walk.)
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
Expand Down
16 changes: 16 additions & 0 deletions docs/quality-gate-changes.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,22 @@ Adding an entry is not permission to weaken a check. ADR-0011 says a genuinely
wrong check is a human call, and this file is where that call is recorded, not
where an agent grants itself one.

## 2026-09-29 - st-1kyb

Approved-by: JohnnyT (in session, 2026-09-27, for exactly this: the
doc_links comment reword in .quality.exs)

- .quality.exs: rewords the comment beside the Docs and Doc links stages so
it says what the Doc links stage checks; no stage option changes

Reason: the comment said the Doc links stage fails on "a published relative
link to a file that is not an extra", which reads as covering every
published relative link, moduledoc links included. The stage reads relative
links in the Markdown extras and the README only; a relative link in a
moduledoc is the Docs stage's job. The comment now carries the wording the
other packages in the family use. A comment-only change: it adds no stage,
loosens nothing, skips no existing check, and lowers no threshold.

## 2026-09-23 - st-bdpe

Approved-by: JohnnyT (the operator's campaign consent of 2026-09-23, which
Expand Down
Loading