fix: read live review requests from each forge #249

Merged
andres merged 5 commits from build/238-review-requests into main 2026-08-24 15:54:52 +00:00

Closes #238

Acceptance criteria

  • forge_pr_review_requests on Forgejo returns exactly live REQUEST_REVIEW logins, including empty crew!96 and four-login crew!97 shapes.
  • The GitHub backend returns .requested_reviewers[].login from the PR object.
  • Superseded questions are re-asked at the verb: stale-not-re-requested, re-requested-with-standing-block, merged-with-stale-field, and request-row-only.
  • End to end on crew!96 facts, exact REQUESTED yields state:addressing while the old inference yields state:bots-reviewing.
  • outstanding_requests has no remaining production occurrence.
  • Outside the named deletion and rewires, label-reconciler assertions are preserved; final count is 252 (258 baseline − 8 superseded + 2 crew!96 regressions).
  • Every question added by #235 remains asked by name, with the three named sites rewired as specified.
  • Full suite and sanctioned shellcheck are green at the PR head.

Worklog

  • Add red-first backend tests for both live-request representations.

  • Implement forge_pr_review_requests in both backends and verify 134 backend assertions.

  • Add the crew!96 before/after round-state fixture and preserve the opening-round assertion.

  • Re-point the review-filter probe and replace the reconciler input with the exact request verb.

  • Delete outstanding_requests and its superseded assertion block without weakening unrelated coverage.

  • Add changelog.d/238.md.

  • Run targeted tests, full suite, sanctioned chunked shellcheck, and diff hygiene.

  • Round fix: make the GitHub stub execute the production --jq expression.

  • Round fix: make the merged shape explicit; keep the lower-level failure coverage within the fixed 134-assertion contract.

  • Round fix: run targeted/full verification, push, and answer the round whole.

Test record

  • Baseline: bash test/run.sh — all 31 test files passed.

  • Backend RED: 128 passed, 6 failed because forge_pr_review_requests was undefined.

  • Backend GREEN at 0160f6a: 134 passed, 0 failed.

  • Probe RED: 259 passed, 1 failed because main() still called the old inference.

  • Reconciler GREEN at 6f5ce8f: 252 passed, 0 failed; backend remains 134 passed, 0 failed.

  • Pure round_state needed no change: crew!96 is bots-reviewing with the old inferred set and addressing with the exact empty set.

  • Final verification at 22865aba5430f5a4263a33efba1f4c8a34838bd5: 31/31 test files passed; shellcheck linted 64 tracked scripts with exit 0; diff check and worktree clean; local, tracking, and PR heads match.

Round log

  • Round-fix verification at f0f39076187dbaf827b09397422fd60095a3b4c8: bad-selector mutation 133 passed / 1 failed; restored backend 134 / 0; full suite 31/31 files; sanctioned shellcheck and actionlint exit 0; diff clean; worktree clean; local and remote heads match.

Round at 22865aba

🔧 addressing round on head 22865aba54

⟲ resuming from 22865aba54

Round analysis:

  • Claude — blocking GitHub backend test is vacuous because its gh stub ignores the production --jq: agree. I will make the stub parse and execute the passed jq expression against a PR-object fixture, then prove a bad production expression fails the test.
  • Claude — merged-PR case reuses an indistinguishable fixture and the stub ignores the PR number: agree. I will give the merged case an explicit answered-row/requested-reviewers shape and document why the stale PR field must not drive the verb.
  • Claude — the backend/PR object is fetched twice and can briefly expose mismatched snapshots: agree, no change in this round. The issue specifies the <n> verb and the sweep self-corrects; changing the interface would exceed #238.
  • Claude — no failure-path assertion exists for the new verb: agree. I will add a focused failure-path check if it fits the existing backend harness without broadening production scope.
  • Claude — review_filter_probe neutralizes forge_select, reducing that probe's selection coverage: agree, no change. The existing comment records why this probe must isolate the post-selection review-filter boundary, while selection remains covered elsewhere.
  • GLM — the new verb causes a second backend fetch: agree, no change for the same spec/interface reason above.
  • GLM — the merged-PR fixture would benefit from an explicit note tying PR 146 to all panelists having submitted: agree. I will make that relationship visible in the fixture/comment while fixing Claude's corresponding point.
  • Kimi — approved with no blocking or non-blocking findings: agree. No code change is needed; I will preserve the verified behavior and rerun the relevant and full checks.
  • GLM — approved aside from the two nits above: agree. No other action is required.

I will append these fix steps to the PR Worklog before editing code, complete and push the round as a whole, reply with changes and verification, then signal the final head while still draft and mark it ready with no intervening commit.

Round answered whole for head 22865aba5430f5a4263a33efba1f4c8a34838bd5; fixes are pushed at f0f39076187dbaf827b09397422fd60095a3b4c8.

  • Claude blocking — GitHub selector was not exercised: fixed. The gh stub now parses the production --jq argument and applies it to a complete PR-object fixture. With the production selector mutated to .this_key_does_not_exist[].login, the backend suite now fails at 133 passed / 1 failed; restoring .requested_reviewers[].login returns 134 / 0.
  • Claude + GLM non-blocking — merged fixture hid the merged shape: fixed. rig!146 now has its own explicit three-submitted-approval fixture and a comment recording that Forgejo's stale requested_reviewers field remained populated while the reviews endpoint carried no REQUEST_REVIEW row.
  • Claude + GLM non-blocking — duplicate backend reads / snapshot race: no code change. The <n> verb is #238's specified interface, the transient mismatch self-corrects on the next sweep, and changing the interface is outside this issue.
  • Claude non-blocking — no verb-specific failure-path assertion: no new assertion. #238 fixes this backend suite at 134 assertions, and lower-level fetch refusals are already covered; combining failure propagation with the selector behavior would make one test answer two unrelated questions.
  • Claude non-blocking — review_filter_probe neutralizes forge_select: no code change. That probe intentionally isolates the post-selection review-filter boundary and already documents the neutralization; selection remains covered independently.
  • Kimi and GLM approvals: preserved; no additional findings required changes.

Verification at f0f39076187dbaf827b09397422fd60095a3b4c8:

  • bash test/run.sh — 31 test files passed, 0 failed.
  • bash test/forge-backends.test.sh — 134 passed, 0 failed.
  • .github/scripts/shellcheck-all.sh — exit 0.
  • .github/scripts/actionlint-all.sh — exit 0.
  • git diff --check origin/main...HEAD — clean.
  • Worktree clean; local, remote branch, and PR head are the same commit.

📣 round answered at head f0f3907618

Round at f0f39076

Round passed with no written reply.

Closes #238 ## Acceptance criteria - [x] `forge_pr_review_requests` on Forgejo returns exactly live `REQUEST_REVIEW` logins, including empty crew!96 and four-login crew!97 shapes. - [x] The GitHub backend returns `.requested_reviewers[].login` from the PR object. - [x] Superseded questions are re-asked at the verb: stale-not-re-requested, re-requested-with-standing-block, merged-with-stale-field, and request-row-only. - [x] End to end on crew!96 facts, exact `REQUESTED` yields `state:addressing` while the old inference yields `state:bots-reviewing`. - [x] `outstanding_requests` has no remaining production occurrence. - [x] Outside the named deletion and rewires, label-reconciler assertions are preserved; final count is 252 (258 baseline − 8 superseded + 2 crew!96 regressions). - [x] Every question added by #235 remains asked by name, with the three named sites rewired as specified. - [x] Full suite and sanctioned shellcheck are green at the PR head. ## Worklog - [x] Add red-first backend tests for both live-request representations. - [x] Implement `forge_pr_review_requests` in both backends and verify 134 backend assertions. - [x] Add the crew!96 before/after round-state fixture and preserve the opening-round assertion. - [x] Re-point the review-filter probe and replace the reconciler input with the exact request verb. - [x] Delete `outstanding_requests` and its superseded assertion block without weakening unrelated coverage. - [x] Add `changelog.d/238.md`. - [x] Run targeted tests, full suite, sanctioned chunked shellcheck, and diff hygiene. - [x] Round fix: make the GitHub stub execute the production `--jq` expression. - [x] Round fix: make the merged shape explicit; keep the lower-level failure coverage within the fixed 134-assertion contract. - [x] Round fix: run targeted/full verification, push, and answer the round whole. ## Test record - Baseline: `bash test/run.sh` — all 31 test files passed. - Backend RED: 128 passed, 6 failed because `forge_pr_review_requests` was undefined. - Backend GREEN at `0160f6a`: 134 passed, 0 failed. - Probe RED: 259 passed, 1 failed because `main()` still called the old inference. - Reconciler GREEN at `6f5ce8f`: 252 passed, 0 failed; backend remains 134 passed, 0 failed. - Pure `round_state` needed no change: crew!96 is `bots-reviewing` with the old inferred set and `addressing` with the exact empty set. - Final verification at `22865aba5430f5a4263a33efba1f4c8a34838bd5`: 31/31 test files passed; shellcheck linted 64 tracked scripts with exit 0; diff check and worktree clean; local, tracking, and PR heads match. ## Round log - Round-fix verification at `f0f39076187dbaf827b09397422fd60095a3b4c8`: bad-selector mutation 133 passed / 1 failed; restored backend 134 / 0; full suite 31/31 files; sanctioned shellcheck and actionlint exit 0; diff clean; worktree clean; local and remote heads match. <!-- round:22865aba5430f5a4263a33efba1f4c8a34838bd5 --> **Round at 22865aba** 🔧 addressing round on head 22865aba5430f5a4263a33efba1f4c8a34838bd5 ⟲ resuming from 22865aba5430f5a4263a33efba1f4c8a34838bd5 Round analysis: - Claude — blocking GitHub backend test is vacuous because its `gh` stub ignores the production `--jq`: **agree**. I will make the stub parse and execute the passed jq expression against a PR-object fixture, then prove a bad production expression fails the test. - Claude — merged-PR case reuses an indistinguishable fixture and the stub ignores the PR number: **agree**. I will give the merged case an explicit answered-row/requested-reviewers shape and document why the stale PR field must not drive the verb. - Claude — the backend/PR object is fetched twice and can briefly expose mismatched snapshots: **agree**, no change in this round. The issue specifies the `<n>` verb and the sweep self-corrects; changing the interface would exceed #238. - Claude — no failure-path assertion exists for the new verb: **agree**. I will add a focused failure-path check if it fits the existing backend harness without broadening production scope. - Claude — `review_filter_probe` neutralizes `forge_select`, reducing that probe's selection coverage: **agree**, no change. The existing comment records why this probe must isolate the post-selection review-filter boundary, while selection remains covered elsewhere. - GLM — the new verb causes a second backend fetch: **agree**, no change for the same spec/interface reason above. - GLM — the merged-PR fixture would benefit from an explicit note tying PR 146 to all panelists having submitted: **agree**. I will make that relationship visible in the fixture/comment while fixing Claude's corresponding point. - Kimi — approved with no blocking or non-blocking findings: **agree**. No code change is needed; I will preserve the verified behavior and rerun the relevant and full checks. - GLM — approved aside from the two nits above: **agree**. No other action is required. I will append these fix steps to the PR Worklog before editing code, complete and push the round as a whole, reply with changes and verification, then signal the final head while still draft and mark it ready with no intervening commit. Round answered whole for head `22865aba5430f5a4263a33efba1f4c8a34838bd5`; fixes are pushed at `f0f39076187dbaf827b09397422fd60095a3b4c8`. - **Claude blocking — GitHub selector was not exercised:** fixed. The `gh` stub now parses the production `--jq` argument and applies it to a complete PR-object fixture. With the production selector mutated to `.this_key_does_not_exist[].login`, the backend suite now fails at 133 passed / 1 failed; restoring `.requested_reviewers[].login` returns 134 / 0. - **Claude + GLM non-blocking — merged fixture hid the merged shape:** fixed. rig!146 now has its own explicit three-submitted-approval fixture and a comment recording that Forgejo's stale `requested_reviewers` field remained populated while the reviews endpoint carried no `REQUEST_REVIEW` row. - **Claude + GLM non-blocking — duplicate backend reads / snapshot race:** no code change. The `<n>` verb is #238's specified interface, the transient mismatch self-corrects on the next sweep, and changing the interface is outside this issue. - **Claude non-blocking — no verb-specific failure-path assertion:** no new assertion. #238 fixes this backend suite at 134 assertions, and lower-level fetch refusals are already covered; combining failure propagation with the selector behavior would make one test answer two unrelated questions. - **Claude non-blocking — `review_filter_probe` neutralizes `forge_select`:** no code change. That probe intentionally isolates the post-selection review-filter boundary and already documents the neutralization; selection remains covered independently. - **Kimi and GLM approvals:** preserved; no additional findings required changes. Verification at `f0f39076187dbaf827b09397422fd60095a3b4c8`: - `bash test/run.sh` — 31 test files passed, 0 failed. - `bash test/forge-backends.test.sh` — 134 passed, 0 failed. - `.github/scripts/shellcheck-all.sh` — exit 0. - `.github/scripts/actionlint-all.sh` — exit 0. - `git diff --check origin/main...HEAD` — clean. - Worktree clean; local, remote branch, and PR head are the same commit. 📣 round answered at head f0f39076187dbaf827b09397422fd60095a3b4c8 <!-- round:f0f39076187dbaf827b09397422fd60095a3b4c8 --> **Round at f0f39076** _Round passed with no written reply._
codex-bot-andresmgsl added 1 commit 2026-08-24 12:38:43 +00:00
fix: read live review requests from each forge
All checks were successful
CI / test (pull_request) Successful in 3m44s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Successful in 20s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
0160f6a883
codex-bot-andresmgsl changed title from fix: read live review requests from each forge to WIP: fix: read live review requests from each forge 2026-08-24 12:38:52 +00:00
codex-bot-andresmgsl added 1 commit 2026-08-24 12:42:23 +00:00
fix: drive round state from live review requests
All checks were successful
CI / test (pull_request) Successful in 4m8s
CI / release-exercise (pull_request) Successful in 24s
CI / self-guards (pull_request) Successful in 19s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
6f5ce8f994
codex-bot-andresmgsl added 1 commit 2026-08-24 12:43:44 +00:00
docs: record live review request fix
All checks were successful
CI / test (pull_request) Successful in 3m43s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Successful in 20s
CI / action-exercise (pull_request) Successful in 18s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
f05e83a562
forgejo-actions added the
state:building
label 2026-08-24 12:43:44 +00:00
codex-bot-andresmgsl added 1 commit 2026-08-24 12:46:53 +00:00
test: preserve superseded request question names
All checks were successful
CI / test (pull_request) Successful in 3m42s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Successful in 19s
CI / action-exercise (pull_request) Successful in 18s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
22865aba54
Author
Member

📣 round answered at head 22865aba54

📣 round answered at head 22865aba5430f5a4263a33efba1f4c8a34838bd5
codex-bot-andresmgsl changed title from WIP: fix: read live review requests from each forge to fix: read live review requests from each forge 2026-08-24 12:49:42 +00:00
forgejo-actions added the
scope:labels
scope:release-flow
labels 2026-08-24 12:49:53 +00:00
forgejo-actions added
state:addressing
and removed
state:building
labels 2026-08-24 12:51:58 +00:00
forgejo-actions added the
blocker:unrequested
label 2026-08-24 13:10:06 +00:00
codex-bot-andresmgsl requested review from glm-bot-andresmgsl 2026-08-24 13:10:53 +00:00
codex-bot-andresmgsl requested review from claude-bot-andresmgsl 2026-08-24 13:10:53 +00:00
codex-bot-andresmgsl requested review from kimi-bot-andresmgsl 2026-08-24 13:10:54 +00:00
codex-bot-andresmgsl added the
state:bots-reviewing
label 2026-08-24 13:10:54 +00:00
forgejo-actions removed the
blocker:unrequested
state:addressing
labels 2026-08-24 13:11:28 +00:00

🔎 reviewing head f0f3907618

Round 2 complete. Last round's blocking item — the GitHub backend's gh stub
discarding the production --jq — is fixed and mutation-verified: replacing
.requested_reviewers[].login with a non-existent key now reds the suite
(133/1), as does dropping | sort -u. Forgejo half re-verified at this head.
Full suite 29/31 files here (the two yq-dependent files fail identically at
the merge base — my box, not the PR); sanctioned shellcheck rc 0; actionlint
absent here. Verdict submitted.

🔎 reviewing head f0f39076187dbaf827b09397422fd60095a3b4c8 Round 2 complete. Last round's blocking item — the GitHub backend's `gh` stub discarding the production `--jq` — is fixed and mutation-verified: replacing `.requested_reviewers[].login` with a non-existent key now reds the suite (133/1), as does dropping `| sort -u`. Forgejo half re-verified at this head. Full suite 29/31 files here (the two `yq`-dependent files fail identically at the merge base — my box, not the PR); sanctioned shellcheck rc 0; actionlint absent here. Verdict submitted.

🔎 reviewing head f0f3907618

  • fetched PR head, checked out detached worktree
  • read issue #238 and PR acceptance criteria
  • reviewed backend changes (forge-forgejo.sh, forge-github.sh) and reconciler rewiring
  • ran test/run.sh: labels-reconcile 252/252 passed, forge-backends 134/134 passed; package-json cases failed (node not installed in this box)
  • ran shellcheck-all.sh: exit 0 on 64 tracked scripts
  • ran self-ref-check, marker-check, vendored-check: all exit 0
  • actionlint not installed in this box
  • verdict: approve (submitted via submit-verdict.sh)
🔎 reviewing head f0f39076187dbaf827b09397422fd60095a3b4c8 - fetched PR head, checked out detached worktree - read issue #238 and PR acceptance criteria - reviewed backend changes (forge-forgejo.sh, forge-github.sh) and reconciler rewiring - ran test/run.sh: labels-reconcile 252/252 passed, forge-backends 134/134 passed; package-json cases failed (node not installed in this box) - ran shellcheck-all.sh: exit 0 on 64 tracked scripts - ran self-ref-check, marker-check, vendored-check: all exit 0 - actionlint not installed in this box - verdict: approve (submitted via submit-verdict.sh)

🔎 reviewing head f0f3907618

  • whole PR re-reviewed at this head: production diff (both backend verbs, REQUESTED= rewire, outstanding_requests deletion, changelog fragment) re-checked against every #238 spec item and acceptance criterion — all present
  • full suite 31/31 files green at head (ran myself); forge-backends 134/0; labels-reconcile 252/0 (= 258 − 8 superseded + 2 crew!96); sanctioned shellcheck exit 0; actionlint exit 0; git diff --check clean
  • grep -c outstanding_requests labels-reconcile.sh = 0; the four superseded questions re-asked by greppable "supersedes" names; both #235 question names still asked at lines 199/1718
  • round-fix verified by mutation: production GitHub selector mutated to .this_key_does_not_exist[].login → 133/1 with the failure landing exactly on "github returns requested_reviewers from the PR object unchanged"; restored → 134/0; worktree clean
  • rig!146 merged shape now explicit (three submitted approvals fixture + stale-field comment) — my prior nit resolved; duplicate-fetch nit declined with the #238 interface rationale I already accepted as non-blocking
  • verdict composed: approve
🔎 reviewing head f0f39076187dbaf827b09397422fd60095a3b4c8 - whole PR re-reviewed at this head: production diff (both backend verbs, REQUESTED= rewire, outstanding_requests deletion, changelog fragment) re-checked against every #238 spec item and acceptance criterion — all present - full suite 31/31 files green at head (ran myself); forge-backends 134/0; labels-reconcile 252/0 (= 258 − 8 superseded + 2 crew!96); sanctioned shellcheck exit 0; actionlint exit 0; `git diff --check` clean - grep -c outstanding_requests labels-reconcile.sh = 0; the four superseded questions re-asked by greppable "supersedes" names; both #235 question names still asked at lines 199/1718 - round-fix verified by mutation: production GitHub selector mutated to .this_key_does_not_exist[].login → 133/1 with the failure landing exactly on "github returns requested_reviewers from the PR object unchanged"; restored → 134/0; worktree clean - rig!146 merged shape now explicit (three submitted approvals fixture + stale-field comment) — my prior nit resolved; duplicate-fetch nit declined with the #238 interface rationale I already accepted as non-blocking - verdict composed: approve
kimi-bot-andresmgsl approved these changes 2026-08-24 13:24:43 +00:00
Dismissed
kimi-bot-andresmgsl left a comment
Member

Approved.

This PR correctly implements the #238 spec: it adds forge_pr_review_requests to both forge backends, deletes the outstanding_requests derivation from actions/labels-reconcile/labels-reconcile.sh, and rewires the two test sites from #235 without weakening them.

What I verified on the PR head (22865aba5430f5a4263a33efba1f4c8a34838bd5):

  • grep -R outstanding_requests --include='*.sh' returns no matches in the tree.
  • test/forge-backends.test.sh: 134 passed, 0 failed. The new assertions cover the four superseded questions: stale-not-re-requested, re-requested-with-standing-block, merged-with-stale-field, and request-row-only, plus crew!97's sorted/deduplicated four-login set.
  • test/labels-reconcile.test.sh: 252 passed, 0 failed. The crew!96 before/after fixture shows state:bots-reviewing under the old inferred request set and state:addressing under the exact empty set.
  • .github/scripts/shellcheck-all.sh: linted 64 tracked scripts with exit 0.
  • CI status on the head is all green (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing).

What I could not verify locally:

  • The full test/run.sh suite: this box lacks node/npm, so the package-json cases in test/version.test.sh, test/facts.test.sh, test/changelog-armed.test.sh, and test/drill-recorded.test.sh fail with "node is required". These are unrelated to the changed files and CI confirms they pass.
Approved. This PR correctly implements the #238 spec: it adds `forge_pr_review_requests` to both forge backends, deletes the `outstanding_requests` derivation from `actions/labels-reconcile/labels-reconcile.sh`, and rewires the two test sites from #235 without weakening them. What I verified on the PR head (`22865aba5430f5a4263a33efba1f4c8a34838bd5`): - `grep -R outstanding_requests --include='*.sh'` returns no matches in the tree. - `test/forge-backends.test.sh`: 134 passed, 0 failed. The new assertions cover the four superseded questions: stale-not-re-requested, re-requested-with-standing-block, merged-with-stale-field, and request-row-only, plus crew!97's sorted/deduplicated four-login set. - `test/labels-reconcile.test.sh`: 252 passed, 0 failed. The crew!96 before/after fixture shows `state:bots-reviewing` under the old inferred request set and `state:addressing` under the exact empty set. - `.github/scripts/shellcheck-all.sh`: linted 64 tracked scripts with exit 0. - CI status on the head is all green (test, release-exercise, self-guards, action-exercise, docs-sync-exercise, labels, refs-not-closing). What I could not verify locally: - The full `test/run.sh` suite: this box lacks `node`/`npm`, so the package-json cases in `test/version.test.sh`, `test/facts.test.sh`, `test/changelog-armed.test.sh`, and `test/drill-recorded.test.sh` fail with "node is required". These are unrelated to the changed files and CI confirms they pass.
glm-bot-andresmgsl approved these changes 2026-08-24 13:26:37 +00:00
Dismissed
glm-bot-andresmgsl left a comment
Member

Approve — verified, not opined. Head 22865aba54 against issue #238.

Acceptance criteria — all checked

  • Verb on Forgejo: reads REQUEST_REVIEW rows from /pulls/{n}/reviews, sort -u, paginated through the completeness-asserting forge_api --paginate (labels-reconcile.test.sh + forge-backends.test.sh). crew!96 payload (two APPROVED + one REQUEST_CHANGES, no rows) yields nothing; crew!97 opening payload (4 logins + a duplicate row) yields the four sorted-unique logins.
  • Verb on GitHub: repos/$REPO/pulls/$n --jq '.requested_reviewers[].login', asserted against a stubbed PR object through the gh boundary.
  • Superseded questions re-asked at the verb, greppably named: all four present in forge-backends.test.sh — stale-never-re-requested → not requested; re-requested over standing REQUEST_CHANGES → requested (the case the old intersection could not express); merged-with-stale-field → nobody; request-row-only → requested. I confirmed the deleted rig!146 answer stays true in the new vocabulary: submitted verdicts delete the rows, and the stub models exactly that (three submitted verdicts, zero rows).
  • crew!96 before/after: both directions asserted ("old inferred requests hand the fix round to the panel" → bots-reviewing; "exact empty requests return the fix round to the builder" → addressing), and the PR body records both.
  • grep -c outstanding_requests actions/labels-reconcile/labels-reconcile.sh = 0 — run by me; no other tracked file references it.
  • Counted deletion: 258 − 8 + 2 = 252, and I reproduced it — the head suite prints "labels-reconcile tests: 252 passed, 0 failed", forge-backends 134 passed; expect-count delta is exactly −8 deleted (the named block) +2 added; the diff touches no other assertion.
  • !244's questions all still asked by name: "three Forgejo request rows keep the opening round with the panel" byte-identical with only its setup rewired to a direct REQUESTED= assignment; the probe assertion byte-identical with the override re-pointed at forge_pr_review_requests (same post-REVIEWS_JSON boundary; the added forge_select(){ return 0; } neutralizes main's backend re-source so the override survives — sound, since the probe already runs the GitHub backend); "a Forgejo request row is not an answer…" superseded by name at the verb; the other seven !244 assertions are untouched (verified against the 68b304d diff; main..head reaches 7bdae45 via changelog-only 246, so the baseline is clean).
  • Green at head: bash test/run.sh → 31/31 files; sanctioned .github/scripts/shellcheck-all.sh → 64 scripts, exit 0; actionlint-all.sh → exit 0.

Verification runs (what I ran)

  • Red-first re-proven by me, not trusted from the body: head's test files against main's libs → forge-backends 128 passed / 6 failed (verb unbound); labels-reconcile 251 passed / 1 failed (probe boundary), and the crew!96 round_state pair green on main — exactly the issue's "red is at the verb, not at round_state".
  • Live end-to-end on this forge, driving the checked-out verb against this very PR: returned exactly the two standing REQUEST_REVIEW rows; kimi's request row had just been deleted by kimi's approval (review 2479) — the review.go delete-on-submit model confirmed against production, on the PR under review.
  • A merged-PR probe (!248) returned a standing unanswered row (andres) — correct per the model and inert in production: forge_pr_list is state=open, so round_state never reads a closed PR. Worth knowing, changes nothing.

What I could not verify, and what I relied on instead

  • The forge-side CI run for this head: I ran the full suite, shellcheck, and actionlint locally at the head instead.
  • The GitHub backend's network path: exercised only through the hermetic gh stub (the fleet is Forgejo-only); relied on the stub asserting the exact endpoint and jq expression.
  • crew!96/97 fixture payloads: these are issue #238's dated measurements of heavy-duty/crew; I trusted the recorded facts rather than re-crawling that repo's history.

Non-blocking nits (builder's discretion)

  • main now fetches the reviews endpoint (Forgejo) / PR object (GitHub) a second time inside the verb after REVIEWS_JSON/PR_JSON. Spec-mandated shape; cost only.
  • The merged-PR backend check stubs the crew!96 payload under N=146 rather than rig!146's own rows — it answers the superseded question faithfully (submitted verdicts ⇒ no rows) but a one-word comment tying 146 to "panel all submitted" would help the next reader.

Panel note: on panel= per #224, minus the author — this is an on-panel verdict, not advisory.

Approve — verified, not opined. Head 22865aba5430f5a4263a33efba1f4c8a34838bd5 against issue #238. ## Acceptance criteria — all checked - **Verb on Forgejo**: reads `REQUEST_REVIEW` rows from `/pulls/{n}/reviews`, `sort -u`, paginated through the completeness-asserting `forge_api --paginate` (labels-reconcile.test.sh + forge-backends.test.sh). crew!96 payload (two APPROVED + one REQUEST_CHANGES, no rows) yields nothing; crew!97 opening payload (4 logins + a duplicate row) yields the four sorted-unique logins. - **Verb on GitHub**: `repos/$REPO/pulls/$n --jq '.requested_reviewers[].login'`, asserted against a stubbed PR object through the `gh` boundary. - **Superseded questions re-asked at the verb, greppably named**: all four present in forge-backends.test.sh — stale-never-re-requested → not requested; re-requested over standing REQUEST_CHANGES → requested (the case the old intersection could not express); merged-with-stale-field → nobody; request-row-only → requested. I confirmed the deleted rig!146 answer stays true in the new vocabulary: submitted verdicts delete the rows, and the stub models exactly that (three submitted verdicts, zero rows). - **crew!96 before/after**: both directions asserted ("old inferred requests hand the fix round to the panel" → bots-reviewing; "exact empty requests return the fix round to the builder" → addressing), and the PR body records both. - **`grep -c outstanding_requests actions/labels-reconcile/labels-reconcile.sh` = 0** — run by me; no other tracked file references it. - **Counted deletion**: 258 − 8 + 2 = 252, and I reproduced it — the head suite prints "labels-reconcile tests: 252 passed, 0 failed", forge-backends 134 passed; expect-count delta is exactly −8 deleted (the named block) +2 added; the diff touches no other assertion. - **!244's questions all still asked by name**: "three Forgejo request rows keep the opening round with the panel" byte-identical with only its setup rewired to a direct `REQUESTED=` assignment; the probe assertion byte-identical with the override re-pointed at `forge_pr_review_requests` (same post-`REVIEWS_JSON` boundary; the added `forge_select(){ return 0; }` neutralizes main's backend re-source so the override survives — sound, since the probe already runs the GitHub backend); "a Forgejo request row is not an answer…" superseded by name at the verb; the other seven !244 assertions are untouched (verified against the 68b304d diff; main..head reaches 7bdae45 via changelog-only 246, so the baseline is clean). - **Green at head**: `bash test/run.sh` → 31/31 files; sanctioned `.github/scripts/shellcheck-all.sh` → 64 scripts, exit 0; `actionlint-all.sh` → exit 0. ## Verification runs (what I ran) - Red-first re-proven by me, not trusted from the body: head's test files against `main`'s libs → forge-backends 128 passed / **6 failed** (verb unbound); labels-reconcile 251 passed / **1 failed** (probe boundary), and the crew!96 `round_state` pair **green on main** — exactly the issue's "red is at the verb, not at round_state". - Live end-to-end on this forge, driving the checked-out verb against this very PR: returned exactly the two standing REQUEST_REVIEW rows; kimi's request row had just been deleted by kimi's approval (review 2479) — the review.go delete-on-submit model confirmed against production, on the PR under review. - A merged-PR probe (!248) returned a standing unanswered row (`andres`) — correct per the model and inert in production: `forge_pr_list` is `state=open`, so round_state never reads a closed PR. Worth knowing, changes nothing. ## What I could not verify, and what I relied on instead - The forge-side CI run for this head: I ran the full suite, shellcheck, and actionlint locally at the head instead. - The GitHub backend's network path: exercised only through the hermetic `gh` stub (the fleet is Forgejo-only); relied on the stub asserting the exact endpoint and jq expression. - crew!96/97 fixture payloads: these are issue #238's dated measurements of heavy-duty/crew; I trusted the recorded facts rather than re-crawling that repo's history. ## Non-blocking nits (builder's discretion) - `main` now fetches the reviews endpoint (Forgejo) / PR object (GitHub) a second time inside the verb after `REVIEWS_JSON`/`PR_JSON`. Spec-mandated shape; cost only. - The merged-PR backend check stubs the crew!96 payload under N=146 rather than rig!146's own rows — it answers the superseded question faithfully (submitted verdicts ⇒ no rows) but a one-word comment tying 146 to "panel all submitted" would help the next reader. Panel note: on `panel=` per #224, minus the author — this is an on-panel verdict, not advisory.
claude-bot-andresmgsl requested changes 2026-08-24 13:27:35 +00:00
Dismissed
claude-bot-andresmgsl left a comment
Member

Request changes — one blocking item, in the GitHub backend's test rather than in its code.

The production change is right, and I verified the premise it rests on against this instance rather than taking it from the issue: on heavy-duty/ceremony!244 (merged) requested_reviewers still lists all three panelists while /pulls/244/reviews carries zero REQUEST_REVIEW rows — the rig!146 shape, live. On this PR right now the same endpoint carries exactly three REQUEST_REVIEW rows for the three requested logins. Rows appear on request and vanish on submit, so forge_pr_review_requests reads the predicate requested() actually needs.

Blocking

The GitHub backend's test does not exercise the GitHub backend's jq, so the criterion it is meant to settle is unsettled. test/forge-backends.test.sh:639-648's gh stub matches on "$1 $2" and hardcodes jq -r '.requested_reviewers[].login' over its fixture, discarding the --jq expression forge_api passes it. The assertion therefore tests the stub's own expression, not lib/forge-github.sh:106's.

Measured, at this head — I replaced the production expression with a path that cannot exist:

lib/forge-github.sh:106
-  forge_api "repos/$REPO/pulls/$n" --jq '.requested_reviewers[].login' | sort -u
+  forge_api "repos/$REPO/pulls/$n" --jq '.this_key_does_not_exist[].login' | sort -u

$ bash test/forge-backends.test.sh | tail -1
134 passed, 0 failed

Green on a backend that returns nothing for every PR. That is the acceptance criterion "the same verb on the GitHub backend returns .requested_reviewers[].login unchanged, asserted against a stubbed PR object" — the stub is a stubbed result, not a stubbed PR object, and nothing asserts the read. The Forgejo half has no such hole: mutating select(.state == "REQUEST_REVIEW") to "PENDING" reds three checks, and dropping | sort -u reds one. It is only the GitHub twin that is unguarded — and that is the twin no runner on this fleet ever exercises, so this test is its whole defence. An empty REQUESTED on every PR is this issue's own bug mirrored: round_state would read *STALE*/*MISSING* and write state:addressing across a GitHub consumer's whole board.

What unblocks it: apply the passed --jq to a fixture body, which is the pattern this same file already uses 130 lines up at :504-537 for the other gh api verbs — parse --jq out of "$@", then jq -r "$jqexpr" <<<"$body" with body='{"requested_reviewers":[{"login":"glm-bot"},{"login":"claude-bot"}]}'. Same assertion, same expectation; it just starts failing when the expression is wrong.

Non-blocking

  • :603-604"a merged PR yields nobody" runs the identical fixture through the identical stub as the check above it, differing only in the argument 146 vs 96, and the stub ignores the number. It satisfies the criterion's letter, but nothing in the fixture carries the merged shape the criterion names, so the supersession it records is invisible to a reader. A payload that pairs the three answered rows with a comment stating that requested_reviewers still lists all three would make the point the deleted rig!146 assertion was making.
  • The sweep now reads /pulls/{n}/reviews twice per PR on Forgejo (REVIEWS_JSON, then the verb) and /pulls/{n} twice on GitHub, and the two snapshots are no longer the same read — a verdict landing between them briefly shows a reviewer as neither requested nor verdicted. It self-corrects on the next sweep, and the <n> signature is the spec's, so this is a note rather than an ask.
  • No failure-path check for the new verb, where the neighbouring verbs have them ("a failed fetch names the URL it tried"). forge_api's own refusals are covered, so the gap is thin.
  • review_filter_probe's new forge_select() { return 0; } is necessary — a backend-defined override cannot survive main's re-source — and the comment says so. Worth knowing it also takes main's selection step out of that probe's reach.

What I verified, and how

In a detached worktree at 22865aba5430f5a4263a33efba1f4c8a34838bd5:

criterion result
verb on Forgejo: crew!96 → empty, crew!97 → four logins pass; and mutating the state filter or dropping sort -u reds it
verb on GitHub assertion passes, but is vacuous — see above
four superseded questions re-asked at the verb, named all four present in test/forge-backends.test.sh
crew!96 end to end, both directions pass; mutating round_state's *STALE* branch to bots-reviewing reds the new "exact empty requests" check plus six standing ones
grep -c outstanding_requests in the reconciler 0; and no occurrence survives anywhere in the tree
assertion arithmetic measured, not taken: base 7bdae45 = 258 and 128; head = 252 and 134. Diffing expect/check names base→head gives exactly 8 removed — all 8 from the deleted block — and 2 added. 258 − 8 + 2 = 252
#235's questions still asked by name "three Forgejo request rows keep the opening round with the panel" keeps its name and state:bots-reviewing expectation with only its setup rewired; "REQUEST_REVIEW is removed before REVIEWS_JSON reaches the grader" is unchanged and still bites — adding REQUEST_REVIEW back to the allow-list reds it through the re-pointed probe
shellcheck clean, rc 0, over 62 tracked *.sh
changelog fragment changelog.d/238.md matches the sibling fragments' shape
Closes #238 correct shape — #238 is claimed, not post-merge, so the closing keyword belongs

Could not verify here. test/labels-bootstrap.test.sh (7/7) and test/labels-dispatch.test.sh (7/14) fail in this box because yq is not installed; actionlint is absent too. I did not take the PR body's 31/31 on trust — I ran both files at the merge base 7bdae45 and they fail there identically, so this is my environment, not a regression, and neither file is touched by this PR. Everything else above I ran. I did not exercise either backend against a real GitHub API; the GitHub half rests entirely on the stubbed test, which is why its hole is the blocking item.

Request changes — one blocking item, in the GitHub backend's test rather than in its code. The production change is right, and I verified the premise it rests on against this instance rather than taking it from the issue: on `heavy-duty/ceremony!244` (merged) `requested_reviewers` still lists all three panelists while `/pulls/244/reviews` carries **zero** `REQUEST_REVIEW` rows — the rig!146 shape, live. On this PR right now the same endpoint carries exactly three `REQUEST_REVIEW` rows for the three requested logins. Rows appear on request and vanish on submit, so `forge_pr_review_requests` reads the predicate `requested()` actually needs. ## Blocking **The GitHub backend's test does not exercise the GitHub backend's `jq`, so the criterion it is meant to settle is unsettled.** `test/forge-backends.test.sh:639-648`'s `gh` stub matches on `"$1 $2"` and hardcodes `jq -r '.requested_reviewers[].login'` over its fixture, discarding the `--jq` expression `forge_api` passes it. The assertion therefore tests the stub's own expression, not `lib/forge-github.sh:106`'s. Measured, at this head — I replaced the production expression with a path that cannot exist: ``` lib/forge-github.sh:106 - forge_api "repos/$REPO/pulls/$n" --jq '.requested_reviewers[].login' | sort -u + forge_api "repos/$REPO/pulls/$n" --jq '.this_key_does_not_exist[].login' | sort -u $ bash test/forge-backends.test.sh | tail -1 134 passed, 0 failed ``` Green on a backend that returns nothing for every PR. That is the acceptance criterion *"the same verb on the GitHub backend returns `.requested_reviewers[].login` unchanged, asserted against a stubbed PR object"* — the stub is a stubbed *result*, not a stubbed PR object, and nothing asserts the read. The Forgejo half has no such hole: mutating `select(.state == "REQUEST_REVIEW")` to `"PENDING"` reds three checks, and dropping `| sort -u` reds one. It is only the GitHub twin that is unguarded — and that is the twin no runner on this fleet ever exercises, so this test is its whole defence. An empty `REQUESTED` on every PR is this issue's own bug mirrored: `round_state` would read `*STALE*`/`*MISSING*` and write `state:addressing` across a GitHub consumer's whole board. **What unblocks it:** apply the passed `--jq` to a fixture body, which is the pattern this same file already uses 130 lines up at `:504-537` for the other `gh api` verbs — parse `--jq` out of `"$@"`, then `jq -r "$jqexpr" <<<"$body"` with `body='{"requested_reviewers":[{"login":"glm-bot"},{"login":"claude-bot"}]}'`. Same assertion, same expectation; it just starts failing when the expression is wrong. ## Non-blocking - `:603-604` — *"a merged PR yields nobody"* runs the identical fixture through the identical stub as the check above it, differing only in the argument `146` vs `96`, and the stub ignores the number. It satisfies the criterion's letter, but nothing in the fixture carries the merged shape the criterion names, so the supersession it records is invisible to a reader. A payload that pairs the three answered rows with a comment stating that `requested_reviewers` still lists all three would make the point the deleted rig!146 assertion was making. - The sweep now reads `/pulls/{n}/reviews` twice per PR on Forgejo (`REVIEWS_JSON`, then the verb) and `/pulls/{n}` twice on GitHub, and the two snapshots are no longer the same read — a verdict landing between them briefly shows a reviewer as neither requested nor verdicted. It self-corrects on the next sweep, and the `<n>` signature is the spec's, so this is a note rather than an ask. - No failure-path check for the new verb, where the neighbouring verbs have them (*"a failed fetch names the URL it tried"*). `forge_api`'s own refusals are covered, so the gap is thin. - `review_filter_probe`'s new `forge_select() { return 0; }` is necessary — a backend-defined override cannot survive `main`'s re-source — and the comment says so. Worth knowing it also takes `main`'s selection step out of that probe's reach. ## What I verified, and how In a detached worktree at `22865aba5430f5a4263a33efba1f4c8a34838bd5`: | criterion | result | |---|---| | verb on Forgejo: crew!96 → empty, crew!97 → four logins | pass; and mutating the state filter or dropping `sort -u` reds it | | verb on GitHub | assertion passes, **but is vacuous** — see above | | four superseded questions re-asked at the verb, named | all four present in `test/forge-backends.test.sh` | | crew!96 end to end, both directions | pass; mutating `round_state`'s `*STALE*` branch to `bots-reviewing` reds the new *"exact empty requests"* check plus six standing ones | | `grep -c outstanding_requests` in the reconciler | `0`; and no occurrence survives anywhere in the tree | | assertion arithmetic | measured, not taken: base `7bdae45` = **258** and **128**; head = **252** and **134**. Diffing `expect`/`check` names base→head gives exactly 8 removed — all 8 from the deleted block — and 2 added. 258 − 8 + 2 = 252 | | #235's questions still asked by name | *"three Forgejo request rows keep the opening round with the panel"* keeps its name and `state:bots-reviewing` expectation with only its setup rewired; *"REQUEST_REVIEW is removed before REVIEWS_JSON reaches the grader"* is unchanged and still bites — adding `REQUEST_REVIEW` back to the allow-list reds it through the re-pointed probe | | shellcheck | clean, rc 0, over 62 tracked `*.sh` | | changelog fragment | `changelog.d/238.md` matches the sibling fragments' shape | | `Closes #238` | correct shape — #238 is `claimed`, not post-merge, so the closing keyword belongs | **Could not verify here.** `test/labels-bootstrap.test.sh` (7/7) and `test/labels-dispatch.test.sh` (7/14) fail in this box because `yq` is not installed; `actionlint` is absent too. I did not take the PR body's 31/31 on trust — I ran both files at the merge base `7bdae45` and they fail there identically, so this is my environment, not a regression, and neither file is touched by this PR. Everything else above I ran. I did not exercise either backend against a real GitHub API; the GitHub half rests entirely on the stubbed test, which is why its hole is the blocking item.
forgejo-actions added
state:addressing
and removed
state:bots-reviewing
labels 2026-08-24 13:27:45 +00:00
codex-bot-andresmgsl changed title from fix: read live review requests from each forge to WIP: fix: read live review requests from each forge 2026-08-24 14:36:23 +00:00
Author
Member

🔧 addressing round on head 22865aba54

⟲ resuming from 22865aba54

Round analysis:

  • Claude — blocking GitHub backend test is vacuous because its gh stub ignores the production --jq: agree. I will make the stub parse and execute the passed jq expression against a PR-object fixture, then prove a bad production expression fails the test.
  • Claude — merged-PR case reuses an indistinguishable fixture and the stub ignores the PR number: agree. I will give the merged case an explicit answered-row/requested-reviewers shape and document why the stale PR field must not drive the verb.
  • Claude — the backend/PR object is fetched twice and can briefly expose mismatched snapshots: agree, no change in this round. The issue specifies the <n> verb and the sweep self-corrects; changing the interface would exceed #238.
  • Claude — no failure-path assertion exists for the new verb: agree. I will add a focused failure-path check if it fits the existing backend harness without broadening production scope.
  • Claude — review_filter_probe neutralizes forge_select, reducing that probe's selection coverage: agree, no change. The existing comment records why this probe must isolate the post-selection review-filter boundary, while selection remains covered elsewhere.
  • GLM — the new verb causes a second backend fetch: agree, no change for the same spec/interface reason above.
  • GLM — the merged-PR fixture would benefit from an explicit note tying PR 146 to all panelists having submitted: agree. I will make that relationship visible in the fixture/comment while fixing Claude's corresponding point.
  • Kimi — approved with no blocking or non-blocking findings: agree. No code change is needed; I will preserve the verified behavior and rerun the relevant and full checks.
  • GLM — approved aside from the two nits above: agree. No other action is required.

I will append these fix steps to the PR Worklog before editing code, complete and push the round as a whole, reply with changes and verification, then signal the final head while still draft and mark it ready with no intervening commit.

🔧 addressing round on head 22865aba5430f5a4263a33efba1f4c8a34838bd5 ⟲ resuming from 22865aba5430f5a4263a33efba1f4c8a34838bd5 Round analysis: - Claude — blocking GitHub backend test is vacuous because its `gh` stub ignores the production `--jq`: **agree**. I will make the stub parse and execute the passed jq expression against a PR-object fixture, then prove a bad production expression fails the test. - Claude — merged-PR case reuses an indistinguishable fixture and the stub ignores the PR number: **agree**. I will give the merged case an explicit answered-row/requested-reviewers shape and document why the stale PR field must not drive the verb. - Claude — the backend/PR object is fetched twice and can briefly expose mismatched snapshots: **agree**, no change in this round. The issue specifies the `<n>` verb and the sweep self-corrects; changing the interface would exceed #238. - Claude — no failure-path assertion exists for the new verb: **agree**. I will add a focused failure-path check if it fits the existing backend harness without broadening production scope. - Claude — `review_filter_probe` neutralizes `forge_select`, reducing that probe's selection coverage: **agree**, no change. The existing comment records why this probe must isolate the post-selection review-filter boundary, while selection remains covered elsewhere. - GLM — the new verb causes a second backend fetch: **agree**, no change for the same spec/interface reason above. - GLM — the merged-PR fixture would benefit from an explicit note tying PR 146 to all panelists having submitted: **agree**. I will make that relationship visible in the fixture/comment while fixing Claude's corresponding point. - Kimi — approved with no blocking or non-blocking findings: **agree**. No code change is needed; I will preserve the verified behavior and rerun the relevant and full checks. - GLM — approved aside from the two nits above: **agree**. No other action is required. I will append these fix steps to the PR Worklog before editing code, complete and push the round as a whole, reply with changes and verification, then signal the final head while still draft and mark it ready with no intervening commit.
codex-bot-andresmgsl added 1 commit 2026-08-24 14:42:46 +00:00
test: exercise GitHub review-request selector
All checks were successful
CI / test (pull_request) Successful in 3m43s
CI / release-exercise (pull_request) Successful in 23s
CI / self-guards (pull_request) Successful in 19s
CI / action-exercise (pull_request) Successful in 19s
CI / docs-sync-exercise (pull_request) Successful in 19s
labels / labels (pull_request) Successful in 21s
Refs guard / refs-not-closing (pull_request) Successful in 19s
f0f3907618
Author
Member

Round answered whole for head 22865aba5430f5a4263a33efba1f4c8a34838bd5; fixes are pushed at f0f39076187dbaf827b09397422fd60095a3b4c8.

  • Claude blocking — GitHub selector was not exercised: fixed. The gh stub now parses the production --jq argument and applies it to a complete PR-object fixture. With the production selector mutated to .this_key_does_not_exist[].login, the backend suite now fails at 133 passed / 1 failed; restoring .requested_reviewers[].login returns 134 / 0.
  • Claude + GLM non-blocking — merged fixture hid the merged shape: fixed. rig!146 now has its own explicit three-submitted-approval fixture and a comment recording that Forgejo's stale requested_reviewers field remained populated while the reviews endpoint carried no REQUEST_REVIEW row.
  • Claude + GLM non-blocking — duplicate backend reads / snapshot race: no code change. The <n> verb is #238's specified interface, the transient mismatch self-corrects on the next sweep, and changing the interface is outside this issue.
  • Claude non-blocking — no verb-specific failure-path assertion: no new assertion. #238 fixes this backend suite at 134 assertions, and lower-level fetch refusals are already covered; combining failure propagation with the selector behavior would make one test answer two unrelated questions.
  • Claude non-blocking — review_filter_probe neutralizes forge_select: no code change. That probe intentionally isolates the post-selection review-filter boundary and already documents the neutralization; selection remains covered independently.
  • Kimi and GLM approvals: preserved; no additional findings required changes.

Verification at f0f39076187dbaf827b09397422fd60095a3b4c8:

  • bash test/run.sh — 31 test files passed, 0 failed.
  • bash test/forge-backends.test.sh — 134 passed, 0 failed.
  • .github/scripts/shellcheck-all.sh — exit 0.
  • .github/scripts/actionlint-all.sh — exit 0.
  • git diff --check origin/main...HEAD — clean.
  • Worktree clean; local, remote branch, and PR head are the same commit.
Round answered whole for head `22865aba5430f5a4263a33efba1f4c8a34838bd5`; fixes are pushed at `f0f39076187dbaf827b09397422fd60095a3b4c8`. - **Claude blocking — GitHub selector was not exercised:** fixed. The `gh` stub now parses the production `--jq` argument and applies it to a complete PR-object fixture. With the production selector mutated to `.this_key_does_not_exist[].login`, the backend suite now fails at 133 passed / 1 failed; restoring `.requested_reviewers[].login` returns 134 / 0. - **Claude + GLM non-blocking — merged fixture hid the merged shape:** fixed. rig!146 now has its own explicit three-submitted-approval fixture and a comment recording that Forgejo's stale `requested_reviewers` field remained populated while the reviews endpoint carried no `REQUEST_REVIEW` row. - **Claude + GLM non-blocking — duplicate backend reads / snapshot race:** no code change. The `<n>` verb is #238's specified interface, the transient mismatch self-corrects on the next sweep, and changing the interface is outside this issue. - **Claude non-blocking — no verb-specific failure-path assertion:** no new assertion. #238 fixes this backend suite at 134 assertions, and lower-level fetch refusals are already covered; combining failure propagation with the selector behavior would make one test answer two unrelated questions. - **Claude non-blocking — `review_filter_probe` neutralizes `forge_select`:** no code change. That probe intentionally isolates the post-selection review-filter boundary and already documents the neutralization; selection remains covered independently. - **Kimi and GLM approvals:** preserved; no additional findings required changes. Verification at `f0f39076187dbaf827b09397422fd60095a3b4c8`: - `bash test/run.sh` — 31 test files passed, 0 failed. - `bash test/forge-backends.test.sh` — 134 passed, 0 failed. - `.github/scripts/shellcheck-all.sh` — exit 0. - `.github/scripts/actionlint-all.sh` — exit 0. - `git diff --check origin/main...HEAD` — clean. - Worktree clean; local, remote branch, and PR head are the same commit.
Author
Member

📣 round answered at head f0f3907618

📣 round answered at head f0f39076187dbaf827b09397422fd60095a3b4c8
codex-bot-andresmgsl changed title from WIP: fix: read live review requests from each forge to fix: read live review requests from each forge 2026-08-24 14:47:35 +00:00
forgejo-actions added
state:bots-reviewing
and removed
state:addressing
labels 2026-08-24 14:50:16 +00:00
glm-bot-andresmgsl approved these changes 2026-08-24 14:56:55 +00:00
glm-bot-andresmgsl left a comment
Member

Verdict: approve — at head f0f3907618

Whole-PR re-review at this head against issue #238's acceptance criteria, the repo's load-bearing constraints, and the code. Every prior round's point is settled.

Acceptance criteria — all verified, not assumed:

  • Forgejo verb exactnessforge_pr_review_requests reads REQUEST_REVIEW rows from /pulls/n/reviews (--paginate, sort -u); crew!96's three-verdict-no-rows payload yields nothing, crew!97's opening payload yields the four logins. The fixture is deliberately unordered with a duplicate, so the sorted-unique contract is exercised, not just the happy path. The review.go delete-on-submit citation the spec asked for is in the comment.
  • GitHub verb.requested_reviewers[].login asserted against a stubbed PR object. This round's fix makes the stub parse and execute the production --jq expression, closing the vacuous-test hole from the last round.
  • The four superseded questions re-asked by name — all present with greppable supersedes prefixes: stale-not-re-requested → not requested; re-requested while holding REQUEST_CHANGES → requested (the case the old intersection could not express); merged rig!146 → nobody; request-row-only → requested.
  • crew!96 before/after end to end — both directions asserted in labels-reconcile: the old inference yields state:bots-reviewing, the exact empty set yields state:addressing.
  • Counted deletiongrep -c outstanding_requests on the reconciler is 0; deletions in the test file are confined to the named block (8 assertions) plus the two spec-3a rewires; both #235 question names still asked at test/labels-reconcile.test.sh:199 and :1718, the probe assertion byte-identical with the override re-pointed at the verb. 252 = 258 − 8 + 2, confirmed by running, not by trusting the body.
  • Green at head — I ran: full suite 31/31 files, forge-backends 134/0, labels-reconcile 252/0, sanctioned shellcheck exit 0, actionlint exit 0, git diff --check clean.

Round-fix verification (the blocking item): I re-ran the mutation myself. With the production selector changed to .this_key_does_not_exist[].login, the backend suite fails 133/1 and the single failure is exactly "github returns requested_reviewers from the PR object unchanged"; restored, 134/0, worktree clean. The rig!146 merged shape now has its own explicit three-submitted-approvals fixture with a comment tying the stale requested_reviewers field to it — my prior nit, resolved.

Non-blocking, unchanged from my last round: the second backend fetch (GitHub PR object read twice) remains by #238's specified <n>-verb interface; the sweep self-corrects. The review_filter_probe's forge_select neutralization keeps the override boundary stable and is documented in place.

What I could not verify: nothing material this round. All checks above were executed locally at the head in a detached throwaway worktree; the live-forge behavior of the verb was verified against this very PR in the previous round and the verb's code is unchanged since.

## Verdict: approve — at head f0f39076187dbaf827b09397422fd60095a3b4c8 Whole-PR re-review at this head against issue #238's acceptance criteria, the repo's load-bearing constraints, and the code. Every prior round's point is settled. **Acceptance criteria — all verified, not assumed:** - **Forgejo verb exactness** — `forge_pr_review_requests` reads `REQUEST_REVIEW` rows from `/pulls/n/reviews` (`--paginate`, `sort -u`); crew!96's three-verdict-no-rows payload yields nothing, crew!97's opening payload yields the four logins. The fixture is deliberately unordered with a duplicate, so the sorted-unique contract is exercised, not just the happy path. The `review.go` delete-on-submit citation the spec asked for is in the comment. - **GitHub verb** — `.requested_reviewers[].login` asserted against a stubbed PR object. This round's fix makes the stub parse and execute the production `--jq` expression, closing the vacuous-test hole from the last round. - **The four superseded questions re-asked by name** — all present with greppable `supersedes` prefixes: stale-not-re-requested → not requested; re-requested while holding `REQUEST_CHANGES` → requested (the case the old intersection could not express); merged rig!146 → nobody; request-row-only → requested. - **crew!96 before/after end to end** — both directions asserted in `labels-reconcile`: the old inference yields `state:bots-reviewing`, the exact empty set yields `state:addressing`. - **Counted deletion** — `grep -c outstanding_requests` on the reconciler is 0; deletions in the test file are confined to the named block (8 assertions) plus the two spec-3a rewires; both #235 question names still asked at test/labels-reconcile.test.sh:199 and :1718, the probe assertion byte-identical with the override re-pointed at the verb. 252 = 258 − 8 + 2, confirmed by running, not by trusting the body. - **Green at head** — I ran: full suite 31/31 files, forge-backends 134/0, labels-reconcile 252/0, sanctioned shellcheck exit 0, actionlint exit 0, `git diff --check` clean. **Round-fix verification (the blocking item):** I re-ran the mutation myself. With the production selector changed to `.this_key_does_not_exist[].login`, the backend suite fails 133/1 and the single failure is exactly "github returns requested_reviewers from the PR object unchanged"; restored, 134/0, worktree clean. The rig!146 merged shape now has its own explicit three-submitted-approvals fixture with a comment tying the stale `requested_reviewers` field to it — my prior nit, resolved. **Non-blocking, unchanged from my last round:** the second backend fetch (GitHub PR object read twice) remains by #238's specified `<n>`-verb interface; the sweep self-corrects. The `review_filter_probe`'s `forge_select` neutralization keeps the override boundary stable and is documented in place. **What I could not verify:** nothing material this round. All checks above were executed locally at the head in a detached throwaway worktree; the live-forge behavior of the verb was verified against this very PR in the previous round and the verb's code is unchanged since.
kimi-bot-andresmgsl approved these changes 2026-08-24 15:00:02 +00:00
kimi-bot-andresmgsl left a comment
Member

Approved.

Reviewed against #238 acceptance criteria:

  • forge_pr_review_requests added to both backends; Forgejo reads REQUEST_REVIEW rows, GitHub reads .requested_reviewers[].login.
  • actions/labels-reconcile/labels-reconcile.sh now calls the backend verb instead of outstanding_requests; the old function and its call sites are removed.
  • test/labels-reconcile.test.sh shows 252 passed / 0 failed (matches the stated target) and includes the crew!96 before/after regression.
  • test/forge-backends.test.sh shows 134 passed / 0 failed, covering empty, multi-login, re-requested, and merged shapes.
  • shellcheck-all.sh is green on 64 tracked scripts.
  • self-ref-check.sh, marker-check.sh, and vendored-check.sh all exit 0.
  • changelog.d/238.md is present and correctly cites the fix.

What I could not verify in this box:

  • actionlint is not installed, so workflow linting was not run. The PR does not change workflow files, so the risk is low; I relied on the unchanged .github/workflows/ci.yml remaining as previously reviewed.
  • Test cases that require node/npm (package-json cases in changelog-armed, drill-recorded, facts, version) failed because Node is not installed here. These are unrelated to #238; I relied on the PR author's recorded full-suite result for those.

The change is minimal, correctly targets the live-request set on each forge, and preserves the doctrine that state labels must be derived from forge facts rather than approximations.

Approved. Reviewed against #238 acceptance criteria: - `forge_pr_review_requests` added to both backends; Forgejo reads `REQUEST_REVIEW` rows, GitHub reads `.requested_reviewers[].login`. - `actions/labels-reconcile/labels-reconcile.sh` now calls the backend verb instead of `outstanding_requests`; the old function and its call sites are removed. - `test/labels-reconcile.test.sh` shows 252 passed / 0 failed (matches the stated target) and includes the crew!96 before/after regression. - `test/forge-backends.test.sh` shows 134 passed / 0 failed, covering empty, multi-login, re-requested, and merged shapes. - `shellcheck-all.sh` is green on 64 tracked scripts. - `self-ref-check.sh`, `marker-check.sh`, and `vendored-check.sh` all exit 0. - `changelog.d/238.md` is present and correctly cites the fix. What I could not verify in this box: - `actionlint` is not installed, so workflow linting was not run. The PR does not change workflow files, so the risk is low; I relied on the unchanged `.github/workflows/ci.yml` remaining as previously reviewed. - Test cases that require `node`/`npm` (`package-json` cases in changelog-armed, drill-recorded, facts, version) failed because Node is not installed here. These are unrelated to #238; I relied on the PR author's recorded full-suite result for those. The change is minimal, correctly targets the live-request set on each forge, and preserves the doctrine that state labels must be derived from forge facts rather than approximations.
claude-bot-andresmgsl approved these changes 2026-08-24 15:02:41 +00:00
claude-bot-andresmgsl left a comment
Member

Approve. The blocking item from my last round is fixed, and I confirmed the fix by mutation rather than by reading it: the GitHub backend's selector is now genuinely under test.

The blocking item, re-measured

test/forge-backends.test.sh's gh stub now parses --jq out of "$@" and applies it to a PR-object fixture, mirroring forge_api's own argument loop. It also pins the endpoint. Three mutations at this head, each reverted before the next:

lib/forge-github.sh:106
  .requested_reviewers[].login  ->  .this_key_does_not_exist[].login
    bash test/forge-backends.test.sh -> 133 passed, 1 failed
    FAIL: github returns requested_reviewers from the PR object unchanged

  | sort -u  ->  | cat
    -> 133 passed, 1 failed   (fixture order is glm,claude; expectation is sorted)

  repos/$REPO/pulls/$n  ->  repos/$REPO/pulls/$((n+1))
    -> 130 passed, 4 failed

Last round the first of those was green at 134/0. It is not any more. That was the whole ask, and nothing else in the round's delta touches production — git diff 22865ab..f0f3907 is 23 insertions and 6 deletions, all in test/forge-backends.test.sh.

Non-blocking items from last round

  • Merged shape made explicit — rig!146 now has its own fixture (three APPROVED rows, commit_id: merged) with a comment recording that requested_reviewers stayed populated while the reviews endpoint carried no request row. It no longer reuses the crew!96 payload, so the supersession is visible to a reader. Resolved.
  • Duplicate backend read / snapshot race, no verb-specific failure path, review_filter_probe neutralizing forge_select — declined, each with a reason inside #238's stated interface. I accept all three. On the last one I checked the claim rather than taking it: test/labels-reconcile.test.sh drives main at five sites (:993, :1075, :1597, :1663, :1714); only the probe at :1714 overrides forge_select, so main's forge_select "" || return 1 at labels-reconcile.sh:996 is still exercised by the other four. Selection coverage is intact.

Whole PR at this head

criterion result
Forgejo verb: crew!96 → empty, crew!97 → four sorted unique logins pass; select(.state == "REQUEST_REVIEW")"PENDING" reds 3 checks, dropping sort -u reds 1
GitHub verb returns .requested_reviewers[].login pass, and now non-vacuous — see above
four superseded questions re-asked at the verb, greppable by name all four present: stale-not-re-requested, merged-yields-nobody, re-requested-holding-REQUEST_CHANGES, request-row-only
crew!96 end to end, both directions pass; mutating round_state's *STALE* branch to bots-reviewing reds "crew!96 exact empty requests return the fix round to the builder" plus six standing checks
grep -c outstanding_requests in the reconciler 0, and zero occurrences anywhere in the tree
assertion arithmetic measured, not taken: base 7bdae45 = 258/128, head = 252/134. Diffing expect names base→head gives exactly 8 removed (all 8 from the deleted block) and 2 added. 258 − 8 + 2 = 252 ✓
#235's questions still asked by name "three Forgejo request rows keep the opening round with the panel" keeps its name and state:bots-reviewing expectation with only its setup rewired; "REQUEST_REVIEW is removed before REVIEWS_JSON reaches the grader" is byte-unchanged and still bites — re-adding REQUEST_REVIEW to the allow-list reds it with got REQUEST_REVIEW,COMMENT,APPROVED
the production rewire is guarded reverting REQUESTED= to the old raw-field read reds the probe assertion (251/1)
shellcheck .github/scripts/shellcheck-all.sh rc 0; all five changed files are in the linted set
diff hygiene git diff --check clean; worktree clean at f0f3907
changelog changelog.d/238.md present, ### Fixed, cites #238
Closes #238 correct shape — #238 is claimed with no post-merge criterion, so the closing keyword belongs; test/closes_references.test.sh 27/0

What I could not verify, and what I relied on instead

  • test/labels-bootstrap.test.sh (7 passed / 7 failed) and test/labels-dispatch.test.sh (7 / 14) fail in this box because yq is not installed. I did not take the PR body's 31/31 on trust: I checked out the merge base 7bdae45 in a second worktree and ran both files there — identical counts, 7/7 and 7/14. So this is my environment, not a regression, and neither file is in this PR's six. My full-suite reading is therefore 29 of 31 test files pass, with those two environmental.
  • actionlint is absent here, so I did not run .github/scripts/actionlint-all.sh. No workflow or action YAML is touched by this PR, so the exposure is nil; I rely on the builder's reported exit 0 and on CI.
  • Neither backend was exercised against a real forge API. The GitHub half rests entirely on the stubbed test — which is precisely why the stub had to execute the production expression, and now does.

One note for a future issue, not for this PR

The Forgejo verb's endpoint is unguarded: pointing it at pulls/$n/comments still leaves the suite at 134/0, because fake_forge serves the same body for any URL. I checked whether this PR introduced that and it did not — mutating the endpoints of pre-existing single-endpoint Forgejo verbs (forge_label_list, forge_pr_list) is equally invisible, while multi-endpoint verbs like forge_timeline do red. The new verb matches the file's existing convention exactly, and #238's test plan specifies fixtures rather than URL assertions, so this is a harness-wide gap for a discussion, not an ask here. The GitHub twin's endpoint is pinned.

The production change is unchanged from the head I reviewed last round and is still right: the REQUEST_REVIEW rows are the live request set because review.go deletes them on submit, and reading them is what brings the *STALE* branch back to life.

Approve. The blocking item from my last round is fixed, and I confirmed the fix by mutation rather than by reading it: the GitHub backend's selector is now genuinely under test. ## The blocking item, re-measured `test/forge-backends.test.sh`'s `gh` stub now parses `--jq` out of `"$@"` and applies it to a PR-object fixture, mirroring `forge_api`'s own argument loop. It also pins the endpoint. Three mutations at this head, each reverted before the next: ``` lib/forge-github.sh:106 .requested_reviewers[].login -> .this_key_does_not_exist[].login bash test/forge-backends.test.sh -> 133 passed, 1 failed FAIL: github returns requested_reviewers from the PR object unchanged | sort -u -> | cat -> 133 passed, 1 failed (fixture order is glm,claude; expectation is sorted) repos/$REPO/pulls/$n -> repos/$REPO/pulls/$((n+1)) -> 130 passed, 4 failed ``` Last round the first of those was green at 134/0. It is not any more. That was the whole ask, and nothing else in the round's delta touches production — `git diff 22865ab..f0f3907` is 23 insertions and 6 deletions, all in `test/forge-backends.test.sh`. ## Non-blocking items from last round - **Merged shape made explicit** — rig!146 now has its own fixture (three `APPROVED` rows, `commit_id: merged`) with a comment recording that `requested_reviewers` stayed populated while the reviews endpoint carried no request row. It no longer reuses the crew!96 payload, so the supersession is visible to a reader. Resolved. - **Duplicate backend read / snapshot race**, **no verb-specific failure path**, **`review_filter_probe` neutralizing `forge_select`** — declined, each with a reason inside #238's stated interface. I accept all three. On the last one I checked the claim rather than taking it: `test/labels-reconcile.test.sh` drives `main` at five sites (`:993`, `:1075`, `:1597`, `:1663`, `:1714`); only the probe at `:1714` overrides `forge_select`, so `main`'s `forge_select "" || return 1` at `labels-reconcile.sh:996` is still exercised by the other four. Selection coverage is intact. ## Whole PR at this head | criterion | result | |---|---| | Forgejo verb: crew!96 → empty, crew!97 → four sorted unique logins | pass; `select(.state == "REQUEST_REVIEW")` → `"PENDING"` reds 3 checks, dropping `sort -u` reds 1 | | GitHub verb returns `.requested_reviewers[].login` | pass, and now non-vacuous — see above | | four superseded questions re-asked at the verb, greppable by name | all four present: stale-not-re-requested, merged-yields-nobody, re-requested-holding-`REQUEST_CHANGES`, request-row-only | | crew!96 end to end, both directions | pass; mutating `round_state`'s `*STALE*` branch to `bots-reviewing` reds *"crew!96 exact empty requests return the fix round to the builder"* plus six standing checks | | `grep -c outstanding_requests` in the reconciler | `0`, and zero occurrences anywhere in the tree | | assertion arithmetic | measured, not taken: base `7bdae45` = **258**/**128**, head = **252**/**134**. Diffing `expect` names base→head gives exactly **8 removed** (all 8 from the deleted block) and **2 added**. 258 − 8 + 2 = 252 ✓ | | #235's questions still asked by name | *"three Forgejo request rows keep the opening round with the panel"* keeps its name and `state:bots-reviewing` expectation with only its setup rewired; *"REQUEST_REVIEW is removed before REVIEWS_JSON reaches the grader"* is byte-unchanged and still bites — re-adding `REQUEST_REVIEW` to the allow-list reds it with `got REQUEST_REVIEW,COMMENT,APPROVED` | | the production rewire is guarded | reverting `REQUESTED=` to the old raw-field read reds the probe assertion (251/1) | | shellcheck | `.github/scripts/shellcheck-all.sh` rc 0; all five changed files are in the linted set | | diff hygiene | `git diff --check` clean; worktree clean at `f0f3907` | | changelog | `changelog.d/238.md` present, `### Fixed`, cites #238 | | `Closes #238` | correct shape — #238 is `claimed` with no post-merge criterion, so the closing keyword belongs; `test/closes_references.test.sh` 27/0 | ## What I could not verify, and what I relied on instead - **`test/labels-bootstrap.test.sh` (7 passed / 7 failed) and `test/labels-dispatch.test.sh` (7 / 14) fail in this box because `yq` is not installed.** I did not take the PR body's 31/31 on trust: I checked out the merge base `7bdae45` in a second worktree and ran both files there — **identical** counts, 7/7 and 7/14. So this is my environment, not a regression, and neither file is in this PR's six. My full-suite reading is therefore **29 of 31 test files pass**, with those two environmental. - **`actionlint` is absent here**, so I did not run `.github/scripts/actionlint-all.sh`. No workflow or action YAML is touched by this PR, so the exposure is nil; I rely on the builder's reported exit 0 and on CI. - **Neither backend was exercised against a real forge API.** The GitHub half rests entirely on the stubbed test — which is precisely why the stub had to execute the production expression, and now does. ## One note for a future issue, not for this PR The Forgejo verb's **endpoint** is unguarded: pointing it at `pulls/$n/comments` still leaves the suite at 134/0, because `fake_forge` serves the same body for any URL. I checked whether this PR introduced that and it did not — mutating the endpoints of pre-existing single-endpoint Forgejo verbs (`forge_label_list`, `forge_pr_list`) is equally invisible, while multi-endpoint verbs like `forge_timeline` do red. The new verb matches the file's existing convention exactly, and #238's test plan specifies fixtures rather than URL assertions, so this is a harness-wide gap for a discussion, not an ask here. The GitHub twin's endpoint *is* pinned. The production change is unchanged from the head I reviewed last round and is still right: the `REQUEST_REVIEW` rows are the live request set because `review.go` deletes them on submit, and reading them is what brings the `*STALE*` branch back to life.
codex-bot-andresmgsl requested review from andres 2026-08-24 15:06:24 +00:00
codex-bot-andresmgsl added the
state:needs-human
label 2026-08-24 15:06:25 +00:00

🧭 Board note, measured at 2026-08-24T15:22Z — no label is written by this comment and nothing is asked of @codex-bot-andresmgsl. States on a pull request are machine-owned (LABELS.md), so triage reports this rather than repairing it by hand.

This PR currently carries two state:* labels, and its head's checks have never run.

  • state:bots-reviewing (automation, 14:50:16Z) and state:needs-human (author, 15:06:25Z) are both standing. LABELS.md allows the author exactly this one hand-set state at handoff, and says the labeled event fires the sweep that validates the write within seconds. That reconcile did not fire: the last labels run for this PR was 13:21Z, and no run of any workflow has been created for #249 since. So the losing state was never stripped.
  • All seven checks on head f0f39076 have been pending since 14:42:47ZCI / test, CI / self-guards, CI / action-exercise, CI / docs-sync-exercise, CI / release-exercise, Refs guard / refs-not-closing and labels / labels. Nothing is red; nothing has run either. The runner is not down — it drained !250's queue between 15:08Z and 15:21Z during the same window.

Why it is worth saying out loud: state:needs-human means exactly "this PR could be merged right now — zero blockers, whole panel approved the current head." The panel half is true and verified: @glm-bot-andresmgsl (14:56:55Z), @kimi-bot-andresmgsl (15:00:02Z) and @claude-bot-andresmgsl (15:02:41Z) all approved head f0f39076, which is the current head. The blockers half is unproven rather than false — the checks that would answer it have not run — and the reconciler that would have taken the label back if it disagreed never got the chance.

This is not an escalation and it needs no ruling. No blocker:* label is owed, because none of this names work the builder owes: a queued check is not a failed one. The hourly scheduled sweep (last at 14:41Z) recomputes PR state from the forge's own facts and should resolve the double label on its next pass. This note exists so that, until it does, nobody merges on the strength of a state:needs-human whose head has no green run behind it.

🧭 **Board note, measured at 2026-08-24T15:22Z — no label is written by this comment and nothing is asked of @codex-bot-andresmgsl.** States on a pull request are machine-owned ([LABELS.md](LABELS.md)), so triage reports this rather than repairing it by hand. **This PR currently carries two `state:*` labels, and its head's checks have never run.** - `state:bots-reviewing` (automation, 14:50:16Z) and `state:needs-human` (author, 15:06:25Z) are both standing. LABELS.md allows the author exactly this one hand-set state at handoff, and says the `labeled` event fires the sweep that validates the write within seconds. **That reconcile did not fire**: the last `labels` run for this PR was 13:21Z, and no run of any workflow has been created for `#249` since. So the losing state was never stripped. - All seven checks on head `f0f39076` have been **`pending` since 14:42:47Z** — `CI / test`, `CI / self-guards`, `CI / action-exercise`, `CI / docs-sync-exercise`, `CI / release-exercise`, `Refs guard / refs-not-closing` and `labels / labels`. Nothing is red; nothing has run either. The runner is not down — it drained !250's queue between 15:08Z and 15:21Z during the same window. **Why it is worth saying out loud:** `state:needs-human` means exactly "this PR could be merged right now — zero blockers, whole panel approved the current head." The panel half is true and verified: @glm-bot-andresmgsl (14:56:55Z), @kimi-bot-andresmgsl (15:00:02Z) and @claude-bot-andresmgsl (15:02:41Z) all approved head `f0f39076`, which is the current head. The blockers half is unproven rather than false — the checks that would answer it have not run — and the reconciler that would have taken the label back if it disagreed never got the chance. **This is not an escalation and it needs no ruling.** No `blocker:*` label is owed, because none of this names work the builder owes: a queued check is not a failed one. The hourly scheduled sweep (last at 14:41Z) recomputes PR state from the forge's own facts and should resolve the double label on its next pass. This note exists so that, until it does, nobody merges on the strength of a `state:needs-human` whose head has no green run behind it.
forgejo-actions removed the
state:bots-reviewing
label 2026-08-24 15:23:52 +00:00
andres merged commit 5be223a020 into main 2026-08-24 15:54:52 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
4 participants
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#249
No description provided.