Skip to content

0.6.0

Released 2026-06-12.

The corrective release. A second full audit ran against 0.5.0 the day it shipped; v0.6.0 closes its entire P0 lot in one pass. Every change here makes an existing promise true: the SDK tells you when records are rejected, the conformance kit promises exactly what it checks, backups cannot back up nothing, reads do not trip over maintenance, and the liveness memento protects default deployments out of the box.

Not a wire-contract break, no data migration. The sharper behaviors (one MCP argument rename, new defaults) are in the 0.5 → 0.6 migration guide.

Changed

  • Standard Go versioning. This release is tagged v0.6.0, and the SDK is its own Go module released independently as pkg/emit/vX.Y.Z — so go get github.com/toise-dev/toise/pkg/emit@v0.1.0 resolves to a real version, and a producer's module graph shrinks to the OTel pdata types and gRPC (none of the server's storage or query stack). Import path unchanged (ADR 0027).
  • MCP get_entity takes entity_id (was id), aligning it with every other entity-taking tool; recent_changes defaults its window to the last hour instead of requiring it.
  • Snapshots on by default (snapshot_interval: 5m), plus a final snapshot at graceful shutdown and a one-interval boot grace after downtime — producer liveness survives restarts in a default deployment, without a post-downtime delete storm.
  • toise-server checkpoint is strictly read-only: it refuses a missing data dir, a legacy layout, or an empty dir instead of silently minting an empty store and "backing it up"; --config honors the server's YAML.
  • The conformance kit's claim is exact: passing Check means never rejected per record for shape reasons; it now also catches empty attribute keys and warns (advisory) when service.instance.id is missing.

Fixed

  • The SDK surfaces partial success: State/Delete return a typed emit.PartialError (count + first server reason) when records are rejected, instead of a silent nil.
  • History reads no longer fail during maintenance: queries that overlapped heartbeat coalescing or retention pruning could error with pebble: not found; dangling index entries are now skipped.
  • An unknown embedded relationship.type is rejected per record instead of wedging the producer's whole export in a retry loop.
  • Pre-1970 timestamps are rejected on every event-time input (MCP and GraphQL) instead of answering with the current graph dressed up as ancient history.

Added

  • pkg/emit/wire — the single in-repo spelling of the entity-events wire vocabulary (stdlib-only), imported by the SDK, the conformance kit and Toise's own ingest, with end-to-end tests pinning the two constants whose drift would have been silent (entity.report.interval, service.instance.id).