Quick-message a task's session: a sends headlessly, A attaches - #120
Merged
Conversation
Saying one sentence to an agent cost a full attach round-trip: suspend the
TUI, type, navigate back, ctrl-C. That price is paid on the cheapest
interaction there is — answering a `needs-input` question, adding a line of
review feedback — so it was routinely not paid at all.
`a` now collects one line in the same inline input the refine note uses and
sends it into the task's recorded session headlessly, fire-and-forget; the
TUI never suspends. The interactive jump-in moves to `A`, the same
lowercase-quick, uppercase-interactive pairing as `r`/`R`.
Agents declare the capability with a new optional `message` verb carrying
both `{session}` and `{prompt_file}`, built in for `claude` as its `resume`
plus `-p`. The near-duplication between those two verb bodies is deliberate
and not factored: a verb is an opaque per-agent contract, which is exactly
what lets `codex` define no `message` and degrade one verb at a time rather
than losing its jump-in with it.
The key applies to the three states whose session is open and between turns
— `needs-input`, `review`, `waiting` — and refuses the rest: `running` and
`refining` are mid-turn with no injection channel, and `stalled` has a dead
session, where a headless resume would restart the work with no tracked pid
and no session row, invisible to the reconciler. A liveness probe refuses a
session still running for the same reason. On a review or waiting task the
message *is* the rejection: `RejectWork` is applied before the send, so the
feedback is in the body and the event log first and a refused transition
sends nothing. There is no separate "just asking" mode — a second channel
that spoke to the agent without recording it would put the task's body and
its session out of step. A `needs-input` task transitions not at all; the
answer belongs to the transcript and the agent's own `voro resume` moves it.
The send borrows the refine round's detached-spawn plumbing (stamped prompt
and log in the runtime dir, launch-log breadcrumb, detached reaper), factored
out of `spawn_expansion` as `spawn_logged`, but records no session row and
tracks no pid: it joins a conversation Voro already knows about.
One knock-on: the new `a/A` slot would have pushed the cockpit key line to
eleven slots on a review row, past the ten §9 allows. `d/D dispatch` is now
advertised only where dispatch can act — `ready` or `stalled` — instead of on
any selection, which both restores the budget and stops the line offering a
verb whose only answer is the state it refuses.
DESIGN.md §6/§8/§9 and docs/agent-integration.md updated in the same change.
Verified: `cargo test --workspace` and `cargo clippy --workspace
--all-targets -- -D warnings` pass. New tests cover the verb's placeholder
validation and its refusal of the launch placeholders, `override_missing_verbs`
reporting a dropped `message`, one-pass rendering of the two bindings, the
state gate, and the key itself driven against stub agents through a real
spawn: a review task's message rejects with feedback and lands in the launch
log, a `needs-input` task's sends with no transition, a live session is
refused, and a missing verb, a missing ref, and a missing session each report.
The TUI could not be driven under tmux here — this session's write guard
refuses the `VORO_DB`/`XDG_CONFIG_HOME` redirection the scratch harness needs
— so the key-line and key-map changes are covered by render tests instead.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JWjypXGmxq2NXuChFfhRdi
MJohnson459
force-pushed
the
quick-message-session
branch
from
August 5, 2026 11:48
e68b25f to
b13b7b0
Compare
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.
Quick-message a task's session without leaving the cockpit
Saying one sentence to an agent cost a full attach round-trip: suspend the
TUI, type, navigate back, ctrl-C. That price is paid on the cheapest
interaction there is — answering a
needs-inputquestion, adding a line ofreview feedback — so it was routinely not paid at all.
anow collects one line in the same inline input the refine note uses andsends it into the task's recorded session headlessly, fire-and-forget; the
TUI never suspends. The interactive jump-in moves to
A, the samelowercase-quick, uppercase-interactive pairing as
r/R.Agents declare the capability with a new optional
messageverb carryingboth
{session}and{prompt_file}, built in forclaudeas itsresumeplus
-p. The near-duplication between those two verb bodies is deliberateand not factored: a verb is an opaque per-agent contract, which is exactly
what lets
codexdefine nomessageand degrade one verb at a time ratherthan losing its jump-in with it.
The key applies to the three states whose session is open and between turns
—
needs-input,review,waiting— and refuses the rest:runningandrefiningare mid-turn with no injection channel, andstalledhas a deadsession, where a headless resume would restart the work with no tracked pid
and no session row, invisible to the reconciler. A liveness probe refuses a
session still running for the same reason. On a review or waiting task the
message is the rejection:
RejectWorkis applied before the send, so thefeedback is in the body and the event log first and a refused transition
sends nothing. There is no separate "just asking" mode — a second channel
that spoke to the agent without recording it would put the task's body and
its session out of step. A
needs-inputtask transitions not at all; theanswer belongs to the transcript and the agent's own
voro resumemoves it.The send borrows the refine round's detached-spawn plumbing (stamped prompt
and log in the runtime dir, launch-log breadcrumb, detached reaper), factored
out of
spawn_expansionasspawn_logged, but records no session row andtracks no pid: it joins a conversation Voro already knows about.
One knock-on: the new
a/Aslot would have pushed the cockpit key line toeleven slots on a review row, past the ten §9 allows.
d/D dispatchis nowadvertised only where dispatch can act —
readyorstalled— instead of onany selection, which both restores the budget and stops the line offering a
verb whose only answer is the state it refuses.
DESIGN.md §6/§8/§9 and docs/agent-integration.md updated in the same change.
Verified:
cargo test --workspaceandcargo clippy --workspace --all-targets -- -D warningspass. New tests cover the verb's placeholdervalidation and its refusal of the launch placeholders,
override_missing_verbsreporting a dropped
message, one-pass rendering of the two bindings, thestate gate, and the key itself driven against stub agents through a real
spawn: a review task's message rejects with feedback and lands in the launch
log, a
needs-inputtask's sends with no transition, a live session isrefused, and a missing verb, a missing ref, and a missing session each report.
The TUI could not be driven under tmux here — this session's write guard
refuses the
VORO_DB/XDG_CONFIG_HOMEredirection the scratch harness needs— so the key-line and key-map changes are covered by render tests instead.
Co-Authored-By: Claude Opus 5 noreply@anthropic.com
Claude-Session: https://claude.ai/code/session_01JWjypXGmxq2NXuChFfhRdi