Problem / why
The runtime promoter walks one global Config.Environments and writes one global
latest_release (internal/promote/promote.go, internal/promote/finalize.go). For a
multi-component manifest, the env walk and the finalize must run per component and write into
that component's state subtree. For a single-component manifest, the single default component
keeps today's behavior.
Scope (firm intent, details to be refined after V3)
- Make the promotion env walk a per-component loop; each component promotes through the
environment ladder on its own version line.
- Port the finalize overlay to component-major:
into.State.Components[comp][env] = mine...Components[comp][env], a disjoint top-level assign with no merge logic, and write a
per-component latest_release.components[comp].
CommitWithRetry stays unchanged; only the Mutate closure keys change. The serializer picks
the single-component collapse or multi-component expand form per F3.
Files / areas touched
internal/promote/promote.go, internal/promote/finalize.go.
Tests and coverage required
- Unit tests: promoting A does not alter B's state subtree or latest_release.
- e2e: promote one component dev to prod while the other stays put.
- A single-component regression test that promotion is unchanged.
Acceptance criteria
- Each component promotes on its own version line and writes only its own state subtree.
- Single-component promotion is unchanged.
Dependencies
Blocked by the independent versioning milestone (V1-V4).
Problem / why
The runtime promoter walks one global
Config.Environmentsand writes one globallatest_release(internal/promote/promote.go,internal/promote/finalize.go). For amulti-component manifest, the env walk and the finalize must run per component and write into
that component's state subtree. For a single-component manifest, the single
defaultcomponentkeeps today's behavior.
Scope (firm intent, details to be refined after V3)
environment ladder on its own version line.
into.State.Components[comp][env] = mine...Components[comp][env], a disjoint top-level assign with no merge logic, and write aper-component
latest_release.components[comp].CommitWithRetrystays unchanged; only theMutateclosure keys change. The serializer picksthe single-component collapse or multi-component expand form per F3.
Files / areas touched
internal/promote/promote.go,internal/promote/finalize.go.Tests and coverage required
Acceptance criteria
Dependencies
Blocked by the independent versioning milestone (V1-V4).