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
PR #1669 (67998ec, merged 2026-09-02 19:02 +09:00, doctoring: docs/doctoring/scheduler-stale-headrefoid-cancellation.md) fixed a race in stale_pr_run_ids() / active_review_run_refs() where a push landing between
run classification and cancellation could let the scheduler cancel a review
run that had, by the time of cancellation, become the PR's own current-head
evidence -- not a superseded one.
That fix stops the race going forward. It does not retroactively repair PRs
that were already left with a wrongly-cancelled current-head check before
the fix landed.
Concrete example found and manually repaired this session
ContextualWisdomLab/naruon#1528 (head cf472cf77fb93325858f485a22e967449d7c387a):
run 33581213829's strix job (id 100095712154) was cancelled at 2026-09-02T01:54:46Z -- well before the #1669 fix merged -- and mergeable_state
was still blocked as of 2026-09-03, 15+ hours after the fix landed, with no
later Strix attempt for that same head. noema-review was also failure for
the same head, so the PR had a second, independent reason to stay open, which
likely masked the fact that nothing was retrying Strix.
Manually re-running the job (gh api -X POST repos/ContextualWisdomLab/naruon/actions/jobs/100095712154/rerun) succeeded
immediately and requeued a fresh strix attempt -- confirming the credential
and API path both work; nothing structural blocks a rerun.
Gap
dispatch_strix_evidence() in scripts/ci/pr_review_merge_scheduler.py already
has a "job exists, rerun it" branch (matching_actions_job_id + rerun_actions_job) that would have fixed naruon#1528 on its own during a
normal scheduler tick -- evidently it either isn't reaching every already-open
PR in a bounded amount of time, or something upstream in decide() (not yet
identified) is short-circuiting before that branch for at least this PR shape.
There is no one-time reconciliation pass that specifically targets pre-#1669
casualties: an open PR, current-head Strix/OpenCode/Noema check-run conclusion
is cancelled, no later same-head success exists, and the run predates the #1669 merge commit's timestamp.
Ask
Root-cause why naruon#1528 specifically didn't get picked up by a normal
scheduler tick in the ~15 hours after fix(scheduler): never let a falsy headRefOid cancel every run for a PR #1669 merged (add scheduler-run
logging/telemetry for this PR shape if existing logs don't already explain
it -- this is also the class of "no specifics on why" telemetry gap the
standing loop separately wants closed for hourly-review-repair timeouts).
Run a bounded, rate-limit-aware one-time sweep across org repos for PRs
matching the "cancelled current-head Strix/OpenCode/Noema evidence, no
later success, run predates 2026-09-02T10:02:47Z UTC" shape, and rerun each
matching job (same non-destructive jobs/{id}/rerun call used above).
Decide whether this sweep should be a one-shot script (run once, then
deleted, matching this repo's self-modifying-workflow-removal convention)
or a permanent low-frequency reconciliation job -- leaning one-shot, since fix(scheduler): never let a falsy headRefOid cancel every run for a PR #1669 already prevents new occurrences.
Filed as part of the standing ContextualWisdomLab PR review/fix/merge loop
(docs/product-goal-directive.md); not itself merge authorization for any
follow-up PR.
Context
PR #1669 (
67998ec, merged 2026-09-02 19:02 +09:00, doctoring:docs/doctoring/scheduler-stale-headrefoid-cancellation.md) fixed a race instale_pr_run_ids()/active_review_run_refs()where a push landing betweenrun classification and cancellation could let the scheduler cancel a review
run that had, by the time of cancellation, become the PR's own current-head
evidence -- not a superseded one.
That fix stops the race going forward. It does not retroactively repair PRs
that were already left with a wrongly-cancelled current-head check before
the fix landed.
Concrete example found and manually repaired this session
ContextualWisdomLab/naruon#1528(headcf472cf77fb93325858f485a22e967449d7c387a):run
33581213829'sstrixjob (id100095712154) wascancelledat2026-09-02T01:54:46Z-- well before the #1669 fix merged -- andmergeable_statewas still
blockedas of 2026-09-03, 15+ hours after the fix landed, with nolater Strix attempt for that same head.
noema-reviewwas alsofailureforthe same head, so the PR had a second, independent reason to stay open, which
likely masked the fact that nothing was retrying Strix.
Manually re-running the job (
gh api -X POST repos/ContextualWisdomLab/naruon/actions/jobs/100095712154/rerun) succeededimmediately and requeued a fresh
strixattempt -- confirming the credentialand API path both work; nothing structural blocks a rerun.
Gap
dispatch_strix_evidence()inscripts/ci/pr_review_merge_scheduler.pyalreadyhas a "job exists, rerun it" branch (
matching_actions_job_id+rerun_actions_job) that would have fixed naruon#1528 on its own during anormal scheduler tick -- evidently it either isn't reaching every already-open
PR in a bounded amount of time, or something upstream in
decide()(not yetidentified) is short-circuiting before that branch for at least this PR shape.
There is no one-time reconciliation pass that specifically targets pre-#1669
casualties: an open PR, current-head Strix/OpenCode/Noema check-run conclusion
is
cancelled, no later same-head success exists, and the run predates the#1669 merge commit's timestamp.
Ask
scheduler tick in the ~15 hours after fix(scheduler): never let a falsy headRefOid cancel every run for a PR #1669 merged (add scheduler-run
logging/telemetry for this PR shape if existing logs don't already explain
it -- this is also the class of "no specifics on why" telemetry gap the
standing loop separately wants closed for hourly-review-repair timeouts).
matching the "cancelled current-head Strix/OpenCode/Noema evidence, no
later success, run predates 2026-09-02T10:02:47Z UTC" shape, and rerun each
matching job (same non-destructive
jobs/{id}/reruncall used above).deleted, matching this repo's self-modifying-workflow-removal convention)
or a permanent low-frequency reconciliation job -- leaning one-shot, since
fix(scheduler): never let a falsy headRefOid cancel every run for a PR #1669 already prevents new occurrences.
Filed as part of the standing ContextualWisdomLab PR review/fix/merge loop
(
docs/product-goal-directive.md); not itself merge authorization for anyfollow-up PR.