cast smoke's canary appears to live in the PREVIEW env set — the never-delete guarantee is verified against rows apply never writes #89
Labels
No labels
blocked
blocker:ci-red
blocker:conflict
blocker:drill-pending
blocker:unrequested
bug
claimed
documentation
enhancement
epic
merge-next
needs-triage
ready
release
scope:apply
scope:capture
scope:coolify-api
scope:fleet
scope:manifest
scope:secrets
stale
state:addressing
state:bots-reviewing
state:building
state:needs-human
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: heavy-duty/cast#89
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
INFRA_SMOKE_KEEPandINFRA_SMOKE_PROBE— the canary and probecast smokewrites — appear to live in the preview env set on prod. If so, smoke's central guarantee is being verified against rowsapplynever touches.The evidence, by elimination
Both vars were reported as live-only orphans on
corein everycast diff --env prod --fullof 2026-07-16 — and vanished the moment #86 landed, with nothing between the two runs but acastreinstall:#86 changed exactly one thing about what
fetchEnvreturns:That predicate is strict. A numeric
1, a string, an absent field — all!== true, all kept. The only rows it can drop are ones whereis_previewis booleantrue. So both smoke vars areis_preview: trueon this box.Why that shouldn't be possible
smoke.tssendsis_preview: falseon both writes — the singular POST for the canary and the bulk PATCH for the probe:And Coolify honours the payload without duplicating (
ApplicationsController@create_bulk_envs, v4.1.2):Even an older cast that sent no
is_previewwould land on?? false. So on the code as written these should be production rows, and #86 should have kept them.Why it matters — smoke is testing the wrong rows
smokeexists to prove one thing, andsmoke.tssays so itself:If the canary and probe sit in the preview set, then:
apply'ssyncEnvnever writes (it sendsis_preview: false), so a full-replace regression on the production set would not move the canary — smoke would stay green through exactly the regression it exists to catch;cast smokehas been leaving two permanent vars in a set nobody looks at.A canary in the wrong mine is worse than no canary: it reports safety it never measured.
Probe
is_preview: true→ confirms the above; smoke's canary is in the preview set.is_preview: false→ then #86 is dropping production rows, which is the more serious outcome: #86 must be narrowed or reverted, and the reasoning above is wrong somewhere.[]→ they were deleted independently and this whole issue is moot.What to do
is_preview: falsebeing sent)smokeassert what it created: it already reads the env list back to checkKEEP_KEYsurvived — checking that the surviving row is theis_preview: falseone is the same read, and it is the difference between a canary and a decorationFound while verifying #85/#86 against prod (the note landed on #85 after it had already closed, hence this issue).