Skip to content

feat(tui): visual polish, superseded drafts and verification outcome - #151

Merged
jkyberneees merged 18 commits into
mainfrom
feat/tui-visual-polish
Oct 9, 2026
Merged

jkyberneees merged 18 commits into
mainfrom
feat/tui-visual-polish

Conversation

@jkyberneees

Copy link
Copy Markdown
Contributor

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)

  • Client decodes answer_superseded, done.verified, persisted superseded records, and runtime_event frames. The last were always dropped before: their object-valued event key failed the Event decode.
  • One answer per turn: when odek re-asks the model (completion check or verification retry), the streamed draft folds into a ⋯ draft revised · <reason> row that opens like reasoning (^E, or inspect + ⏎). msg.content (copy, export, stats) keeps only the replacement.
  • Verification is visible live: the status line reads verifying answer during the check; a failed check shows ✗ unverified on 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

  • Footer: no dangling · separators or empty segments; the slash popup is named commands.
  • Reply text keeps its column before the first render flush (no sideways jump).
  • Header rule is a quiet hairline (amber stays on the wordmark and focus).
  • Warning hue separated from the brand accent in ember-dark/light/high-contrast; high-risk approvals get a red border.
  • Step rows carry one status glyph (tool icon / ✗ / static ▸).
  • Sandbox badge is ◆, so dots belong to the connection lamp alone.
  • Approval card: code-styled command, redundant reason hidden, in-card actions (friction cards match the two-step confirm).
  • Composer rests at one row and grows with content; first-run home sits above the composer without duplicated hints.
  • Help card grouped into sections with a two-column layout; cockpit fits its content; collapsed drawer tab strip reads tab N/10; tip emoji removed.

Testing

  • make fmt, make vet, make lint (0 issues), make test (race) all green.
  • New tests: 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.
  • End-to-end against a local odek v2.33.3: a turn re-asked by the completion check renders one answer with a folded draft; verification frames drive the status label and ✗ unverified / clean outcome correctly across a two-turn session.

🤖 Generated with Claude Code

jkyberneees and others added 18 commits October 8, 2026 18:45
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>
@cloudflare-workers-and-pages

cloudflare-workers-and-pages Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Deploying with  Cloudflare Workers  Cloudflare Workers

The latest updates on your project. Learn more about integrating Git with Workers.

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

@jkyberneees
jkyberneees merged commit b48c33a into main Oct 9, 2026
9 checks passed
@jkyberneees
jkyberneees deleted the feat/tui-visual-polish branch October 9, 2026 05:19
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