Skip to content

fix(#2298): remove retro/prioritize→fullsend role mapping in dispatch - #2781

Merged
waynesun09 merged 2 commits into
mainfrom
fix-2298-dispatch-retro-prioritize
Jul 1, 2026
Merged

fix(#2298): remove retro/prioritize→fullsend role mapping in dispatch#2781
waynesun09 merged 2 commits into
mainfrom
fix-2298-dispatch-retro-prioritize

Conversation

@waynesun09

@waynesun09 waynesun09 commented Jun 30, 2026

Copy link
Copy Markdown
Member

Summary

  • Remove the retro|prioritize) STAGE_ROLE="fullsend" mapping from the role-check step in both dispatch workflows (reusable-dispatch.yml and scaffold dispatch.yml)
  • In per-repo mode, PerRepoDefaultRoles() includes retro and prioritize directly but excludes fullsend, so the remapping caused these stages to be silently skipped — and required the fullsend-ai-fullsend app to be installed even in per-repo mode
  • Add backward-compat fallback: when retro/prioritize is not in the roles list but fullsend is, allow the stage with a ::notice:: annotation — preserves org-mode configs that used fullsend as an umbrella role
  • Update docs: clarify that the fullsend dispatch app is only required for org-mode installations; per-repo mode no longer needs it
  • Add TestRoleCheckCaseBranches to guard against regression

Test plan

  • make lint passes
  • make go-test passes (new TestRoleCheckCaseBranches covers both workflows)
  • Verify in a per-repo installation (e.g., fullsend-playground/hello-pages) that /fs-retro dispatches correctly with default roles
  • Verify org-mode installations are unaffected (retro/prioritize still work with fullsend in defaults.roles)

Fixes #2298

@qodo-code-review

qodo-code-review Bot commented Jun 30, 2026

Copy link
Copy Markdown

PR Summary by Qodo

Fix dispatch role-check: stop remapping retro/prioritize to fullsend

🐞 Bug fix 📝 Documentation 🧪 Tests 🕐 20-40 Minutes

Grey Divider

AI Description

• Stop remapping retro/prioritize stages to the fullsend role in dispatch workflows.
• Keep org-mode compatibility by allowing retro/prioritize when fullsend is configured.
• Update getting-started docs and add tests to lock in role-check behavior.
Diagram

graph TD
  A["Dispatch workflow"] --> B["Compute STAGE_ROLE"] --> C["Load configured roles"] --> D{"Role check passes?"}
  D -->|"Yes"| E["Run stage"]
  D -->|"No"| F{"Stage is retro/prioritize AND roles contain fullsend?"}
  F -->|"Yes"| G["Allow + ::notice::"] --> E
  F -->|"No"| H["Skip + set output"]

  subgraph Legend
    direction LR
    _flow["Step"] ~~~ _dec{"Decision"}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Normalize roles at config-load time
  • ➕ Centralizes aliasing/compat logic (e.g., expand fullsend to include retro/prioritize)
  • ➕ Keeps workflow step simpler and avoids duplicating logic across templates
  • ➖ Harder to implement in pure workflow bash without introducing more parsing/templating
  • ➖ Still needs deprecation messaging somewhere (docs or notices)
2. Hard deprecate `fullsend` umbrella role (no compat)
  • ➕ Simplest runtime logic; fewer branches to reason about
  • ➕ Forces org-mode configs to converge quickly on explicit roles
  • ➖ Breaking change for existing org-mode installs relying on fullsend
  • ➖ Would likely increase support load and require coordinated migration guidance

Recommendation: Keep the PR’s approach: treat retro/prioritize as direct roles (fixing per-repo defaults) while preserving org-mode behavior via a narrow fullsend-compat branch that emits a ::notice:: for auditability. This is the best balance of correctness, backwards compatibility, and operational visibility.

Files changed (5) +71 / -10

Bug fix (2) +16 / -8
reusable-dispatch.ymlFix stage role gating and add org-mode compat notice +8/-4

Fix stage role gating and add org-mode compat notice

• Removes the 'retro|prioritize -> fullsend' role remap so role checks reflect the actual stage roles. Adds a backward-compat allowance when 'fullsend' is present in roles, emitting a '::notice::' when that path is used.

.github/workflows/reusable-dispatch.yml

dispatch.ymlAlign scaffold dispatch role gating with reusable workflow +8/-4

Align scaffold dispatch role gating with reusable workflow

• Removes the 'retro|prioritize -> fullsend' remap and adds the same org-mode compatibility logic with notice logging. Ensures generated per-repo workflows behave consistently with the reusable workflow.

internal/scaffold/fullsend-repo/.github/workflows/dispatch.yml

Tests (1) +44 / -0
workflow_call_alignment_test.goAdd tests for role-check mapping and compat behavior +44/-0

Add tests for role-check mapping and compat behavior

• Introduces 'TestRoleCheckCaseBranches' to verify 'code|fix -> coder', ensure retro/prioritize are not remapped to fullsend, and require a '::notice::' when the compat path ('fullsend' implies retro/prioritize) is used.

internal/scaffold/workflow_call_alignment_test.go

Documentation (2) +11 / -2
configuring-github.mdClarify per-repo app requirements (fullsend app not needed) +6/-2

Clarify per-repo app requirements (fullsend app not needed)

• Updates the GitHub Apps table and guidance to clarify that the 'fullsend' dispatch app is only required for organization-mode. Explains that per-repo mode uses the repository shim workflow for dispatch.

docs/guides/getting-started/configuring-github.md

org-mode.mdDocument fullsend dispatch app requirement for org-mode +5/-0

Document fullsend dispatch app requirement for org-mode

• Adds explicit installation instructions for the 'fullsend-ai-fullsend' dispatch app and notes its role in cross-repo routing for organization-mode installs.

docs/guides/getting-started/org-mode.md

@github-actions

github-actions Bot commented Jun 30, 2026

Copy link
Copy Markdown

Site preview

Preview: https://0156b02f-site.fullsend-ai.workers.dev

Commit: dbca7312dde4305f1bd57c702569be28e4078d83

@fullsend-ai-review

fullsend-ai-review Bot commented Jun 30, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:05 PM UTC · Completed 3:25 PM UTC
Commit: d8eb586 · View workflow run →

@codecov

codecov Bot commented Jun 30, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

@qodo-code-review

qodo-code-review Bot commented Jun 30, 2026

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (0) 📘 Rule violations (0) 📎 Requirement gaps (0) 📜 Skill insights (1)

Context used
✅ Compliance rules (platform): 61 rules

Grey Divider


Action required

1. Prioritize missing project number ✗ Dismissed 🐞 Bug ≡ Correctness
Description
After the remap removal, per-repo /fs-prioritize will pass the role gate as role prioritize, but
the per-repo shim does not pass project_number, so the prioritize workflow reaches
post-prioritize.sh with empty PROJECT_NUMBER and exits 1. This turns the previous silent-skip
behavior into a hard workflow failure for default per-repo role sets that include prioritize.
Code

.github/workflows/reusable-dispatch.yml[R366-371]

          STAGE_ROLE="$STAGE"
          case "$STAGE" in
            code|fix) STAGE_ROLE="coder" ;;
-            retro|prioritize) STAGE_ROLE="fullsend" ;;
          esac
          ROLES=$(yq '.roles[]' .fullsend/config.yaml 2>/dev/null || echo "")
          if [[ -n "$ROLES" ]] && ! echo "$ROLES" | grep -Fqx "$STAGE_ROLE"; then
Relevance

⭐⭐⭐ High

Prioritize workflow already threads project_number; team fixes dispatch correctness issues (PR
#1917).

PR-#1917

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The per-repo shim does not provide project_number, so reusable-dispatch.yml passes an empty
string to reusable-prioritize.yml. That workflow converts the empty input into PROJECT_NUMBER,
and post-prioritize.sh immediately exits with an error when PROJECT_NUMBER is unset/empty.

.github/workflows/reusable-dispatch.yml[53-58]
internal/scaffold/fullsend-repo/templates/shim-per-repo.yaml[40-55]
.github/workflows/reusable-dispatch.yml[531-547]
.github/workflows/reusable-prioritize.yml[24-30]
.github/workflows/reusable-prioritize.yml[134-141]
internal/scaffold/fullsend-repo/.github/scripts/setup-agent-env.sh[12-22]
internal/scaffold/fullsend-repo/scripts/post-prioritize.sh[19-22]
internal/config/config.go[166-171]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
Per-repo installs can now dispatch the `prioritize` stage (because the role-gate no longer remaps `prioritize`→`fullsend`), but the per-repo shim does not pass a project number into `reusable-dispatch.yml`. `reusable-prioritize.yml` maps `inputs.project_number` into `PROJECT_NUMBER` and the prioritize post-script hard-requires `PROJECT_NUMBER`, so `/fs-prioritize` will fail at runtime.

## Issue Context
- `reusable-dispatch.yml` defines `project_number` as an optional input with default `""`, and threads it into the prioritize job.
- The per-repo shim template (`shim-per-repo.yaml`) does not pass `project_number`, so it remains empty.
- `reusable-prioritize.yml` maps `inputs.project_number` → `PRIORITIZE_PROJECT_NUMBER` and `setup-agent-env.sh` strips the `PRIORITIZE_` prefix, producing `PROJECT_NUMBER`.
- `post-prioritize.sh` exits non-zero if `PROJECT_NUMBER` is unset/empty.

## Fix Focus Areas
- .github/workflows/reusable-dispatch.yml[53-58]
- .github/workflows/reusable-dispatch.yml[356-376]
- .github/workflows/reusable-dispatch.yml[531-548]
- internal/scaffold/fullsend-repo/templates/shim-per-repo.yaml[40-55]

## Suggested fix
1) Update the per-repo shim template to pass `project_number: ${{ vars.FULLSEND_PROJECT_NUMBER }}` into `__REUSABLE_DISPATCH__`.
2) Add a guard in `reusable-dispatch.yml` so when `STAGE == prioritize` and `inputs.project_number` is empty, it emits a `::notice::` and sets `skipped=true` (similar to the existing role-check skip), preventing the prioritize job from running and failing.
  - This keeps `project_number` optional globally, but makes the failure mode explicit and non-fatal when it’s not configured.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

2. Empty roles bypass gate ✗ Dismissed 🐞 Bug ⛨ Security
Description
The role gate only runs when the extracted ROLES string is non-empty, so a config with roles: []
(or defaults.roles: []) will allow all stages instead of blocking all roles.
This contradicts the documented semantics that omitted roles are not dispatched and can
unintentionally enable higher-risk stages (retro/prioritize).
Code

.github/workflows/reusable-dispatch.yml[R370-371]

          ROLES=$(yq '.roles[]' .fullsend/config.yaml 2>/dev/null || echo "")
          if [[ -n "$ROLES" ]] && ! echo "$ROLES" | grep -Fqx "$STAGE_ROLE"; then
-            echo "::notice::Stage '$STAGE' skipped — role '$STAGE_ROLE' not in configured roles"
-            echo "skipped=true" >> "${GITHUB_OUTPUT}"
-            exit 0
Relevance

⭐⭐⭐ High

Team has prior fail-closed security fixes; PR fullsend-ai/fullsend#792 accepted “empty allowlist must deny”, and PR
#1022 spec expects empty roles skip all.

PR-#792
PR-#1022

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
Both workflows use [[ -n "$ROLES" ]] to decide whether to enforce the allowlist; yq '.roles[]'
produces an empty string for an empty list, so gating is skipped. Documentation states that omitted
roles are not dispatched, implying an empty allowlist should block all stages.

.github/workflows/reusable-dispatch.yml[360-380]
internal/scaffold/fullsend-repo/.github/workflows/dispatch.yml[340-362]
docs/guides/infrastructure/private-repositories.md[54-72]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The dispatch role gate is guarded by `[[ -n "$ROLES" ]]`, which means an explicitly empty roles list (`roles: []` / `defaults.roles: []`) skips gating and allows any stage to proceed.

### Issue Context
`yq '.roles[]'` / `yq '.defaults.roles[]'` outputs nothing for an empty YAML array, so the `-n` check is false even though the roles key is present and intentionally empty.

### Fix Focus Areas
- .github/workflows/reusable-dispatch.yml[366-381]
- internal/scaffold/fullsend-repo/.github/workflows/dispatch.yml[347-363]

### Suggested fix approach
- Distinguish between “roles key missing” vs “roles key present but empty”. For example:
 - `HAS_ROLES=$(yq 'has("roles")' .fullsend/config.yaml)` (or `has("defaults") and .defaults | has("roles")` for org-mode), and `ROLES=$(yq -r '.roles[]?' ...)`.
 - If roles key is present and the stage role is not found (including the empty-list case), set `skipped=true` and `exit 0`.
- Keep the existing fullsend→(retro|prioritize) compat allowance on top of the corrected gating behavior.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Prose procedure lacks numbering ✗ Dismissed 📜 Skill insight ✧ Quality
Description
The updated guide text instructs the reader to perform an installation action in prose without
numbered steps. This conflicts with the requirement that procedural content be expressed as numbered
steps.
Code

docs/guides/getting-started/configuring-github.md[R18-20]

+Install the following agent applications to your organization
and provide them permissions to the repository you want to install Fullsend to.
Relevance

⭐⭐⭐ High

Docs review history enforces numbered steps for procedures (accepted in PRs fullsend-ai/fullsend#2663, fullsend-ai/fullsend#2277).

PR-#2663
PR-#2277

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The guide's changed lines contain procedural instructions (install and grant permissions) but are
not presented as an ordered list of steps, contrary to the documentation procedure format
requirement.

docs/guides/getting-started/configuring-github.md[18-20]
Skill: writing-user-docs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The "Installing GitHub Applications" procedure is written as prose instructions; procedural content must use numbered steps.

## Issue Context
This PR modified the installation instruction lines, so this section should be updated to comply with the procedure formatting rule.

## Fix Focus Areas
- docs/guides/getting-started/configuring-github.md[18-20]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Informational

4. Guide not in admin/user 📜 Skill insight ⌂ Architecture
Description
docs/guides/getting-started/configuring-github.md is a guide file that lives outside
docs/guides/admin/ or docs/guides/user/, which violates the required guide directory structure.
This makes it unclear which audience the guide targets and breaks the docs organization standard.
Code

docs/guides/getting-started/configuring-github.md[R18-32]

+Install the following agent applications to your organization
and provide them permissions to the repository you want to install Fullsend to.

| Role | Installation URL |
|------|-----------------|
-| fullsend | <https://github.com/apps/fullsend-ai-fullsend/installations/new> |
| triage | <https://github.com/apps/fullsend-ai-triage/installations/new> |
| coder | <https://github.com/apps/fullsend-ai-coder/installations/new> |
| review | <https://github.com/apps/fullsend-ai-review/installations/new> |
| retro | <https://github.com/apps/fullsend-ai-retro/installations/new> |
| prioritize | <https://github.com/apps/fullsend-ai-prioritize/installations/new> |

+> **Note:** The `fullsend` dispatch app (`fullsend-ai-fullsend`) is only
+> required for [organization-mode](org-mode.md) installations. Per-repo
+> mode uses the repository's own shim workflow for dispatch and does not
+> need the `fullsend` app.
Relevance

⭐ Low

Repo intentionally has docs/guides/getting-started section; not limited to admin/user (PRs fullsend-ai/fullsend#2124,
#2698).

PR-#2124
PR-#2698

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The checklist requires every guide under docs/guides/ to be located in either the admin/ or
user/ subdirectory. The modified guide is located at
docs/guides/getting-started/configuring-github.md, which is neither admin/ nor user/.

docs/guides/getting-started/configuring-github.md[18-32]
Skill: writing-user-docs

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
`docs/guides/getting-started/configuring-github.md` is under `docs/guides/getting-started/`, but guides must live under either `docs/guides/admin/` or `docs/guides/user/` and target a single audience.

## Issue Context
This PR modifies the guide, so it must conform to the current guide directory/audience rules.

## Fix Focus Areas
- docs/guides/getting-started/configuring-github.md[18-32]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment thread docs/guides/getting-started/configuring-github.md
Comment thread .github/workflows/reusable-dispatch.yml
@fullsend-ai-review

fullsend-ai-review Bot commented Jun 30, 2026

Copy link
Copy Markdown

Review

Findings

Medium

Previous run

Review

Findings

Medium

Previous run

Review

Findings

Medium

  • [protected-path] .github/workflows/reusable-dispatch.yml — This file is under the .github/ protected path. The PR links to issue dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 and the description explains the rationale for the change. Human approval is always required for protected-path changes regardless of context.

  • [scope-creep] .github/workflows/reusable-dispatch.yml:372 — The PR adds a backward-compatibility fallback (lines 372–376 in both dispatch workflows) that preserves the fullsend role as an implicit alias for retro/prioritize. While the case branch is removed as dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 requests, the compat block introduces new behavior not explicitly authorized by the issue. The compat logic is a reasonable migration aid — without it, org-mode installations listing only fullsend in roles would silently lose retro/prioritize — but the gradual migration strategy should be acknowledged in the issue or PR description. Consider adding a TODO comment with a removal target (e.g., after org-mode deprecation per ADR 0044).


Labels: PR modifies dispatch workflow routing and includes documentation updates


Labels: PR modifies dispatch workflow routing logic and getting-started documentation


Labels: PR modifies dispatch workflow routing and getting-started documentation


Labels: PR modifies dispatch workflow routing and getting-started documentation

Previous run

Review

Findings

Medium


Labels: PR modifies dispatch workflow routing logic and getting-started documentation

Previous run (2)

Review

Findings

Medium

  • [protected-path] .github/workflows/reusable-dispatch.yml — This file is under the .github/ protected path. The PR links to issue dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 and the description explains the rationale for the change. Human approval is always required for protected-path changes regardless of context.

  • [scope-creep] .github/workflows/reusable-dispatch.yml:372 — The PR adds a backward-compatibility fallback (lines 372–376 in both dispatch workflows) that preserves the fullsend role as an implicit alias for retro/prioritize. While the case branch is removed as dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 requests, the compat block introduces new behavior not explicitly authorized by the issue. The compat logic is a reasonable migration aid — without it, org-mode installations listing only fullsend in roles would silently lose retro/prioritize — but the gradual migration strategy should be acknowledged in the issue or PR description. Consider adding a TODO comment with a removal target (e.g., after org-mode deprecation per ADR 0044).


Labels: PR modifies dispatch workflow routing and includes documentation updates

Previous run (3)

Review

Findings

Medium

  • [protected-path] .github/workflows/reusable-dispatch.yml — This file is under the .github/ protected path. The PR links to issue dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 and the description explains the rationale for the change. Human approval is always required for protected-path changes regardless of context.

  • [scope-creep] .github/workflows/reusable-dispatch.yml:372 — The PR adds a backward-compatibility fallback (lines 372–376 in both dispatch workflows) that preserves the fullsend role as an implicit alias for retro/prioritize. While the case branch is removed as dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 requests, the compat block introduces new behavior not explicitly authorized by the issue. The compat logic is a reasonable migration aid — without it, org-mode installations listing only fullsend in roles would silently lose retro/prioritize — but the gradual migration strategy should be acknowledged in the issue or PR description. Consider adding a TODO comment with a removal target (e.g., after org-mode deprecation per ADR 0044).

Previous run (4)

Review

Findings

Medium

Low

  • [stale-reference] docs/superpowers/plans/2026-05-15-silent-skip-unconfigured-roles.md — Implementation plan document contains four instances of the now-removed retro|prioritize) STAGE_ROLE="fullsend" mapping (lines 34, 57, 136, 161). These appear in code blocks showing the workflow YAML at the time the plan was executed. The plan is a historical record so this is low-severity, but could be annotated with a reference to this PR for clarity.

  • [implementation-plan-outdated] docs/superpowers/specs/2026-05-15-silent-skip-unconfigured-roles-design.md — Design spec references the old fullsend role behavior for retro/prioritize stages. As a historical design document, this reflects the state at the time it was written.


Labels: PR modifies dispatch workflow routing and includes documentation updates

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment component/dispatch Workflow dispatch and triggers component/docs User-facing documentation type/bug Confirmed defect in existing behavior labels Jun 30, 2026
@waynesun09
waynesun09 force-pushed the fix-2298-dispatch-retro-prioritize branch from d8eb586 to cbab251 Compare June 30, 2026 15:51
@fullsend-ai-review

fullsend-ai-review Bot commented Jun 30, 2026

Copy link
Copy Markdown

🤖 Finished Review · ❌ Failure · Started 3:54 PM UTC · Completed 4:01 PM UTC
Commit: cbab251 · View workflow run →

@waynesun09
waynesun09 marked this pull request as draft June 30, 2026 16:41

@ralphbean ralphbean left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM. A couple non-blocking notes inline.

Comment thread docs/guides/getting-started/configuring-github.md
Comment thread .github/workflows/reusable-dispatch.yml
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 1, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:13 PM UTC · Ended 3:20 PM UTC
Commit: f417572 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 1, 2026

Copy link
Copy Markdown

🤖 Review · ❌ Terminated · Started 3:23 PM UTC · Ended 3:36 PM UTC
Commit: f417572 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed requires-manual-review Review requires human judgment labels Jul 1, 2026
@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:23 PM UTC · Completed 3:36 PM UTC
Commit: 644597e · View workflow run →

@waynesun09
waynesun09 marked this pull request as ready for review July 1, 2026 15:41
@waynesun09
waynesun09 requested a review from a team as a code owner July 1, 2026 15:41
@waynesun09
waynesun09 force-pushed the fix-2298-dispatch-retro-prioritize branch from 644597e to dd83093 Compare July 1, 2026 15:43
@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed requires-manual-review Review requires human judgment labels Jul 1, 2026
@fullsend-ai-review

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:46 PM UTC · Completed 3:56 PM UTC
Commit: dd83093 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 1, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 4:47 PM UTC · Ended 4:54 PM UTC
Commit: f417572 · View workflow run →

Remove the `retro|prioritize) STAGE_ROLE="fullsend"` mapping from
the role-check step in both dispatch workflows. In per-repo mode,
`PerRepoDefaultRoles()` includes retro and prioritize directly but
excludes fullsend, so the remapping caused these stages to be
silently skipped.

Add backward-compat fallback: when retro/prioritize is not in the
roles list but "fullsend" is, allow the stage through. This preserves
org-mode configs that used fullsend as an umbrella role.

Update docs: the fullsend dispatch app is only required for org-mode
installations — per-repo mode no longer maps retro/prioritize to the
fullsend role, so the app is not needed.

Fixes #2298

Assisted-by: Claude (fix), Gemini (review)
Signed-off-by: Wayne Sun <gsun@redhat.com>
The backward-compat path that allows retro/prioritize stages when
"fullsend" is in roles was silently passing via no-op. Emit a
::notice:: annotation so operators can audit which path was taken
during migration from the fullsend catch-all role.

Add TestRoleCheckCaseBranches to validate:
- code|fix maps to coder
- retro/prioritize are not remapped to fullsend
- compat path emits a ::notice::

Assisted-by: Claude
Signed-off-by: Wayne Sun <gsun@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 1, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:57 PM UTC · Completed 5:08 PM UTC
Commit: dbca731 · View workflow run →

@fullsend-ai-review fullsend-ai-review Bot added requires-manual-review Review requires human judgment and removed requires-manual-review Review requires human judgment labels Jul 1, 2026
@waynesun09
waynesun09 added this pull request to the merge queue Jul 1, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 1, 2026
@waynesun09
waynesun09 added this pull request to the merge queue Jul 1, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 1, 2026
@waynesun09
waynesun09 added this pull request to the merge queue Jul 1, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 1, 2026
@waynesun09
waynesun09 added this pull request to the merge queue Jul 1, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Jul 1, 2026
@waynesun09
waynesun09 added this pull request to the merge queue Jul 1, 2026
Merged via the queue into main with commit 5638def Jul 1, 2026
19 checks passed
@waynesun09
waynesun09 deleted the fix-2298-dispatch-retro-prioritize branch July 1, 2026 19:20
@fullsend-ai-retro

fullsend-ai-retro Bot commented Jul 1, 2026

Copy link
Copy Markdown

🤖 Finished Retro · ✅ Success · Started 7:24 PM UTC · Completed 7:34 PM UTC
Commit: dbca731 · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

Retro: PR #2781 — fix dispatch role-check for retro/prioritize

Timeline

  1. Issue dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend #2298 filed (2026-06-15): retro and prioritize stages silently skipped in per-repo mode because the dispatch role-check remapped them to fullsend, which per-repo configs don't include.
  2. Code agent triggered via /fs-code (2026-06-30 14:43 UTC): completed the fix correctly but push was rejected because the changes included .github/workflows/reusable-dispatch.yml and the GitHub App token lacks the workflows permission.
  3. Human (waynesun09) manually created PR fix(#2298): remove retro/prioritize→fullsend role mapping in dispatch #2781 on branch fix-2298-dispatch-retro-prioritize.
  4. 7 review agent runs: 4 successful (each on a different SHA from force-pushes), 1 infrastructure failure (sandbox creation timeout), 2 correctly cancelled by supersession. The review agent flagged protected-path changes and scope-creep on the backward-compat fallback — both useful findings.
  5. Human reviewer (ralphbean) approved with non-blocking notes: requested test coverage (addressed in second commit) and identified a downstream project_number gap for the prioritize stage (filed as follow-up dispatch: per-repo shim does not pass project_number for prioritize agent #2782).
  6. PR merged (2026-07-01 19:20 UTC) with 2 commits across 5 files (+71/-10).

Workflow quality assessment

What went well:

  • The code agent produced a correct fix despite being unable to push it.
  • The review agent's scope-creep and protected-path findings were relevant and useful.
  • The supersession mechanism correctly cancelled stale review runs.
  • The human reviewer caught the test coverage gap and downstream project_number issue, both leading to concrete follow-up actions.
  • A follow-up issue (dispatch: per-repo shim does not pass project_number for prioritize agent #2782) was properly filed for the surfaced project_number gap.

Waste areas:

  • The code agent consumed tokens on work it couldn't push (workflow file permission). This is tracked by epic #2822 and related issues #470, #2670, #1888.
  • 7 review runs where ~3 would have sufficed. Force-push debouncing is tracked by #1014. The sandbox infra failure was transient.
  • The review agent did not detect the missing test coverage gap (tracked by #2589).

Proposals

No new proposals filed. All identified improvement opportunities are already covered by existing open issues:

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

Labels

component/dispatch Workflow dispatch and triggers component/docs User-facing documentation requires-manual-review Review requires human judgment type/bug Confirmed defect in existing behavior

Projects

None yet

Development

Successfully merging this pull request may close these issues.

dispatch: retro and prioritize skipped in per-repo mode — role check looks for fullsend

2 participants