diff --git a/.github/workflows/opencode-review.yml b/.github/workflows/opencode-review.yml index e73a7a0000..bb2ccfdb74 100644 --- a/.github/workflows/opencode-review.yml +++ b/.github/workflows/opencode-review.yml @@ -327,6 +327,8 @@ jobs: HEAD_SHA: ${{ github.event.pull_request.head.sha }} PR_DRAFT: ${{ github.event.pull_request.draft }} BASE_BRANCH: ${{ github.event.pull_request.base.ref }} + BASE_SHA: ${{ github.event.pull_request.base.sha }} + HEAD_REF: ${{ github.event.pull_request.head.ref }} WORKFLOW_SHA: ${{ github.workflow_sha }} run: | set -euo pipefail @@ -411,8 +413,12 @@ jobs: jq -cn \ --arg target_repository "$TARGET_REPOSITORY" \ --arg pr_number "$PR_NUMBER" \ - --arg base_branch "$BASE_BRANCH" \ - '{event_type:"merge-scheduler",client_payload:{target_repository:$target_repository,pr_number:$pr_number,base_branch:$base_branch,max_prs:"1",review_dispatch_limit:"1",trigger_reviews:true,enable_auto_merge:false,update_branches:false,dry_run:false}}' | + --arg pr_base_ref "$BASE_BRANCH" \ + --arg pr_base_sha "$BASE_SHA" \ + --arg pr_head_ref "$HEAD_REF" \ + --arg pr_head_sha "$HEAD_SHA" \ + --arg required_run_id "$GITHUB_RUN_ID" \ + '{event_type:"opencode-review",client_payload:{target_repository:$target_repository,pr_number:$pr_number,pr_base_ref:$pr_base_ref,pr_base_sha:$pr_base_sha,pr_head_ref:$pr_head_ref,pr_head_sha:$pr_head_sha,required_run_id:$required_run_id}}' | GH_TOKEN="$app_token" gh api -X POST repos/ContextualWisdomLab/.github/dispatches --input - - name: Fail closed without a current-head OpenCode verdict diff --git a/tests/test_required_workflow_queue_contract.py b/tests/test_required_workflow_queue_contract.py index 5b0e993a5e..4a1f717f42 100644 --- a/tests/test_required_workflow_queue_contract.py +++ b/tests/test_required_workflow_queue_contract.py @@ -211,6 +211,25 @@ def test_privileged_review_retries_use_default_branch_repository_dispatch() -> N assert '"gh",\n "workflow",\n "run"' not in autofix_scheduler +def test_required_opencode_dispatch_does_not_wait_on_merge_scheduler() -> None: + """Dispatch review execution directly so polling cannot starve its producer.""" + workflow = workflow_text("opencode-review.yml") + dispatch = workflow_step(workflow, "Request current-head OpenCode review execution") + + assert 'event_type:"opencode-review"' in dispatch + assert 'event_type:"merge-scheduler"' not in dispatch + assert 'required_run_id:$required_run_id' in dispatch + for field in ( + "target_repository", + "pr_number", + "pr_base_ref", + "pr_base_sha", + "pr_head_ref", + "pr_head_sha", + ): + assert f"{field}:${field}" in dispatch + + def test_no_central_workflow_exposes_branch_selected_manual_dispatch() -> None: """Every central manual entrypoint must load code from the default branch.""" workflow_files = sorted((REPO_ROOT / ".github" / "workflows").glob("*.yml"))