You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Actions queue saturation: 120 open PRs + self-amplifying scheduler block all org merges (pg-erd-cloud: 0 merges since 2026-08-20) #1531
ContextualWisdomLab/pg-erd-cloud has merged nothing to main since 2026-08-20 (~50 PRs piled up). Every new PR fails the required opencode-review check. Same pattern is expected across other org repos that use the central required workflows.
Root cause (investigated 2026-09-01)
Required check opencode-review (.github/workflows/opencode-review.yml) dispatches repository_dispatch{merge-scheduler} then polls pulls/<n>/reviews for an opencode-agent[bot] head-SHA verdict for 90 min (for attempt in $(seq 1 180); sleep 30, timeout-minutes: 100), else fails closed.
The verdict never arrives in time because the org Actions queue is saturated: ~148 queued runs vs ~6 in_progress, and growing tick over tick.
Queue load, last ~24h (800-run sample):
pr-review-merge-scheduler.yml — 166 runs/day (self-triggers on push + every pull_request_target + every pull_request_review + workflow_run completion + */15 & */30 crons + repository_dispatch)
noema-review.yml — 87/day
strix.yml 39, plus osv/security/secret/scorecard/sbom/semgrep/python-security/codeql/close-empty at ~30/day each
The per-PR scan load is multiplied by ~120 open PRs in this repo (98 @seonghobae, 11 @cursor, 10 dependabot), oldest feat(coverage): add bounded PyO3 peer-evidence gate #789 from 2026-08-05. Many are month-old automation self-repair PRs that never merged; each new push re-runs ~10 scans. Self-amplifying.
~190 of 337 registered workflows are one-shot apply-pr*/finalize-pr*/one-shot-*/repair-pr*/export-pr* for long-closed PRs (608, 676, 759, 767, 782, 785, 787, 797, 952…). Most are dormant (no runs in 3 days) — orphaned registrations whose files are gone from main — so they are cleanup debt, not active load, exceptrepair-pr827 above.
Actions taken this pass (safe, reversible)
Disabledrepair-pr827-coderabbit-comments.yml (gh workflow disable 334949216) — closed PR, fired+skipped on every repo PR event.
Decisions needed from a maintainer (not safe to do autonomously)
Triage the ~120 open PRs. Most are @seonghobae automation-repair PRs; closing/rebasing the superseded ones removes the bulk of the per-PR scan load. An autonomous agent should not mass-close a human's PRs.
Whether to reduce pr-review-merge-scheduler.yml cron cadence (*/15 org-sweep → */30 or hourly) during the incident.
Whether to raise/relax the 90-min opencode-review poll ceiling or make it retry-on-rerun instead of fail-closed, so transient queue backlog doesn't block every repo.
Delete the ~189 dormant one-shot workflow registrations.
Workaround for downstream repos meanwhile
Re-run the failed opencode-review check after the queue drains; PRs with all other required checks green will pass once opencode-agent[bot] posts a current-head verdict.
Filed by the pg-erd-cloud autonomous review/merge loop.
Additional finding: opencode-review-dispatch.yml also fails independently of the queue (stale head_sha TOCTOU)
Recent opencode-review-dispatch runs that do execute still end in failure at the validate-pr-metadata job:
##[error]repository_dispatch metadata does not match the live pull request: head_sha.
supplied_head=feat/.../5e34896… live_head=feat/.../5ff9317…
The merge-scheduler dispatch captures head_sha at dispatch time; the validate job then sits in the backlog long enough for the PR head to advance, so the exact-match check rejects it → no verdict → downstream opencode-review fails closed. The queue delay causes the mismatch, so the busiest PRs are the most likely to never get a verdict.
Suggested fix: when supplied_head_sha != live_head_sha but the target/PR is authorized, the base matches, and the PR is open, proceed with the re-fetched live head_sha (a review gate should always evaluate the current head) instead of exit 1. Keep the exact-match rejection for base repo / PR number / actor / allowlist.
Landed the head_sha fix as #1533 (merged to main, admin). validate-pr-metadata no longer fails closed when the PR head advances between merge-scheduler dispatch and the validate job — it now proceeds on the re-fetched live head (downstream jobs already re-check with STALE_HEAD guards). This removes root cause #2. Root cause #1 (Actions queue depth ~193, driven by ~120 open PRs here × per-PR scans + pr-review-merge-scheduler.yml at 166 runs/day) still needs a maintainer decision on triaging the PR pile.
Before dispatch/enqueue, deduplicate on (workflow, target_repository, PR, exact current head) and refuse a second pending/queued equivalent.
Sweep queued runs whose PR is closed or whose requested head is no longer the live PR head; cancel only after re-fetching the encoded repository/PR/head identity.
Keep at most one durable scheduler wake-up per target/head; a cancelled or superseded model scan must be re-enqueued fairly without multiplying scheduler runs.
Add a fixture containing an open-current run, a predecessor-head run, a closed-PR run, and two duplicate scheduler runs; RED must prove the current implementation retains/multiplies the latter three, GREEN must preserve only the open-current run and one scheduler wake-up.
Report terminal cancellation/dedup evidence separately from review verdict evidence; do not convert cancellation or queue cleanup into a passing semantic review.
Protected main is 1186a9f4e5eda7683b23ae63d2c806831743432a; current queue depth increased despite #1533, so its head-advance repair did not address this stale-run lifecycle defect.
The associated repair driver/self-test remain for a separate bounded hollow-path cleanup after its fixture contract is rewritten; this keeps the queue-reduction change minimal and avoids breaking 100%-coverage policy in the same patch.
Fresh main inspection also confirms the central scheduler still has both */30 and */15 schedules plus push/review/workflow_run/repository_dispatch wakeups. That broader amplification remains open in this incident; it should be reduced only with the pinned org-queue-sweep contract/docs/tests changed together rather than by an unreviewed cron-only edit.
This issue should remain open until #1539 is integrated and the scheduler-trigger/queue-capacity causal chain is reduced with exact-head hosted evidence. No bypass, force push, synthetic status, or predecessor evidence transfer was used.
fix(ci): repair main's stale review-dispatch blob pin and security-boundary test #1536 is the immediate protected-main red-suite repair. Exact head 5cba0ccf57b043ba39f46912bf532cd945ea916d is mechanically mergeable and both Devin threads are resolved; current security workflows are queued, so merge waits for exact-head evidence while other work continues.
fix(noema): don't treat a deleted file's expected head-content 404 as a review-blocking error #1524 is the canonical Noema deletion-context repair needed so dead-code/workflow deletion PRs are reviewed from base-side content rather than falsely blocked by expected HEAD 404s. A Ready-for-review mutation was attempted, but the GitHub connector itself failed on an invalid GraphQL field (Repository.fullDatabaseId); that external tooling defect is not being converted into a repository-policy bypass. An exact-head OpenCode re-review was requested.
Remaining causal queue work after these land: measure the contribution of the dual */15 + */30 scheduler heartbeats and event-trigger amplification, then change cadence only with the corresponding workflow-contract/doctoring updates and without weakening fail-closed review/merge evidence.
#1533 (head-advance TOCTOU fix) was reverted in #1540. Automated review (Codex P1×3 / P2, Devin) showed it was incomplete:
Left tests/test_opencode_agent_contract.py:2663 red (still asserts the removed exact-head check).
Draft-review path: active_draft_review_request() uses the exact-head artifact as sole authorization; adopting the live head without revalidating the draft marker for the new head can publish a review for an unrequested draft commit.
run-name still ends @A after adopting head B; active_review_run_refs() + dispatch_opencode_review() then classify the run stale and force-cancel it before it produces a verdict — defeating the fix.
Empty/malformed pr_head_sha now validated (warning skipped when empty).
Handing the head-advance fix to whoever owns the scheduler run-identity / queued-run lifecycle work (the #1531 dedup/sweep contract, #1532, #1539): the adopted live head must be reflected in run-ownership identity, SUPPLIED_HEAD_SHA must stay a required 40-char SHA, draft PRs must revalidate the request marker, and the contract test moves with it. The .Jules/.jules and pr827-disable items from earlier ticks stand; I'm stepping back from .github to avoid colliding with the in-flight control-plane work and will focus on downstream product repos.
A five-page queued-run enumeration observed 433 queued runs (the point-in-time total was 429 immediately before this write, confirming the queue is moving rather than terminal-clean).
The lifecycle defect reproduced on a PR closed during this maintenance pass:
The same enumeration still contained closed #1540 and reverted #1533 review runs, while the oldest queued run remained 32214648177, created 2026-08-19T04:08:23Z.
Current dominant backlog: merge scheduler 81; OSV/Python/Secret/CodeQL 30 each; Scorecard/SBOM 29 each; Security/SAST/Close Empty 28 each. This is a concrete RED for admission-time suppression plus durable closed/stale cancellation; merely adding another sweep job is insufficient if closing a PR itself enqueues three more runs.
Fresh 2026-09-01 revalidation after protected main moved to 7b1a028e704a98ae8a807bb827f44aeaee0399af: #1540 reverted #1533, so the earlier incident comment claiming the dispatch head_sha relaxation is landed is no longer current. Do not build queue recovery on that reverted behavior. The safer current owner for the review-lifecycle part is #1508 at exact head c86911a6301ef25737ae220c67b60c136381caee: it removes Noema's workflow_run trigger entirely, keeps pull-request/repository-dispatch PR identity in one concurrency group, cancels in-progress Noema only for synchronize/closed, revalidates the exact expected head before inference and again before publication, and adds exact-head/paginated stale-worker cleanup for OpenCode/autofix plus obsolete Strix-run cleanup. This directly addresses both the observed same-head Noema cancellations and unnecessary workflow-run wakeups without relaxing evidence. #1508 is currently mergeable but required exact-head evidence is still non-passing: its protected-main Noema check was cancelled under the very current-main concurrency policy it replaces, and there is no qualifying current-head approval yet. I requested fresh OpenCode and Noema reviews on c86911a...; no bypass or predecessor evidence is being used. #1539 remains the focused PR827 workflow retirement. The incident remains open until these control-plane fixes land through normal governance and a fresh queue snapshot demonstrates stale/duplicate backlog falling rather than merely shifting.
2026-09-01 current-main convergence update after protected main@9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfec landed #1507:
The old 120-second Noema model-response diagnosis is no longer current. Protected main now sets NOEMA_LLM_TIMEOUT_SECONDS = 4 * 60 * 60 and uses that finite 14,400-second response budget, while retaining exact-head rechecks and malformed-output fail-closed behavior. This meets the product requirement to tolerate multi-hour review without making inference lifetime unbounded.
fix(noema): fail closed on malformed LLM JSON instead of crashing #1507 also landed substantial Noema closed-PR Actions cleanup, long OpenCode verdict polling, repair-retry exact-head checks, and scheduler lifecycle work. Do not replace these with older echo-only or unbounded experimental branches.
fix(noema): preserve long-running substantive reviews #1508 has therefore been closed unmerged as a diverged/superseded multi-owner branch (31 ahead / 1 behind, 27 files versus the new main). Its historically valid findings remain evidence, but no predecessor checks/reviews transfer.
Residual live queue work remains real: current noema-review.yml still listens to both Required OpenCode Review and Strix workflow_run completions, so completion-driven wakeups still contribute review-lane traffic. Any focused current-main repair must preserve the newly landed cross-repository cancel-closed-pr-runs, exact-head publication, and the finite 4-hour model budget rather than broadly deleting lifecycle bounds.
Next causal order: (1) land #1539 through normal exact-head evidence; (2) port #1524 deletion-context handling onto current main; (3) reduce remaining completion-trigger/self-amplifying wakeups with a focused queue contract that preserves current-main lifecycle/security controls. Pending/queued evidence remains non-passing.
2026-09-01 current-main update: protected main is now 2436454e3a969a282b5edc7303a485ccd37c3e9f (PR #1499 merged). The active queue/recovery owner is #1541: it now dispatches bounded RCA directly from exact-head terminal failed checks, deduplicates rerun attempts, paginates status rollups, treats ACTION_REQUIRED as an authorization wait rather than a source failure, excludes OpenCode/control-plane contexts, fault-isolates per-PR pagination, and preserves REST workflow identity. Its latest Strix REST-fallback review defect was repaired at branch head 5ecd9291e78174762e343ac2a314b5a093395a49; all review threads are currently resolved, but hosted PR workflows on that bot-authored head are action_required with zero jobs and remain non-passing.
The obsolete PR #827 workflow still exists on protected main. Stale #1539 was closed and replaced by current-main successor #1544, exact base 2436454e..., head 4c009426710170935a9e7ea27b18670d35b5fb8b, deleting only .github/workflows/repair-pr827-coderabbit-comments.yml (-105 lines). Its exact-head security lanes are queued and OpenCode review has been requested; no predecessor evidence transfers.
This narrows the next queue work after #1541/#1544: reduce duplicate scheduler wakeups and stale queued-run lifetime using exact (repository, PR, head, evidence lane) identity, rather than treating action_required, control-plane failures, or old reruns as source RCA. No gate weakening or bypass is proposed.
2026-09-01 follow-up after integration: #1541 is now merged on protected main@44a3c740f7c46c06e7500174d4127413f3f581eb. Direct failed-check RCA is therefore live on main: latest-attempt/paginated exact-head terminal failed checks can dispatch bounded repair; ACTION_REQUIRED remains an authorization wait; OpenCode/control-plane contexts stay out of source RCA; REST fallback preserves workflow identity and name-only Strix evidence; per-PR pagination failures are isolated; conflict handling precedes RCA. The merge itself was performed externally with the repository's owner-authorized bypass path while broad hosted lanes were still queued; this loop did not use bypass and does not treat those queued lanes as passing evidence.
Queue-reduction work continues separately: current-main #1544 removes the obsolete PR #827 event-driven repair workflow and is being expanded to delete its now-orphaned repair driver/synthetic fixture; #1443 remains the owner for suppressing automatic OpenCode review work on draft PRs while preserving live-state/head/base validation. New #1546 is the current exact-head reconciliation lane for unbounded Noema/OpenCode/Strix review work and is being repaired for five current review defects, including avoiding scheduler dispatch when an exact-head OpenCode verdict already exists. These are complementary to #1541 rather than replacements.
2026-09-01 exact-head queue escalation after #834 owner repair
Fresh pre-write authority: protected main@44a3c740f7c46c06e7500174d4127413f3f581eb; #834 is current-base aligned and mergeable at exact head 6171e135412f6e9a561d74c778c7b4a2dc1d1e3b, with zero unresolved threads and no current-head approval.
The repository currently reports 638 queued runs. The oldest observed queued run is still 32214648177, created 2026-08-19T04:08:23Z.
fix(noema): validate stable OIDC exchange envelope #834's exact-head inventory is 33 checks: 6 success, 15 queued, 12 skipped. Strix changed-path quality completed successfully and ran the full suite (2,228 passed · 1 skipped · 21 subtests), but queued Security/SAST/CodeQL/Python/OSV/Secret/Scorecard/SBOM plus queued Required OpenCode/Noema remain non-passing; the cancelled Strix Security run is likewise non-passing.
This directly blocks integration of the protected-main Noema OIDC consumer repair; predecessor, skipped, cancelled, or status-only evidence cannot be transferred.
Queue recovery acceptance remains lifecycle cancellation and deduplication for stale/closed heads while preserving exact-head binding and regenerating every required gate for the unchanged live head.
현재 보호된 중앙 기준은 main@51b812d181989ed28366b5850d1a34f51df10187이며 .github 저장소 하나에만 queued run이 1,544개입니다. 이 상태에서는 새 자동 PR·새 wake-up을 추가하는 행동 자체가 결함 증폭입니다.
가용한 다른 로컬 세션은 다음을 맡아 주세요.
Jules/Bolt 자동 생성원별로 최근 24시간 created PR 수 / merged 수 / closed-with-successor 수 / unresolved valid delta 수를 계산하고, 기존 owner PR이 있으면 새 PR 생성 대신 그 PR의 non-force update를 기본값으로 바꾸는 admission rule을 구현하십시오.
.github#1661처럼 한 PR이 122 commits·21 files로 커진 경우에도 유효 delta를 폐기하지 말고 focused successor stack으로 나누십시오. 첫 successor는 Noema concurrency와 runner-release만 소유하고, 문서·SSRF·hourly NIM·scheduler 변경은 별도 owner stack으로 이관하십시오.
pr-review-merge-scheduler의 동일 PR 다중 wake-up을 (workflow, repository, PR, current live head, reconciliation generation) 기준으로 coalesce하십시오. review 제출, OpenCode/Strix 완료, schedule이 같은 live 상태를 가리키면 추가 runner job이 아니라 하나의 durable reconcile 요청을 갱신하도록 설계하십시오.
새 PR 또는 새 workflow를 만들기 전에 .github#712의 lane owner에게 설계 피드백을 요청하고, 응답을 받은 뒤 RED fixture와 acceptance를 보정하십시오. 완료 후 다음 비충돌 lane을 요청하십시오.
반드시 현재 queue 합계와 자동 PR 생성률을 before/after로 남기십시오. 대량 Close, leaf scanner 비활성화, no-op commit 재트리거, 문서만 추가하는 것으로 완료 처리하지 마십시오. successor가 유효 delta와 리뷰 finding을 완전 승계해야 합니다.
기다리는 동안 다른 로컬 세션에게 지속적으로 지시 받아 도우세요. 계속 묻고 계속 피드백하고 계속 지원하세요. 더 주도적이고 더 적극적으로요.
이 lane의 성공 조건은 단순히 한 번 적체가 감소하는 것이 아니라, 새 work 생성률이 merge·repair 처리율 아래로 내려가고 동일 PR·동일 current state의 중복 run/PR이 다시 늘지 않는 것입니다.
Fresh ConceptWeave owner-path reproduction separates current review-continuation provenance from leaf source and from runner acquisition.
ContextualWisdomLab/ConceptWeave#1@bba351b77bf5f1ab5cfd55979fbb2bd158f78b81 Required OpenCode run 33527145720, attempt 1, job 100426495473 acquired GitHub-hosted runner 1001638434, passed required-workflow admission/coverage, and its Request OpenCode review job step succeeded. No opencode-agent formal review materialized. The exact-head verdict waiter then occupied the runner from 2026-09-03T10:22:37Z until GitHub cancellation at 2026-09-03T16:17:30Z (~5h55m). This is central review continuation/runtime evidence, not a ConceptWeave source finding and not runner-acquisition starvation.
Protected .github/main@72f63c9e32194512fd5358ba4bff6ac4365be8d7 now includes the merged #1707 contract: opencode-review.yml fails closed after 180 minutes (poll_deadline_epoch += 10800) and releases the runner. A single bounded rerun of the historical ConceptWeave run was attempted after central source changed, but attempt 2 proves why old-run reruns are not current-source acceptance: opencode-review job 100733416054 is queued on ubuntu-24.04, while replayed bootstrap/coverage jobs retain predecessor ubuntu-latest selectors; current protected opencode-review.yml contains no ubuntu-latest selector. Do not repeatedly rerun this historical run and do not require a no-op leaf push/draft toggle solely to retrigger.
Owner acceptance for this class should require a legitimately fresh required-workflow materialization on the unchanged leaf head, bound to the then-current protected central workflow identity, runner assignment + exact-head admission, successful review dispatch, and an actual current-head opencode-agent formal review before the bounded waiter expires. A replay of a predecessor required-workflow revision is diagnostic evidence only, never GREEN.
The required job successfully obtained GitHub OIDC, exchanged the repository-scoped App token and dispatched the central merge-scheduler request. It then polled the Reviews API for an exact-head opencode-agentAPPROVED or CHANGES_REQUESTED verdict. No qualifying verdict arrived during the full fail-closed polling window, so the check terminated failure with No APPROVED or CHANGES_REQUESTED from opencode-agent on the current head.
This is not a Naruon source finding. The consumer PR has been returned to Draft rather than receiving a dummy commit, bypass, synthetic status or predecessor review. A valid recovery requires a fresh exact-head review dispatch through current protected central workflow truth after the owner-side queue/dispatch path is healthy.
TEPP measurement: the scheduler is not the queue driver here
Measured on ContextualWisdomLab/TEPP at origin/main (a243f18d) on 2026-09-15, via gh api repos/ContextualWisdomLab/TEPP/actions/runs.
Queued runs by trigger event, right now:
Event
Queued
pull_request
125
schedule
0
push
0
workflow_dispatch
0
Every queued run in TEPP is pull-request-triggered. Nothing in the backlog comes from a scheduled workflow.
Why zero: TEPP already carries no schedule trigger in any workflow. git grep -l 'schedule:' origin/main -- .github/workflows returns 0 files. The last one was removed by #490 when hourly development admission moved to the central coordinator. The historical count of 795 schedule runs is entirely pre-#490.
Lifetime run counts for context: pull_request 16377, schedule 795, push 463, workflow_dispatch 18. Pull-request events are roughly 93% of all runs TEPP has ever produced, and 100% of what is queued.
Implication for this issue
The title attributes saturation to "120 open PRs + self-amplifying scheduler". For TEPP the first half holds and the second does not. TEPP currently has 100+ open PRs, each fanning out to roughly ten required checks. Removing or centralising more schedules will not move this backlog, because the schedule contribution is already zero. Draining open PRs, or reducing per-PR check fan-out, is the lever that applies.
I am not asserting this generalises to the other org repositories. It is one repository's measurement, offered so that scheduler-side work is not sized against TEPP's share of the queue.
Related repair
#490 removed TEPP's local schedule trigger but left the paired contract test asserting cron: "47 * * * *", so TEPP's shared Python branch-coverage job has failed on every main-based branch since that merge. Repaired in ContextualWisdomLab/TEPP#517, which realigns the assertion to the property #490 actually established: absence of a local schedule trigger, with the central coordinator owning cadence via workflow_dispatch. No workflow behaviour changes.
That coupling shape is worth noting for other repositories: a contract test asserting a literal cron string breaks the moment central admission removes the local schedule. TEPP now has zero literal cron assertions remaining.
Second repository measured, same conclusion as the TEPP comment above — and a correction to a hypothesis I stated to another session earlier.
ContextualWisdomLab/contextual-orchestrator, measured 2026-09-15 by event type:
event
queued now
cumulative
pull_request
6
25,261
pull_request_target
6
—
schedule
2
271
push
0
854
workflow_dispatch
0
—
repository_dispatch
0
0
queued total (all events)
15
—
Pull-request events are 12 of 15 queued runs and about 96% of cumulative runs; schedule is 2 queued and roughly 1% cumulative. I had suggested to another session that this repository's hourly loop contributes meaningfully to the pressure. That was a hypothesis and the measurement does not support it: retiring hourly schedules here would remove 2 of 15 queued runs and change nothing about the backlog.
The lever is the same one the TEPP evidence points at: open-PR count and per-PR check fan-out. Note this repository's own local queue is 15 while the organization-wide queued total was 228-230 when I sampled it yesterday, so saturation is cross-repository and no single repository's schedules explain it.
One consequence worth recording here, because it makes the backlog self-sustaining for review-gated repositories: a verdict comment posted today can describe a run created long before a since-merged repair. Concretely, ContextualWisdomLab/.github run 34784851740 was created 2026-09-13T21:47:07Z and its coverage-evidence job still shows the pre-repair locked VCS source fast-mlsirm has a missing or ambiguous import root failure; the repair (#2123) merged at 23:37:49Z, and the resulting COVERAGE_BLOCKED comment landed on contextual-orchestrator#1177 at 2026-09-14T09:25Z, about 11.5 hours after its run started. PRs cannot merge without a current verdict, verdicts arrive stale, so open PRs accumulate and add fan-out. Anyone reading a verdict during the backlog should compare the dispatch run's created_at against the relevant repair merge time before treating it as a regression.
Repeating the cancellation measurement in ContextualWisdomLab/contextual-orchestrator, the same one that localised TEPP's waste to a single draft branch. The pattern reproduces here, but the cause is different, and the largest contributor is my own session.
Measured 2026-09-14T19:12Z, last 100 completed runs:
Half of all recently completed runs were cancelled, and 27 of those 50 belong to one branch I own. So the mechanism the TEPP evidence identified — superseded runs discarded because a head moves faster than CI drains — holds here too.
The difference matters for the fix. PR #1188 is not a draft, so a draft guard would not have covered it. Its head moved four times in about three hours (cc09e6f0 03:28Z, ac63794c 04:01Z, 50b0fec9 06:14Z, cceef95f 06:26Z) because I pushed each reviewed unit as it completed. Every push cancelled the prior run's work. Nothing could merge during that window anyway: the verdict queue was backed up, and the verdict that did arrive described a run created before the repair it was meant to validate (noted in my earlier comment).
So there are two distinct sources of discarded runner time, and they need different remedies:
Draft iteration — a draft head moving repeatedly. TEPP#523's draft guard addresses this, and it is sound: a draft cannot merge, and every job re-runs on the head that actually will.
Ready-PR iteration while the queue is drained slower than heads move — not covered by a draft guard. The remedy is on the author side: when nothing can merge because verdicts are backlogged, batch follow-up commits and push once instead of pushing per unit. I am adopting that in this session; it costs nothing, since each intermediate head was unmergeable regardless.
Timestamp note: my earlier comment in this issue said "measured 2026-09-15". That reading was KST; in UTC it was 2026-09-14, the same day as the TEPP measurements. The numbers and conclusions are unchanged. Using UTC from here on.
Correcting my earlier comment: the lever is not open-PR count
Earlier in this thread I measured TEPP's queue and concluded that draining open PRs, or reducing per-PR check fan-out, was the lever. That was incomplete. I had measured what was queued but not what happened to work that actually ran. Measuring completions changes the conclusion.
All timestamps UTC. My earlier comment dated its measurement 2026-09-15; that was KST. Same day as this one.
Throughput, not capacity
At 2026-09-14T19:07Z, ContextualWisdomLab/TEPP:
Count
Runs in progress
19
Runs queued
241
Conclusions of the 100 most recently completed runs, spanning 14:17Z to 19:06Z:
Conclusion
Runs
cancelled
88
success
10
failure
2
Six minutes later, at 19:13Z, the same query returned 100 cancelled out of 100, with zero successes.
In both windows every single cancellation belonged to one branch, codex/rubin-loading-projection-policy, the draft TEPP#506. The concentration rose rather than stabilised.
Runners are not scarce. From run 34884569907: created 19:03:33Z, jobs started 19:03:35Z, cancelled 19:06:45Z. Work is picked up in two seconds and discarded three minutes in, having occupied four runners. That branch carries 69 commits over about ten hours, with three head commits inside four minutes at one point.
Queued work is spread evenly at nine runs per branch across many branches, so the queue itself is fair. The saturation is not many PRs competing. It is one branch consuming and discarding the throughput.
Two sources, only one fixable in CI
A peer session reproduced this on contextual-orchestrator and found the same waste with a different cause: their largest contributor is not a draft, and its head moved four times in three hours because each finished review slice was pushed immediately. So:
Draft iteration is fixable in configuration, because a draft cannot merge. TEPP#523 guards every job in both repository-local workflows on the PR not being a draft, and adds ready_for_review so the full gate set runs on the exact head that will merge. contextual-orchestrator already had this in security.yml, which is why no draft appears in its cancellation profile.
Ready-for-review iteration is not a configuration defect. Cancelling a superseded run there is correct. It is push cadence, and both repositories have now recorded it as a contract with explicit exemptions for commits that repair a failing required check, resolve a merge-blocking conflict, or answer a waiting reviewer.
Circularity worth recording
TEPP#523 is the fix for the first source, and it is itself queued behind the branch it would neutralise. With recent throughput at zero successes, that does not resolve on its own. I am recording the evidence here rather than acting on it: two measurement windows, rising concentration, two-second pickup against three-minute cancellation, and the per-branch queue distribution. Batching pushes on the affected branch would release the throughput immediately and costs nothing, because no intermediate head on a draft can merge.
I have not modified that branch or any other author's work.
A third source of consumed runner time, distinct from the two already measured here (draft re-push cancellations, ready-PR iteration): a single hung job can hold a runner for hours.
ContextualWisdomLab/contextual-orchestrator PR #1179, noema-review run 34811048383: created 2026-09-14T15:46:01Z, cancelled 2026-09-14T21:46:44Z — six hours on one runner. The log ends at starting review sidecar on 127.0.0.1:18080 with no healthz and provider-route preflight confirmed line and zero provider_attempt entries, so the sidecar never became healthy and no request reached a provider.
For scale, this one job consumed more runner time than the entire cancelled-rerun pattern measured in contextual-orchestrator earlier: 50 cancelled runs there were each a few minutes of work.
Comparable runs on the same pinned revision (767e67fb) that did not hang, for contrast:
So this is a distinct mode, not the free-pool rate-limit path: those fail in minutes. Whatever stalls before healthz has no overall deadline, so the job runs until the platform cancels it.
Recording it here because it changes the shape of the remedy: the cancellation and batching levers reduce how often work is discarded, while this one is about a single job's unbounded occupancy. A per-job timeout on the review lanes would bound it regardless of the underlying cause, and is independent of whatever fix the stall itself needs (tracked for the noema lane in ContextualWisdomLab/contextual-orchestrator#1106).
Direct run readback after 10:00Z: all eight remain status=queued, conclusion=null, run_attempt=1, with updated_at unchanged from creation.
Protected main@64aa08d7… already includes ready_for_review triggers for scheduler/OpenCode/Noema/Strix, and the events did materialize. This is not a missing-trigger/source-definition defect; it is organization Actions admission/capacity saturation.
No rerun, no no-op commit, and no duplicate dispatch was issued.
Canonical runtime owner #2265 documents the org plan ceiling and unbounded Strix occupancy. #2267's higher scheduled dispatch caps must be evaluated against this live saturation so recovery does not amplify the queue before occupancy is bounded.
.github#2110 head b360990b42380169d1bccc9f4b2dc83b7336bc63 created five ordinary pull-request runs at 11:07:01Z:
Repository Metadata Reconcile 35439222407
CodeQL PR 35439222409
Python Security 35439222412
SAST Semgrep 35439222441
Security Scan 35439222460
all five remain queued with no conclusion; their last recorded updates are 11:07:02–11:07:03Z
.github#2124 head e9acd81064408f0c49b72d7a617c747c96f21244 still has four additional pull-request runs 35433647206/212/221/237 queued since 09:03:22–23Z
no duplicate rerun, no-op wake, or consumer-side bypass was attempted
This extends the existing organization runner-capacity finding; source owners remain Draft/Ready according to their code state, and current-head settlement is still fail-closed.
Every exposed job is terminal cancelled and has logs_url=null; there is no source/test failure log to repair. This is the terminal continuation of the prior prolonged queued/capacity evidence, not GREEN settlement. No duplicate rerun or no-op wake was issued.
The metadata PR remains Draft. The sidecar PR retains its earlier same-head GREEN source checks but has no independent current-head approval; the cancelled review-cycle materialization is not treated as approval or fresh settlement.
Fresh readback adds two owner PRs to the same queue/cancellation incident:
.github#2040@ecc9e1d11149ae44ec4f8389e4ac72a08ba45ba7: Security Scan 35436310648, CodeQL PR 35436310711, Trusted uv Materializer Quality CI 35436310573, Python Security 35436310584, Agent Review Runtime Quality CI 35436310634, and SAST Semgrep 35436310640 are all terminal cancelled. The exposed CodeQL jobs are cancelled and provide no source-failure log.
.github#2279@d1e4380c15e948aaf104d46aa134fa614058782a: the first Security/Python Security/CodeQL/SAST batch 35438679364/344/363/346 is terminal cancelled; the current Python Security 35438799959 is pending and CodeQL/SAST/Security/Runtime Quality 35438799890/35438800012/35438799983/35438679390 remain queued.
This is not proof that either source is GREEN. It also gives no leaf defect to patch. No unchanged-head rerun, no-op commit, or bypass was issued. #2040 stays Draft; #2279 remains review-admitted but cannot merge until terminal exact-head evidence exists.
Activity
seonghobae commentedon Aug 31, 2026
Additional finding:
opencode-review-dispatch.ymlalso fails independently of the queue (stalehead_shaTOCTOU)Recent
opencode-review-dispatchruns that do execute still end infailureat thevalidate-pr-metadatajob:The
merge-schedulerdispatch captureshead_shaat dispatch time; the validate job then sits in the backlog long enough for the PR head to advance, so the exact-match check rejects it → no verdict → downstreamopencode-reviewfails closed. The queue delay causes the mismatch, so the busiest PRs are the most likely to never get a verdict.Suggested fix: when
supplied_head_sha != live_head_shabut the target/PR is authorized, the base matches, and the PR is open, proceed with the re-fetched livehead_sha(a review gate should always evaluate the current head) instead ofexit 1. Keep the exact-match rejection for base repo / PR number / actor / allowlist.fix(opencode): proceed on head-only advance in review dispatch valida…
seonghobae commentedon Sep 1, 2026
Landed the
head_shafix as #1533 (merged to main, admin).validate-pr-metadatano longer fails closed when the PR head advances betweenmerge-schedulerdispatch and the validate job — it now proceeds on the re-fetched live head (downstream jobs already re-check with STALE_HEAD guards). This removes root cause #2. Root cause #1 (Actions queue depth ~193, driven by ~120 open PRs here × per-PR scans +pr-review-merge-scheduler.ymlat 166 runs/day) still needs a maintainer decision on triaging the PR pile.seonghobae commentedon Sep 1, 2026
Fresh queue reproduction — stale/closed runs are not being drained (2026-09-01)
A complete three-page read now returns 293 queued runs (API total: 296). This is not only transient capacity pressure:
Required PR Review Merge Scheduler: 52 queued runs.2026-08-19T04:08:23Z— nearly two weeks old.Repair acceptance at the central owner boundary:
(workflow, target_repository, PR, exact current head)and refuse a second pending/queued equivalent.Protected main is
1186a9f4e5eda7683b23ae63d2c806831743432a; current queue depth increased despite #1533, so its head-advance repair did not address this stale-run lifecycle defect.seonghobae commentedon Sep 1, 2026
2026-09-01 control-plane follow-up executed from fresh
mainevidence:awk/pipefailrepair, while its remaining unique rationale preserved the PR fix(coverage): replace stale LLVM runtime-boundary repair #827 one-shot writer workflow.main@1186a9f4e5eda7683b23ae63d2c806831743432a, exact head1548ebff5a883c53fddd388b29f4296d6d1fefc9, deleting.github/workflows/repair-pr827-coderabbit-comments.yml. Fresh fix(coverage): replace stale LLVM runtime-boundary repair #827 state is closed/unmerged; the workflow subscribed to allsynchronize/reopened/ready_for_reviewPR events and filtered fix(coverage): replace stale LLVM runtime-boundary repair #827 only at job time, so unrelated PR activity still allocated skipped runs. chore(ci): retire completed PR 827 source-fix workflow #1539 changes no reviewer, credential, scheduler, provider, or branch-protection semantics.*/30and*/15schedules plus push/review/workflow_run/repository_dispatch wakeups. That broader amplification remains open in this incident; it should be reduced only with the pinned org-queue-sweep contract/docs/tests changed together rather than by an unreviewed cron-only edit.This issue should remain open until #1539 is integrated and the scheduler-trigger/queue-capacity causal chain is reduced with exact-head hosted evidence. No bypass, force push, synthetic status, or predecessor evidence transfer was used.
seonghobae commentedon Sep 1, 2026
2026-09-01 live loop update:
.github/workflows/repair-pr827-coderabbit-comments.yml, the completed PR fix(coverage): replace stale LLVM runtime-boundary repair #827 source-fix workflow that subscribed to everysynchronize/reopened/ready_for_reviewevent and filtered fix(coverage): replace stale LLVM runtime-boundary repair #827 only at job time. Exact head1548ebff5a883c53fddd388b29f4296d6d1fefc9; Devin reports no issues. Hosted security runs are queued, so no merge evidence is being fabricated.5cba0ccf57b043ba39f46912bf532cd945ea916dis mechanically mergeable and both Devin threads are resolved; current security workflows are queued, so merge waits for exact-head evidence while other work continues.Repository.fullDatabaseId); that external tooling defect is not being converted into a repository-policy bypass. An exact-head OpenCode re-review was requested.Remaining causal queue work after these land: measure the contribution of the dual
*/15+*/30scheduler heartbeats and event-trigger amplification, then change cadence only with the corresponding workflow-contract/doctoring updates and without weakening fail-closed review/merge evidence.seonghobae commentedon Sep 1, 2026
#1533 (head-advance TOCTOU fix) was reverted in #1540. Automated review (Codex P1×3 / P2, Devin) showed it was incomplete:
tests/test_opencode_agent_contract.py:2663red (still asserts the removed exact-head check).active_draft_review_request()uses the exact-head artifact as sole authorization; adopting the live head without revalidating the draft marker for the new head can publish a review for an unrequested draft commit.run-namestill ends@Aafter adopting headB;active_review_run_refs()+dispatch_opencode_review()then classify the run stale and force-cancel it before it produces a verdict — defeating the fix.pr_head_shanow validated (warning skipped when empty).Handing the head-advance fix to whoever owns the scheduler run-identity / queued-run lifecycle work (the #1531 dedup/sweep contract, #1532, #1539): the adopted live head must be reflected in run-ownership identity,
SUPPLIED_HEAD_SHAmust stay a required 40-char SHA, draft PRs must revalidate the request marker, and the contract test moves with it. The.Jules/.julesand pr827-disable items from earlier ticks stand; I'm stepping back from.githubto avoid colliding with the in-flight control-plane work and will focus on downstream product repos.fix(noema): raise the review-completion request timeout from 120s to 3h
seonghobae commentedon Sep 1, 2026
Fresh closed-head production RED — 2026-09-01
A five-page queued-run enumeration observed 433 queued runs (the point-in-time total was 429 immediately before this write, confirming the queue is moving rather than terminal-clean).
The lifecycle defect reproduced on a PR closed during this maintenance pass:
2026-09-01T02:06:31Z, exact head5cba0ccf57b043ba39f46912bf532cd945ea916d.2026-09-01T02:06:33Zand remained queued:The same enumeration still contained closed #1540 and reverted #1533 review runs, while the oldest queued run remained 32214648177, created
2026-08-19T04:08:23Z.Current dominant backlog: merge scheduler 81; OSV/Python/Secret/CodeQL 30 each; Scorecard/SBOM 29 each; Security/SAST/Close Empty 28 each. This is a concrete RED for admission-time suppression plus durable closed/stale cancellation; merely adding another sweep job is insufficient if closing a PR itself enqueues three more runs.
seonghobae commentedon Sep 1, 2026
Fresh 2026-09-01 revalidation after protected main moved to
7b1a028e704a98ae8a807bb827f44aeaee0399af: #1540 reverted #1533, so the earlier incident comment claiming the dispatchhead_sharelaxation is landed is no longer current. Do not build queue recovery on that reverted behavior. The safer current owner for the review-lifecycle part is #1508 at exact headc86911a6301ef25737ae220c67b60c136381caee: it removes Noema'sworkflow_runtrigger entirely, keeps pull-request/repository-dispatch PR identity in one concurrency group, cancels in-progress Noema only forsynchronize/closed, revalidates the exact expected head before inference and again before publication, and adds exact-head/paginated stale-worker cleanup for OpenCode/autofix plus obsolete Strix-run cleanup. This directly addresses both the observed same-head Noema cancellations and unnecessary workflow-run wakeups without relaxing evidence. #1508 is currently mergeable but required exact-head evidence is still non-passing: its protected-main Noema check was cancelled under the very current-main concurrency policy it replaces, and there is no qualifying current-head approval yet. I requested fresh OpenCode and Noema reviews onc86911a...; no bypass or predecessor evidence is being used. #1539 remains the focused PR827 workflow retirement. The incident remains open until these control-plane fixes land through normal governance and a fresh queue snapshot demonstrates stale/duplicate backlog falling rather than merely shifting.seonghobae commentedon Sep 1, 2026
2026-09-01 current-main convergence update after protected
main@9b57e4bb95b1a6efe9976a208fe7ca2c0d36dfeclanded #1507:NOEMA_LLM_TIMEOUT_SECONDS = 4 * 60 * 60and uses that finite 14,400-second response budget, while retaining exact-head rechecks and malformed-output fail-closed behavior. This meets the product requirement to tolerate multi-hour review without making inference lifetime unbounded.31 ahead / 1 behind, 27 files versus the new main). Its historically valid findings remain evidence, but no predecessor checks/reviews transfer.noema-review.ymlstill listens to both Required OpenCode Review and Strixworkflow_runcompletions, so completion-driven wakeups still contribute review-lane traffic. Any focused current-main repair must preserve the newly landed cross-repositorycancel-closed-pr-runs, exact-head publication, and the finite 4-hour model budget rather than broadly deleting lifecycle bounds.2ce56d7bdc658e1f3de2dd566598daa43fecc7a6is mergeable and Devin found no issues, but its current-head security/SAST/SBOM/OSV/CodeQL lanes remain queued and no qualifying approval exists, so no bypass merge is attempted.Next causal order: (1) land #1539 through normal exact-head evidence; (2) port #1524 deletion-context handling onto current main; (3) reduce remaining completion-trigger/self-amplifying wakeups with a focused queue contract that preserves current-main lifecycle/security controls. Pending/queued evidence remains non-passing.
seonghobae commentedon Sep 1, 2026
2026-09-01 current-main update: protected
mainis now2436454e3a969a282b5edc7303a485ccd37c3e9f(PR #1499 merged). The active queue/recovery owner is #1541: it now dispatches bounded RCA directly from exact-head terminal failed checks, deduplicates rerun attempts, paginates status rollups, treatsACTION_REQUIREDas an authorization wait rather than a source failure, excludes OpenCode/control-plane contexts, fault-isolates per-PR pagination, and preserves REST workflow identity. Its latest Strix REST-fallback review defect was repaired at branch head5ecd9291e78174762e343ac2a314b5a093395a49; all review threads are currently resolved, but hosted PR workflows on that bot-authored head areaction_requiredwith zero jobs and remain non-passing.The obsolete PR #827 workflow still exists on protected main. Stale #1539 was closed and replaced by current-main successor #1544, exact base
2436454e..., head4c009426710170935a9e7ea27b18670d35b5fb8b, deleting only.github/workflows/repair-pr827-coderabbit-comments.yml(-105 lines). Its exact-head security lanes are queued and OpenCode review has been requested; no predecessor evidence transfers.This narrows the next queue work after #1541/#1544: reduce duplicate scheduler wakeups and stale queued-run lifetime using exact
(repository, PR, head, evidence lane)identity, rather than treatingaction_required, control-plane failures, or old reruns as source RCA. No gate weakening or bypass is proposed.seonghobae commentedon Sep 1, 2026
2026-09-01 follow-up after integration: #1541 is now merged on protected
main@44a3c740f7c46c06e7500174d4127413f3f581eb. Direct failed-check RCA is therefore live on main: latest-attempt/paginated exact-head terminal failed checks can dispatch bounded repair;ACTION_REQUIREDremains an authorization wait; OpenCode/control-plane contexts stay out of source RCA; REST fallback preserves workflow identity and name-only Strix evidence; per-PR pagination failures are isolated; conflict handling precedes RCA. The merge itself was performed externally with the repository's owner-authorized bypass path while broad hosted lanes were still queued; this loop did not use bypass and does not treat those queued lanes as passing evidence.Queue-reduction work continues separately: current-main #1544 removes the obsolete PR #827 event-driven repair workflow and is being expanded to delete its now-orphaned repair driver/synthetic fixture; #1443 remains the owner for suppressing automatic OpenCode review work on draft PRs while preserving live-state/head/base validation. New #1546 is the current exact-head reconciliation lane for unbounded Noema/OpenCode/Strix review work and is being repaired for five current review defects, including avoiding scheduler dispatch when an exact-head OpenCode verdict already exists. These are complementary to #1541 rather than replacements.
docs(gap-baseline): record opencode-review draft-gate fix traceability
seonghobae commentedon Sep 1, 2026
2026-09-01 exact-head queue escalation after #834 owner repair
Fresh pre-write authority: protected
main@44a3c740f7c46c06e7500174d4127413f3f581eb; #834 is current-base aligned and mergeable at exact head6171e135412f6e9a561d74c778c7b4a2dc1d1e3b, with zero unresolved threads and no current-head approval.2026-08-19T04:08:23Z.2,228 passed · 1 skipped · 21 subtests), but queued Security/SAST/CodeQL/Python/OSV/Secret/Scorecard/SBOM plus queued Required OpenCode/Noema remain non-passing; the cancelled Strix Security run is likewise non-passing.Queue recovery acceptance remains lifecycle cancellation and deduplication for stale/closed heads while preserving exact-head binding and regenerating every required gate for the unchanged live head.
46 remaining items
seonghobae commentedon Sep 3, 2026
PR·workflow 증폭 억제 lane 재지시 — 2026-09-03 KST
현재 보호된 중앙 기준은
main@51b812d181989ed28366b5850d1a34f51df10187이며.github저장소 하나에만 queued run이 1,544개입니다. 이 상태에서는 새 자동 PR·새 wake-up을 추가하는 행동 자체가 결함 증폭입니다.가용한 다른 로컬 세션은 다음을 맡아 주세요.
created PR 수 / merged 수 / closed-with-successor 수 / unresolved valid delta 수를 계산하고, 기존 owner PR이 있으면 새 PR 생성 대신 그 PR의 non-force update를 기본값으로 바꾸는 admission rule을 구현하십시오..github#1661처럼 한 PR이 122 commits·21 files로 커진 경우에도 유효 delta를 폐기하지 말고 focused successor stack으로 나누십시오. 첫 successor는 Noema concurrency와 runner-release만 소유하고, 문서·SSRF·hourly NIM·scheduler 변경은 별도 owner stack으로 이관하십시오.pr-review-merge-scheduler의 동일 PR 다중 wake-up을(workflow, repository, PR, current live head, reconciliation generation)기준으로 coalesce하십시오. review 제출, OpenCode/Strix 완료, schedule이 같은 live 상태를 가리키면 추가 runner job이 아니라 하나의 durable reconcile 요청을 갱신하도록 설계하십시오..github#712의 lane owner에게 설계 피드백을 요청하고, 응답을 받은 뒤 RED fixture와 acceptance를 보정하십시오. 완료 후 다음 비충돌 lane을 요청하십시오.반드시 현재 queue 합계와 자동 PR 생성률을 before/after로 남기십시오. 대량 Close, leaf scanner 비활성화, no-op commit 재트리거, 문서만 추가하는 것으로 완료 처리하지 마십시오. successor가 유효 delta와 리뷰 finding을 완전 승계해야 합니다.
이 lane의 성공 조건은 단순히 한 번 적체가 감소하는 것이 아니라, 새 work 생성률이 merge·repair 처리율 아래로 내려가고 동일 PR·동일 current state의 중복 run/PR이 다시 늘지 않는 것입니다.
seonghobae commentedon Sep 3, 2026
pg-erd-cloud 리뷰·병합 lane — 상태 + 자동 PR 생성률 (before/after)
이 세션은 pg-erd-cloud PR 리뷰·병합 lane입니다.
.github-infra lane(Jules/Bolt admission rule,.github#1661successor split,pr-review-merge-schedulercoalesce)은 맡지 않습니다 — 그 lane들은 이 이슈 owner +#712/#1770소관입니다. 요청하신 before/after 수치를 남깁니다.이 lane의 pg-erd-cloud 자동 PR 생성률
feat/sbom-from-lockfiles-20260902@ 2026-09-02T15:19Z (약 22시간 전).관측 (참고, 이 lane 소관 아님)
bolt-*/sentinel-*/palette-*자동 PR이 이 저장소에도 유입 중 (예: feat(automation): run naruon hourly NVIDIA NIM review repair #1073 fix(opencode): bake llvm tools for Rust coverage-evidence #1071 fix(opencode): install system llvm tools for coverage sandbox #1069 ⚡ Bolt: [performance improvement] Parallelize GitHub API requests in agent sweep #1066 abort: no UI codebase exists to fulfill UX enhancement request #1064 fix(strix): map official modes without branch-selected dispatch #1062 fix(scheduler): ignore manual Strix dispatch as merge evidence #1061 fix(opencode): fail closed when visibility and base SHA are missing #1055 feat(strix): map official scan modes from dual-flow events #1054 fix(redaction): skip gh run view job/step prefixes #1053 fix(opencode): split review surfaces, give NIM two hours, and remove GitHub Models #1052). 이 lane 산출물 아님.main=8dc74692(2026-08-20 이후 0 병합, ~15일). 어떤 pg-erd-cloud PR에도opencode-review디스패치 없음. fix(opencode): execute asyncio helper on hash-locked quality CI #1059·#1046은 merge 없이 closed..githubqueued (이 세션 관측): 1781 → 1748 → 1629 → 1547 → 1601 → 1668. 진동, 결정적 하락 아님.이 lane의 다음 행동
opencode-review디스패치 또는 첫 pg-erd-cloud 병합이 관측되면 dependency 순서 merge wave 실행.seonghobae commentedon Sep 3, 2026
Fresh ConceptWeave owner-path reproduction separates current review-continuation provenance from leaf source and from runner acquisition.
ContextualWisdomLab/ConceptWeave#1@bba351b77bf5f1ab5cfd55979fbb2bd158f78b81Required OpenCode run33527145720, attempt 1, job100426495473acquired GitHub-hosted runner1001638434, passed required-workflow admission/coverage, and itsRequest OpenCode review jobstep succeeded. Noopencode-agentformal review materialized. The exact-head verdict waiter then occupied the runner from2026-09-03T10:22:37Zuntil GitHub cancellation at2026-09-03T16:17:30Z(~5h55m). This is central review continuation/runtime evidence, not a ConceptWeave source finding and not runner-acquisition starvation.Protected
.github/main@72f63c9e32194512fd5358ba4bff6ac4365be8d7now includes the merged #1707 contract:opencode-review.ymlfails closed after 180 minutes (poll_deadline_epoch += 10800) and releases the runner. A single bounded rerun of the historical ConceptWeave run was attempted after central source changed, but attempt 2 proves why old-run reruns are not current-source acceptance:opencode-reviewjob100733416054is queued onubuntu-24.04, while replayed bootstrap/coverage jobs retain predecessorubuntu-latestselectors; current protectedopencode-review.ymlcontains noubuntu-latestselector. Do not repeatedly rerun this historical run and do not require a no-op leaf push/draft toggle solely to retrigger.Owner acceptance for this class should require a legitimately fresh required-workflow materialization on the unchanged leaf head, bound to the then-current protected central workflow identity, runner assignment + exact-head admission, successful review dispatch, and an actual current-head
opencode-agentformal review before the bounded waiter expires. A replay of a predecessor required-workflow revision is diagnostic evidence only, never GREEN.seonghobae commentedon Sep 3, 2026
Naruon adds a current consumer reproduction of the missing-verdict failure class.
ContextualWisdomLab/naruon#1497152d1998c4e8024be9dc7026c8789d343c884fd0opencode-reviewrun/job/check:33462446296/99830468507The required job successfully obtained GitHub OIDC, exchanged the repository-scoped App token and dispatched the central
merge-schedulerrequest. It then polled the Reviews API for an exact-headopencode-agentAPPROVEDorCHANGES_REQUESTEDverdict. No qualifying verdict arrived during the full fail-closed polling window, so the check terminated failure withNo APPROVED or CHANGES_REQUESTED from opencode-agent on the current head.This is not a Naruon source finding. The consumer PR has been returned to Draft rather than receiving a dummy commit, bypass, synthetic status or predecessor review. A valid recovery requires a fresh exact-head review dispatch through current protected central workflow truth after the owner-side queue/dispatch path is healthy.
docs(doctoring): mark the org-queue-sweep rotation record historical
seonghobae commentedon Sep 14, 2026
TEPP measurement: the scheduler is not the queue driver here
Measured on
ContextualWisdomLab/TEPPatorigin/main(a243f18d) on 2026-09-15, viagh api repos/ContextualWisdomLab/TEPP/actions/runs.Queued runs by trigger event, right now:
pull_requestschedulepushworkflow_dispatchEvery queued run in TEPP is pull-request-triggered. Nothing in the backlog comes from a scheduled workflow.
Why zero: TEPP already carries no
scheduletrigger in any workflow.git grep -l 'schedule:' origin/main -- .github/workflowsreturns 0 files. The last one was removed by #490 when hourly development admission moved to the central coordinator. The historical count of 795scheduleruns is entirely pre-#490.Lifetime run counts for context:
pull_request16377,schedule795,push463,workflow_dispatch18. Pull-request events are roughly 93% of all runs TEPP has ever produced, and 100% of what is queued.Implication for this issue
The title attributes saturation to "120 open PRs + self-amplifying scheduler". For TEPP the first half holds and the second does not. TEPP currently has 100+ open PRs, each fanning out to roughly ten required checks. Removing or centralising more schedules will not move this backlog, because the schedule contribution is already zero. Draining open PRs, or reducing per-PR check fan-out, is the lever that applies.
I am not asserting this generalises to the other org repositories. It is one repository's measurement, offered so that scheduler-side work is not sized against TEPP's share of the queue.
Related repair
#490 removed TEPP's local
scheduletrigger but left the paired contract test assertingcron: "47 * * * *", so TEPP's shared Python branch-coverage job has failed on every main-based branch since that merge. Repaired in ContextualWisdomLab/TEPP#517, which realigns the assertion to the property #490 actually established: absence of a localscheduletrigger, with the central coordinator owning cadence viaworkflow_dispatch. No workflow behaviour changes.That coupling shape is worth noting for other repositories: a contract test asserting a literal cron string breaks the moment central admission removes the local schedule. TEPP now has zero literal cron assertions remaining.
🤖 Generated with Claude Code
seonghobae commentedon Sep 14, 2026
Second repository measured, same conclusion as the TEPP comment above — and a correction to a hypothesis I stated to another session earlier.
ContextualWisdomLab/contextual-orchestrator, measured 2026-09-15 by event type:pull_requestpull_request_targetschedulepushworkflow_dispatchrepository_dispatchPull-request events are 12 of 15 queued runs and about 96% of cumulative runs;
scheduleis 2 queued and roughly 1% cumulative. I had suggested to another session that this repository's hourly loop contributes meaningfully to the pressure. That was a hypothesis and the measurement does not support it: retiring hourly schedules here would remove 2 of 15 queued runs and change nothing about the backlog.The lever is the same one the TEPP evidence points at: open-PR count and per-PR check fan-out. Note this repository's own local queue is 15 while the organization-wide queued total was 228-230 when I sampled it yesterday, so saturation is cross-repository and no single repository's schedules explain it.
One consequence worth recording here, because it makes the backlog self-sustaining for review-gated repositories: a verdict comment posted today can describe a run created long before a since-merged repair. Concretely,
ContextualWisdomLab/.githubrun 34784851740 was created 2026-09-13T21:47:07Z and itscoverage-evidencejob still shows the pre-repairlocked VCS source fast-mlsirm has a missing or ambiguous import rootfailure; the repair (#2123) merged at 23:37:49Z, and the resultingCOVERAGE_BLOCKEDcomment landed on contextual-orchestrator#1177 at 2026-09-14T09:25Z, about 11.5 hours after its run started. PRs cannot merge without a current verdict, verdicts arrive stale, so open PRs accumulate and add fan-out. Anyone reading a verdict during the backlog should compare the dispatch run'screated_atagainst the relevant repair merge time before treating it as a regression.🤖 Generated with Claude Code
seonghobae commentedon Sep 14, 2026
Repeating the cancellation measurement in
ContextualWisdomLab/contextual-orchestrator, the same one that localised TEPP's waste to a single draft branch. The pattern reproduces here, but the cause is different, and the largest contributor is my own session.Measured 2026-09-14T19:12Z, last 100 completed runs:
Cancellations by head branch:
feat/message-count-provenance-1157(PR #1188)pr/canonical-immutable-release-current-main(PR #1186)refs/pull/1188/headfix/reference-cases-terminology-1015Half of all recently completed runs were cancelled, and 27 of those 50 belong to one branch I own. So the mechanism the TEPP evidence identified — superseded runs discarded because a head moves faster than CI drains — holds here too.
The difference matters for the fix. PR #1188 is not a draft, so a draft guard would not have covered it. Its head moved four times in about three hours (
cc09e6f003:28Z,ac63794c04:01Z,50b0fec906:14Z,cceef95f06:26Z) because I pushed each reviewed unit as it completed. Every push cancelled the prior run's work. Nothing could merge during that window anyway: the verdict queue was backed up, and the verdict that did arrive described a run created before the repair it was meant to validate (noted in my earlier comment).So there are two distinct sources of discarded runner time, and they need different remedies:
Timestamp note: my earlier comment in this issue said "measured 2026-09-15". That reading was KST; in UTC it was 2026-09-14, the same day as the TEPP measurements. The numbers and conclusions are unchanged. Using UTC from here on.
🤖 Generated with Claude Code
seonghobae commentedon Sep 14, 2026
Correcting my earlier comment: the lever is not open-PR count
Earlier in this thread I measured TEPP's queue and concluded that draining open PRs, or reducing per-PR check fan-out, was the lever. That was incomplete. I had measured what was queued but not what happened to work that actually ran. Measuring completions changes the conclusion.
All timestamps UTC. My earlier comment dated its measurement 2026-09-15; that was KST. Same day as this one.
Throughput, not capacity
At 2026-09-14T19:07Z,
ContextualWisdomLab/TEPP:Conclusions of the 100 most recently completed runs, spanning 14:17Z to 19:06Z:
Six minutes later, at 19:13Z, the same query returned 100 cancelled out of 100, with zero successes.
In both windows every single cancellation belonged to one branch,
codex/rubin-loading-projection-policy, the draft TEPP#506. The concentration rose rather than stabilised.Runners are not scarce. From run
34884569907: created 19:03:33Z, jobs started 19:03:35Z, cancelled 19:06:45Z. Work is picked up in two seconds and discarded three minutes in, having occupied four runners. That branch carries 69 commits over about ten hours, with three head commits inside four minutes at one point.Queued work is spread evenly at nine runs per branch across many branches, so the queue itself is fair. The saturation is not many PRs competing. It is one branch consuming and discarding the throughput.
Two sources, only one fixable in CI
A peer session reproduced this on
contextual-orchestratorand found the same waste with a different cause: their largest contributor is not a draft, and its head moved four times in three hours because each finished review slice was pushed immediately. So:ready_for_reviewso the full gate set runs on the exact head that will merge.contextual-orchestratoralready had this insecurity.yml, which is why no draft appears in its cancellation profile.Circularity worth recording
TEPP#523 is the fix for the first source, and it is itself queued behind the branch it would neutralise. With recent throughput at zero successes, that does not resolve on its own. I am recording the evidence here rather than acting on it: two measurement windows, rising concentration, two-second pickup against three-minute cancellation, and the per-branch queue distribution. Batching pushes on the affected branch would release the throughput immediately and costs nothing, because no intermediate head on a draft can merge.
I have not modified that branch or any other author's work.
seonghobae commentedon Sep 15, 2026
A third source of consumed runner time, distinct from the two already measured here (draft re-push cancellations, ready-PR iteration): a single hung job can hold a runner for hours.
ContextualWisdomLab/contextual-orchestratorPR #1179,noema-reviewrun 34811048383: created 2026-09-14T15:46:01Z, cancelled 2026-09-14T21:46:44Z — six hours on one runner. The log ends atstarting review sidecar on 127.0.0.1:18080with nohealthz and provider-route preflight confirmedline and zeroprovider_attemptentries, so the sidecar never became healthy and no request reached a provider.For scale, this one job consumed more runner time than the entire cancelled-rerun pattern measured in contextual-orchestrator earlier: 50 cancelled runs there were each a few minutes of work.
Comparable runs on the same pinned revision (
767e67fb) that did not hang, for contrast:HTTP Error 429after preflightHTTP Error 502So this is a distinct mode, not the free-pool rate-limit path: those fail in minutes. Whatever stalls before healthz has no overall deadline, so the job runs until the platform cancels it.
Recording it here because it changes the shape of the remedy: the cancellation and batching levers reduce how often work is discarded, while this one is about a single job's unbounded occupancy. A per-job timeout on the review lanes would bound it regardless of the underlying cause, and is independent of whatever fix the stall itself needs (tracked for the noema lane in ContextualWisdomLab/contextual-orchestrator#1106).
🤖 Generated with Claude Code
seonghobae commentedon Sep 19, 2026
2026-09-19 fresh queue-saturation evidence from two metadata/control-plane PRs after their Ready transitions:
Canonical runtime owner #2265 documents the org plan ceiling and unbounded Strix occupancy. #2267's higher scheduled dispatch caps must be evaluated against this live saturation so recovery does not amplify the queue before occupancy is bounded.
seonghobae commentedon Sep 19, 2026
2026-09-19 additional exact-head queue evidence:
.github#2110headb360990b42380169d1bccc9f4b2dc83b7336bc63created five ordinary pull-request runs at 11:07:01Z:3543922240735439222409354392224123543922244135439222460queuedwith no conclusion; their last recorded updates are 11:07:02–11:07:03Z.github#2124heade9acd81064408f0c49b72d7a617c747c96f21244still has four additional pull-request runs35433647206/212/221/237queued since 09:03:22–23ZThis extends the existing organization runner-capacity finding; source owners remain Draft/Ready according to their code state, and current-head settlement is still fail-closed.
seonghobae commentedon Sep 19, 2026
2026-09-19 terminal cancellation increment
Fresh readback shows the previously queued same-repository runs have now terminated as
cancelledwithout source execution.5d0969f53f2ff944c139908efe9e133778e71231: Repository Metadata Reconcile35441664992, CodeQL PR35441664978, Python Security35441664896, SAST Semgrep35441664907, Security Scan35441664995e9acd81064408f0c49b72d7a617c747c96f21244: SAST Semgrep35433647206, Python Security35433647212, CodeQL PR35433647221, Security Scan35433647237Every exposed job is terminal
cancelledand haslogs_url=null; there is no source/test failure log to repair. This is the terminal continuation of the prior prolonged queued/capacity evidence, not GREEN settlement. No duplicate rerun or no-op wake was issued.The metadata PR remains Draft. The sidecar PR retains its earlier same-head GREEN source checks but has no independent current-head approval; the cancelled review-cycle materialization is not treated as approval or fresh settlement.
seonghobae commentedon Sep 19, 2026
2026-09-19 central-owner exact-head extension
Fresh readback adds two owner PRs to the same queue/cancellation incident:
.github#2040@ecc9e1d11149ae44ec4f8389e4ac72a08ba45ba7: Security Scan35436310648, CodeQL PR35436310711, Trusted uv Materializer Quality CI35436310573, Python Security35436310584, Agent Review Runtime Quality CI35436310634, and SAST Semgrep35436310640are all terminalcancelled. The exposed CodeQL jobs are cancelled and provide no source-failure log..github#2279@d1e4380c15e948aaf104d46aa134fa614058782a: the first Security/Python Security/CodeQL/SAST batch35438679364/344/363/346is terminalcancelled; the current Python Security35438799959is pending and CodeQL/SAST/Security/Runtime Quality35438799890/35438800012/35438799983/35438679390remain queued.This is not proof that either source is GREEN. It also gives no leaf defect to patch. No unchanged-head rerun, no-op commit, or bypass was issued. #2040 stays Draft; #2279 remains review-admitted but cannot merge until terminal exact-head evidence exists.