fix: the CONSUMERS.md stub's issues: types match the caller's, parity-tested #150

Merged
claude-bot-andresmgsl merged 1 commit from build/144-consumers-issues-parity into main 2026-07-24 13:56:30 +00:00
claude-bot-andresmgsl commented 2026-07-24 13:34:57 +00:00 (Migrated from github.com)

Closes #144

The published labels-caller stub in docs/CONSUMERS.md listed six issues: types while ceremony's own caller (self-labels.yml) listens on eight — PR #32's 70db91f widened the caller by edited and reopened and the stub never followed. A consumer adopting the stub therefore never wakes on the two events that falsify issue labels silently: editing the body that carries the Blocked by #N declaration, and reopening a closed issue.

What this PR does

  • D1 — the stub's issues: list is now byte-identical to the caller's, order included.
  • D2 — the caller/stub parity coverage #137 landed in test/labels.test.sh is extended to the issues: list, exactly as the issue specified for whichever PR landed second: #143 (for #137) merged while this one was in draft, so this branch was rebased onto it and its pr_target_types/types_in_sync helper generalized into event_types <file> <trigger> / types_in_sync <trigger> <caller> <stub>. #137's four rows are preserved on the shared helper; four new rows cover the issues: list — identity, the caller's full eight-type pin (D3: the caller cannot narrow to "fix" a drift), and the failing cases (a type dropped from either file, a reorder in one file only).
  • D4 — one adoption note covers both pending stub edits, as the issue demanded if #137 and #144 ship in the same tag (they now will): review_requested/review_request_removed on pull_request_target: (#137) and edited/reopened on issues: (#144), adopted together at the pin bump to the first tag carrying both — never before it, never through mixed refs. The issues:-availability paragraph gains one clause saying the 0.2.0 list stops at closed.
  • D5 — the scope job is untouched (gated on pull_request_target; no issues: action reaches it).

Test evidence

  • bash test/run.sh — 18 files green; labels.test.sh 22 rows including the four new issues: rows beside #137's four.
  • bash .github/scripts/shellcheck-all.sh — clean (-x, whole tracked tree).
  • The generalized awk helper is mawk-safe (no \x escapes; -v assignment only). The NF == 1 guard keeps issues: write under permissions: from matching the trigger key; verified each file carries exactly one bare issues:/pull_request_target: key and each sed mutation target appears exactly once per file.
  • self-labels.yml is untouched by this PR (D3) — actionlint has nothing new to say; CI runs it regardless.

Acceptance criteria

  • The caller's and the stub's issues: type lists are byte-identical, edited and reopened included.
  • test/labels.test.sh goes red if either file drops a type from either list, or if the two issues: lists drift apart.
  • CONSUMERS.md carries exactly one adoption note covering every pending stub edit, naming the tag (the first tag carrying ceremony#137 and ceremony#144).
  • self-labels.yml still lists all eight types (untouched, and now test-pinned).
  • actionlint and the full local suite are green locally; CI confirms.

Worklog

  • Read the spec, caller, stub, main's test harness, and #143's helper shape
  • D1: stub issues: list byte-identical to the caller's
  • D4: single adoption note naming the tag
  • D2/D3: parity row + eight-type pin + three failing cases in test/labels.test.sh
  • changelog.d/144.md
  • bash test/run.sh + shellcheck gate green locally
  • #143 merged mid-draft → rebased onto main, generalized its parity helper to both trigger lists, folded both pending stub edits into the one adoption note (per the issue's lands-second clause)
  • CI green on the draft
  • Mark ready-for-review, request the panel (codex, grok, kimi)
Closes #144 The published labels-caller stub in `docs/CONSUMERS.md` listed six `issues:` types while ceremony's own caller (`self-labels.yml`) listens on eight — PR #32's `70db91f` widened the caller by `edited` and `reopened` and the stub never followed. A consumer adopting the stub therefore never wakes on the two events that falsify issue labels silently: editing the body that carries the `Blocked by #N` declaration, and reopening a closed issue. **What this PR does** - **D1** — the stub's `issues:` list is now byte-identical to the caller's, order included. - **D2** — the caller/stub parity coverage #137 landed in `test/labels.test.sh` is extended to the `issues:` list, exactly as the issue specified for whichever PR landed second: #143 (for #137) merged while this one was in draft, so this branch was rebased onto it and its `pr_target_types`/`types_in_sync` helper generalized into `event_types <file> <trigger>` / `types_in_sync <trigger> <caller> <stub>`. #137's four rows are preserved on the shared helper; four new rows cover the `issues:` list — identity, the caller's full eight-type pin (D3: the caller cannot narrow to "fix" a drift), and the failing cases (a type dropped from either file, a reorder in one file only). - **D4** — one adoption note covers both pending stub edits, as the issue demanded if #137 and #144 ship in the same tag (they now will): `review_requested`/`review_request_removed` on `pull_request_target:` (#137) and `edited`/`reopened` on `issues:` (#144), adopted together at the pin bump to the first tag carrying both — never before it, never through mixed refs. The `issues:`-availability paragraph gains one clause saying the `0.2.0` list stops at `closed`. - **D5** — the `scope` job is untouched (gated on `pull_request_target`; no `issues:` action reaches it). **Test evidence** - `bash test/run.sh` — 18 files green; `labels.test.sh` 22 rows including the four new `issues:` rows beside #137's four. - `bash .github/scripts/shellcheck-all.sh` — clean (`-x`, whole tracked tree). - The generalized awk helper is mawk-safe (no `\x` escapes; `-v` assignment only). The `NF == 1` guard keeps `issues: write` under `permissions:` from matching the trigger key; verified each file carries exactly one bare `issues:`/`pull_request_target:` key and each sed mutation target appears exactly once per file. - `self-labels.yml` is untouched by this PR (D3) — `actionlint` has nothing new to say; CI runs it regardless. ## Acceptance criteria - [x] The caller's and the stub's `issues:` type lists are byte-identical, `edited` and `reopened` included. - [x] `test/labels.test.sh` goes red if either file drops a type from either list, or if the two `issues:` lists drift apart. - [x] `CONSUMERS.md` carries exactly one adoption note covering every pending stub edit, naming the tag (the first tag carrying ceremony#137 and ceremony#144). - [x] `self-labels.yml` still lists all eight types (untouched, and now test-pinned). - [x] `actionlint` and the full local suite are green locally; CI confirms. ## Worklog - [x] Read the spec, caller, stub, main's test harness, and #143's helper shape - [x] D1: stub `issues:` list byte-identical to the caller's - [x] D4: single adoption note naming the tag - [x] D2/D3: parity row + eight-type pin + three failing cases in `test/labels.test.sh` - [x] `changelog.d/144.md` - [x] `bash test/run.sh` + shellcheck gate green locally - [x] #143 merged mid-draft → rebased onto main, generalized its parity helper to both trigger lists, folded both pending stub edits into the one adoption note (per the issue's lands-second clause) - [x] CI green on the draft - [x] Mark ready-for-review, request the panel (codex, grok, kimi)
danmt (Migrated from github.com) reviewed 2026-07-24 13:34:57 +00:00
grok-bot-andresmgsl commented 2026-07-24 13:45:52 +00:00 (Migrated from github.com)

🔎 reviewing head 0b77d4b860

🔎 reviewing head 0b77d4b860961ee01de107145d3fb1e784e54c63
grok-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-24 13:46:57 +00:00
grok-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Reviewed head 0b77d4b860961ee01de107145d3fb1e784e54c63 against #144 (Closes #144).

Acceptance criteria

Criterion Result
Caller and stub issues: lists byte-identical, edited/reopened included met — both are types: [opened, edited, assigned, unassigned, labeled, unlabeled, closed, reopened]
test/labels.test.sh red on drop or drift of either list met — identity + eight-type pin + drop-from-caller / drop-from-stub / reorder rows; generalized event_types / types_in_sync keeps #137's pull_request_target rows intact
Exactly one adoption note covering every pending stub edit, naming the tag met — single prose note folds #137 (review_requested/review_request_removed) and #144 (edited/reopened) into one pin-bump to the first tag carrying both; 0.2.0 availability paragraph correctly notes the list stopped at closed
self-labels.yml still lists all eight types met — file untouched vs main; pin row asserts the eight-type line
actionlint / full local suite green metbash test/run.sh → 18/18 files, labels.test.sh 22/22; shellcheck-all.sh clean; CI test + self-guards success on this head

Spec decisions (D1–D5)

  • D1 stub follows caller order and membership.
  • D2 parity extended to issues: with the same failing-case shape as #137.
  • D3 caller not narrowed to “fix” the drift.
  • D4 one adoption note, not two competing ones.
  • D5 scope job out of scope; this PR only touches docs/CONSUMERS.md, test/labels.test.sh, and changelog.d/144.md.

Verification run

Detached worktree at the head SHA:

  • Manual types_in_sync issues → match; drop edited from either side → exit 1; reorder → exit 1.
  • NF == 1 guard correctly ignores issues: write under permissions:.

No blockers. Non-blocking: none worth holding the human for.

## Verdict: approve Reviewed head `0b77d4b860961ee01de107145d3fb1e784e54c63` against #144 (Closes #144). ### Acceptance criteria | Criterion | Result | |---|---| | Caller and stub `issues:` lists byte-identical, `edited`/`reopened` included | **met** — both are `types: [opened, edited, assigned, unassigned, labeled, unlabeled, closed, reopened]` | | `test/labels.test.sh` red on drop or drift of either list | **met** — identity + eight-type pin + drop-from-caller / drop-from-stub / reorder rows; generalized `event_types` / `types_in_sync` keeps #137's `pull_request_target` rows intact | | Exactly one adoption note covering every pending stub edit, naming the tag | **met** — single prose note folds #137 (`review_requested`/`review_request_removed`) and #144 (`edited`/`reopened`) into one pin-bump to the first tag carrying both; `0.2.0` availability paragraph correctly notes the list stopped at `closed` | | `self-labels.yml` still lists all eight types | **met** — file untouched vs main; pin row asserts the eight-type line | | actionlint / full local suite green | **met** — `bash test/run.sh` → 18/18 files, `labels.test.sh` 22/22; `shellcheck-all.sh` clean; CI `test` + `self-guards` success on this head | ### Spec decisions (D1–D5) - **D1** stub follows caller order and membership. - **D2** parity extended to `issues:` with the same failing-case shape as #137. - **D3** caller not narrowed to “fix” the drift. - **D4** one adoption note, not two competing ones. - **D5** `scope` job out of scope; this PR only touches `docs/CONSUMERS.md`, `test/labels.test.sh`, and `changelog.d/144.md`. ### Verification run Detached worktree at the head SHA: - Manual `types_in_sync issues` → match; drop `edited` from either side → exit 1; reorder → exit 1. - `NF == 1` guard correctly ignores `issues: write` under `permissions:`. No blockers. Non-blocking: none worth holding the human for.
kimi-bot-andresmgsl commented 2026-07-24 13:46:57 +00:00 (Migrated from github.com)

🔎 reviewing head 0b77d4b860

🔎 reviewing head 0b77d4b860961ee01de107145d3fb1e784e54c63
codex-bot-andresmgsl commented 2026-07-24 13:50:46 +00:00 (Migrated from github.com)

🔎 reviewing head 0b77d4b860

🔎 reviewing head 0b77d4b860961ee01de107145d3fb1e784e54c63
kimi-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-24 13:51:09 +00:00
kimi-bot-andresmgsl (Migrated from github.com) left a comment

Approve. Reviewed the whole PR at head 0b77d4b in a detached worktree against issue #144's spec.

Acceptance criteria — all verified by reading + running:

  • D1 / AC1 — the stub's issues: list (docs/CONSUMERS.md:312) is byte-identical to the caller's (.github/workflows/self-labels.yml:11), order included: [opened, edited, assigned, unassigned, labeled, unlabeled, closed, reopened]. Confirmed by diffing the extracted lines.
  • D2 / AC2test/labels.test.sh generalizes #137's helper into event_types <file> <trigger> / types_in_sync <trigger> <caller> <stub>; #137's four pull_request_target rows are preserved on the shared helper, and four new rows pin the issues: list (identity, the caller's eight-type pin, drop-from-caller, drop-from-stub, reorder). Ran it here: 22/22 green, and the three failing-case rows do exit 1 on the mutated copies as written.
  • D3 / AC4 — the caller still lists all eight types; no narrowing.
  • D4 / AC3 — exactly one adoption note (CONSUMERS.md:335-348) covers both pending stub edits (review_requested/review_request_removed for #137, edited/reopened for #144), adopted together at the pin bump to the first tag carrying both; the issues:-availability paragraph gains the "at 0.2.0 the type list stops at closed" clause. The two inline stub comments point at the same bump — not competing notes.
  • D5labels.yml (the scope job) is untouched; only 3 files changed.
  • changelog.d/144.md present, and it accurately describes the fix.

What I could not verify locally, and what I relied on instead: this box has no node, shellcheck, actionlint, or jq. The full local suite fails 63 rows in 7 files (version, changelog-armed, drill-recorded, facts, issueflow-reconcile, ruling, plus related) — I ran the identical suite on a main worktree and got the same 63 failures in the same 7 files, so none are introduced by this PR; they are environment gaps on this box. labels.test.sh — the only test file this PR touches — is fully green standalone. For actionlint/shellcheck I relied on CI: all check runs on 0b77d4b are success (test, self-guards, labels / reconcile, exercise jobs), the skipped/cancelled duplicates being superseded reruns.

The awk NF == 1 guard correctly keeps issues: write under permissions: from matching the trigger key, in both the caller and the stub. Nothing blocking.

Approve. Reviewed the whole PR at head `0b77d4b` in a detached worktree against issue #144's spec. **Acceptance criteria — all verified by reading + running:** - **D1 / AC1** — the stub's `issues:` list (`docs/CONSUMERS.md:312`) is byte-identical to the caller's (`.github/workflows/self-labels.yml:11`), order included: `[opened, edited, assigned, unassigned, labeled, unlabeled, closed, reopened]`. Confirmed by diffing the extracted lines. - **D2 / AC2** — `test/labels.test.sh` generalizes #137's helper into `event_types <file> <trigger>` / `types_in_sync <trigger> <caller> <stub>`; #137's four `pull_request_target` rows are preserved on the shared helper, and four new rows pin the `issues:` list (identity, the caller's eight-type pin, drop-from-caller, drop-from-stub, reorder). Ran it here: **22/22 green**, and the three failing-case rows do exit 1 on the mutated copies as written. - **D3 / AC4** — the caller still lists all eight types; no narrowing. - **D4 / AC3** — exactly one adoption note (CONSUMERS.md:335-348) covers both pending stub edits (`review_requested`/`review_request_removed` for #137, `edited`/`reopened` for #144), adopted together at the pin bump to the first tag carrying both; the `issues:`-availability paragraph gains the "at `0.2.0` the type list stops at `closed`" clause. The two inline stub comments point at the same bump — not competing notes. - **D5** — `labels.yml` (the `scope` job) is untouched; only 3 files changed. - `changelog.d/144.md` present, and it accurately describes the fix. **What I could not verify locally, and what I relied on instead:** this box has no `node`, `shellcheck`, `actionlint`, or `jq`. The full local suite fails 63 rows in 7 files (`version`, `changelog-armed`, `drill-recorded`, `facts`, `issueflow-reconcile`, `ruling`, plus related) — I ran the identical suite on a `main` worktree and got **the same 63 failures in the same 7 files**, so none are introduced by this PR; they are environment gaps on this box. `labels.test.sh` — the only test file this PR touches — is fully green standalone. For `actionlint`/`shellcheck` I relied on CI: all check runs on `0b77d4b` are `success` (`test`, `self-guards`, `labels / reconcile`, exercise jobs), the skipped/cancelled duplicates being superseded reruns. The `awk` `NF == 1` guard correctly keeps `issues: write` under `permissions:` from matching the trigger key, in both the caller and the stub. Nothing blocking.
codex-bot-andresmgsl (Migrated from github.com) approved these changes 2026-07-24 13:52:12 +00:00
codex-bot-andresmgsl (Migrated from github.com) left a comment

Verdict: approve

Reviewed head 0b77d4b860961ee01de107145d3fb1e784e54c63 against issue #144.

The implementation meets the contract:

  • The published issues: list is byte-identical to the caller’s eight-type list, including edited and reopened; self-labels.yml remains unchanged.
  • The generalized event_types helper is mawk-compatible and its NF == 1 guard excludes issues: write under permissions:.
  • The parity coverage proves identity, pins the caller’s complete list, and goes red when either side drops a type or one side reorders the list. The existing pull_request_target coverage remains intact.
  • CONSUMERS.md carries one combined adoption note for #137 and #144 and accurately distinguishes the 0.2.0 trigger shape from the first tag carrying both pending edits.
  • The change is limited to the stub, parity tests, and the required changelog fragment; the caller and scope job are untouched.

Verification:

  • bash test/run.sh — 18/18 test files passed; test/labels.test.sh passed 22/22 rows.
  • bash .github/scripts/shellcheck-all.sh — clean across 39 tracked scripts.
  • actionlint — clean.
  • git diff --check — clean.
  • CI on this head reports the substantive test and guard jobs successful.

No blocking or non-blocking findings.

## Verdict: approve Reviewed head `0b77d4b860961ee01de107145d3fb1e784e54c63` against issue #144. The implementation meets the contract: - The published `issues:` list is byte-identical to the caller’s eight-type list, including `edited` and `reopened`; `self-labels.yml` remains unchanged. - The generalized `event_types` helper is mawk-compatible and its `NF == 1` guard excludes `issues: write` under `permissions:`. - The parity coverage proves identity, pins the caller’s complete list, and goes red when either side drops a type or one side reorders the list. The existing `pull_request_target` coverage remains intact. - `CONSUMERS.md` carries one combined adoption note for #137 and #144 and accurately distinguishes the `0.2.0` trigger shape from the first tag carrying both pending edits. - The change is limited to the stub, parity tests, and the required changelog fragment; the caller and `scope` job are untouched. Verification: - `bash test/run.sh` — 18/18 test files passed; `test/labels.test.sh` passed 22/22 rows. - `bash .github/scripts/shellcheck-all.sh` — clean across 39 tracked scripts. - `actionlint` — clean. - `git diff --check` — clean. - CI on this head reports the substantive test and guard jobs successful. No blocking or non-blocking findings.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: heavy-duty/ceremony#150
No description provided.