v0.2.0
Kubernetes high-availability, a reworked dashboard, and a full QA sweep. A
second QA pass over the real prospero/caliband stack filed 23 findings; all
are fixed here, alongside first-class leader election for the k8s fleet backend
and a new agent-timeline dashboard.
Added
- Leader election + attach lifecycle for the
K8sFleetbackend. The
session-plane attach — the one path that writes an agent's events to the shared
store/bus — is now gated on a per-agent ownership lease, so with 2+prosperod
replicas exactly one replica owns, attaches to, and emits each agent (no more
duplicate SSE events or racing per-streamseqallocation). Standalone is
unchanged (SelfOwnsAll); a clustered deploy builds aLeasedOwnershiplease
plus heartbeat. Attach tasks are now promptly torn down on stop/remove/restart,
and any agent observedRunning— including operator- or peer-created ones —
is streamed by the lease owner
(#108,
#112,
#113)
(#138). - Dashboard agent timeline, tool-call inspector, and run header — a folded
event timeline with expandable tool-call segments and a per-run turns/outcome
header (#5)
(#96). prospero-typescrate — the normalizedFleetEvent/model DTOs extracted
into a small, wasm-compatible serde-only crate the WASM dashboard can share
(#98)
(#100).
Changed
- Under
PROSPERO_FLEET=k8s,prosperodno longer builds a local
FleetManager/poll loop; the k8s backend serves directly over the shared
store/bus (#83)
(#92). /readyznow reportsworkspaces_total/workspaces_healthy/
workspaces_unreachable(wasrepos_*), and user-facing error wording says
"workspace" not "repo", matching the vocabulary used everywhere else
(#116,
#117)
(#135).
Fixed
- Dashboard. Terminal-agent SSE streams no longer reconnect-storm into an
unbounded, duplicated timeline with runaway memory
(#105)
(#128); tool calls resolve
ok/failinstead of showing "running" forever (paired bytool_use_id)
(#106)
(#131); the fleet summary
shows the workspace count, the misleading$0.0000cost is gone, and a favicon
is served (#115,
#109,
#119)
(#134). - API. Duplicate workspace registration returns
409 Conflict, not a
misleading503(#111)
(#139); an unknown agent's
events endpoint returns404instead of200 []
(#118)
(#135);api_key_from_env
on a keyless provider is rejected at config-set time, andrmno longer races
a just-spawned agent or lags the fleet view
(#120,
#122,
#123)
(#137). - k8s hardening. The session-plane bearer token is never sent over plaintext
(#107)
(#133); unrecognized
CalibanTaskphases map to a terminal state,calibandEndpointis validated,
lock poisoning can't wedge the fleet view, the token compare is constant-time,
and--fleet-backend k8son a non-k8s build fails before any side effects
(#114,
#121,
#125,
#126,
#127)
(#136). - Tests. De-flaked the
distributed_busPG suite under parallel shared-DB
load (#110)
(#129) and
cli_drives_the_full_stack(#85)
(#94).