Skip to content

agent list omits the message verb from each agent's verb list - #167

Merged
MJohnson459 merged 1 commit into
mainfrom
task-393-agent-list-message-verb
Aug 14, 2026
Merged

MJohnson459 merged 1 commit into
mainfrom
task-393-agent-list-message-verb

Conversation

@MJohnson459

Copy link
Copy Markdown
Contributor

agent list and 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 dropped message, logs or stop: the two lines disagreed about the same agent. Quick message is the verb that suffers most, 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 (crates/voro-core/src/agent.rs), rendered by a new AgentTemplate::verbs(); override_missing_verbs filters the same roster. The listing gains message, logs and stop, and a verb added to the set later appears in both places without a second edit. crates/voro/src/cli.rs and crates/voro/src/app.rs both call verbs() instead of duplicating the list.

The open question is decided in favour of marking the fork: 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 plainly as message. 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 list at 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).

`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
MJohnson459 merged commit c563fdc into main Aug 14, 2026
7 checks passed
@MJohnson459
MJohnson459 deleted the task-393-agent-list-message-verb branch August 14, 2026 14:09
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.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant