Repository navigation
feat(tui): visual polish, superseded drafts and verification outcome - #151
Merged
Merged
Conversation
The mode name carried its own trailing separator, so an idle footer read 'composer · ' and panel hints that baked ' · ' into their text rendered empty segments. Segments now join once after the mode name, and the slash popup reports 'commands' instead of 'attach'. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A reply segment painted before its first glamour flush sat two columns left of the rendered card, so text jumped sideways when markdown landed. Indent the raw body to glamour's document margin. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The cockpit card forced its box to the full transcript height, leaving about ten empty rows under a short card; the height is now a maximum. Server, budget, and lifetime labels share one column across sections, and the session block drops the duplicated sandbox row and the rule around it. The /stats sheet keeps its sandbox row and rules. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When the ten-tab strip does not fit, the collapsed form read '… · 7 memory' beside the '❖ memory' title, which looked like a broken count. It now reads 'tab 7/10'; the full strip still shows when wide. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The F1 help card listed every key in one flat run, taller than the transcript on short terminals. Keys are now grouped under compose, navigate, inspect & copy, session, and general headings, and sit in two columns at 100+ columns. Narrower terminals keep a single column. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The full-width amber gradient under the header was the loudest element on screen and cost one SGR per cell each frame. Amber now stays on the wordmark and focus; the rule uses the theme hairline. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Ember warning yellow sat within 2-9 degrees of the amber accent, so approval borders and budget warnings read as ordinary chrome. Dark moves to lemon, light to burnt orange, high-contrast to orange. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The tip note was the only emoji in the UI, and its cell width varies by terminal. The 'tip:' label already identifies it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The first-run home sat at the top of the transcript, far from the input it asks the user to type into. It now hugs the composer with one blank row between, falling back to top placement when the viewport is too short. The duplicated "type a task" line is dropped, and the tip names only the composer keys and @ references since the footer owns ^K. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Before the editor opens, a friction card's 'a' starts the confirm editor rather than approving, so the in-card row now says so; the typed 'approve + ⏎' row shows only while editing. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The empty composer occupied three text rows; it now rests at one and grows per line or wrapped row as before, returning two rows to the transcript. Opening a job's output detail now relayouts so the viewport follows the drawer sheet split. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Step heads stacked a disclosure chevron, a status mark and a tool icon (▶ ✓ ◰ read_file). The tool icon now carries the state: its own glyph on success, ✗ on failure, the static ▸ while live. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The header paired '● sandboxed' with the green ● connection lamp, so two dots carried unrelated meanings. Dots now belong to the lamp alone. The README also still described the pre-glyph emoji badge. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Every approval shared the warning border, so a high-risk request looked like any other. Risk 'high' now paints the card border in the danger color; class risks keep the warning border. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
odek v2.33 signals superseded drafts and the verification outcome. The Event union gains reason/cycle/verified, persisted messages gain superseded/superseded_reason, and runtime_event frames now decode through a dedicated path: their object-valued 'event' key collided with the string SubType, so every such frame was silently dropped. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
When odek re-asks the model after an answer already streamed, the turn showed two near-identical answers. answer_superseded now folds the draft into a '⋯ draft revised' row that opens like reasoning, and msg.content keeps only the replacement. done.verified=fail (or the persisted/bulk marker) shows '✗ unverified' on the head and outcome row, the status line reads 'verifying answer' during the check, replay folds persisted drafts, and plain mode notes the revision. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Exercise the remaining branch paths: a superseded event with no streamed draft, the unknown-reason label, the selected folded draft hint and its copy span, narrow help rows, and the cockpit start-time line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
bodek | 6160e68 | Commit Preview URL Branch Preview URL |
Oct 09 2026, 05:17 AM |
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.
Summary
A design pass over the TUI, plus support for odek v2.33's superseded-draft and verification signals.
Superseded drafts and verification (odek ≥ v2.33)
answer_superseded,done.verified, persistedsupersededrecords, andruntime_eventframes. The last were always dropped before: their object-valuedeventkey failed theEventdecode.⋯ draft revised · <reason>row that opens like reasoning (^E, or inspect +⏎).msg.content(copy, export, stats) keeps only the replacement.verifying answerduring the check; a failed check shows✗ unverifiedon the turn head and the outcome row (the bulk/persisted marker is stripped in favour of the chip). History replay folds persisted drafts the same way, and plain mode notes the revision.Visual polish
·separators or empty segments; the slash popup is namedcommands.✗/ static▸).◆, so dots belong to the connection lamp alone.tab N/10; tip emoji removed.Testing
make fmt,make vet,make lint(0 issues),make test(race) all green.visual_polish_test.go,superseded_test.go,approval_card_polish_test.go,help_layout_test.go,internal/client/answer_events_test.go, plus updated layout tests. Every line this branch adds is covered.✗ unverified/ clean outcome correctly across a two-turn session.🤖 Generated with Claude Code