Skip to content

fix: preserve the readiness window and failed candidate diagnostics - #27

Merged
apresmoi merged 6 commits into
mainfrom
fix/candidate-readiness-diagnostics
Sep 13, 2026
Merged

apresmoi merged 6 commits into
mainfrom
fix/candidate-readiness-diagnostics

Conversation

@apresmoi

@apresmoi apresmoi commented Sep 13, 2026

Copy link
Copy Markdown
Collaborator

A running image candidate could become unhealthy during startup and be rolled back before Spawnfile’s existing 120-second readiness budget expired. It now continues polling within that budget and succeeds only after becoming healthy; stopped containers and unknown health states still fail immediately.

Failed candidates now save bounded, sanitized application logs and health details in private local deployment evidence before rollback removes the container. Errors point to that evidence. Collection or storage failures do not prevent rollback. Shared Docker log redaction normalizes text and secret values together and replaces longer secrets first.

Validation: 67 targeted tests; 3,532 full Vitest tests, 12 node tests and 28 script tests; typecheck/package build; 27-page website build; isolated real Docker stdout/stderr capture and redaction smoke. Coverage:95.02% lines,90.07% branches. Readiness, quoted-authorization and normalization regressions were verified red before fixes; removing diagnostic capture breaks the rollback-path regression. GitHub CI passes on cf559b8. Independent Claude review accepted readiness, rollback and private storage. Its concrete sanitizer findings were fixed and regression-tested; the final independent Antigravity review accepted the shared normalization, empty-value filtering, longest-first matching and caller immutability.

@apresmoi
apresmoi merged commit ea5352a into main Sep 13, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant