hyperhive/hive-jobq-wire
Repository files (latest commit first)
Filename Latest commit message Latest commit date
atlas 7966d5eb66 jobq-wire: move the generic graph projection into its own crate
The wire types were in hive-host-sock, which is the host *socket* crate — so
anything living there is core-shaped by construction, and the projection had
quietly grown two core dependencies to match: it selected roots by matching
NodeKind::Dag, and rendered payloads through free functions in hive-c0re that
nothing obliged a second host to write.

hive-jobq is the wrong home too. That crate is the scheduler — logic — and
folding presentation in means every consumer of it carries a JSON vocabulary
it may never serve.

So: a new hive-jobq-wire. A host implements WireNode for its payload N and
WireResource for its resource name R; GraphWire::wire_snapshot is
blanket-implemented for Graph<N, R> when both hold, and for nothing else. A
payload that has never said how it displays has no way onto the wire.

wire_snapshot takes the roots to serve rather than reading Graph::roots
itself. Nothing is ever removed from a Graph, so retention is a policy only
the host can hold; hive-c0re passes visible_roots(), which is the existing
MAX_HISTORY_DAGS bound selected structurally (a root is a node with no
parent) instead of by node kind.
2026-08-03 00:39:14 +02:00
..
src jobq-wire: move the generic graph projection into its own crate 2026-08-03 00:39:14 +02:00
Cargo.toml jobq-wire: move the generic graph projection into its own crate 2026-08-03 00:39:14 +02:00
README.md jobq-wire: move the generic graph projection into its own crate 2026-08-03 00:39:14 +02:00

hive-jobq-wire

Wire types for serving a hive-jobq graph to a viewer, plus the traits a host implements to say how its graph renders.

Why this is not part of hive-jobq. The scheduler crate is logic: a graph, a resource pool, a run loop. Presentation is a different concern with a different audience, and folding it in means every consumer of the scheduler also carries a JSON vocabulary it may never serve — the two get remixed and stay that way. A separate crate keeps that boundary where it can be seen.

A host implements WireNode for its node payload N and WireResource for its resource name R. GraphWire::wire_snapshot is then blanket-implemented for hive_jobq::Graph<N, R> — so the projection exists exactly when both types have said how they render, and a payload that hasn't cannot reach a viewer at all.