Skip to content

v0.14.0

Choose a tag to compare

@github-actions github-actions released this 17 Aug 16:12
· 14 commits to main since this release
b086d43
Toise v0.14.0 — reachability, and the first deprecation

A fourteenth entity type makes "why can't A reach B" a graph question, and the
1.0 freeze audit opens by naming what will not survive it. No wire-contract
break, no data migration.

network.segment is a broadcast and reachability domain bearing an assigned
identifier. Two workloads on the same one can address each other, two on
different ones cannot, whatever the firewall says. It was nothing in the graph
before: producers carried overlays as metric labels, queryable but not
traversable. A cluster declares its segments with has_segment, a container or pod
joins one with attached_to, and find_path between two containers on disjoint
segments answers reachable:false in one hop. Verified on a real four-node Swarm.

Only swarm:<network-id> is a frozen identity subtype. k8s: and vlan: are
deliberately open, with their reasons in the contract: Kubernetes has no object
to identify in the default flat-network case, and a VLAN id is not globally
unique while a VLAN trunked across five switches is one segment rather than five.
An identity engraved wrongly costs a migration; an open one costs a sentence.

The edges promise less than they may appear to. attached_to states a dependency,
not that an event will arrive: no producer can mark a segment down, so impact_of
answers a hypothetical while nothing propagates at runtime. Do not alert on it.
The alertable event is on the edge, a container losing its attachment. And
membership is necessary, not sufficient, for reachability.

The freeze audit opens with the project's first deprecation. routes_via,
forwards_to and adjacent_to were superseded under ADR 0022 and will be removed at
1.0; this release is the notice the stability policy requires. They stay accepted
meanwhile. ENTITY_IDENTITY_CHANGED is a different case and cannot be removed — it
replays logs written before exact identity — so it is now documented as never
emitted rather than left to invite a handler. recentChanges gains the 1h default
its MCP twin already had. And parity between the two read surfaces is defined:
not feature-equal, but identical wherever both answer the same question.

pkg/emit/wire staying stdlib-only is now enforced by a test rather than promised
in a comment: a producer that already owns its OTLP transport must be able to
take the vocabulary without the protocol stack.

entity.delete.reason is settled as a distinct axis from delete_source, with an
open enum and a recommended core. Six values say the resource ended; unmonitored
says the observation did and the resource may still be running — the value that
stops a removed probe from reading as a vanished database.

Producers get the vocabulary in pkg/emit/v0.9.0.