recommendPlan math runs as a final fallback.
What happens
- CLI sends a
flow_startenvelope to Scout. - Scout reads the position + pool tick state, loads vol / gas /
yield, classifies the regime (
ranging/trending/volatile/stressed), and forwardscontext_observedto Strategist. - Strategist proposes 2-5 candidate ranges as
(widthMultiplier, centerOffsetTicks)tuples (snapped totickSpacing), each with stress + yield numbers. Forwardsproposalto Critic. - Critic runs deterministic stress (1×, 2×, 3× vol), gas/yield
ratios, and judges each candidate
accept|revise|vetoagainst the user’s risk profile.- On
accept: emitsplan_readyto the CLI, flow ends. - On
revise: forwardscritiqueback to Strategist for round 2. - On
veto_allpastZUNO_MAX_DEBATE_ROUNDS: emitsdeadlockto Arbiter.
- On
- Arbiter (on deadlock) reads the full debate, picks one candidate
from the latest proposal, and emits
plan_readyto the CLI. - CLI prints the result and writes
~/.zuno/plans/<planId>.jsonwith the transcript baked intorisk.reasons.
agent_thought envelopes throughout, rendering each
turn live under the recommendation card:
Example output
Risk profile
SetZUNO_RISK_PROFILE to bias the Critic’s floors and the Arbiter’s
tiebreak:
| profile | min base buffer | max gas/yield | tiebreak |
|---|---|---|---|
conservative | 36h | 1.2x | largest 2× vol buffer wins |
balanced | 24h | 1.6x | best buffer × yield balance |
aggressive | 14h | 2.4x | highest yield among non-vetoed candidates |
Confidence labels
| label | meaning |
|---|---|
approve | converged with strong buffer |
approve_with_caution | converged but buffer is tight, or arbiter broke deadlock |
reject | every candidate failed stress at the active risk profile |
Replaying the debate
risk.reasons, which includes every [scout] / [strategist]
/ [critic] / [arbiter] line from the original flow. The transcript
is persisted with the plan so you can read the reasoning later.