Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
124 commits
Select commit Hold shift + click to select a range
8e0e3c9
fix(dispatch): per-role two-layer concurrency for per-repo (#981)
ifireball Jun 21, 2026
72e66cd
Merge branch 'main' of upstream into fix/981-per-repo-concurrency
ifireball Jun 21, 2026
346776d
fix: gofmt and update ADR concurrency docs for per-role policy
ifireball Jun 21, 2026
a8094d4
ci: retrigger e2e after babysit fixes
ifireball Jun 21, 2026
3ad2fe0
fix(workflows): drop reusable workflow concurrency to avoid parent ca…
ifireball Jun 21, 2026
a49e6ef
fix(workflows): agent-scoped concurrency on reusable stage workflows
ifireball Jun 21, 2026
6fc33f6
refactor(dispatch): require PR context for review triggers
ifireball Jun 21, 2026
46786dc
refactor(dispatch): keep ready-for-review trigger on PRs only
ifireball Jun 22, 2026
fb460e3
Merge pull request #2468 from fullsend-ai/agent/2467-elevate-lint-ste…
rh-hemartin Jun 22, 2026
1f66045
Merge pull request #2459 from fullsend-ai/agent/2458-guard-github-wor…
rh-hemartin Jun 22, 2026
602362b
Merge branch 'main' of github.com:fullsend-ai/fullsend into refactor/…
ifireball Jun 22, 2026
d9abce9
docs: address review feedback on PR-context triggers
ifireball Jun 22, 2026
1475413
refactor(dispatch): rename ISSUE_HAS_PR to IS_PR
ifireball Jun 22, 2026
145c4bd
Merge remote-tracking branch 'origin/main' into docs/audit-log-integrity
Benkapner Jun 22, 2026
7adb411
chore(deps): update dependency mermaid to v11.15.0 [security]
renovate[bot] Jun 22, 2026
8a33dd9
Merge pull request #2482 from fullsend-ai/renovate/npm-mermaid-vulner…
rh-hemartin Jun 22, 2026
3c810f1
fix(#2490): add retry logic for flaky e2e TestAdminInstallUninstall
fullsend-ai-coder[bot] Jun 22, 2026
4638557
Merge pull request #2492 from fullsend-ai/agent/2490-e2e-flaky-retry
rh-hemartin Jun 22, 2026
8507057
chore(deps): update dependency svelte to v5.55.7 [security]
renovate[bot] Jun 22, 2026
f005a08
feat(#2479): enable Renovate via self-hosted GitHub App
rh-hemartin Jun 22, 2026
8e1279b
Merge pull request #2481 from fullsend-ai/renovate/npm-svelte-vulnera…
rh-hemartin Jun 22, 2026
3f1ab3f
fix(#2474): include linters in 9c terminal condition
fullsend-ai-coder[bot] Jun 22, 2026
addf93f
chore: update obsolete GitHub Actions to latest major versions
Victoremepunto Jun 19, 2026
1f85d99
Merge pull request #2475 from fullsend-ai/agent/2474-fix-9c-terminal-…
rh-hemartin Jun 22, 2026
4b78a44
Merge pull request #2457 from Victoremepunto/update-obsolete-actions
rh-hemartin Jun 22, 2026
1544ba6
refactor(dispatch): rename IS_PR to ISSUE_IS_PR
ifireball Jun 22, 2026
43e7619
fix(ci): opt in to checkout@v7 unsafe PR checkout for e2e gate flow
ifireball Jun 22, 2026
b2d1835
Merge pull request #2503 from ifireball/fix/e2e-checkout-v7-unsafe-pr…
ralphbean Jun 22, 2026
0ed7d0b
Merge branch 'main' into refactor/drop-issue-review-fix-triggers
ifireball Jun 22, 2026
d70e0b6
refactor(dispatch): scope PR-context review gates to per-repo only
ifireball Jun 22, 2026
3b3f85b
Merge pull request #2447 from ggallen/worktree-adr-0045-phase4-pr2
ggallen Jun 22, 2026
5d0b34e
Merge pull request #2448 from ggallen/worktree-adr-0045-phase4-pr3
ggallen Jun 22, 2026
ca776d5
feat(harness): require role field in Validate() (ADR-0045 Phase 4 PR 1)
ggallen Jun 22, 2026
1ec755c
Merge pull request #2446 from ggallen/worktree-adr-0045-review
ggallen Jun 22, 2026
0d93cb1
chore(security): gofmt trace.go
Benkapner Jun 22, 2026
90bb6a5
Merge pull request #2010 from Benkapner/docs/audit-log-integrity
ralphbean Jun 22, 2026
c7f580d
feat(eval): add functional test framework with harness hooks
ralphbean Jun 4, 2026
5cd97bb
fix(eval): address review findings on threshold checks and shellcheck
ralphbean Jun 4, 2026
77e064f
fix(eval): install agent-eval-harness from submodule instead of git URL
ralphbean Jun 5, 2026
551bdff
refactor(eval): move behavioral thresholds into harness judges
ralphbean Jun 5, 2026
8ecd8c6
fix(eval): lint-cases checks for required judges in eval.yaml
ralphbean Jun 5, 2026
6cb8220
fix(eval): write metrics.json to correct output path
ralphbean Jun 5, 2026
9041b54
fix(eval): raise max_turns threshold to 30 for triage case
ralphbean Jun 5, 2026
7ce1d35
feat(eval): add needs-info, feature-request, and duplicate test cases
ralphbean Jun 5, 2026
d346678
perf(eval): run triage cases in parallel (parallelism: 4)
ralphbean Jun 5, 2026
32dfd39
fix(eval): renumber ADRs 0044/0045 to 0046/0047 to avoid collision
ralphbean Jun 11, 2026
bced358
fix(docs): renumber ADR 0046 to 0048 to resolve collision
ralphbean Jun 15, 2026
3e5e578
chore: fix gofmt in claude_progress.go
ralphbean Jun 15, 2026
205d9cd
fix(eval): address review feedback from waynesun09
ralphbean Jun 15, 2026
8299019
fix(docs): renumber ADRs 0047/0048 to 0051/0052 to avoid collision
ralphbean Jun 22, 2026
2893fcc
Merge pull request #1682 from fullsend-ai/ci/functional-evals
ralphbean Jun 22, 2026
b45bf1a
fix(#2345): resolve TARGET_BRANCH dynamically in code agent
Marcusk19 Jun 16, 2026
d77c7bb
docs(#2345): add ADR 0047 for agent-driven branch targeting
Marcusk19 Jun 17, 2026
d88167c
feat(#2345): wire up structured output and branch policy in code harness
Marcusk19 Jun 17, 2026
2fe5903
feat(#2345): add code-result.schema.json for agent branch targeting
Marcusk19 Jun 17, 2026
6deffb7
feat(#2345): add agent-driven branch resolution to post-code.sh
Marcusk19 Jun 17, 2026
17349d2
refactor(#2345): remove hardcoded TARGET_BRANCH from code workflow
Marcusk19 Jun 17, 2026
cdaafaf
docs(#2345): instruct code agent to write target branch to structured…
Marcusk19 Jun 17, 2026
9998660
fix(#2345): address PR review feedback
Marcusk19 Jun 18, 2026
5369932
fix(#2345): address second round of review feedback
Marcusk19 Jun 22, 2026
5e891a3
fix(#2345): renumber ADR 0051 → 0052 (collision in merge queue)
Marcusk19 Jun 22, 2026
5d88516
fix(#2345): renumber ADR 0052 → 0053 (0051-0052 merged upstream)
Marcusk19 Jun 22, 2026
b2e30d1
fix(#1835): require file reads before asserting contents in findings
fullsend-ai-coder[bot] Jun 18, 2026
b4da33d
feat(admin): add ESLint, Prettier, and Stylelint configuration
waynesun09 May 3, 2026
96fbec0
fix(#1835): add cross-file verification to security sub-agent
fullsend-ai-coder[bot] Jun 22, 2026
65056b7
ci: retrigger checks after merge queue dequeue
ralphbean Jun 22, 2026
687a24b
refactor(config): remove OrgConfig.Agents field entirely (ADR-0045 Ph…
ggallen Jun 22, 2026
0ac7318
Merge pull request #2346 from Marcusk19/fix/dynamic-target-branch
ralphbean Jun 22, 2026
825b326
Merge pull request #2443 from fullsend-ai/agent/1835-verify-file-cont…
ben-alkov Jun 22, 2026
c90a2cb
fix: sync functional tests openshell version with shared pin
ralphbean Jun 22, 2026
09cf796
feat(harness): fetch scripts from URL-referenced base harnesses (ADR-…
ggallen Jun 22, 2026
68f3aa8
chore(ci): pin all GitHub Actions to full-length commit SHAs
ralphbean Jun 22, 2026
c7bee5c
chore(ci): align action versions across workflows
ralphbean Jun 22, 2026
170e224
chore(ci): pin functional-tests.yml actions and fix pinact/renovate c…
ralphbean Jun 22, 2026
a7733a0
fix: drop hardcoded supervisor image override
ralphbean Jun 22, 2026
52ebc5a
Merge pull request #2525 from ggallen/worktree-adr-0038-base-scripts
ggallen Jun 22, 2026
ab4c9ac
Merge pull request #2517 from ggallen/worktree-adr-0045-phase4-pr4
ggallen Jun 22, 2026
d8552d2
fix: align functional tests openshell setup with action.yml
ralphbean Jun 22, 2026
e7f80f2
fix: quote $HOME and simplify heredoc to satisfy actionlint
ralphbean Jun 22, 2026
c56f7ac
ci(functional-tests): use pull_request_target for fork PR support
ralphbean Jun 22, 2026
da23233
ci(functional-tests): address PR review feedback
ralphbean Jun 22, 2026
2219a4f
feat(install): default to PR-based scaffold delivery
waynesun09 Jun 22, 2026
1a1cc28
feat(cli): add --direct flag to admin install and github setup
waynesun09 Jun 22, 2026
c69dc63
test(scaffold): tighten reusable-dispatch routing regexes
ifireball Jun 23, 2026
ed1d99e
Merge branch 'main' into refactor/drop-issue-review-fix-triggers
ifireball Jun 23, 2026
0c06adc
test(scaffold): rename to TestReusableDispatchWorkflowContent
ifireball Jun 23, 2026
f2c450e
Merge pull request #2473 from ifireball/refactor/drop-issue-review-fi…
ifireball Jun 23, 2026
12ca020
Merge pull request #2421 from fullsend-ai/fix/2420-automate-v0-tag
rh-hemartin Jun 23, 2026
06390ea
Merge upstream/main (includes #2473 review concurrency fix)
ifireball Jun 23, 2026
bcbc6d8
Merge pull request #2480 from fullsend-ai/hemartin/renovate-github-app
rh-hemartin Jun 23, 2026
f87b72c
Merge pull request #2535 from fullsend-ai/fix/openshell-version-sync
ralphbean Jun 23, 2026
bce1402
Merge branch 'main' into fix-functional-tests-fork-support
ralphbean Jun 23, 2026
6868253
Merge pull request #2534 from fullsend-ai/fix-functional-tests-fork-s…
ralphbean Jun 23, 2026
0ea1999
test(install): update tests for PR-based scaffold default
waynesun09 Jun 22, 2026
a40a79b
chore(admin): format and lint existing admin SPA code
waynesun09 May 3, 2026
058d20d
fix(admin): address review findings in lint config
waynesun09 May 3, 2026
3a6fd22
feat: add lint-staged pre-commit hook for web apps
waynesun09 May 3, 2026
47d5adb
fix(admin): resolve ESLint errors and Stylelint deprecations
waynesun09 May 6, 2026
c904dfd
fix(admin): remove dead _scanComplete reactive state from OrgList
waynesun09 May 6, 2026
368c4dc
fix: remove unused dep and scope browser globals
waynesun09 Jun 22, 2026
ff20816
Merge pull request #2533 from fullsend-ai/feat-default-pr-install
waynesun09 Jun 23, 2026
71f2b8b
Merge branch 'main' into pin-actions-to-sha
ralphbean Jun 23, 2026
aabb8f2
Merge pull request #625 from fullsend-ai/add-frontend-linting
waynesun09 Jun 23, 2026
01060b6
chore: update fullsend shim workflow
fullsend-ai-fullsend[bot] Jun 23, 2026
6a8b38d
Merge pull request #2573 from fullsend-ai/fullsend/onboard
ralphbean Jun 23, 2026
b2ea498
fix(deps): restore toml-eslint-parser removed by 758ce3e4
waynesun09 Jun 23, 2026
20c11e6
Merge pull request #2508 from fullsend-ai/pin-actions-to-sha
ralphbean Jun 23, 2026
51ee5f7
fix(#1230): run OutputPipeline on post-review before posting to forge
fullsend-ai-coder[bot] Jun 18, 2026
645d883
fix(#1230): sanitize severity/category fields and fix misleading log …
fullsend-ai-coder[bot] Jun 22, 2026
13d82c0
fix: log per-finding details after body sanitization summary
fullsend-ai-coder[bot] Jun 22, 2026
5d6928e
Merge pull request #2444 from fullsend-ai/agent/1230-sanitize-post-re…
ben-alkov Jun 23, 2026
0ae170f
Merge remote-tracking branch 'origin/main' into docs/mcp-config-drift
Benkapner Jun 24, 2026
623c7f0
Merge pull request #2011 from Benkapner/docs/mcp-config-drift
rh-hemartin Jun 24, 2026
ce549c1
fix(#2591): add Signed-off-by trailer to scaffold PR commits
fullsend-ai-coder[bot] Jun 24, 2026
9d7c2b9
fix: scope ErrNotFound wrapping in GetAuthenticatedUserIdentity
fullsend-ai-coder[bot] Jun 24, 2026
811d99a
Merge pull request #2595 from fullsend-ai/agent/2591-scaffold-signoff
ifireball Jun 24, 2026
d726889
Merge pull request #2576 from fullsend-ai/fix-toml-dep
ifireball Jun 24, 2026
fa4bb7d
chore(ci): add pinact pre-commit hook to enforce SHA-pinned actions
ralphbean Jun 22, 2026
44e9d2f
fix(ci): pin actions in renovate.yml to commit SHAs
ralphbean Jun 23, 2026
8ac66b4
fix(ci): add pinact to bootstrap and cover .github/actions/ in hook
ralphbean Jun 24, 2026
b4ffe64
Merge pull request #2509 from fullsend-ai/chore/pinact-precommit-hook
ralphbean Jun 24, 2026
4b08f2a
Merge upstream/main
ifireball Jun 24, 2026
a3bbc22
fix(workflows): add PR fallback to triage/code/prioritize concurrency
ifireball Jun 24, 2026
f35c753
Merge upstream/main into fix/981-per-repo-concurrency
ifireball Jun 24, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/reusable-code.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Reusable code agent workflow. Called by thin callers in .fullsend repos
# via workflow_call. Runs in the caller's repo context (secrets, checkout).
#
# Concurrency: agent-scoped cancel-in-progress group (distinct from dispatch/thin
# caller groups so workflow_call parent runs are not cancelled).
name: Code Agent

on:
Expand Down Expand Up @@ -39,6 +42,10 @@ on:
FULLSEND_GCP_PROJECT_ID:
required: true

concurrency:
group: fullsend-code-agent-${{ inputs.source_repo }}-${{ fromJSON(inputs.event_payload).issue.number || fromJSON(inputs.event_payload).pull_request.number }}
cancel-in-progress: true

jobs:
code:
name: Code
Expand Down
23 changes: 23 additions & 0 deletions .github/workflows/reusable-dispatch.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@
# workflow_call jobs. This is the per-repo equivalent of the per-org
# dispatch.yml + thin caller pair.
#
# Concurrency: each stage job declares a per-role cancel-in-progress dispatch group.
# Reusable stage workflows use distinct agent-scoped groups (fullsend-{stage}-agent-…)
# so workflow_call parents are not cancelled. Roles operate independently — review
# dispatches do not cancel triage, code, fix, etc.
#
# Flow: shim (per-repo) → reusable-dispatch.yml → reusable-{stage}.yml
# Nesting: 3 levels of workflow_call (within GitHub's 4-level limit)
#
Expand Down Expand Up @@ -413,6 +418,9 @@ jobs:
name: Triage
needs: route
if: needs.route.outputs.stage == 'triage'
concurrency:
group: fullsend-triage-${{ github.repository }}-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: true
# @v0 is hardcoded — GHA does not support expressions in uses:.
# fullsend_ai_ref controls the ref for composite actions inside stage workflows.
uses: fullsend-ai/fullsend/.github/workflows/reusable-triage.yml@v0
Expand All @@ -433,6 +441,9 @@ jobs:
name: Code
needs: route
if: needs.route.outputs.stage == 'code'
concurrency:
group: fullsend-code-${{ github.repository }}-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: true
uses: fullsend-ai/fullsend/.github/workflows/reusable-code.yml@v0
with:
event_type: ${{ github.event_name }}
Expand All @@ -451,6 +462,9 @@ jobs:
name: Review
needs: route
if: needs.route.outputs.stage == 'review'
Comment thread
ifireball marked this conversation as resolved.
concurrency:
Comment thread
ifireball marked this conversation as resolved.
group: fullsend-review-${{ github.repository }}-${{ github.event.pull_request.number || github.event.issue.number }}
cancel-in-progress: true
uses: fullsend-ai/fullsend/.github/workflows/reusable-review.yml@v0
with:
event_type: ${{ github.event_name }}
Expand All @@ -469,6 +483,9 @@ jobs:
name: Fix
needs: route
if: needs.route.outputs.stage == 'fix'
concurrency:
group: fullsend-fix-${{ github.repository }}-${{ github.event.pull_request.number || github.event.issue.number }}
cancel-in-progress: true
uses: fullsend-ai/fullsend/.github/workflows/reusable-fix.yml@v0
with:
event_type: ${{ github.event_name }}
Expand All @@ -488,6 +505,9 @@ jobs:
name: Retro
needs: route
if: needs.route.outputs.stage == 'retro'
concurrency:
group: fullsend-retro-${{ github.repository }}-${{ github.event.pull_request.number || github.event.issue.number }}
cancel-in-progress: true
uses: fullsend-ai/fullsend/.github/workflows/reusable-retro.yml@v0
with:
event_type: ${{ github.event_name }}
Expand All @@ -506,6 +526,9 @@ jobs:
name: Prioritize
needs: route
if: needs.route.outputs.stage == 'prioritize'
concurrency:
group: fullsend-prioritize-${{ github.repository }}-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: true
uses: fullsend-ai/fullsend/.github/workflows/reusable-prioritize.yml@v0
with:
event_type: ${{ github.event_name }}
Expand Down
16 changes: 14 additions & 2 deletions .github/workflows/reusable-fix.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Reusable fix agent workflow. Called by thin callers in .fullsend repos
# via workflow_call. Runs in the caller's repo context (secrets, checkout).
# Reusable fix agent workflow. Called by dispatch workflows via workflow_call.
# Runs in the caller's repo context (secrets, checkout).
#
# Concurrency: agent-scoped cancel-in-progress group (distinct from dispatch/thin
# caller groups so workflow_call parent runs are not cancelled).
name: Fix Agent

on:
Expand Down Expand Up @@ -51,6 +54,15 @@ on:
FULLSEND_GCP_PROJECT_ID:
required: true

concurrency:
group: >-
fullsend-fix-agent-${{ inputs.source_repo }}-${{
fromJSON(inputs.event_payload).pull_request.number
|| fromJSON(inputs.event_payload).issue.number
|| inputs.pr_number
}}
cancel-in-progress: true

jobs:
fix:
name: Fix
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/reusable-prioritize.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Reusable prioritize agent workflow. Called by thin callers in .fullsend repos
# via workflow_call. Runs in the caller's repo context (secrets, checkout).
# Reusable prioritize agent workflow. Called by dispatch workflows via workflow_call.
# Runs in the caller's repo context (secrets, checkout).
#
# Concurrency: agent-scoped cancel-in-progress group (distinct from dispatch/thin
# caller groups so workflow_call parent runs are not cancelled).
name: Prioritize Agent

on:
Expand Down Expand Up @@ -43,6 +46,10 @@ on:
FULLSEND_GCP_PROJECT_ID:
required: true

concurrency:
group: fullsend-prioritize-agent-${{ inputs.source_repo }}-${{ fromJSON(inputs.event_payload).issue.number || fromJSON(inputs.event_payload).pull_request.number }}
cancel-in-progress: true

jobs:
prioritize:
name: Prioritize
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/reusable-retro.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Reusable retro agent workflow. Called by thin callers in .fullsend repos
# via workflow_call. Runs in the caller's repo context (secrets, checkout).
# Reusable retro agent workflow. Called by dispatch workflows via workflow_call.
# Runs in the caller's repo context (secrets, checkout).
#
# Concurrency: agent-scoped cancel-in-progress group (distinct from dispatch/thin
# caller groups so workflow_call parent runs are not cancelled).
name: Retro Agent

on:
Expand Down Expand Up @@ -39,6 +42,10 @@ on:
FULLSEND_GCP_PROJECT_ID:
required: true

concurrency:
group: fullsend-retro-agent-${{ inputs.source_repo }}-${{ fromJSON(inputs.event_payload).pull_request.number || fromJSON(inputs.event_payload).issue.number }}
cancel-in-progress: true

jobs:
retro:
name: Retro
Expand Down
11 changes: 9 additions & 2 deletions .github/workflows/reusable-review.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
# Reusable review agent workflow. Called by thin callers in .fullsend repos
# via workflow_call. Runs in the caller's repo context (secrets, checkout).
# Reusable review agent workflow. Called by dispatch workflows via workflow_call.
# Runs in the caller's repo context (secrets, checkout).
#
# Concurrency: agent-scoped cancel-in-progress group (distinct from dispatch/thin
# caller groups so workflow_call parent runs are not cancelled).
name: Review Agent

on:
Expand Down Expand Up @@ -39,6 +42,10 @@ on:
FULLSEND_GCP_PROJECT_ID:
required: true

concurrency:
group: fullsend-review-agent-${{ inputs.source_repo }}-${{ fromJSON(inputs.event_payload).pull_request.number || fromJSON(inputs.event_payload).issue.number }}
cancel-in-progress: true

jobs:
review:
name: Review
Expand Down
12 changes: 10 additions & 2 deletions .github/workflows/reusable-triage.yml
Original file line number Diff line number Diff line change
@@ -1,5 +1,9 @@
# Reusable triage agent workflow. Called by thin callers in .fullsend repos
# via workflow_call. Runs in the caller's repo context (secrets, checkout).
# Reusable triage agent workflow. Called by dispatch workflows via workflow_call.
# Runs in the caller's repo context (secrets, checkout).
#
# Concurrency: agent-scoped cancel-in-progress group (distinct from dispatch/thin
# caller groups so workflow_call parent runs are not cancelled). Latest agent
# run for an issue wins.
name: Triage Agent

on:
Expand Down Expand Up @@ -39,6 +43,10 @@ on:
FULLSEND_GCP_PROJECT_ID:
required: true

concurrency:
group: fullsend-triage-agent-${{ inputs.source_repo }}-${{ fromJSON(inputs.event_payload).issue.number || fromJSON(inputs.event_payload).pull_request.number }}
cancel-in-progress: true

jobs:
triage:
name: Triage
Expand Down
5 changes: 5 additions & 0 deletions docs/ADRs/0034-centralized-shim-routing-via-dispatch.md
Original file line number Diff line number Diff line change
Expand Up @@ -166,3 +166,8 @@ The `stage` input to `dispatch.yml` becomes optional. When provided
the same routing script. Per-org shims could also adopt
`reusable-fullsend.yml` directly, eliminating `dispatch.yml` as a
routing layer entirely — see ADR 0033 Open Questions.

## Implementation note (#981)

Per-role dispatch concurrency is configured in repository workflows; the routing
model in this ADR is unchanged.
5 changes: 5 additions & 0 deletions docs/ADRs/0041-synchronous-workflow-call-event-dispatch.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,3 +138,8 @@ re-evaluate whether a discovery mechanism is needed.
`needs:` / concurrency review ([#504](https://github.com/fullsend-ai/fullsend/issues/504)).
- Discovery may be revisited after [ADR 0038](0038-universal-harness-access.md)
agent architecture changes land.

## Implementation note (#981)

Per-repo concurrency follow-up ([#504](https://github.com/fullsend-ai/fullsend/issues/504))
is addressed in workflow configuration; the dispatch shape in this ADR is unchanged.
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,10 @@
# which determines the stage and conditionally calls the appropriate
# reusable-{stage}.yml workflow. Adding a new stage requires only a case
# branch in reusable-dispatch.yml — zero changes to this repo.
#
# Concurrency: per-role cancel-in-progress groups live in reusable-dispatch.yml
# stage jobs and agent-scoped groups on reusable-{stage}.yml — not on this shim.
# A monolithic shim group would serialize unrelated roles and drop pending runs (#2452).
name: fullsend

permissions:
Expand All @@ -35,9 +39,6 @@ on:

jobs:
dispatch:
concurrency:
group: fullsend-dispatch-${{ github.event.issue.number || github.event.pull_request.number }}
cancel-in-progress: false
if: >-
github.event_name != 'issue_comment'
|| github.event.comment.user.type != 'Bot'
Expand Down
15 changes: 15 additions & 0 deletions internal/scaffold/scaffold_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -145,6 +145,21 @@ func TestShimWorkflowCallTemplateContent(t *testing.T) {
assert.NotContains(t, s, "curl")
}

func TestShimPerRepoTemplateContent(t *testing.T) {
content, err := FullsendRepoFile("templates/shim-per-repo.yaml")
require.NoError(t, err)
s := string(content)
assert.True(t, strings.HasPrefix(s, "---\n"), "per-repo shim must start with YAML document start marker")
assert.Contains(t, s, "dispatch:")
assert.Contains(t, s, "stop-fix:")
assert.Contains(t, s, "__REUSABLE_DISPATCH__")
assert.Contains(t, s, "install_mode: per-repo")
// Per-role concurrency lives in reusable-dispatch.yml, not a monolithic shim group (#2452).
Comment thread
ifireball marked this conversation as resolved.
assert.NotContains(t, s, "fullsend-dispatch-${{")
assert.NotRegexp(t, `(?m)^\s+concurrency:`, s)
assert.Contains(t, s, "per-role cancel-in-progress groups live in reusable-dispatch.yml")
}

func TestShimTriggerParity(t *testing.T) {
// Both shim templates must declare the same event trigger types so that
// per-repo and workflow-call installation modes have identical behavior.
Expand Down
Loading
Loading