The probe convention
Every session-lived accumulator registers a probe: its name, current size, cap, and pressure policy. An accumulator without a probe is a review defect. The rule turns leases-and-budgets’ prose principle — every session-lived thing must say what bounds it — into a checkable convention: a budget that cannot be inspected will be debugged by restarting the process.
A probe is a ProbeRow (exarch/src/resources.rs): name, current,
cap: Option<u64>, a policy from the closed pressure vocabulary
(coalesce / reject / evict / reap / warn / none (unbounded)),
and an optional note. Multi-figure accumulators emit one row per figure
(viewport.blocks, inbox[user], …). The inspector deliberately precedes
the enforcer: an accumulator whose cap lands later states its decided
policy with cap: None and a note saying so — never a fake cap, never
silence.
/resources is a fold over the registered probes, not a bespoke report.
It has two halves, split by who may legally read what: the agent assembles
its own rows on its drive thread (the shell’s worker registry and bindings,
its inbox, event log, and disk) and emits them as one Kind::Resources —
raw rows beside the rendered card, so transcript.jsonl keeps the figures —
and the frontend appends the rows for the accumulators it owns (viewports,
views, the bus) at render time. Neither half reaches across a thread for the
other’s figures, and the fold is never model-facing.
Two laws bound what a probe may do:
- Probing never mutates and never renews. Enumeration is not
observation — the same rule that keeps the
servicespin’s reconciliation from renewing a service’s own state. If probing renewed, the operator’s own diagnostics would immortalise every zombie they exist to reveal. - Residents and accumulators are both probed; only residents are listed, cancelled, and leased. The line is the capability (session-ledger): a resident (a worker, an agent, a schedule) can be reached and controlled by id; a mere accumulator (a viewport, the bus, an inbox) can only be measured and bounded. A probe row is the one facet the two kinds share.
The hard rule for new code: a session-lived accumulator lands together with
its probe row in the /resources fold, and its row’s policy names how the
accumulator behaves under pressure — even when the enforcement ships later.
See also session-ledger (the
resident/accumulator line; the probe as one of a resident’s four facets),
agent (the agent half of the fold),
builtins (the services pin, the same
enumeration-is-not-observation law — workers itself was since retired as a
model-facing listing, legibility now split by lease class).