Problem
The promote workflow hardcodes fail-fast: false on its deploy matrix (promote.go:579) and there is no max-parallel anywhere in the generator. Both values are fixed at generation time with no manifest-level knob.
This prevents two common deployment patterns:
- Rolling/region-by-region deploys:
max-parallel: 1 ensures only one environment or region is deploying at a time, limiting blast radius.
- Fail-fast on first bad environment: some teams want
fail-fast: true so a failed dev deploy halts the rest of the matrix rather than continuing to staging and prod.
The schema shape for this should be reserved now. The matrix-builds work and canary support both inherit this same knob, so the field design affects multiple future features.
What to add
Add a strategy: block to the deploy-matrix configuration in the manifest schema:
deploys:
strategy:
max_parallel: 1 # optional; GHA default is unlimited
fail_fast: false # optional; default false (current behaviour preserved)
The generator maps these to strategy.max-parallel and strategy.fail-fast on the promote matrix job. When absent, current behaviour is preserved (fail-fast: false, no max-parallel).
Acceptance criteria
Problem
The promote workflow hardcodes
fail-fast: falseon its deploy matrix (promote.go:579) and there is nomax-parallelanywhere in the generator. Both values are fixed at generation time with no manifest-level knob.This prevents two common deployment patterns:
max-parallel: 1ensures only one environment or region is deploying at a time, limiting blast radius.fail-fast: trueso a failed dev deploy halts the rest of the matrix rather than continuing to staging and prod.The schema shape for this should be reserved now. The matrix-builds work and canary support both inherit this same knob, so the field design affects multiple future features.
What to add
Add a
strategy:block to the deploy-matrix configuration in the manifest schema:The generator maps these to
strategy.max-parallelandstrategy.fail-faston the promote matrix job. When absent, current behaviour is preserved (fail-fast: false, nomax-parallel).Acceptance criteria
strategy.max_parallel(positive integer) andstrategy.fail_fast(bool) under the deploy configuration.max_parallelis set, the generated promote matrix includesstrategy.max-parallel: N.fail_fastis set totrue, the generated promote matrix emitsfail-fast: trueinstead of the hardcodedfalse.strategyproduces the same output as today (non-breaking).cascade validaterejectsmax_parallel: 0or negative values with a clear error.strategy: {max_parallel: 1, fail_fast: true}generates a promote workflow where the matrix block containsmax-parallel: 1andfail-fast: true; a manifest with nostrategyblock generates output identical to the current baseline.