diff --git a/.claude/wurk/commit.md b/.claude/wurk/commit.md index 124f6bf1..6ab0bac2 100644 --- a/.claude/wurk/commit.md +++ b/.claude/wurk/commit.md @@ -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 diff --git a/.claude/wurk/release.md b/.claude/wurk/release.md index 7f410270..0b758aae 100644 --- a/.claude/wurk/release.md +++ b/.claude/wurk/release.md @@ -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 diff --git a/.quality.exs b/.quality.exs index 6475be28..209ef5e8 100644 --- a/.quality.exs +++ b/.quality.exs @@ -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], diff --git a/CLAUDE.md b/CLAUDE.md index d52e748f..98572daf 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -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 ` | 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 | @@ -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 diff --git a/docs/quality-gate-changes.md b/docs/quality-gate-changes.md index 4f56bea0..09469fda 100644 --- a/docs/quality-gate-changes.md +++ b/docs/quality-gate-changes.md @@ -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