recommend rebalance run is a debate that
converges, not a pipeline that always runs the same length.
Topology
All envelopes ride the AXL mesh (ed25519 peer ids,/send + /recv).
Why this shape
A monolithic copilot black-boxes its reasoning - it makes a call and tells you to trust it. By splitting the job across four processes that communicate their intermediate state, the reasoning is auditable: you can read the AXL log and see what each agent saw and what it sent. The strategist↔critic loop is the heart of the design. It models the real tension in LP management - fee density vs survival - as a back-and-forth instead of a single scoring function. The arbiter is the safety valve for when the loop won’t converge.Envelope shape
Every message between peers is anAxlEnvelope:
AxlKind values:
flow_start- cli kicks off a rebalance debateflow_create_start- cli kicks off a create-position debatecontext_observed- scout publishes regime + market context (or surveyed pools for create)proposal- strategist publishes initial candidatescritique- critic asks strategist to reviserevision- strategist responds with revised candidatesdeadlock- critic gives up, hands the debate to arbiterplan_ready- final structured plan back to cliflow_failed- unrecoverable erroragent_thought- live narration line
kind field is the contract between agents. New capabilities mean
new kind values, never new transport.
Inbox / poll model
Peers pull from their own inbox viaGET /recv on their local AXL node.
Zuno keeps the agent code behind AxlClient, so transport changes stay
isolated to the AXL package.
Live transcript
Every agent emitsagent_thought envelopes as it works - these are the
running narration the CLI renders under the recommendation card.
Thoughts are best-effort: dropping one never affects the structural
flow, because critic and arbiter both ride the running debate inside
their structural envelopes.
What the monitor is (and isn’t)
packages/strategy/src/monitor/ is a separate background worker - not
an AXL peer, not part of the debate. It polls Uniswap v4 positions on a
fixed interval, runs deterministic risk thresholds (isRiskyPosition),
writes alerts to ~/.zuno/alerts.json, and optionally pushes them to
Telegram. The shell sees the same alerts via show alerts.
The monitor sits next to the agents under packages/strategy/src/
because it shares the chain-read primitives (listPositions,
buildSnapshot, riskReason), but it never exchanges AXL envelopes
and never triggers the debate by itself. Acting on an alert is always
a manual recommend rebalance → approve it → apply it. See
CLI / monitor.