v0.4.0-beta
·
440 commits
to master
since this release
Spooky 0.4.0-beta — Runtime Lifecycle & Canonical Observability
Minor release covering all changes since 0.3.1-beta.
Added
- Deterministic runtime lifecycle state machine — reload commits, drain, and shutdown now flow through explicit lifecycle states rather than ad-hoc paths, making generation swaps predictable under load.
- Canonical observability vocabulary — admission outcomes, local reason enums, overload metric labels, and backend health-failure reasons all map to one canonical set, with bounded connect-attempt label cardinality to keep metric series stable.
- Unified backend refresh classification — DNS/health refreshes report explicit traffic-continuity outcomes, and the canonical backend health-failure reason is surfaced in the control-plane snapshot.
- Structured reload rejections — operator-facing reload preflight failures now carry structured messages, backed by a typed operational-policy vocabulary for runtime ownership and reload rules.
- Live log-level reload —
log.levelchanges apply on config reload via a runtimeset_log_level, no restart required.
Fixed
- Process-shared watchdog and DNS resolver are now carried across reload instead of being rebuilt, preserving state through generation swaps.
- Bundle-lock panic and control-API unreachable paths replaced with fail-safe recovery; backend client-rotation failure is now an explicit, operator-visible outcome.
- Pre-response requests still reading the body now time out under the request-body bucket.
- Restored stateful round-robin selection, failover availability on circuit-open retries, and streaming guardrail failure semantics.
- WebSocket upgrade headers preserved in bootstrap
101responses. - Upstreams iterated in name order so route conflicts report deterministically.
Changed
- Public API surface locked down across all crates — crate-internal items demoted,
unreachable_pubenforced, dead code removed, and public runtime/listener/connection surfaces documented. - Documentation realigned to the post-refactor architecture (edge runtime ownership, runtime generation & backend lifecycle, request lifecycle, transport boundaries, observability, and reload behavior).
- Test suite hardened with per-contract cases asserting QUIC/bootstrap parity, metric label vocabularies, and retry/hedge accounting.
Known Limitations
- No dynamic backend discovery (static config only)
- Listener bind address and protocol changes still require a restart
- Pre-GA — extended soak testing recommended before broad production rollout