zenkey-fleet
The fleet engine for keyspace-v2 Zenoh
tooling — the shared core of the zenctl and zengui explorers, in five
layers:
bus/ holds a session → observations
model/ holds values → meaning
judge/ holds meaning → verdicts
report/ the serialized shapes every layer above hands out
tape/ traffic as a thing: captured, replayed, manufactured, timed
Placing a module is one question in order: does it need a session (bus/),
can it answer from values already in hand (model/), does it say whether
something is wrong (judge/), does it turn a stream into a recording or
back (tape/)? A new serde-pinned struct is not a module question at all —
it goes to report/, by the rule that module's docs state.
bus/ — everything holding a session
query— the RFC 05 §2.1 fan-in discipline (fleet_get: targetAll, consolidationNone, attribution by the reply's own key), in exactly one place. Answers carry zenoh's refcountedZBytes— no per-reply copies.write— the only two ways an explorer writes:Publication(a declared publisher with the closed QoS enum applied —send, and since #115retire, the RFC 04 §1.2 tombstone; there is deliberately no bare-put and no bare-delete helper) andcall, the disciplined RPC.check_retireis the class guard: state keys pass, everything else prices the operator act (--i-know), wildcards refuse outright.monitor—Monitor: subscription multiplexing + liveliness watching (withhistory(true)— the roster arrives on join) into a bounded broadcast of events. Overflow surfaces as an explicitDropped(n); render loops pull the immutableKeyTreeSnapshoton the stats tick, so a hot bus cannot melt a UI.body(featuredecode) — the encode direction:prepare_publish/prepare_requestturn a typed body into the bytes that actually ship, encoded against the served schema and labelled with the declaredEncoding. Encode resolution is declared > registry > the schema kind's native encoding (never a sniff of the operator's text). A body that could not be encoded is reported as such —BodySourcedistinguishes encoded, as-typed, and raw, so no caller can ship an unencoded payload silently.roster/admin— the liveliness roster and raw@/**admin-space access. Plussession,serve,scout,seed,blob,discover,producer.
model/ — meaning, without a session
registry—SliceSet: registry slices from the live bus (introspectfan-in) or localregistry/*.tomldirs, one type either way, with precedence-correct subject refinement (sharedzenkey::patternmatcher) and an on-disk cache.decode(featuredecode, default) — the RFC 08 §7 pipeline:SchemaStorelazily fetches each producer's serveddescribeschema set,decode_sampleturns wire bytes into named-field JSON with honest structural fallback; encoding resolution is sample > registry > sniff.decode-protobufadds dynamic protobuf via the served FileDescriptorSet,decode-cdradds XCDR1 (DDS / ROS 2) against a servedcdrfield list.stats/tree— per-key rate/byte counters (EWMA, SourceInfo gap counting) and the chunk-grouped snapshot they build.bounded/retain/examples— the three mechanisms every long-running projection shares: the O6 ceiling with its eviction ledger, the retention budget, and "up to N examples, and the count of what they stand for". Plusfacts,project,skeleton,diff.
judge/ — verdicts
doctor, expect, condition, field, why, cutover, retired,
budget, and common — the vocabulary they share: the stable check- and
rung-id registries, the RFC 09 §5.3 synthetic marker, the definition of "the
new plane", the passive-observation scopes, and the caps on how many
offenders a report names.
report/ — every serialized contract
One rule, stated in full at the top of the module: every serde-pinned wire
shape lives here, split by domain, with its pinned-shape test beside it; a
type the wire never sees stays in the module that computes it. The domain
files are private and re-exported flat, so every shape is spelled
zenkey_fleet::report::Thing and the split can be re-cut without a call site
moving.
tape/ — traffic as a thing
record (.zrec capture and replay, normative for the format), ingest
(the row dialect it is made of), generate and synth (traffic that never
happened, marked as such), bench.
Sessions opened here are deliberately un-namespaced (RFC 09 §5): an explorer sees the wire as it really is. Do not "fix" that.
Explorer configuration — named connection contexts, ~/.config, the
completion cache — is not here; it lives in zenkey-explorer-config, so a
library consumer of this crate does not pay for dirs and toml.