TUI: answer the refine keys from the queue, not the triage menu - #108
Merged
Conversation
Refine is deliberately not a triage verdict — a proposal that goes through it is still `proposed` — so filing it behind the verdict menu put it under a decision it does not make, and hid it one keypress behind the very menu whose three bad options it exists to escape. The operator notices a sub-standard body while reading it in the queue, which is where `r` and `R` now answer. Refresh moves to `ctrl-r` to free the letter. The triage menu keeps its own pair, so a refine decided mid-verdict costs no escape, and both paths keep the guard that refuses anything but a proposal. The key hint line gains `r/R refine` on a proposal, which is what surfaced this: refine had no hint anywhere, because the hints are computed per screen and the menu that owned the keys is a mode. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019QUiy1Y4sr5kXmKrYqjaTU
Leaving `r`/`R` in the verdict menu as well as the queue kept the claim the move exists to retract: that refine is something triage does. One key in one place, and the guard refusing anything but a proposal lives in the single entry point. The two triage-menu tests go with it. The note-submission path they covered folds into the queue-level test; nothing replaces the rest, since a test that a keybinding is absent pins behaviour that was never a requirement. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019QUiy1Y4sr5kXmKrYqjaTU
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.
Refine is deliberately not a triage verdict — a proposal that goes through it
is still
proposed— so filing it behind the verdict menu put it under adecision it does not make, and hid it one keypress behind the very menu whose
three bad options it exists to escape. The operator notices a sub-standard body
while reading it in the queue, which is where
randRnow answer.What changed
r(note-driven) andR(interactive) act on a selected proposal from boththe cockpit and the tasks browser, via a new
refine_selectedgated onTaskState::Proposed. Anything else is a no-op that says why on the statusline, matching
wand!.ctrl-r, freeing the letter.r/Rpair, so a refine decided mid-verdictcosts no escape. Both paths keep the guard refusing anything but a proposal.
r/R refineon a proposal. This is what surfaced thewhole thing: refine had no hint anywhere, because
key_hintsis computed perscreen and the menu that owned the keys is a mode.
carries the reasoning for the move plus the
ctrl-rrebind. The two CLIerror strings that pointed at the triage menu now point at
Rover aproposal.
Note for the reviewer
ris a breaking rebind for anyone with refresh in muscle memory. CHANGELOG.mdis untouched, following the convention of the last six commits, but this is
arguably a
Changedentry.From the cockpit a proposal still needs Enter to fold its project's digest open
before
r/Rreach it (proposals collapse into a per-project digest,DESIGN.md §7), so it is two keys there rather than one; the tasks browser,
where proposals are ordinary rows, is the single-keypress case.
Two pre-existing defects were found and deliberately left alone:
voro-{task_id}—spawn_expansion(dispatch.rs:500) substitutes onlyPROMPT_FILE_PLACEHOLDER, where the real dispatch path(
dispatch.rs:884-885) substitutesTASK_ID_PLACEHOLDERtoo. Underneaththat,
refine()borrowsagent.dispatch_command(), whose built-in claudetemplate carries
--bg --name, so refine launches a backgrounded namedsession at all — contradicting DESIGN.md §6's "it is not a dispatch".
key_hintsignoresapp.mode, so any open modal still shows the underlyingscreen's keys.
Verification
cargo test --workspace273 passed / 0 failed.cargo clippy --workspace --all-targets -- -D warningsclean.cargo fmt --allapplied.