What happened
PR #6590 was opened 2026-08-25 from fork guyoron1/fullsend. Three workflow runs fired over 12 days:
- Run 32844079832 (Aug 25,
opened): Route step logged ISSUE_IS_PR: false, concluded "No stage matched — skipping dispatch."
- Run 33504286930 (Sep 1,
ready_for_review): Same ISSUE_IS_PR: false, same skip.
- 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:
- Set
ISSUE_IS_PR=true unconditionally when GITHUB_EVENT_NAME is pull_request_target or pull_request_review, or
- 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
What happened
PR #6590 was opened 2026-08-25 from fork
guyoron1/fullsend. Three workflow runs fired over 12 days:opened): Route step loggedISSUE_IS_PR: false, concluded "No stage matched — skipping dispatch."ready_for_review): SameISSUE_IS_PR: false, same skip.submitted): SameISSUE_IS_PR: false, plus harness dispatch hit a permission lookup failure forqodo-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.ymland.github/workflows/reusable-review.yml— the dispatch infrastructure itself — with zero fullsend review coverage.What could go better
The
ISSUE_IS_PRvariable is computed asfalseforpull_request_targetevents from forks. Since the Route step's stage-matching branches forpull_request_targetcheckISSUE_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-testlabel) for fork PR dispatch. However, ifISSUE_IS_PRremainsfalsefor 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: falsecomputation is likely the same mechanism.Confidence: High that
ISSUE_IS_PR: falseis 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 onISSUE_IS_PR.Proposed change
Investigate the
ISSUE_IS_PRcomputation in the Route step of.github/workflows/fullsend.yaml(or the reusable workflow that defines the route job). Forpull_request_targetevents, the event is always a PR by definition —ISSUE_IS_PRshould betrueregardless of whether the PR comes from a fork. The likely fix is either:ISSUE_IS_PR=trueunconditionally whenGITHUB_EVENT_NAMEispull_request_targetorpull_request_review, orISSUE_IS_PRto 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_targetevents from fork PRs should showISSUE_IS_PR: truein 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 tofullsend-ai/fullsendor any enrolled repo that previously showed theISSUE_IS_PR: false/ "No stage matched" pattern.Generated by retro agent from #6590