Skip to content

Route step computes ISSUE_IS_PR=false for fork pull_request_target events, silently blocking all agent dispatch #7054

Description

@fullsend-ai-retro

What happened

PR #6590 was opened 2026-08-25 from fork guyoron1/fullsend. Three workflow runs fired over 12 days:

  1. Run 32844079832 (Aug 25, opened): Route step logged ISSUE_IS_PR: false, concluded "No stage matched — skipping dispatch."
  2. Run 33504286930 (Sep 1, ready_for_review): Same ISSUE_IS_PR: false, same skip.
  3. Run 33504592708 (Sep 1, Qodo review submitted): Same ISSUE_IS_PR: false, plus harness dispatch hit a permission lookup failure for qodo-code-review[bot].

No fullsend review agent was ever dispatched. The only review came from Qodo, which found 3 high-severity correctness bugs. The PR modified .github/workflows/reusable-dispatch.yml and .github/workflows/reusable-review.yml — the dispatch infrastructure itself — with zero fullsend review coverage.

What could go better

The ISSUE_IS_PR variable is computed as false for pull_request_target events from forks. Since the Route step's stage-matching branches for pull_request_target check ISSUE_IS_PR, the event never matches any stage and dispatch is silently skipped.

This is an upstream blocker that operates before the authorization check (is_event_actor_authorized). Existing issues #2967 and #4374 propose authorization-based solutions (org membership, ok-to-test label) for fork PR dispatch. However, if ISSUE_IS_PR remains false for forks, those authorization checks may never be reached — the route step exits at stage-matching before evaluating actor authorization.

Issue #6796 describes a 14-day dispatch delay on a fork PR in another repo with "unclear root cause." The ISSUE_IS_PR: false computation is likely the same mechanism.

Confidence: High that ISSUE_IS_PR: false is the proximate cause of the dispatch skip — three runs on the same PR all show the same variable value and the same skip outcome. Moderate confidence that this blocks #2967/#4374, since I have not read the route script source to verify the exact control flow — the authorization check might be in a separate branch that does not depend on ISSUE_IS_PR.

Proposed change

Investigate the ISSUE_IS_PR computation in the Route step of .github/workflows/fullsend.yaml (or the reusable workflow that defines the route job). For pull_request_target events, the event is always a PR by definition — ISSUE_IS_PR should be true regardless of whether the PR comes from a fork. The likely fix is either:

  1. Set ISSUE_IS_PR=true unconditionally when GITHUB_EVENT_NAME is pull_request_target or pull_request_review, or
  2. Fix the API lookup that derives ISSUE_IS_PR to correctly resolve fork PR numbers against the base repo.

This fix is a prerequisite for any trust-gated fork PR dispatch (#2967, #4374). Without it, the authorization layer is never reached. The fix itself does not need to enable unrestricted fork PR dispatch — it just needs to let the route step proceed to the authorization checks that decide whether dispatch is safe.

Validation criteria

After the fix, pull_request_target events from fork PRs should show ISSUE_IS_PR: true in the Route step logs. The route step should proceed to stage-matching and authorization checks (which may still correctly block dispatch pending implementation of #2967 or #4374). Verify on the next 3 fork PRs to fullsend-ai/fullsend or any enrolled repo that previously showed the ISSUE_IS_PR: false / "No stage matched" pattern.


Generated by retro agent from #6590

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugcomponent/dispatchWorkflow dispatch and triggerspriority/lowNice to have, address when convenientready-for-triageTriggers triage agent dispatchtriagedTriaged but awaiting human prioritizationtype/bugConfirmed defect in existing behavior

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions