Problem / why
Promotion workflows are generated globally (internal/promote/promote.go emission). For a
multi-component manifest, like orchestrate (V3), promotion must fan out to one file per
component so each component's promotion runs and concurrency are isolated. A single-component
manifest keeps promote.yaml.
Scope (firm intent, to be refined after P1)
- Emit one promote workflow file per component (
promote-<name>.yaml; the single-component
default keeps promote.yaml).
- Per-component concurrency group, replicating the V3 / external pattern.
- Reserve the matrix for legs WITHIN a component (the existing per-environment / per-promotion
matrix), not across components.
Files / areas touched
internal/promote/promote.go (emission), internal/generate/command.go (fan-out).
Tests and coverage required
- Generator unit tests: one promote file per component, each with its own concurrency group.
- actionlint-clean on generated multi-component promote workflows.
- A single-component regression test that
promote.yaml is unchanged.
Acceptance criteria
- One promote workflow per component, each with a distinct concurrency group, actionlint clean.
- Single-component promote output is unchanged.
Dependencies
Blocked by P1.
Problem / why
Promotion workflows are generated globally (
internal/promote/promote.goemission). For amulti-component manifest, like orchestrate (V3), promotion must fan out to one file per
component so each component's promotion runs and concurrency are isolated. A single-component
manifest keeps
promote.yaml.Scope (firm intent, to be refined after P1)
promote-<name>.yaml; the single-componentdefaultkeepspromote.yaml).matrix), not across components.
Files / areas touched
internal/promote/promote.go(emission),internal/generate/command.go(fan-out).Tests and coverage required
promote.yamlis unchanged.Acceptance criteria
Dependencies
Blocked by P1.