v0.235.0: a delivered fix must also refresh the stored definition
gates / gates (push) Successful in 14s

Found by the LIVE validation on demo-hp, not by review. Scenario A passed - a
non-image catalog change reached the pinned app on the real 15-minute cycle - and
that is exactly what exposed the gap: the stored applied-compose.yml is written
when the PIN is written, so the fix landed in the live compose file and not in the
store. The first time the catalog then moved a version, the freeze would have
rendered the pre-fix definition and reverted every fix delivered since - silently
undoing the half of the operator's ruling that says fixes keep flowing.

The equal-images branch now refreshes the store as it delivers. The images cannot
move in that branch by construction, so no version moves and no intent is
rewritten. RenderPlan gains StackDir so the syncer can write it.

TestFixRefreshesTheStoredDefinition asserts both halves: the fix reaches the
store, and it survives the freeze that follows.
This commit is contained in:
2026-09-06 10:04:21 +02:00
parent 8a0e0a59ad
commit 2a56f557d0
4 changed files with 95 additions and 13 deletions
+11 -1
View File
@@ -78,9 +78,19 @@ test still green, because the two fields have the same type. The comparison now
`Stack.CatalogImages`, taken from the syncer's git clone. **No readable catalog entry renders
nothing.** No Hungarian string, badge state or partial changed.
### A fix must also refresh the stored definition — found by the LIVE validation, not by review
The stored definition is written when the pin is written. A fix delivered afterwards landed in the
live compose file but **not** in the stored one — so the first time the catalog moved a version, the
freeze would have reverted every fix delivered since, **silently undoing the half of the ruling that
says fixes keep flowing**. The equal-images branch now refreshes the store as it delivers. The images
cannot move there by construction, so no version moves and no intent is rewritten.
`TestFixRefreshesTheStoredDefinition` asserts both halves: the fix reaches the store, and it survives
the subsequent freeze.
### Tests
+16 (1729 → 1745). 28 packages green, 0 FAIL. New: `internal/sync/render_test.go`,
+17 (1729 → 1746). 28 packages green, 0 FAIL. New: `internal/sync/render_test.go`,
`internal/stacks/pin_test.go`, Group G in `internal/web/updatebadge_test.go`.
**Three companion red-proofs, each run, observed failing, and reverted (2026-09-06):**