Problem / why
GitHub Actions cannot path-filter per matrix leg (on.push.paths is workflow-global), so a
matrix over components would trigger every leg on any component's path change. F4 already emits
one orchestrate file per component; this issue drives each file's on.push.paths from that
component's triggers and gives each its own component-keyed concurrency group and scoped
setup / build / deploy / finalize jobs.
Scope
This PR does:
- Drive each component file's
on.push.paths from that component's triggers / paths
(writeWorkflowTriggers), replacing the global GetAllTriggers collapse for multi-component
manifests.
- Emit a per-component concurrency group, replicating the proven pattern already used by
internal/generate/external.go (a per-component key so distinct components never share a
group).
- Keep single-component output (the
default collapse) byte-identical.
This PR does NOT:
- Change promotion workflows (P2 handles per-component promote files).
- Introduce cross-component ordering.
Files / areas touched
internal/generate/generator.go - per-component writeWorkflowTriggers / writeConcurrency.
internal/generate/command.go - wire component triggers into the per-component files.
Tests and coverage required
- Generator unit tests: a two-component manifest emits two orchestrate files, each with its own
on.push.paths and its own concurrency group.
- A test that the single-component output is unchanged.
- actionlint-clean assertion on the generated multi-component workflows.
Acceptance criteria
- One orchestrate workflow file per component, each path-filtered to that component.
- Each component has a distinct concurrency group.
- Single-component output filenames and contents are unchanged and actionlint-clean.
Dependencies
Blocked by V1 and V2.
Problem / why
GitHub Actions cannot path-filter per matrix leg (
on.push.pathsis workflow-global), so amatrix over components would trigger every leg on any component's path change. F4 already emits
one orchestrate file per component; this issue drives each file's
on.push.pathsfrom thatcomponent's triggers and gives each its own component-keyed concurrency group and scoped
setup / build / deploy / finalize jobs.
Scope
This PR does:
on.push.pathsfrom that component's triggers / paths(
writeWorkflowTriggers), replacing the globalGetAllTriggerscollapse for multi-componentmanifests.
internal/generate/external.go(a per-component key so distinct components never share agroup).
defaultcollapse) byte-identical.This PR does NOT:
Files / areas touched
internal/generate/generator.go- per-componentwriteWorkflowTriggers/writeConcurrency.internal/generate/command.go- wire component triggers into the per-component files.Tests and coverage required
on.push.pathsand its own concurrency group.Acceptance criteria
Dependencies
Blocked by V1 and V2.