diff --git a/.github/labels.conf b/.github/labels.conf index ef6116e..9b77d17 100644 --- a/.github/labels.conf +++ b/.github/labels.conf @@ -1,5 +1,5 @@ -panel=claude-bot-andresmgsl codex-bot-andresmgsl grok-bot-andresmgsl kimi-bot-andresmgsl -triage-actors=dan-claude-bot +panel=cluade-reviewer-andresmgsl codex-reviewer-andresmgsl grok-reviewer-andresmgsl kimi-reviewer-andresmgsl +triage-actors=cluade-reviewer-andresmgsl scope:bootstrap|C5DEF5|bootstrap — hardening a pristine server into a node scope:users|C5DEF5|users-* — class model, apply/status, close-root scope:runner|C5DEF5|runner-* / forgejo-runner-* — CI runner lifecycle, either forge diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2fe09fc..a0ff0a5 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -16,8 +16,8 @@ genuinely rig's. 1. **Fork and branch.** Contributors work from forks; upstream branches are for maintainers. Title the PR conventionally (`feat:`, `fix:`, `docs:`). 2. **The review panel** (`.github/labels.conf`'s `panel=` line): - `claude-bot-andresmgsl`, `codex-bot-andresmgsl`, `grok-bot-andresmgsl`, - `kimi-bot-andresmgsl` — + `cluade-reviewer-andresmgsl`, `codex-reviewer-andresmgsl`, + `grok-reviewer-andresmgsl`, `kimi-reviewer-andresmgsl` — the required verdicts for a PR are the panel minus its author. The maintainer (`danmt`) takes the last word and merges. 3. **Checks must be green**: `shellcheck`, `bash test/cli.sh` and diff --git a/changelog.d/116.md b/changelog.d/116.md new file mode 100644 index 0000000..8c21511 --- /dev/null +++ b/changelog.d/116.md @@ -0,0 +1,3 @@ +### Fixed + +- Ceremony recognizes the Forgejo review panel and triage actor (#116) diff --git a/test/cli.sh b/test/cli.sh index 0f68bf3..8f0fcfb 100644 --- a/test/cli.sh +++ b/test/cli.sh @@ -3664,6 +3664,37 @@ check "release.yml: the caller was not absolutised (docs-sync would go red)" 0 " check "labels.yml: the caller was not absolutised either" 0 "count=0" \ wf_count labels.yml '^[[:space:]]*uses:[[:space:]]*https://.*ceremony/\.github/workflows/' +# The reconciler reads the machine roster from labels.conf while contributors +# read the prose roster. A Forgejo migration that updates only one side makes +# the required-verdict set differ depending on who is reading it. +configured_panel() { + sed -n 's/^panel=//p' "$ROOT/.github/labels.conf" +} +documented_panel() { + # shellcheck disable=SC2016 # backticks are literal Markdown delimiters + sed -n '/^2\. \*\*The review panel\*\*/,/required verdicts/p' "$ROOT/CONTRIBUTING.md" \ + | grep -oE '`[^`]+-reviewer-andresmgsl`' \ + | tr -d '`' \ + | paste -sd ' ' - +} +panel_is_forgejo_roster() { + [ "$(configured_panel)" = \ + "cluade-reviewer-andresmgsl codex-reviewer-andresmgsl grok-reviewer-andresmgsl kimi-reviewer-andresmgsl" ] +} +panel_rosters_match() { + [ "$(documented_panel)" = "$(configured_panel)" ] +} +triage_actor_is_forgejo_claude() { + [ "$(sed -n 's/^triage-actors=//p' "$ROOT/.github/labels.conf")" = \ + "cluade-reviewer-andresmgsl" ] +} +check "labels: panel names exactly the four Forgejo reviewer accounts" 0 "" \ + panel_is_forgejo_roster +check "labels: CONTRIBUTING panel matches labels.conf exactly" 0 "" \ + panel_rosters_match +check "labels: Forgejo triage actor is exactly the existing claude account" 0 "" \ + triage_actor_is_forgejo_claude + # One tag governs all eight references — the pin may be bumped, never split. ceremony_tags() { grep -rhoE 'heavy-duty/ceremony/[^@]+@[^[:space:]]+' "$ROOT/.github/workflows/" \