Status: accepted (2026-07-07). Extends ADR-058 (minimal framing — lean on
the agent) from code-writing campaign bots to interactive bots. Piloted by
rewriting whats-next (Nexie) v1 (form state machine, 15 nodes / 21 edges /
4 bespoke human forms + hardcoded studio form resolvers) → v2 (chat loop,
5 nodes). First live session: run 019f3beb, 2026-07-07 —
docs/bot-runs/whats-next.md.
whats-next v1 modelled the operator dialogue as a state machine: every
exchange was a typed human-node form (priorities radio, roadmap review
checkboxes, dispatch pickers, an ask_continue radio of five preset actions
detail field), each answer routed through compute/router
nodes into single-purpose agent nodes (triage_board, load_dispatch_candidates,
assign_to_bots…), and the studio carried a parallel per-node form registry
(resolveDynamicForm, QuickMode intent classifier) to make the forms bearable.The 2026-07-07 dogfood run (019f3b6b) showed the failure squarely. The
operator asked, in chat, “indique-moi les tickets les plus pertinents pour un
quickwin”. The bot could only answer with a 13-item raw checkbox list (no
analysis), forced the question into a preset radio’s detail field, burned a
full state-machine cycle (~40 s) per utterance, alternated reply languages,
and — because each triage_board invocation was a fresh LLM session — carried
no conversational memory between turns. The operator abandoned the session.
The root cause mirrors ADR-058’s: the deficit was framing, not capability.
A dialogue is the least decomposable flow there is — every node boundary
inserted between two utterances destroys context, adds latency, and replaces
language with forms. Meanwhile the engine already had every primitive a real
conversation needs, each built for other purposes: ask_user pauses with
same-session resume (claude --resume <id>; interaction depth resets on every
human answer, so a conversation is unbounded), a budget that suspends entirely
during human pauses (a session can idle for days at zero cost), the operator
chatbox inbox drained into the running agent at every tool boundary, and the
board MCP tools.
Design interactive/orchestrator bots as one conversational agent in a chat loop, with the engine as the interaction substrate rather than the dialogue script:
seed (compute) → nexie (agent) → gate (compute) ── close ──▶ done
▲ │ (default)
└── loop(N) ── chat (human, ONE free-text field)
_session_id/_session_fingerprint from the agent’s previous output, so
every turn resumes the SAME backend session — conversational memory without
re-shipping context through prompts. (Load-bearing and easy to lose: session
continuity resolves ONLY from the input map; claw’s session: inherit
eviction on success made v1’s inherit a silent no-op.)chat human node is the standby home base. One free-text field; the
node’s instructions: renders the agent’s reply verbatim, so the pause IS
the chat bubble + composer. Budget is suspended while paused; the run stays
reachable indefinitely. The ONLY terminal path is an explicit operator
close (close: true in the turn output, projected by the gate compute).ask_user — now with structured options
(clickable in the studio) — reserved for real decisions and the
bulk-action confirmation ritual. Everything that can wait for the next
message belongs in reply.ask_user confirmation on bulk (≥3) or destructive
mutations, evidence-grounded curation (verify an issue against git log +
code before calling it obsolete), cross-session memory via a
CONTEXT_BRIEF.md in the workspace memory tree.{reply, close, quick_replies, dispatched_ids} — the last feeding the
server-side watched-issues stamp), the loop bound (conversation_loop(N),
persisted across resumes) as the lifetime backstop, and per-burst budget
caps. Nothing else.assistant_text narration events as the agent’s speech
bubbles while it works; quick_replies and ask_user options as chips.
No per-bot form registry.Generic engine/studio work shipped with the pilot (benefits every bot):
ask_user structured options across both backends, assistant_text
narration events, ask_user pauses on agent nodes surfacing as chat turns,
and the pending-input nav badge.
close, the loop bound, the
bulk-confirmation ritual, and golden replay
(pkg/botreplay nexie_turn_basic, recorded live).paused_waiting_human by design.
The nav badge + the runs list make them visible; close archives.interaction: llm_or_human auto-answering — wrong tool: the operator IS
the counterpart, auto-answering them defeats the purpose; (c) a
supervisor-style side channel (ADR-051/supervisors) — steers a working
agent, but cannot BE the primary dialogue surface.