fix(553): exclude bot-authored issues from the queue selector #557

Merged
timothy merged 1 commits from issue-553-selector-bot-exclude into main 2026-07-22 18:01:20 +02:00
Owner

Fixes #553.

What

scripts/select-queue.sh ranked Renovate's Dependency Dashboard (#22) as an ordinary priority: low candidate. With the backlog now entirely priority: low (ordered by issue number), #22 sorted to the top and was the first thing the selector proposed to every fresh session — a bot-rewritten status board whose checkboxes are commands to Renovate, not work items. A session that trusts the selector's "DEPS/tiering/ordering are deterministic — trust them" contract would either waste a pickup on it or make the exact undocumented judgment call the script exists to eliminate. (This session hit it live.)

Fix

Drop bot-authored issues in the same jq pass that already drops PRs / in-progress / parked:

| (.user.login // "") as $author
| select(($author == "renovate" or ($author | test("\\[bot\\]$"))) | not)

A bot's actionable output is PRs (already excluded); it never files a human work-item issue, so the whole class is never a pickup. Matches the concrete renovate login plus the GitHub name[bot] convention so a future bot dashboard is excluded too. Documented in the script's header alongside the existing label/PR/dependency exclusions.

Also (kickoff process)

Made "scan for bundle-able siblings after claiming" an explicit kickoff step (new step 4 in docs/handoffs/chicorytv-issue-queue.md) with a third bundle axis — shared label / adjacent subject — so a session sweeps small independent same-label issues together instead of one at a time. This PR's own bundle (#553 + #512, two ci-cd tooling-hygiene fixes) is the worked example.

Verification

  • bash -n + shellcheck clean.
  • Ran the patched selector: #22 is absent; genuine backlog issues (#74, #248, #297, #381, #392, #414, …) still rank.
  • Confirmed #22 is the only bot-authored open issue (grouped all 36 open issues by author → only renovate → [22]), so nothing legitimate is dropped.
  • Cold independent adversarial review: VERDICT: MERGEABLE (jq null-guard/regex/placement/pagination/doc-renumber all verified).

Done-when

  • scripts/select-queue.sh no longer ranks #22 (or any future bot-authored dashboard) as a candidate
  • The exclusion is documented in the script's header comment alongside the existing label/PR/dependency exclusions
  • Verified by running the selector and confirming #22 is absent while genuine backlog issues still rank
  • Adversarial review passed, with Review-verdict: referencing the PR's current head sha

Docs-only/tooling change — no .cs, no API, no web build, no migration.

🤖 Generated with Claude Code

Fixes #553. ## What `scripts/select-queue.sh` ranked Renovate's **Dependency Dashboard (#22)** as an ordinary `priority: low` candidate. With the backlog now entirely `priority: low` (ordered by issue number), #22 sorted to the **top** and was the first thing the selector proposed to every fresh session — a bot-rewritten status board whose checkboxes are commands to Renovate, not work items. A session that trusts the selector's "DEPS/tiering/ordering are deterministic — trust them" contract would either waste a pickup on it or make the exact undocumented judgment call the script exists to eliminate. (This session hit it live.) ## Fix Drop bot-authored issues in the same jq pass that already drops PRs / `in-progress` / `parked`: ```jq | (.user.login // "") as $author | select(($author == "renovate" or ($author | test("\\[bot\\]$"))) | not) ``` A bot's actionable output is PRs (already excluded); it never files a human work-item issue, so the whole class is never a pickup. Matches the concrete `renovate` login plus the GitHub `name[bot]` convention so a future bot dashboard is excluded too. Documented in the script's header alongside the existing label/PR/dependency exclusions. ## Also (kickoff process) Made **"scan for bundle-able siblings after claiming"** an explicit kickoff step (new **step 4** in `docs/handoffs/chicorytv-issue-queue.md`) with a third bundle axis — **shared label / adjacent subject** — so a session sweeps small independent same-label issues together instead of one at a time. This PR's own bundle (#553 + #512, two `ci-cd` tooling-hygiene fixes) is the worked example. ## Verification - `bash -n` + `shellcheck` clean. - Ran the patched selector: **#22 is absent**; genuine backlog issues (#74, #248, #297, #381, #392, #414, …) still rank. - Confirmed #22 is the **only** bot-authored open issue (grouped all 36 open issues by author → only `renovate → [22]`), so nothing legitimate is dropped. - Cold independent adversarial review: **VERDICT: MERGEABLE** (jq null-guard/regex/placement/pagination/doc-renumber all verified). ## Done-when - [x] `scripts/select-queue.sh` no longer ranks #22 (or any future bot-authored dashboard) as a candidate - [x] The exclusion is documented in the script's header comment alongside the existing label/PR/dependency exclusions - [x] Verified by running the selector and confirming #22 is absent while genuine backlog issues still rank - [ ] Adversarial review passed, with `Review-verdict:` referencing the PR's current head sha Docs-only/tooling change — no `.cs`, no API, no web build, no migration. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
timothy added 1 commit 2026-07-22 17:04:12 +02:00
fix(553): exclude bot-authored issues from the queue selector
PR Gates / CI image pin matches docker/ci (pull_request) Successful in 30s
PR Gates / Docs update reminder (pull_request) Successful in 55s
PR Gates / decisions lifecycle (pull_request) Successful in 58s
Build ErsatzTV Image / API docs in sync (OpenAPI + endpoint index) (pull_request) Successful in 1m27s
Build ErsatzTV Image / Formatting (changed .cs conform to .editorconfig) (pull_request) Successful in 16s
Build ErsatzTV Image / Build & test (.NET) (pull_request) Successful in 7m40s
Build ErsatzTV Image / EF migration integrity (SQLite + MySql) (pull_request) Successful in 6m42s
Build ErsatzTV Image / Build & push image (amd64) (pull_request) Has been skipped
Build ErsatzTV Image / Functional E2E (curl contracts) (pull_request) Successful in 16m34s
6208d66864
scripts/select-queue.sh ranked Renovate's Dependency Dashboard (#22) as an
ordinary `priority: low` candidate. With an all-low backlog ordered by issue
number, #22 sorted to the top and was proposed to every fresh session — a bot-
rewritten status board whose checkboxes are commands to Renovate, not work
items. A session trusting the selector's "trust the ordering" contract would
either waste a pickup or make the exact undocumented judgment call the script
exists to eliminate (this session hit it live).

Drop bot-authored issues in the same jq pass that drops PRs/in-progress/parked:
match login `renovate` plus the GitHub `name[bot]` convention so a future bot
dashboard is excluded too. A bot's actionable output is PRs (already excluded);
it never files a human work-item issue, so the whole class is never a pickup.

Also make "scan for bundle-able siblings after claiming" an explicit kickoff
step (new step 4) with a third bundle axis — shared label / adjacent subject —
so a session sweeps small independent same-label issues together (e.g. this
change's own #553 + #512 ci-cd hygiene bundle) instead of closing one at a time.

Verified: selector no longer lists #22; genuine backlog issues still rank; the
only bot-authored open issue is #22. shellcheck clean.

Fixes #553

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author
Owner

Cold, independent adversarial review (fresh-context reviewer, review-only brief) ran every check: .user.login present in the live payload; // "" null-guard verified (no null.login throw); \[bot\]$ regex survives the single-quoted-bash → jq passthrough; filter placement references nothing undefined and doesn't touch pagination (loop breaks on the raw pre-filter batch count); regression PASS (#22 absent, #74/#248/#297/#381/#392/#414 still rank; #22 confirmed the sole bot-authored open issue); bash -n + shellcheck clean; doc renumber clean 1..7 with the one back-reference correct. No findings above NIT.

Review-verdict: MERGEABLE @ 6208d668

Cold, independent adversarial review (fresh-context reviewer, review-only brief) ran every check: `.user.login` present in the live payload; `// ""` null-guard verified (no `null.login` throw); `\[bot\]$` regex survives the single-quoted-bash → jq passthrough; filter placement references nothing undefined and doesn't touch pagination (loop breaks on the raw pre-filter batch count); regression PASS (#22 absent, #74/#248/#297/#381/#392/#414 still rank; #22 confirmed the sole bot-authored open issue); `bash -n` + `shellcheck` clean; doc renumber clean 1..7 with the one back-reference correct. No findings above NIT. Review-verdict: MERGEABLE @ 6208d668
Author
Owner

⚠️ CI reds on this PR are infra, not code — the runner host hit No space left on device during the build step (EF migration + Functional E2E both failed inside dotnet build … Release, never reaching real assertions). Tracked in server-management#654. Build & test (.NET) already went green here on 6208d66. Merge is pending a clean rerun once the runner-host capacity issue is resolved — no code change needed.

⚠️ CI reds on this PR are **infra, not code** — the runner host hit `No space left on device` during the build step (EF migration + Functional E2E both failed inside `dotnet build … Release`, never reaching real assertions). Tracked in **server-management#654**. `Build & test (.NET)` already went green here on `6208d66`. Merge is pending a clean rerun once the runner-host capacity issue is resolved — no code change needed.
timothy merged commit 869253cd83 into main 2026-07-22 18:01:20 +02:00
timothy deleted branch issue-553-selector-bot-exclude 2026-07-22 18:01:23 +02:00
Sign in to join this conversation.