Styx v0.2.0 — the wishlist crossing
The wishlist release: everything the first external integration of the shared-memory transport — a device gateway embedding Styx as its device-plugin transport — had to work around, closed. Six public-API additions, four fixes the work surfaced, every feature commit externally reviewed to a clean verdict before landing.
Stability: pre-1.0 — the public Go API may still move between minor versions. The wire contracts (
shm-abi.md,stream-protocol.md) are frozen and change only by explicit, versioned amendment.
Added
ErrPayloadTooLarge— an oversize payload is rejected before any byte is published, and that rejection is nowerrors.Is-matchable at the public API on unary calls, stream opens, and stream sends. A host's error-translation table can classify it instead of default-denying a deterministic condition.- Live stdio observation —
PluginSpec.Stdiotakes aStdioSinkreceiving every stdout/stderr line a plugin writes, live; a slow or panicking sink never blocks or crashes the plugin.PluginCrashError.StderrTailcarries the crash tail structured, so log pipelines stop parsing it out ofReason. Host.Health(name)— a pull-based, level-triggered health snapshot: most recent lifecycle state, last transition time, last error, and the current consecutive missed-heartbeat count. Built for synchronous probes (a Kubernetes liveness handler, an embedding supervisor'sPing()) that previously had to rebuild retained state from the edge-triggeredEvents()channel. Unknown names answerErrUnknownPlugin.- Protobuf editions support in
protoc-gen-go-styx—edition = "2023"contract files generate; the declared range mirrors the pinned protobuf runtime, with golden and response-contract tests keeping it honest. NoRestart— a named supervision policy for hosts whose embedding supervisor owns restart decisions, plus the documented host-owned-restart pattern (freshHostper recreation) indocs/plugin-lifecycle.md.IncompatibleError.Kind— a tampered or wrong binary on disk (IncompatibleBinaryIdentity) is now distinguishable from ordinary version skew (IncompatibleHandshake) without parsingReason.
Fixed
- An oversize
STREAM_OPENsurfaced wrapped in the retryableErrPluginUnavailable, mislabeling a deterministic rejection as transient. - The shared-memory writer's arena oversize backstop reported an error outside the never-published classification, which would have misclassified a provably-unpublished send as outcome-unknown.
Host.Startsilently attached a second supervisor to an already-started name, overwriting its routing; it now refuses withErrPluginAlreadyStarted.make lintnever linted the failpoint-tagged files thatmake test-failpointtests; thecigate now runs both passes.
Full details in CHANGELOG.md.