From 02487b4490b195c91752ba7a2d78e6d6849e1e8f Mon Sep 17 00:00:00 2001 From: Seongho Bae Date: Sat, 29 Aug 2026 16:30:06 +0900 Subject: [PATCH] fix(automation): cover the full BandScope review queue --- .../workflows/bandscope-hourly-review-repair.yml | 4 +++- CHANGELOG.md | 4 ++++ docs/doctoring/bandscope-hourly-review-caller.md | 13 ++++++++----- tests/test_bandscope_hourly_review_caller.py | 2 +- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/.github/workflows/bandscope-hourly-review-repair.yml b/.github/workflows/bandscope-hourly-review-repair.yml index 78e5276ec2..c7e5fc73b9 100644 --- a/.github/workflows/bandscope-hourly-review-repair.yml +++ b/.github/workflows/bandscope-hourly-review-repair.yml @@ -22,7 +22,9 @@ jobs: with: target_repository: ContextualWisdomLab/bandscope base_branch: develop - max_prs: "50" + # The scheduler enumerates oldest-first; cover the current full queue so + # older draft PRs cannot hide newer non-draft work from the heartbeat. + max_prs: "200" max_dispatches: "1" # Music, browser, Rust, and NVIDIA-backed review work can exceed one hour. retry_hours: "2" diff --git a/CHANGELOG.md b/CHANGELOG.md index e9717d09a9..a02edde446 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,10 @@ this file. The format follows Keep a Changelog, and versioned releases follow Semantic Versioning where the repository publishes a release. ## [Unreleased] +- Raise the BandScope hourly review-repair scan bound to 200 so the + oldest-first scheduler covers the current open queue and does not hide newer + non-draft pull requests behind older drafts; the one-writer and retry bounds + remain unchanged. - Give stacked pull requests a separately bounded organization-sweep OpenCode dispatch budget, so default-branch review traffic cannot leave a stacked PR at `OpenCode review absent` without changing the protected merge diff --git a/docs/doctoring/bandscope-hourly-review-caller.md b/docs/doctoring/bandscope-hourly-review-caller.md index 67c281e2d6..898b67b797 100644 --- a/docs/doctoring/bandscope-hourly-review-caller.md +++ b/docs/doctoring/bandscope-hourly-review-caller.md @@ -21,11 +21,14 @@ without crossing product ownership boundaries. The caller runs at minute 53 of every hour and invokes the sealed central `pr-review-fix-scheduler.yml` with protected base `develop`. Minute 53 avoids the established product-specific heartbeat minutes already present on protected -central `main`. Each heartbeat scans at most 50 open pull requests and dispatches -at most one writer. The two-hour same-head retry floor prevents a later heartbeat -from duplicating a legitimate OpenCode, Strix, Noema, browser, Rust, or -NVIDIA-backed investigation. The non-cancelling concurrency contract preserves -root-cause analysis already in progress. +central `main`. Each heartbeat scans at most 200 open pull requests and dispatches +at most one writer. The scheduler enumerates oldest-first, so the 200-entry bound +covers the current 136-open-PR queue while preventing older draft PRs from hiding +newer non-draft work. If the queue approaches that bound, operators must raise it +deliberately and recheck the bounded runtime. The two-hour same-head retry floor +prevents a later heartbeat from duplicating a legitimate OpenCode, Strix, Noema, +browser, Rust, or NVIDIA-backed investigation. The non-cancelling concurrency +contract preserves root-cause analysis already in progress. A writer may edit only after it establishes the first causal boundary, compares bounded remediation candidates, proves remediation feasibility, verifies writer diff --git a/tests/test_bandscope_hourly_review_caller.py b/tests/test_bandscope_hourly_review_caller.py index 3c8d96cbfb..e868f6e507 100644 --- a/tests/test_bandscope_hourly_review_caller.py +++ b/tests/test_bandscope_hourly_review_caller.py @@ -24,7 +24,7 @@ def test_bandscope_caller_is_hourly_bounded_and_non_cancelling() -> None: assert "uses: ./.github/workflows/pr-review-fix-scheduler.yml" in caller assert "target_repository: ContextualWisdomLab/bandscope" in caller assert "base_branch: develop" in caller - assert 'max_prs: "50"' in caller + assert 'max_prs: "200"' in caller assert 'max_dispatches: "1"' in caller assert 'retry_hours: "2"' in caller