Repository navigation
fix(dispatch): skip stale dispatches for closed PRs or superseded heads - #2382
seonghobae wants to merge 8 commits into
Conversation
…tead of failures
A dispatch whose target PR is closed, or whose live head has moved strictly
past the dispatched head, ends validate with a ::notice:: and stale=true;
later jobs are gated on that output so the run concludes success.
A head mismatch alone is not treated as stale: GitHub can briefly serve the
previous head right after a push. Retirement requires the compare API
(repos/{target}/compare/{dispatched}...{live}) to answer status "ahead" with
behind_by 0 and ahead_by >= 1. Behind (API lag), diverged (force-push), or a
failed/malformed compare keeps the original fail-closed head_sha mismatch.
The OpenCode side keeps its EVENT_NAME == repository_dispatch guard because
its authorization and supplied-head binding are nested under that check;
CodeQL triggers only on repository_dispatch and authorizes unconditionally,
so it needs no guard. Tests pin both premises. Draft PRs are not stale.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (5)
Included review availability: This review used your included allowance. Your plan provides up to 1 included review per hour; 0 remain after this review. 📝 WalkthroughWalkthroughCodeQL과 OpenCode dispatch 검증은 PR이 닫혔거나 live head가 dispatched head의 후손임이 확인되면 실행을 stale로 표시합니다. 해당 실행은 성공적으로 종료되며, scan 또는 coverage 및 review 후속 작업은 건너뜁니다. 그 밖의 검증 불일치와 compare 실패는 기존처럼 실패 처리됩니다. ChangesStale dispatch 처리
Priority: ⬇️ Low Estimated code review effort: 3 (Moderate) | ~25 minutes Change: Bug fix Sequence Diagram(s)sequenceDiagram
participant Dispatch as repository_dispatch
participant ValidateDispatch as CodeQL validate-dispatch
participant CompareAPI as GitHub compare API
participant Scan as CodeQL scan 및 settlement
Dispatch->>ValidateDispatch: PR 식별 정보와 dispatched head 전달
ValidateDispatch->>CompareAPI: head 불일치 시 두 SHA 비교
CompareAPI-->>ValidateDispatch: compare 결과 반환
ValidateDispatch-->>Scan: stale가 아니면 scan 실행 허용
ValidateDispatch-->>Scan: stale이면 scan 건너뜀
sequenceDiagram
participant Dispatch as repository_dispatch
participant ValidateMetadata as OpenCode validate-pr-metadata
participant CompareAPI as GitHub compare API
participant OpenCodeJobs as coverage 및 review 작업
Dispatch->>ValidateMetadata: PR 메타데이터와 dispatched head 전달
ValidateMetadata->>CompareAPI: head 불일치 시 두 SHA 비교
CompareAPI-->>ValidateMetadata: compare 결과 반환
ValidateMetadata-->>OpenCodeJobs: stale가 아니면 후속 작업 허용
ValidateMetadata-->>OpenCodeJobs: stale이면 후속 작업 건너뜀
Merge Risk: ⚪ Minimal · up to The change retires stale CodeQL and OpenCode dispatches successfully while keeping mismatches and lookup failures as failures. No actionable merge-blocking risk was found. Normal hosted checks and independent approval still apply. Security Architecture ReviewSecurity architecture risk: 🔵 Low · up to The dispatch paths now skip only closed PRs or heads proven superseded, while other mismatches continue through validation. No introduced security finding was established. Some upstream authorization and deployment details remain unverified. Retained concerns Security review detailsSecurity Blast Radius
Trust Boundaries and Controls
Resilience and Maintainability Implications
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
Full details: Docstring CoverageExplanation Docstring coverage is 77.27% which is insufficient. The required threshold is 80.00%. Docstring coverage is scoped to functions touched by this diff. Analyzed 66 functions across 16 files. (3 skipped: 3 unsupported.)
✨ Finishing Touches 💡 2📝 Generate docstrings 💡
🛠️ Fix failing CI checks 💡
🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
seonghobae
left a comment
There was a problem hiding this comment.
P1 dependency / single-writer repair — current exact head 3d0352198303ad055e751f1f5580313a687a2638 cannot be accepted on protected main@e6334e22….
Exact-log RCA for Python Security run 36220837176, job 108362326873, shows the hard gate audited requirements-strix-ci-hashes.txt and found AnyIO 4.14.0 vulnerable to CVE-2026-63374, CVE-2026-64847, and CVE-2026-63349; all require 4.14.2. This is a real dependency finding, not queue saturation or transport failure.
Canonical lock/source repair already exists in #2385@8e1aba9c: it adds anyio==4.14.2 to the source requirements, updates the hashed lock, and pins source↔lock parity. Do not copy a second lock repair here. The heads are diverged at main@e6334e22…: this PR is ahead 1 / behind 25 relative to #2385, and both modify .github/workflows/opencode-review-dispatch.yml.
Required order: settle #2385 first, then ordinary/non-force restack this branch on its accepted head while preserving only the unique stale-dispatch retirement delta and reconciling the shared OpenCode workflow. Re-run every exact-head gate after reconciliation; predecessor receipts do not transfer. Runtime Quality 36220837157, SAST 36220837165, and Security 36220837182 passed, but Python Security failed and CodeQL 36220837170 remains queued. Ready is review admission only; no merge, auto-merge, bypass, synthetic status, or blind rerun is authorized.
|
Exact-head admission correction for Exact-head Python Security run The PR stays open with its complete delta and review evidence preserved. Draft is Proposed/not merge-admissible, not completion. No rerun, bypass, synthetic status, force update, review dismissal, or Close is performed. |
seonghobae
left a comment
There was a problem hiding this comment.
Exact-head/base dependency finding for 3d0352198303ad055e751f1f5580313a687a2638.
Canonical foundation parent #2385 is still open at 8e1aba9ce1d52acb36f095da32511da06958733f. A direct base retarget was tested and GitHub reported the child unmergeable. The cause is concrete three-path ownership overlap:
.github/workflows/codeql-scan-dispatch.yml.github/workflows/opencode-review-dispatch.ymltests/test_pr_review_autofix_nvidia_nim_contract.py
The child’s six-path stale-dispatch delta remains preserved: the base was restored to protected main@e6334e229581a918e2f22de18733b76fa65d7e71, the head was never moved or rewritten, and GitHub recomputed the PR as mergeable on that original base. Pre-parent Checks cannot be used as post-convergence evidence.
Required order: settle #2385 normally; then create an ordinary non-force successor/restack that resolves the three overlapping paths while preserving both the foundation and stale-dispatch contracts; finally acquire fresh exact-head/base Checks and independent review. Do not force-push, drop the child delta, or treat #2385 evidence as inherited passing proof.
There was a problem hiding this comment.
Pull request overview
OpenCode reviewed the current-head product diff. Coverage is a separate gate.
Changed files
.github/workflows/codeql-scan-dispatch.yml— GitHub Actions review job.github/workflows/opencode-review-dispatch.yml— GitHub Actions review jobCHANGELOG.d/20260926-dispatch-stale-head-skip.md— repository behaviortests/test_codeql_scan_dispatch_workflow_contract.py— regression suitetests/test_opencode_review_dispatch_stale_skip.py— regression suitetests/test_pr_review_autofix_nvidia_nim_contract.py— regression suite
Changed behavior
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow: codeql-scan-dispatch.yml"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow: codeql-scan-dispatch.yml"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["Workflow: opencode-review-dispatch.yml"]
S2 --> I2["GitHub Actions review job"]
I2 --> R2["Review risk: Workflow: opencode-review-dispatch.yml"]
R2 --> V2["actionlint plus required checks"]
Evidence --> S3["Repository file: 20260926-dispatch-stale-head-skip.md"]
S3 --> I3["repository behavior"]
I3 --> R3["Review risk: Repository file: 20260926-dispatch-stale-head-skip.md"]
R3 --> V3["required checks"]
Evidence --> S4["Test: test_codeql_scan_dispatch_workflow_contract.py (3 files)"]
S4 --> I4["regression suite"]
I4 --> R4["Review risk: Test: test_codeql_scan_dispatch_workflow_contract.py (3 files)"]
R4 --> V4["targeted test run"]
Findings
No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.
- Head SHA:
3d0352198303ad055e751f1f5580313a687a2638 - Workflow run: 36234093075
- Workflow attempt: 1
- Coverage gate:
failure
Review outcome
Coverage is a gate, not the review. This body reviews the changed product files.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow: codeql-scan-dispatch.yml"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow: codeql-scan-dispatch.yml"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["Workflow: opencode-review-dispatch.yml"]
S2 --> I2["GitHub Actions review job"]
I2 --> R2["Review risk: Workflow: opencode-review-dispatch.yml"]
R2 --> V2["actionlint plus required checks"]
Evidence --> S3["Repository file: 20260926-dispatch-stale-head-skip.md"]
S3 --> I3["repository behavior"]
I3 --> R3["Review risk: Repository file: 20260926-dispatch-stale-head-skip.md"]
R3 --> V3["required checks"]
Evidence --> S4["Test: test_codeql_scan_dispatch_workflow_contract.py (3 files)"]
S4 --> I4["regression suite"]
I4 --> R4["Review risk: Test: test_codeql_scan_dispatch_workflow_contract.py (3 files)"]
R4 --> V4["targeted test run"]
OpenCode Review Overview
Coverage evidence did not pass, so approval is blocked. The formal pull-request review is the source-backed diff review, not this status comment. |
Ordinary-forward integrates PR #2385 into draft PR #2382 so the canonical Noema coverage build-context repair and the stale-dispatch retirement remain one reviewable lineage. The only textual conflict was the workflow blob identity contract; it is pinned to the computed merged workflow blob b22750e.
|
Ordinary-forward convergence evidence for exact head
The PR remains Draft / Proposed. No Force Push, destructive rebase, rerun, self-approval, bypass, or merge was used. |
seonghobae
left a comment
There was a problem hiding this comment.
Exact-head review for d9e31329e2e0361e904aef3072984ec1b4e076cd (COMMENT, not approval).
The ordinary-forward successor preserves canonical #2385 exact 8e1aba9c… and leaves only the six stale-dispatch paths as the effective delta: ahead 2 / behind 0. The two dispatch validators retire only a closed PR or a head mismatch proven by GitHub compare as ahead with behind_by: 0 and ahead_by >= 1; API lag (behind), force-push divergence, contradictory/malformed compare evidence, lookup failure, unauthorized sender, and other identity mismatches remain fail closed. Current exact remote verification: Python AST 3/3, workflow YAML 2/2, and bash -n for both changed validation shell blocks 2/2.
The prior OpenCode CHANGES_REQUESTED review is anchored to predecessor 3d035219… / run 36234093075 and explicitly reports no source-backed product finding; it is stale after the non-force #2385 convergence. Dismissing it does not satisfy coverage, hosted Checks, or independent approval. Current exact Runtime Quality, Security, Python Security, SAST, and CodeQL runs remain queued, so this PR stays Draft/Proposed and is not merge-authorized.
Dismissed as stale exact-head evidence after ordinary-forward convergence. This review is anchored to predecessor 3d03521 / run 36234093075 and explicitly states that no source-backed product finding was synthesized. Current exact d9e3132 has a fresh COMMENT review; queued hosted Checks, coverage, and independent approval remain mandatory.
|
Ready / Proposed admission correction for unchanged exact head |
There was a problem hiding this comment.
Pull request overview
OpenCode reviewed the current-head product diff. Coverage is a separate gate.
Changed files
.github/workflows/codeql-scan-dispatch.yml— GitHub Actions review job.github/workflows/opencode-review-dispatch.yml— GitHub Actions review jobCHANGELOG.d/20260926-dispatch-stale-head-skip.md— repository behaviorCHANGELOG.md— repository behaviordocs/product-technical-gap-baseline.md— operator or user guidancerequirements-strix-ci-hashes.txt— repository behaviorrequirements-strix-ci.txt— repository behaviorscripts/ci/actions_queue_health.py— review and security gate shell pathscripts/ci/actions_queue_health_core.py— review and security gate shell pathtests/test_actions_queue_health_cancelled_before_runner.py— regression suitetests/test_actions_queue_health_post_evidence_retry.py— regression suitetests/test_actions_queue_health_snapshot_consistency.py— regression suitetests/test_actions_queue_health_terminal_preexecution.py— regression suitetests/test_codeql_scan_dispatch_ghas_credential_contract.py— regression suitetests/test_codeql_scan_dispatch_workflow_contract.py— regression suitetests/test_noema_document_review_context.py— regression suitetests/test_noema_review_document_boundaries.py— regression suitetests/test_opencode_agent_contract.py— regression suitetests/test_opencode_review_dispatch_stale_skip.py— regression suitetests/test_organization_commercial_readiness_loop_receipt_contract.py— regression suitetests/test_pr_review_autofix_nvidia_nim_contract.py— regression suitetests/test_pr_review_merge_scheduler.py— regression suitetests/test_strix_runtime_dependencies.py— regression suite
Changed behavior
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow: codeql-scan-dispatch.yml"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow: codeql-scan-dispatch.yml"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["Workflow: opencode-review-dispatch.yml"]
S2 --> I2["GitHub Actions review job"]
I2 --> R2["Review risk: Workflow: opencode-review-dispatch.yml"]
R2 --> V2["actionlint plus required checks"]
Evidence --> S3["Repository file: 20260926-dispatch-stale-head-skip.md"]
S3 --> I3["repository behavior"]
I3 --> R3["Review risk: Repository file: 20260926-dispatch-stale-head-skip.md"]
R3 --> V3["required checks"]
Evidence --> S4["Repository file: CHANGELOG.md"]
S4 --> I4["repository behavior"]
I4 --> R4["Review risk: Repository file: CHANGELOG.md"]
R4 --> V4["required checks"]
Evidence --> S5["Docs: product-technical-gap-baseline.md"]
S5 --> I5["operator or user guidance"]
I5 --> R5["Review risk: Docs: product-technical-gap-baseline.md"]
R5 --> V5["docs review"]
Evidence --> S6["Repository file: requirements-strix-ci-hashes.txt"]
S6 --> I6["repository behavior"]
I6 --> R6["Review risk: Repository file: requirements-strix-ci-hashes.txt"]
R6 --> V6["required checks"]
Evidence --> S7["Repository file: requirements-strix-ci.txt"]
S7 --> I7["repository behavior"]
I7 --> R7["Review risk: Repository file: requirements-strix-ci.txt"]
R7 --> V7["required checks"]
Evidence --> S8["CI script: actions_queue_health.py"]
S8 --> I8["review and security gate shell path"]
I8 --> R8["Review risk: CI script: actions_queue_health.py"]
R8 --> V8["bash -n plus Strix self-test"]
Evidence --> S9["CI script: actions_queue_health_core.py"]
S9 --> I9["review and security gate shell path"]
I9 --> R9["Review risk: CI script: actions_queue_health_core.py"]
R9 --> V9["bash -n plus Strix self-test"]
Evidence --> S10["Test: test_actions_queue_health_cancelled_before_runner.py (14 files)"]
S10 --> I10["regression suite"]
I10 --> R10["Review risk: Test: test_actions_queue_health_cancelled_before_runner.py (14 files)"]
R10 --> V10["targeted test run"]
Findings
No source-backed product finding is synthesized from the coverage gate. A coverage miss belongs in the status comment.
- Head SHA:
d9e31329e2e0361e904aef3072984ec1b4e076cd - Workflow run: 36308944761
- Workflow attempt: 1
- Coverage gate:
failure
Review outcome
Coverage is a gate, not the review. This body reviews the changed product files.
Changed-File Evidence Map
flowchart LR
PR["PR changed files"] --> Evidence["OpenCode bounded evidence"]
Evidence --> S1["Workflow: codeql-scan-dispatch.yml"]
S1 --> I1["GitHub Actions review job"]
I1 --> R1["Review risk: Workflow: codeql-scan-dispatch.yml"]
R1 --> V1["actionlint plus required checks"]
Evidence --> S2["Workflow: opencode-review-dispatch.yml"]
S2 --> I2["GitHub Actions review job"]
I2 --> R2["Review risk: Workflow: opencode-review-dispatch.yml"]
R2 --> V2["actionlint plus required checks"]
Evidence --> S3["Repository file: 20260926-dispatch-stale-head-skip.md"]
S3 --> I3["repository behavior"]
I3 --> R3["Review risk: Repository file: 20260926-dispatch-stale-head-skip.md"]
R3 --> V3["required checks"]
Evidence --> S4["Repository file: CHANGELOG.md"]
S4 --> I4["repository behavior"]
I4 --> R4["Review risk: Repository file: CHANGELOG.md"]
R4 --> V4["required checks"]
Evidence --> S5["Docs: product-technical-gap-baseline.md"]
S5 --> I5["operator or user guidance"]
I5 --> R5["Review risk: Docs: product-technical-gap-baseline.md"]
R5 --> V5["docs review"]
Evidence --> S6["Repository file: requirements-strix-ci-hashes.txt"]
S6 --> I6["repository behavior"]
I6 --> R6["Review risk: Repository file: requirements-strix-ci-hashes.txt"]
R6 --> V6["required checks"]
Evidence --> S7["Repository file: requirements-strix-ci.txt"]
S7 --> I7["repository behavior"]
I7 --> R7["Review risk: Repository file: requirements-strix-ci.txt"]
R7 --> V7["required checks"]
Evidence --> S8["CI script: actions_queue_health.py"]
S8 --> I8["review and security gate shell path"]
I8 --> R8["Review risk: CI script: actions_queue_health.py"]
R8 --> V8["bash -n plus Strix self-test"]
Evidence --> S9["CI script: actions_queue_health_core.py"]
S9 --> I9["review and security gate shell path"]
I9 --> R9["Review risk: CI script: actions_queue_health_core.py"]
R9 --> V9["bash -n plus Strix self-test"]
Evidence --> S10["Test: test_actions_queue_health_cancelled_before_runner.py (14 files)"]
S10 --> I10["regression suite"]
I10 --> R10["Review risk: Test: test_actions_queue_health_cancelled_before_runner.py (14 files)"]
R10 --> V10["targeted test run"]
|
Exact-head admission correction — Ready is review admission only. Fresh audit against base
This PR is moved to Draft/Proposed until the causal owner repair is present on a successor exact head and re-audited. Queued/pending work is neither an additional blocker nor passing evidence. No Close, force push, destructive rebase, manual rerun, synthetic status/approval, merge, auto-merge, or bypass was performed. |
|
Current authority — exact head The prerequisite stack conflict is repaired by published ordinary two-parent convergence commit This exact head is now Ready solely to admit CodeQL and independent review. Its earlier hosted attempts ended before job steps/logs existed, while CodeQL was skipped because the PR was Draft. Terminal exact-head GREEN Checks and qualifying independent approval remain merge gates. No rerun, merge, auto-merge, dismissal, protection bypass, Force Push, destructive rebase, or Close was performed. |
|
Exact-head runner-admission evidence — #2382 The Ready transition generated a fresh event generation without any new commit:
This reproduces the same pre-execution admission defect on the unchanged exact head. No source step ran, so it is not a product/test finding and does not justify Draft. It remains a merge blocker because it is not passing evidence. No rerun, wake-only commit, bypass, merge, or auto-merge was used. |
이 CHANGES_REQUESTED는 predecessor d9e31329e2e0361e904aef3072984ec1b4e076cd / run 36308944761에 고정되어 있고 review 본문 자체가 source-backed product finding이 없다고 명시합니다. 현재 exact head e1257f7070f5d3e31855851c44b9f62a1a7f4934는 ordinary-forward convergence와 새 exact-head 검증을 갖습니다. 이 dismiss는 승인이나 merge 우회가 아니며, 최신 hosted Checks와 qualifying independent approval은 계속 별도 merge gate입니다.
seonghobae
left a comment
There was a problem hiding this comment.
Exact-head COMMENT for e1257f7070f5d3e31855851c44b9f62a1a7f4934.
Fresh Ready admission on 2026-10-07 produced terminal pre-execution failures: SAST run 37570713438 job 112628455724; CodeQL run 37570713441 detect job 112628455657; Python Security run 37570713440 detect job 112628455998; Security run 37570713424 jobs 112628455790 and 112628455900. Each failing job has steps=null and logs_url=null; dependent jobs were skipped. This is runner/admission evidence, not a source finding, so no blind rerun or wake commit is justified.
The only CHANGES_REQUESTED review was anchored to predecessor d9e31329… and explicitly said no source-backed product finding existed. It is now dismissed as stale after the ordinary-forward convergence. This dismissal is neither approval nor merge authorization.
Current state: Ready / Proposed / merge HOLD; mechanically mergeable, zero unresolved threads, zero qualifying approvals, and no terminal exact-head GREEN required Checks.
|
Exact-head repair published at RCA: proven head ancestry was evaluated before stable base/ref identity, so a moved head plus changed base SHA could exit 0 as stale. RED @coderabbitai review Ready / Proposed / merge HOLD until this exact head has source-executing terminal GREEN required Checks, no actionable unresolved review, and qualifying independent approval. |
|
|
Fresh exact-head hosted admission for |
seonghobae
left a comment
There was a problem hiding this comment.
Exact-head COMMENT for e6eb1eb4564e3fb1f754a91b51161033d7ced1b1 (not approval).
Independent three-dot review of the new effective delta found no additional source-backed finding. The repair correctly validates live base ref, base SHA, and head ref before allowing the strict-ancestor moved-head retirement exception in both CodeQL and OpenCode dispatch paths. Focused independent verification passed 116 tests normally and 116 with GITHUB_ACTIONS=true; git diff --check passed. These are an independent subset of the broader 132-passed author evidence already bound in the PR body.
Exact-head hosted admission remains failed before executable steps: Runtime Quality 37599526918/112720207385, CodeQL 37599526923/112720207358, SAST 37599527089/112720208201, Python Security 37599526953/112720208129, and Security 37599527117/112720208668,112720208975 all reported steps=null and logs_url=null; dependents skipped. There are zero unresolved threads and zero qualifying approvals. Ready remains review admission only: merge HOLD, with no blind rerun, bypass, auto-merge, or merge.
Current authority — 2026-10-07
Ready / Proposed for review admission at exact head
e6eb1eb4564e3fb1f754a91b51161033d7ced1b1. This is not merge authorization.Ordinary-forward convergence
main@7554587c2e3106a388998bcad048a3d7121de25ed9e31329e2e0361e904aef3072984ec1b4e076cdca3fe966c0508a0274be7435ad4642756db2ac49d7d82dbf23abd03e9fa2a073053219114934138ff7de3e2ce5d7d5e8a4937d39b99856a03624fab4e6eb1eb4564e3fb1f754a91b51161033d7ced1b1645a80c2e9cf9bb4f94cb765b000d14c8d18536aRoot cause and repair
A moved PR head whose compare result proved strict ancestry was retired before the validator checked the live base SHA/ref and head ref. A payload could therefore combine a genuinely superseded head with unrelated identity drift and exit successfully as stale.
Both CodeQL and OpenCode validators now:
Closed-PR retirement, authorization, lookup-failure, API-lag, divergence, and non-dispatch behavior remain covered. The reviewed OpenCode workflow blob pin is
5e609e0699cedb9aeeb0158d28e66dd4e4da8fca.Exact-tree verification
GITHUB_ACTIONS=true: 132 passed, 1 skipped.Hosted evidence and merge hold
Fresh exact-head admission again failed before any executable step was created:
37599526918, job11272020738537599526923, detect job11272020735837599527089, job11272020820137599526953, detect job11272020812937599527117, gitleaks job112720208668and scope job112720208975Every failing job reports
steps=nullandlogs_url=null; dependent jobs were skipped. This is fresh exact-head runner/admission evidence, not a source finding, and no blind rerun is justified. There are zero unresolved review threads and zero qualifying approvals.Ready / Proposed / merge HOLD. Ready admits review; terminal exact-head GREEN Checks, no unresolved actionable review, and a qualifying independent approval remain merge gates. No bypass, auto-merge, or merge is authorized.
Stack note
Open PR #2363 also edits
opencode-review-dispatch.ymland its immutable pin. It must be reconciled non-destructively against whichever canonical owner state lands first.Summary by CodeRabbit