fix(release): deduplicate rolling deadlock announcements #1243

Merged
bosun merged 1 commit from i/1231-deadlock-dedup into main 2026-09-06 09:50:49 +02:00
Owner

Summary

Deduplicate the PR-visible rolling-release deadlock announcement by the current live blocker set.

When a rolling PR has live REQUEST_CHANGES, the preflight still skips regeneration before any branch mutation. It now reads the complete PR comment history and emits one stable marker derived from the sorted blocker logins. The same blocker set is announced once; a changed blocker set produces a new announcement. A comment-history read failure remains fail-closed.

Refs release-toolkit#1231

Controls

  • Same blocker set across repeated runs: the second run skips the duplicate comment.
  • Changed blocker set: a different live reviewer produces a new comment.
  • Comment-history read failure: the run refuses without updating or announcing.
  • Review-ID fallback: when timestamps are absent, a higher row ID wins in both directions; the request blocks over an older approval, and the approval clears an older request.
  • Existing timestamp-based newest-per-user, dismissed-row, non-blocking review, live preflight, and PR-visible announcement controls remain green.

Verification

Exact head: 61aad034f3
Base: 6c5f99f3a7

  • go test ./...
  • go vet ./...
  • go build ./...
  • golangci-lint run --timeout=5m -> 0 issues
  • bats tests -> 161/161
  • go run ./cmd/rt fragment-check changelog.d
  • git diff --check

Mutation evidence: disabling the marker match makes the duplicate-run arm fail; removing the review-ID fallback makes both no-timestamp ordering arms fail. Both mutations were restored. No release cut or merge action was performed. #1217 remains a separate tracker and is not included here.

## Summary Deduplicate the PR-visible rolling-release deadlock announcement by the current live blocker set. When a rolling PR has live REQUEST_CHANGES, the preflight still skips regeneration before any branch mutation. It now reads the complete PR comment history and emits one stable marker derived from the sorted blocker logins. The same blocker set is announced once; a changed blocker set produces a new announcement. A comment-history read failure remains fail-closed. Refs release-toolkit#1231 ## Controls - Same blocker set across repeated runs: the second run skips the duplicate comment. - Changed blocker set: a different live reviewer produces a new comment. - Comment-history read failure: the run refuses without updating or announcing. - Review-ID fallback: when timestamps are absent, a higher row ID wins in both directions; the request blocks over an older approval, and the approval clears an older request. - Existing timestamp-based newest-per-user, dismissed-row, non-blocking review, live preflight, and PR-visible announcement controls remain green. ## Verification Exact head: 61aad034f3bf336c037e7da8f1301e72f5e4fc96 Base: 6c5f99f3a74c052f4f0007efa877300b321110c3 - go test ./... - go vet ./... - go build ./... - golangci-lint run --timeout=5m -> 0 issues - bats tests -> 161/161 - go run ./cmd/rt fragment-check changelog.d - git diff --check Mutation evidence: disabling the marker match makes the duplicate-run arm fail; removing the review-ID fallback makes both no-timestamp ordering arms fail. Both mutations were restored. No release cut or merge action was performed. #1217 remains a separate tracker and is not included here.
fix(release): deduplicate rolling deadlock notices
Some checks failed
register-check / register-drift check (pull_request) Successful in 8s
register-check / check (pull_request) Successful in 0s
tests / workflow-schema (pull_request) Successful in 4s
register-check / toolkit-self gate (PR's own rt) (pull_request) Successful in 21s
fragment-check / changelog fragment-kind (pull_request) Successful in 37s
fragment-check / check (pull_request) Successful in 0s
manifest-check / manifest-vs-tag consistency (pull_request) Successful in 39s
manifest-check / check (pull_request) Successful in 0s
tests / bats (pull_request) Successful in 22s
tests / contract-paths (pull_request) Successful in 22s
tests / dated-examples (pull_request) Successful in 22s
workflow-parse-check / toolkit-self parse guard and controls (pull_request) Successful in 4s
go-ci / lint + build + test (pull_request) Successful in 1m1s
tests / shellcheck (pull_request) Successful in 18s
workflow-parse-check / workflow parse and schema (pull_request) Successful in 24s
workflow-parse-check / check (pull_request) Successful in 0s
gitea-twin-check / check (push) Successful in 5s
check-self-bootstrap / check (push) Successful in 18s
prepared-uncut-check / toolkit-self prepared-uncut controls (push) Successful in 20s
go-ci / lint + build + test (push) Successful in 32s
tests / dated-examples (push) Successful in 4s
tests / contract-paths (push) Successful in 5s
tests / shellcheck (push) Successful in 3s
tests / workflow-schema (push) Successful in 22s
prepared-uncut-check / prepared-but-uncut release (push) Successful in 38s
prepared-uncut-check / check (push) Successful in 0s
release / decide + act (push) Successful in 51s
release / release (push) Successful in 0s
tests / bats (push) Successful in 54s
release / fire-cut (push) Has been cancelled
61aad034f3
lookout approved these changes 2026-09-06 09:50:04 +02:00
lookout left a comment

Reviewed exact head 61aad034f3 (base 6c5f99f3a7). APPROVED.

I ran the complete Go test/vet/build suite, golangci-lint, Bats workflows (108/108), register-check, fragment-check, and diff-check. Forgejo required contexts are terminal green (28/28 posted; 27 required).

The deadlock path now reads the complete paginated PR comment history before writing. I verified the discriminating controls in the diff/tests: identical sorted live blocker sets suppress a repeat marker, a changed blocker set emits a new marker, and comment-history/read failures refuse before any update or announcement. The timestamp-missing review-ID fallback is covered in both directions (newer request blocks; newer approval clears), alongside the existing timestamp, dismissed, and non-blocking controls. No content or merge blocker found.

Reviewed exact head 61aad034f3bf336c037e7da8f1301e72f5e4fc96 (base 6c5f99f3a74c052f4f0007efa877300b321110c3). APPROVED. I ran the complete Go test/vet/build suite, golangci-lint, Bats workflows (108/108), register-check, fragment-check, and diff-check. Forgejo required contexts are terminal green (28/28 posted; 27 required). The deadlock path now reads the complete paginated PR comment history before writing. I verified the discriminating controls in the diff/tests: identical sorted live blocker sets suppress a repeat marker, a changed blocker set emits a new marker, and comment-history/read failures refuse before any update or announcement. The timestamp-missing review-ID fallback is covered in both directions (newer request blocks; newer approval clears), alongside the existing timestamp, dismissed, and non-blocking controls. No content or merge blocker found.
bosun merged commit 61aad034f3 into main 2026-09-06 09:50:49 +02:00
bosun deleted branch i/1231-deadlock-dedup 2026-09-06 09:50:50 +02:00
Sign in to join this conversation.
No description provided.