agent list omits the message verb from each agent's verb list - #167
Merged
Merged
Conversation
`agent list` and the Config screen assembled each agent's bracketed verb
list from four hand-written entries — sessions, attach, resume, plan —
while the warning under the row read a seven-verb roster. So the built-in
claude listed as `[sessions attach resume plan]` while the same rows
warned that an override had dropped `message`, `logs` or `stop`: the two
lines disagreed about the same agent. Quick message is the verb that
suffers most from the omission, being entirely per-agent and otherwise
invisible until `a` is pressed and a status line read.
Both lines now read one `OPTIONAL_VERBS` roster in voro-core, so no verb
can be named by one and not the other, and a verb added to the set later
appears in both without a second edit. `AgentTemplate::verbs()` renders
it; the listing gains `message`, `logs` and `stop`.
A `message` carrying `{new_session}` reads `message(fork)`. Forking is
not a spelling detail: it is what makes a send land in a session whose
supervisor still holds it, and it moves the reference the row addresses
afterwards, so the row distinguishes an agent Voro can steer between
turns from one it cannot. A message that resumes in place still reads
`message`.
DESIGN.md §11a and docs/agent-integration.md record both.
Verified with `cargo test --workspace` (836 tests), `cargo clippy
--workspace --all-targets -- -D warnings`, `voro agent list`, and the
Config screen in a scratch tmux at 110 columns, where the built-in claude
row reads `[sessions attach resume message(fork) logs stop plan]`.
MJohnson459
added a commit
that referenced
this pull request
Aug 14, 2026
The agent row on the Config screen is one unwrapped line — marker, name, provenance, verbs, then a dim `<model … · deep … · plan …>` tail — in a Paragraph with no Wrap, so it clips at the pane's width. Listing every optional verb (#167) grew the built-in claude row from ~98 to ~121 columns, which pushed the model annotation off the end at 110, where it used to fit. The annotation is the half that cannot fall off: it exists so the `{model}` in the dispatch line below reads without opening voro.toml. So it moves onto its own dim continuation line directly under that command, spelled `{model}: opus · deep fable · plan fable` — anchored to the placeholder it explains rather than trailing a row whose length is set by how many verbs an agent happens to define. That costs a line per agent carrying a model map, which the pane's fixed 14-line cap would have paid for by hiding agents off the bottom. The cap goes: the pane now sizes to the rows it has and yields only what the viewers list below needs to keep a row. That list scrolls with its selection and this paragraph does not, so an agent hidden here is the more expensive truncation. Verified in a scratch tmux at 100 columns: the built-in claude row shows every verb and its model map, and six model-carrying agents all render with the viewers list intact. Covered by two ui tests at that width.
MJohnson459
added a commit
that referenced
this pull request
Aug 14, 2026
* Give the Config screen's model map a line of its own The agent row on the Config screen is one unwrapped line — marker, name, provenance, verbs, then a dim `<model … · deep … · plan …>` tail — in a Paragraph with no Wrap, so it clips at the pane's width. Listing every optional verb (#167) grew the built-in claude row from ~98 to ~121 columns, which pushed the model annotation off the end at 110, where it used to fit. The annotation is the half that cannot fall off: it exists so the `{model}` in the dispatch line below reads without opening voro.toml. So it moves onto its own dim continuation line directly under that command, spelled `{model}: opus · deep fable · plan fable` — anchored to the placeholder it explains rather than trailing a row whose length is set by how many verbs an agent happens to define. That costs a line per agent carrying a model map, which the pane's fixed 14-line cap would have paid for by hiding agents off the bottom. The cap goes: the pane now sizes to the rows it has and yields only what the viewers list below needs to keep a row. That list scrolls with its selection and this paragraph does not, so an agent hidden here is the more expensive truncation. Verified in a scratch tmux at 100 columns: the built-in claude row shows every verb and its model map, and six model-carrying agents all render with the viewers list intact. Covered by two ui tests at that width. * Read the built-in claude row's verbs and model map off the row The Config screen test asserted the literal `[sessions attach resume message(fork) logs stop plan]`, which pinned a template detail rather than the width it meant to check: #170 dropped `--fork-session` from the built-in claude `message`, so `verbs()` now reports plain `message` and the assertion failed on the pull request's merge with main while passing on the older base the branch was written against. Both assertions now read the expected text off the rendered agent's own row — the bracketed verb list from `verbs`, the annotation from `models` — so the test still fails if the row clips at 100 columns and no longer fails when a template changes what the row correctly says.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
agent listand the Config screen assembled each agent's bracketed verb list from four hand-written entries — sessions, attach, resume, plan — while the dropped-verb warning under the row read a seven-verb roster. Built-in claude therefore listed as[sessions attach resume plan]while the same rows could warn that an override had droppedmessage,logsorstop: the two lines disagreed about the same agent. Quick message is the verb that suffers most, being entirely per-agent and otherwise invisible untilais pressed and a status line read.Both lines now read one
OPTIONAL_VERBSroster invoro-core(crates/voro-core/src/agent.rs), rendered by a newAgentTemplate::verbs();override_missing_verbsfilters the same roster. The listing gainsmessage,logsandstop, and a verb added to the set later appears in both places without a second edit.crates/voro/src/cli.rsandcrates/voro/src/app.rsboth callverbs()instead of duplicating the list.The open question is decided in favour of marking the fork: a
messagecarrying{new_session}readsmessage(fork). Forking is not a spelling detail — it is what makes a send land in a session whose supervisor still holds it, and it moves the reference the row addresses afterwards, so the row distinguishes an agent Voro can steer between turns from one it cannot. A message that resumes in place still reads plainly asmessage. Built-in claude now lists as[sessions attach resume message(fork) logs stop plan], codex as[resume].DESIGN.md §11a and docs/agent-integration.md record both the shared roster and the fork marking.
Verified with
cargo test --workspace(836 tests, all passing),cargo clippy --workspace --all-targets -- -D warnings,voro agent listat the shell, and the Config screen driven in a scratch tmux at 110 columns. New tests cover the roster's contents, the fork marking, the non-forking case, and the invariant that the listing and the warning name the same verbs.One consequence is filed rather than fixed here: the longer verb list pushes the Config row's dim
<model …>block past 110 columns, where it used to fit (task #448 — the pane clips rather than wraps, and which of three fixes it wants is a layout decision).