Skip to content

fix(dispatch): label-aware concurrency prevents routing-label cancellation - #5472

Merged
ggallen merged 1 commit into
fullsend-ai:mainfrom
ggallen:fix/2452-label-aware-dispatch-concurrency
Jul 29, 2026
Merged

fix(dispatch): label-aware concurrency prevents routing-label cancellation#5472
ggallen merged 1 commit into
fullsend-ai:mainfrom
ggallen:fix/2452-label-aware-dispatch-concurrency

Conversation

@ggallen

@ggallen ggallen commented Jul 22, 2026

Copy link
Copy Markdown
Member

Summary

Fixes #2452. When triage applies multiple labels rapidly, all issues/labeled events shared the same concurrency group (fullsend-dispatch-{number}). GitHub Actions cancels intermediate pending runs, so the ready-to-code event could be cancelled while a non-routing label (type/bug) survives — the code agent never dispatches.

Two complementary fixes:

  • Label-aware concurrency key: for labeled events, include the label name in the group so ready-to-code and type/bug get separate concurrency slots. Non-labeled events share a common dispatch suffix to preserve existing queuing behavior.
  • Early-exit non-routing labels: if: guard skips the dispatch job entirely for labeled events where the label isn't ready-to-code, ready-for-review, or ready-for-triage. Prevents non-routing labels from consuming concurrency slots or wasting runner time.

Applied to all three shim files:

  • .github/workflows/fullsend.yaml (this repo)
  • internal/scaffold/fullsend-repo/templates/shim-workflow-call.yaml (per-org template)
  • internal/scaffold/fullsend-repo/templates/shim-per-repo.yaml (per-repo template, if: guard only — no concurrency group)

Test plan

  • All existing scaffold alignment tests pass (100+)
  • Added TestShimLabeledEventFiltering — validates all three shims have the routing-label whitelist and the workflow-call shims have label-aware concurrency keys
  • actionlint passes on fullsend.yaml
  • All pre-commit hooks pass (go vet, gofmt, secret scan, workflow lint)
  • Apply 5+ labels to a test issue in rapid succession (including ready-to-code as a non-final label). Verify the ready-to-code run completes with "Routed to stage: code" rather than being cancelled

🤖 Generated with Claude Code

@ggallen
ggallen requested a review from a team as a code owner July 22, 2026 15:55
@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Fix dispatch concurrency for labeled events to prevent routing cancellation

🐞 Bug fix ⚙️ Configuration changes 🧪 Tests 🕐 20-40 Minutes

Grey Divider

AI Description

• Make dispatch concurrency label-aware for labeled events to avoid run cancellations.
• Skip dispatch entirely for non-routing labels to preserve runner time and queue slots.
• Add alignment test to prevent regressions across all shim workflow templates.
Diagram

graph TD
  A([GitHub event]) --> B[Fullsend shim workflow] --> C{Routing label?} --> D[Label-aware concurrency group] --> E[dispatch.yml (reusable)] --> F[Agent stage runs]
  C -->|no| G[Skip dispatch job]

  subgraph Legend
    direction LR
    _ext([Event]) ~~~ _wf[Workflow/job] ~~~ _dec{Decision}
  end
Loading
High-Level Assessment

The following are alternative approaches to this PR:

1. Filter labeled events inside dispatch.yml only
  • ➕ Centralizes routing/label logic in one place
  • ➕ Avoids duplicating label whitelist across shims
  • ➖ Still consumes concurrency slots and runner startup time for non-routing labels
  • ➖ Does not address cancellations caused by concurrency collisions without additional changes
2. Disable/relax concurrency for labeled events
  • ➕ Eliminates cancellation/queue interactions for label bursts
  • ➖ Can trigger multiple redundant dispatches for the same issue/PR
  • ➖ Higher runner usage and more noise during rapid label application

Recommendation: Current approach is the best tradeoff: the if: guard prevents wasted runs for non-routing labels, and the label-aware concurrency key prevents routing labels from being starved/canceled by unrelated labels during rapid triage bursts. Keeping the whitelist in the shims is acceptable since it’s now enforced by an alignment test.

Files changed (4) +83 / -8

Bug fix (2) +34 / -6
fullsend.yamlAdd label-aware concurrency and routing-label guard to dispatch job +17/-3

Add label-aware concurrency and routing-label guard to dispatch job

• Updates the dispatch job concurrency group to include the label name for 'issues/pull_request' 'labeled' events, preventing routing labels from sharing a slot with non-routing labels. Adds an 'if:' guard to skip dispatch on labeled events unless the label is one of the routing labels (ready-to-code/review/triage).

.github/workflows/fullsend.yaml

shim-workflow-call.yamlAdd label-aware concurrency and routing-label guard to workflow-call shim +17/-3

Add label-aware concurrency and routing-label guard to workflow-call shim

• Updates the workflow-call shim dispatch job concurrency group to include the label name for labeled events. Adds an 'if:' guard to skip the dispatch job for non-routing labeled events, matching repo-level behavior.

internal/scaffold/fullsend-repo/templates/shim-workflow-call.yaml

Tests (1) +39 / -0
workflow_call_alignment_test.goAdd regression test for labeled-event filtering and concurrency keys +39/-0

Add regression test for labeled-event filtering and concurrency keys

• Introduces 'TestShimLabeledEventFiltering' to assert all shim variants whitelist only routing labels at the 'if:' guard and that workflow-call based shims include 'github.event.label.name' in the concurrency key. Prevents future scaffold drift/regressions for #2452.

internal/scaffold/workflow_call_alignment_test.go

Other (1) +10 / -2
shim-per-repo.yamlSkip dispatch for non-routing labeled events in per-repo shim +10/-2

Skip dispatch for non-routing labeled events in per-repo shim

• Adds an 'if:' guard to the per-repo shim dispatch job to ignore labeled events unless the label is a routing label. This avoids consuming runner time and avoids interfering with routing-label runs.

internal/scaffold/fullsend-repo/templates/shim-per-repo.yaml

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 22, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:57 PM UTC · Ended 4:00 PM UTC
Commit: 4ec46ff · View workflow run →

@github-actions

github-actions Bot commented Jul 22, 2026

Copy link
Copy Markdown

Site preview

Preview: https://2bf35781-site.fullsend-ai.workers.dev

Commit: f1f2010bfbc91993780a36f7497af88f11838f09

@ggallen
ggallen force-pushed the fix/2452-label-aware-dispatch-concurrency branch from 4ec46ff to 761aadf Compare July 22, 2026 15:59
@ggallen ggallen changed the title fix(dispatch): label-aware concurrency prevents routing-label cancellation fix(dispatch): label-aware concurrency prevents routing-label cancellation (#2452) Jul 22, 2026
@ggallen ggallen changed the title fix(dispatch): label-aware concurrency prevents routing-label cancellation (#2452) fix(dispatch): label-aware concurrency prevents routing-label cancellation Jul 22, 2026
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 22, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:01 PM UTC · Completed 4:19 PM UTC
Commit: 761aadf · View workflow run →

@qodo-code-review

qodo-code-review Bot commented Jul 22, 2026

Copy link
Copy Markdown

Code Review by Qodo

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

Context used
✅ Compliance rules (platform): 61 rules

Grey Divider


Remediation recommended

1. PR label whitelist mismatch 🐞 Bug ➹ Performance
Description
The shim if: whitelist allows ready-to-code and ready-for-triage for all labeled events,
including pull_request_target labeled events, but the downstream router only routes
pull_request_target labeled when the triggering label is ready-for-review. This causes avoidable
dispatch runs that immediately skip with “No stage matched”.
Code

.github/workflows/fullsend.yaml[R56-61]

+      && (
+        github.event.action != 'labeled'
+        || github.event.label.name == 'ready-to-code'
+        || github.event.label.name == 'ready-for-review'
+        || github.event.label.name == 'ready-for-triage'
+      )
Relevance

●●● Strong

PR #5015 routes pull_request_target.labeled only for ready-for-review; tightening shim whitelist
avoids known no-op “stage empty” runs.

PR-#5015
PR-#5198

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The shim whitelist includes three routing labels regardless of event type, but the router’s
pull_request_target labeled branch only routes on ready-for-review and otherwise returns an
empty stage, which the dispatcher treats as a no-op skip.

.github/workflows/fullsend.yaml[51-61]
internal/scaffold/fullsend-repo/.github/workflows/dispatch.yml[201-212]
.github/workflows/reusable-dispatch.yml[269-316]

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 shim job `if:` condition whitelists three labels for any `labeled` action. However, the router logic for `pull_request_target` only routes labeled events when the triggering label is `ready-for-review`; other whitelisted labels (e.g. `ready-to-code`) won’t route and will lead to a no-op dispatch run.

### Issue Context
This wastes runner time and can still consume a per-label concurrency slot for a run that cannot route.

### Fix Focus Areas
- .github/workflows/fullsend.yaml[52-61]
- internal/scaffold/fullsend-repo/templates/shim-workflow-call.yaml[50-59]
- internal/scaffold/fullsend-repo/templates/shim-per-repo.yaml[41-50]

### Implementation guidance
- Refine the labeled-event guard to align with routing behavior:
 - For `pull_request_target` + `action == 'labeled'`: only allow `github.event.label.name == 'ready-for-review'`.
 - For `issues` + `action == 'labeled'`: allow `ready-to-code`, `ready-for-triage` (and `ready-for-review` only if you explicitly want to support it).
- Update `TestShimLabeledEventFiltering` accordingly (it currently assumes the same whitelist for all shims).

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



Informational

2. Concurrency test false-positive ✓ Resolved 🐞 Bug ⚙ Maintainability
Description
TestShimLabeledEventFiltering’s “concurrency” subtest only checks that github.event.label.name
appears anywhere in the workflow text, but that substring already exists in the if: guard. This
can let a future regression remove label-awareness from concurrency.group without failing tests.
Code

internal/scaffold/workflow_call_alignment_test.go[R618-624]

+	// Workflow-call shim must also have a label-aware concurrency key.
+	for _, tc := range cases[:2] {
+		t.Run(tc.name+"/concurrency", func(t *testing.T) {
+			s := string(tc.content(t))
+			assert.Contains(t, s, "github.event.label.name",
+				"%s concurrency group must include label name for labeled events", tc.name)
+		})
Relevance

● Weak

Team previously rejected stricter concurrency assertions; PR #2465 rejected replacing Contains
checks with tighter/anchored validation.

PR-#2465

ⓘ Recommendations generated based on similar findings in past PRs

Evidence
The test’s concurrency assertion is not scoped to concurrency.group, and github.event.label.name
is already present in the newly-added if: guard, so the test can pass even if the concurrency
group regresses.

internal/scaffold/workflow_call_alignment_test.go[589-625]
.github/workflows/fullsend.yaml[51-61]

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

### Issue description
`TestShimLabeledEventFiltering` claims to validate that `jobs.dispatch.concurrency.group` includes the label name, but its assertion is scoped to the entire file content. Because `github.event.label.name` is also present in the `if:` guard, the test can pass even when `concurrency.group` does not include the label.

### Issue Context
This weakens regression detection for the concurrency change introduced in #2452.

### Fix Focus Areas
- internal/scaffold/workflow_call_alignment_test.go[589-626]

### Implementation guidance
- Unmarshal each workflow YAML into a minimal struct (you already have `callerWorkflow`, `callerJob`, `jobConcurrency`).
- Assert specifically on `caller.Jobs["dispatch"].Concurrency.Group` containing `github.event.label.name` (and optionally containing the `github.event.action == 'labeled'` guard), instead of `assert.Contains(t, s, ...)` on the whole file string.
- Keep the existing string-based assertions for the `if:` guard if desired, but make the concurrency assertion field-scoped.

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


Grey Divider

To customize comments, go to the Qodo configuration screen, or learn more in the docs.

Qodo Logo

Comment thread .github/workflows/fullsend.yaml
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 22, 2026

Copy link
Copy Markdown

Review

Findings

Medium

Low

  • [missing-pattern-documentation] docs/contributing/ci-workflows.md — The concurrency groups section documents standard patterns for pull_request_target workflows but does not mention the label-aware concurrency pattern introduced by this PR. The fullsend shim is a specialized use case already documented in ADR 0034's Note annotation; the general CI conventions doc may not be the right location for this pattern.
Previous run

Review

Findings

Medium

Low

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:632TestShimLabeledEventFiltering validates the ready- prefix filter and label-aware concurrency but does not test interaction with non-labeled event types (e.g., opened, synchronize). If a future change accidentally tightens the guard to block non-labeled events, this test would not catch it. The regex assertion is structurally anchored to the labeled-specific clause, limiting the practical risk.

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:745TestRoutingLabelPrefixDrift only checks scaffold/dispatch.yml but not .github/workflows/reusable-dispatch.yml, which has an identical set of TRIGGERING_LABEL comparisons. If the two files drift independently, only scaffold-side drift is caught. The test comment documents this scope as intentional (per-repo shims have no prefix guard), but reusable-dispatch.yml is a per-org file, not a per-repo shim.

Previous run (2)

Review

Findings

Medium

Low

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:637TestShimLabeledEventFiltering validates the ready- prefix filter and label-aware concurrency but does not test interaction with non-labeled event types (e.g., opened, synchronize). If a future change accidentally tightens the guard to block non-labeled events, this test would not catch it. The regex assertion is structurally anchored to the labeled-specific clause, limiting the practical risk.

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:768TestRoutingLabelPrefixDrift only checks scaffold/dispatch.yml but not .github/workflows/reusable-dispatch.yml, which has an identical set of TRIGGERING_LABEL comparisons. If the two files drift independently, only scaffold-side drift is caught. The test comment documents this scope as intentional (per-repo shims have no prefix guard), but reusable-dispatch.yml is a per-org file, not a per-repo shim.

Previous run (3)

Review

Findings

Medium

Low

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:637TestShimLabeledEventFiltering validates the ready- prefix filter and label-aware concurrency but does not test interaction with non-labeled event types (e.g., opened, synchronize). If a future change accidentally tightens the guard to block non-labeled events, this test would not catch it. The regex assertion is structurally anchored to the labeled-specific clause, limiting the practical risk.

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:730TestRoutingLabelPrefixDrift only checks scaffold/dispatch.yml but not .github/workflows/reusable-dispatch.yml, which contains parallel TRIGGERING_LABEL comparisons. Both files currently use only ready- prefixed labels, so no active drift exists. The test scope comment documents this exclusion as intentional (per-repo shims have no prefix guard).

  • [architectural-amendment-via-note] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:148 — The PR refines ADR 0034's concurrency model (from a single per-issue/PR group to label-isolated slots) via a Note annotation. This follows the established codebase convention for annotating accepted ADRs (matching the existing Note at line 239 and patterns in ADRs 0002, 0027, 0033, 0046, 0054, 0066). The change is a narrowing refinement — non-label events still share the original single concurrency group. No action required unless the team wants to formalize this as a separate ADR.

  • [implicit-architectural-constraint] docs/glossary.md:118 — The ready- prefix requirement for per-org routing labels is documented in three places (glossary, ADR 0034 Note, BYOA guide) and enforced by TestRoutingLabelPrefixDrift, but lacks a dedicated ADR. The documentation coverage is thorough; a standalone ADR is optional follow-up.

Previous run (4)

Review

Findings

Medium

Low

  • [architectural-amendment-via-note] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:278 — The PR refines ADR 0034's concurrency model (from a single per-issue/PR group to label-isolated slots) via a Note annotation. This follows the established codebase convention for annotating accepted ADRs (matching the existing Note at line 239 and patterns in ADRs 0002, 0027, 0033, 0046, 0054, 0066). The change is a narrowing refinement — non-label events still share the original single concurrency group. No action required unless the team wants to formalize this as a separate ADR.

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:637TestShimLabeledEventFiltering validates the ready- prefix filter and label-aware concurrency but does not test interaction with non-labeled event types (e.g., opened, synchronize). If a future change accidentally tightens the guard to block non-labeled events, this test would not catch it. The regex assertion is structurally anchored to the labeled-specific clause, limiting the practical risk.

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:730TestRoutingLabelPrefixDrift only checks scaffold/dispatch.yml but not .github/workflows/reusable-dispatch.yml, which contains parallel TRIGGERING_LABEL comparisons. Both files currently use only ready- prefixed labels, so no active drift exists. The test scope comment documents this exclusion as intentional (per-repo shims have no prefix guard).

  • [implicit-architectural-constraint] docs/glossary.md:437 — The ready- prefix requirement for per-org routing labels is documented in three places (glossary, ADR 0034 Note, BYOA guide) and enforced by TestRoutingLabelPrefixDrift, but lacks a dedicated ADR. The documentation coverage is thorough; a standalone ADR is optional follow-up.

Previous run (5)

Review

Findings

Medium

Low

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:637TestShimLabeledEventFiltering validates the ready- prefix filter and label-aware concurrency but does not test interaction with non-labeled event types (e.g., opened, synchronize). If a future change accidentally tightens the guard to block non-labeled events, this test would not catch it. The regex assertion is structurally anchored to the labeled-specific clause, limiting the practical risk.

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:730TestRoutingLabelPrefixDrift only checks scaffold/dispatch.yml but not .github/workflows/reusable-dispatch.yml, which contains parallel TRIGGERING_LABEL comparisons. Both files currently use only ready- prefixed labels, so no active drift exists, but adding a non-ready- label to reusable-dispatch.yml would not be caught by this test.

Previous run (6)

Review

Findings

Medium

Low

  • [test-coverage-gap] internal/scaffold/workflow_call_alignment_test.go:637TestShimLabeledEventFiltering validates the ready- prefix filter and label-aware concurrency but does not test interaction with non-labeled event types (e.g., opened, synchronize). If a future change accidentally tightens the guard to block non-labeled events, this test would not catch it. The regex assertion is structurally anchored to the labeled-specific clause, limiting the practical risk.
Previous run (7)

Review

Findings

Medium

Previous run (8)

Review

Findings

Medium

Low

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:477 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.
Previous run (9)

Review

Findings

Medium

Low

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:477 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.
Previous run (10)

Review

Findings

Medium

Low

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:477 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.
Previous run (11)

Review

Findings

Medium

Low

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:477 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.
Previous run (12)

Review

Findings

Medium

Low

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:476 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.
Previous run (13)

Review

Findings

Medium

  • [protected-path] .github/workflows/fullsend.yaml — Protected path modified. The PR links to issue Concurrency group cancels code dispatch when triage applies multiple labels #2452 and the description explains the rationale for the concurrency group and if: guard changes. Human approval is required for all protected-path changes.

  • [adr-immutability] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:142 — The edit deletes the original Consequences bullet (which described a single per-issue/PR concurrency group where "a new dispatch now cancels any in-progress run") and replaces it with rewritten text about per-issue/PR concurrency plus GitHub's pending-run replacement. The ADR policy (docs/contributing/adrs.md) permits short Note annotations on Accepted ADRs but prohibits substantial rewrites to Consequences sections. The original behavioral description is removed rather than preserved with an appended annotation. Remediation: restore the original Consequences bullet verbatim, then append the new label-aware concurrency Note as a separate blockquote annotation below it, matching the existing > **Note (2026-06):** pattern already used in the Decision section.

Low

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:477 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.

Labels: PR adds 138 lines of Go test code validating the new shim label filtering and concurrency key behavior.

Previous run (14)

Review

Findings

Medium

  • [protected-path] .github/workflows/fullsend.yaml — Protected path modified. The PR links to issue Concurrency group cancels code dispatch when triage applies multiple labels #2452 and the description explains the rationale for the concurrency group and if: guard changes. Human approval is required for all protected-path changes.

  • [adr-immutability] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:142 — The edit replaces the original Consequences bullet (which described a single per-issue concurrency group) with rewritten text and a ~25-line Note annotation. The ADR policy (docs/contributing/adrs.md) permits "short notes linking to newer decisions" but prohibits "substantially rewriting Context, Decision, or Consequences sections." The original behavioral description is deleted rather than annotated — this ADR already has an accepted annotation pattern (blockquote at line 110). Remediation: restore the original Consequences bullet verbatim, then append the label-aware concurrency note as a separate blockquote annotation matching the existing pattern.

Low

  • [documentation-verbosity] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md — The Note annotation is ~20 lines inline, substantially longer than existing annotations on this and other ADRs (typically 2–8 lines). Consider trimming to a concise blockquote with a link to Concurrency group cancels code dispatch when triage applies multiple labels #2452 for details.

  • [documentation-verbosity] docs/glossary.md:118 — The Label State Machine glossary entry expanded to include shim filtering mechanics, case-sensitivity edge cases, and per-repo vs. per-org differences. A glossary entry should define terms concisely and point to the ADR or BYOA guide for operational detail.

  • [scope-assessment] docs/guides/user/bring-your-own-agent.md:477 — The ready- prefix was previously a de facto convention; this PR formalizes it as an enforced requirement for per-org installs. The BYOA guide callout documents this constraint and explicitly exempts per-repo installs, containing the impact.

Previous run (15)

Review

Findings

Medium

  • [protected-path] .github/workflows/fullsend.yaml — Protected path modified. The PR links to issue Concurrency group cancels code dispatch when triage applies multiple labels #2452 and the description explains the rationale for the concurrency group and if: guard changes. Human approval is required for all protected-path changes.

  • [technical-documentation-accuracy] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:155 — The ADR states "unlabeled events are blocked at the if: guard since dispatch.yml has no unlabeled routing branch." This is technically inaccurate. The if: guard checks github.event.action != 'labeled'. Since 'unlabeled' != 'labeled' evaluates to true, unlabeled events pass through the guard. They reach dispatch, which exits early because it has no unlabeled routing branch. The sentence conflates two different filtering layers: the shim if: guard and the dispatch routing logic.

  • [technical-documentation-accuracy] docs/glossary.md:118 — The glossary states the shim if: guard "blocks unlabeled events entirely (dispatch has no unlabeled routing branch)." This is the same inaccuracy — unlabeled events pass through the guard (since unlabeled != labeled) but route to no stage at dispatch, which exits early.

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).

  • [GHA expression injection] .github/workflows/fullsend.yaml:44github.event.label.name is interpolated in the concurrency group key. Safe because concurrency.group is a GHA expression context (not a shell context), so expression injection is not possible. The if: guard further constrains label-triggered dispatch to ready-* labels, limiting the practical scope of concurrency-slot creation.

  • [architectural-alignment] docs/guides/user/bring-your-own-agent.md — The ready- prefix was previously a convention (all built-in routing labels followed it); this PR formalizes it as an enforced requirement for per-org installs. The per-repo shim is explicitly exempted for BYOA compatibility, containing the impact.

Previous run (16)

Review

Findings

Medium

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).
Previous run (17)

Review

Findings

Medium

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).
Previous run (18)

Review

Findings

Medium

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).
Previous run (19)

Review

Findings

Medium

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).
Previous run (20)

Review

Findings

Medium

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).

  • [naming-consistency] docs/ADRs/0002-initial-fullsend-design.md — ADR 0002 uses ready-to-implement throughout the workflow narrative but production code and this PR use ready-to-code as the routing label, creating terminology drift between the design document and implementation.

Previous run (21)

Review

Findings

Medium

Low

  • [edge-case] .github/workflows/fullsend.yaml:58 — The startsWith('ready-') guard lets unlabeled events for routing labels (e.g., removing ready-to-code) through to dispatch, but dispatch does not route any unlabeled event to a stage — the run will spin up a runner and exit early with no work done. This is an intentional, tested design choice (forward-compatible defensive filtering) with negligible cost (~20s wasted runner per routing label removal).
Previous run (22)

Review

Findings

Medium

Low

Previous run (23)

Review

Findings

Medium

Low

  • [scope-creep] .github/workflows/fullsend.yaml:57 — The startsWith(github.event.label.name, 'ready-') filter formalizes the existing ready- prefix convention into an enforced guard. All current routing labels already follow this convention and the prefix approach is more maintainable than an explicit allowlist, but the issue authorized a concurrency bug fix rather than a naming-convention formalization.
Previous run (24)

Review

Findings

Medium

Low

  • [scope-creep] .github/workflows/fullsend.yaml:57 — The startsWith(github.event.label.name, 'ready-') filter formalizes the existing ready- prefix convention into an enforced guard. All current routing labels already follow this convention and the prefix approach is more maintainable than an explicit allowlist (avoids updating every enrolled repo for new routing labels), but the issue authorized a concurrency bug fix rather than a naming-convention formalization. Consider noting in the PR description that this convention is an intentional design decision.

  • [documentation-alignment] docs/glossary.md:118 — The glossary states "custom agents must follow this convention" for the ready- prefix but doesn't explain the failure mode. The bring-your-own-agent guide does explain it ("a non-conforming label will never reach dispatch") — consider adding a cross-reference from the glossary entry.

Previous run (25)

Review

Findings

Medium

Previous run (26)

Review

Findings

Medium

Previous run (27)

Review

Findings

Medium

Previous run (28)

Review

Findings

Medium

Previous run (29)

Review

Findings

Medium

Previous run (30)

Review

Findings

Medium

Low

  • [adr-annotation-format] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:147 — ADR update annotation uses **Update (#2452, PR #5472):** instead of the established **Note (YYYY-MM, [#ISSUE](link)):** format used elsewhere in this repo's ADRs (e.g., ADRs 0054, 0066). Consider changing to **Note (2026-07, [#2452](https://github.com/fullsend-ai/fullsend/issues/2452)):** to match repo conventions.

  • [scope-documentation] docs/glossary.md:118 — The ready- prefix requirement is a new architectural constraint enforced by the if: guard on all shims. All existing routing labels already use this prefix, and the PR properly documents the convention in the glossary, ADR, and bring-your-own-agent guide. Consider noting in the PR description that this convention is an intentional design decision formalized by this PR.

Previous run (31)

Review

Findings

Medium

Previous run (32)

Review

Findings

Medium

  • [protected-path] .github/workflows/fullsend.yaml — Protected path modified. The PR links to issue Concurrency group cancels code dispatch when triage applies multiple labels #2452 and the description explains the rationale for the concurrency group and if: guard changes. Human approval is required for all protected-path changes.

  • [breaking-change] internal/scaffold/fullsend-repo/templates/shim-workflow-call.yaml:50 — The startsWith(github.event.label.name, 'ready-') filter formalizes an implicit convention as an enforced behavioral change in the shim templates. All existing routing labels already use the ready- prefix and dispatch.yml routing only matches ready--prefixed labels (so non-ready- labels were never functionally routed), but the shim-level enforcement is new. Custom agents using label-based triggers must follow the ready- prefix convention. The PR documents this requirement in the glossary, ADR 0034, and bring-your-own-agent guide.

Low

  • [implicit-contract] docs/guides/user/bring-your-own-agent.md:187 — The ready- prefix requirement is documented as an inline comment in the harness field reference YAML block. A more prominent callout (e.g., in the "Registering your agent" section) would improve discoverability for custom agent authors.

  • [documentation-gap] docs/glossary.md:118 — The glossary update mentions the shim if: guard skips non-matching labels. Making the silent nature of the skip more explicit (e.g., "silently skips") would help users understand the consequences of using a non-ready- label.

Previous run (33)

Review

Findings

Medium

Low

  • [incomplete-doc] docs/guides/dev/e2e-testing.md — The e2e-testing guide discusses label filtering limitations at the on: level and uses concurrency groups plus gate jobs to handle non-actionable labels. The PR introduces a complementary if: startsWith() pattern for dispatch label filtering at the job level. A cross-reference could be useful, though these are different subsystems (e2e authorization vs dispatch routing).
Previous run (34)

Review

Findings

Medium

Low

  • [code-organization] internal/scaffold/workflow_call_alignment_test.goTestShimLabeledEventFiltering validates both label filtering and label-aware concurrency in a single test function. The concurrency sub-tests cover shim dispatcher concurrency (a different layer than TestReusableDispatchStageConcurrency which tests stage-level agent workflows in reusable-dispatch.yml), so the overlap is cosmetic, not functional. Keeping both concerns together is reasonable since they implement the same feature (Concurrency group cancels code dispatch when triage applies multiple labels #2452).
Previous run (35)

Review

Findings

Medium

  • [protected-path] .github/workflows/fullsend.yaml — Protected path modified. The PR links to issue Concurrency group cancels code dispatch when triage applies multiple labels #2452 and the description explains the rationale for the change. Human approval is required for all protected-path changes.

  • [stale-behavioral-description] docs/ADRs/0034-centralized-shim-routing-via-dispatch.md:142 — The Consequences section describes enrolled repos having "a single concurrency group" that "cancels any in-progress run for the same issue/PR." This PR introduces label-aware concurrency groups where different routing labels get separate slots, making that description inaccurate. A minor annotation cross-referencing fix(dispatch): label-aware concurrency prevents routing-label cancellation #5472 would be appropriate (per ADR immutability rules).

Low

  • [test-inadequate] internal/scaffold/workflow_call_alignment_test.go:622 — The concurrency sub-test asserts github.event.label.name appears in the file content, but this string also appears in the if: guard. If the concurrency group were accidentally removed while the if: guard remained, this test would still pass. A more specific assertion (e.g., checking for the ternary expression github.event.action == 'labeled' && github.event.label.name) would make the test robust against this false-positive scenario.

Labels: PR modifies dispatch workflow routing (concurrency groups and labeled-event filtering)

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 component/dispatch Workflow dispatch and triggers type/bug Confirmed defect in existing behavior labels Jul 22, 2026
@ggallen
ggallen force-pushed the fix/2452-label-aware-dispatch-concurrency branch from 761aadf to e909805 Compare July 22, 2026 16:43
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 22, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 4:45 PM UTC · Completed 4:58 PM UTC
Commit: e909805 · View workflow run →

@waynesun09 waynesun09 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.

Multi-agent review squad pass (4 reviewers: Claude x2, Grok, Gemini) — no Critical/High findings survived verification. 7 Medium findings posted inline covering: unverified core fix behavior in a live GH Actions environment, a weak test assertion (substring-only, not semantic), a fragile positional test slice, a stale ADR invariant re: per-role concurrency, an ADR update that overgeneralizes which shim gained label-aware concurrency, an unacknowledged "Confidence: Medium" root cause from the source issue, and hand-copied if:/group: blocks with no single source of truth. Two prior review threads (label-whitelist mismatch, weak concurrency test) are already resolved/declared-intentional and not re-flagged.

Comment thread .github/workflows/fullsend.yaml
Comment thread .github/workflows/fullsend.yaml
Comment thread docs/ADRs/0034-centralized-shim-routing-via-dispatch.md
Comment thread docs/ADRs/0034-centralized-shim-routing-via-dispatch.md Outdated
Comment thread docs/ADRs/0034-centralized-shim-routing-via-dispatch.md Outdated
Comment thread internal/scaffold/workflow_call_alignment_test.go Outdated
Comment thread internal/scaffold/workflow_call_alignment_test.go Outdated
Comment thread internal/scaffold/fullsend-repo/templates/shim-workflow-call.yaml
@ggallen
ggallen force-pushed the fix/2452-label-aware-dispatch-concurrency branch from e909805 to aed6789 Compare July 22, 2026 18:59
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 22, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:00 PM UTC · Completed 7:14 PM UTC
Commit: aed6789 · View workflow run →

Comment thread .github/workflows/fullsend.yaml
@ggallen
ggallen force-pushed the fix/2452-label-aware-dispatch-concurrency branch from aed6789 to 9ea85ce Compare July 22, 2026 20:20
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 12:34 PM UTC · Completed 12:47 PM UTC
Commit: 784a9c0 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:45 PM UTC · Completed 4:01 PM UTC
Commit: b24d7d4 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 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.

Multi-agent review squad pass (3 reviewers: Claude x2, Grok) against b24d7d4, plus a re-verification of the previous round.

The blocker from the last round is cleared. Three things resolved well:

  • ADR immutability — the diff is now purely additive (6+/0-), original Consequences bullet restored verbatim, short blockquote Note appended matching the existing pattern. This is the right shape per CONTRIBUTING.md:61, and it also corrects an earlier ask of mine that pointed the wrong way: I asked for the parent bullet to be rewritten because it contradicted its footnote, when the convention is to leave the historical text alone and annotate. That's on me — what shipped is correct and my earlier request was not.
  • The unlabeled doc contradiction — no false claim remains in either the ADR or the glossary.
  • "Agent workflows re-resolve current state … stale-payload races are benign" — removed entirely. That unverified, load-bearing claim was flagged by every reviewer in all three rounds; good to see it go rather than get re-hedged.

Posting 4 Medium findings that are new substance on lines this PR adds, plus one on the PR description below. Nothing outstanding is a behavior defect — this is test-hardening and doc accuracy. Low findings held back (the guard regex still hard-pins || immediately after != 'labeled', so a future unlabeled conjunct would fail the test; the glossary trim dropped the startsWith case-insensitivity asymmetry, which was accurate and didn't move to the guide; ready-for-merge is still missing from the glossary's review-outcome list, raised in round 1). Happy to add any of those.


[MEDIUM] — PR description no longer matches the shipped code, and it becomes the squash-merge message

Three drifts at b24d7d4:

  1. "if: guard skips the dispatch job entirely for labeled events where the label isn't ready-to-code, ready-for-review, or ready-for-triage" — the code implements startsWith('ready-'), a strictly weaker prefix match, not that three-label allowlist.
  2. "Applied to all three shim files" listing shim-per-repo.yaml "(if: guard only)" — that file is no longer in the changed-file set, and TestShimLabeledEventFiltering's no-label-guard subtest now asserts the opposite, that it must not carry the filter.
  3. Test plan: "validates all three shims have the routing-label whitelist" — neither "all three" nor "whitelist" describes the test as written.

After eight rounds this body is the artifact a future reader reaches for first, and it's the commit message that lands on main. Worth a rewrite to: prefix filter, two shims changed, per-repo deliberately exempt for BYOA-harness compatibility.

Also unchecked: the one end-to-end validation ([ ] Apply 5+ labels to a test issue in rapid succession) is still open. That's been acknowledged as a post-merge item, so noting it for the record rather than re-litigating.

Comment thread docs/ADRs/0034-centralized-shim-routing-via-dispatch.md
Comment thread internal/scaffold/workflow_call_alignment_test.go Outdated
Comment thread internal/scaffold/workflow_call_alignment_test.go Outdated
Comment thread docs/guides/user/bring-your-own-agent.md Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:03 PM UTC · Completed 7:19 PM UTC
Commit: 9ec8af5 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 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.

Review pass: 1 new finding posted inline below (design-alternative note on the shim concurrency block). The other candidate findings from this pass overlapped with points already raised and resolved/acknowledged in the existing review threads and the most recent review round, so they were held back to avoid duplicating the record.

Comment thread .github/workflows/fullsend.yaml
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 7:40 PM UTC · Ended 7:54 PM UTC
Commit: 7a3265f · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 7:55 PM UTC · Completed 8:10 PM UTC
Commit: 8be7d13 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 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.

Multi-agent review squad pass against 8be7d13 (3 dispatched, 2 completed — the Grok reviewer terminated without producing findings, so this round is Claude x2 plus my own verification).

No CRITICAL findings, and the shipped behavior is sound. One reviewer hand-evaluated all 12 subscribed event/action pairs and killed 9 of 12 mutations against the guard and concurrency expressions. actionlint passes, both new tests pass, and all three routers agree on the TRIGGERING_LABEL set (ready-for-triage, ready-to-code, ready-for-review) — so TestRoutingLabelPrefixDrift is green for the right reason, not by accident.

Posting 1 High + 3 Medium. Everything is test-hardening or docs; nothing below is a behavior defect.

Deliberately not re-raised: both reviewers flagged the ready- prefix being promoted to a public contract as a premature decision. That's been declared intentional four times across earlier rounds, so I'm treating it as settled rather than re-litigating it.

Low findings held back (happy to add any): the ADR blockquote sits at column 0 between two list items, which splits the Consequences <ul> into two lists — indenting it two spaces would nest it under the bullet it annotates; the ADR Note attributes the per-repo shim's missing concurrency group to "BYOA compat", but shim-per-repo.yaml:15-16, scaffold_test.go:126, and this PR's own test comment at workflow_call_alignment_test.go:713-714 all say it's because per-role groups live in reusable-dispatch.yml — BYOA compat is why it's exempt from the prefix guard, a different thing; the glossary's new link has no anchor and the target has no matching heading; and the concurrency assertions don't pin the fullsend-dispatch- namespace or the - separator (dropping the separator to yield fullsend-dispatch-12ready-to-code survives the full package).

One observation across rounds. Each round's test fix has been syntactic, so each one closes the specific mutation raised and leaves a differently-shaped hole — ContainsRegexp → parens pinned → join operator pinned → broadened matcher, and the two findings below are the next shape. The durable fix is the one suggested a few times and not yet taken: a table-driven evaluator over (event_name, action, label.name) tuples asserting the guard's boolean result and the rendered group string, plus a self-test feeding each non-conforming comparison style through labelPatterns to assert it's recognized. That would end this particular treadmill.

Still open from earlier rounds: the PR description hasn't been updated (three-label allowlist vs. shipped prefix filter; "all three shim files" vs. two; test plan claiming the test validates a "whitelist" on all three shims, which the /no-label-guard subtest asserts the opposite of). It becomes the squash-merge message. The manual burst-test checkbox also remains unticked, which both reviewers noted as the one thing static assertions can't establish.

Comment thread internal/scaffold/workflow_call_alignment_test.go Outdated
Comment thread docs/glossary.md Outdated
Comment thread docs/guides/user/bring-your-own-agent.md Outdated
Comment thread .github/workflows/fullsend.yaml Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 28, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 10:25 PM UTC · Completed 10:41 PM UTC
Commit: c436f26 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:21 PM UTC · Ended 3:31 PM UTC
Commit: fde3391 · View workflow run →

@waynesun09 waynesun09 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.

Review-only pass focused on the new ADR 0034 amendment note. One finding below.

Comment thread docs/ADRs/0034-centralized-shim-routing-via-dispatch.md Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:32 PM UTC · Ended 3:47 PM UTC
Commit: cc0b427 · View workflow run →

@ggallen

ggallen commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

/fs-review

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 3:48 PM UTC · Ended 3:51 PM UTC
Commit: cc0b427 · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 3:53 PM UTC · Completed 4:06 PM UTC
Commit: 7b8ff2f · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Review · ⚠️ Cancelled · Started 6:03 PM UTC · Ended 6:08 PM UTC
Commit: 9d0be9f · View workflow run →

@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 6:09 PM UTC · Completed 6:24 PM UTC
Commit: ec59892 · View workflow run →

fullsend-ai-review[bot]

This comment was marked as outdated.

@waynesun09 waynesun09 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.

Review pass: 1 new finding posted inline below. A second candidate (PR description misdescribing shim-per-repo.yaml's guard status and calling the ready- prefix filter a "whitelist") was held back — already raised and left open in an earlier review round on this PR, so not re-posted here.

Comment thread .github/workflows/fullsend.yaml Outdated
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Finished Review · ❌ Failure · Started 7:11 PM UTC · Completed 7:12 PM UTC
Commit: d607b2c · View workflow run →

@ggallen

ggallen commented Jul 29, 2026

Copy link
Copy Markdown
Member Author

/fs-review

Comment thread internal/scaffold/workflow_call_alignment_test.go Outdated
…ation (fullsend-ai#2452)

Signed-off-by: Greg Allen <gallen@redhat.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Signed-off-by: Greg Allen <gallen@redhat.com>
@fullsend-ai-review

fullsend-ai-review Bot commented Jul 29, 2026

Copy link
Copy Markdown

🤖 Finished Review · ✅ Success · Started 9:39 PM UTC · Completed 9:54 PM UTC
Commit: f1f2010 · View workflow run →

@fullsend-ai-retro

Copy link
Copy Markdown

🤖 Retro · Started 10:12 PM UTC
Commit: f1f2010 · View workflow run →

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 go Pull requests that update go code 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.

Concurrency group cancels code dispatch when triage applies multiple labels

3 participants