Skip to content

Fixes from the final end-to-end check after the redesign merge - #395

Merged
Broccolito merged 6 commits into
mainfrom
claude/final-check-fixes-2026-10-12
Oct 12, 2026
Merged

Broccolito merged 6 commits into
mainfrom
claude/final-check-fixes-2026-10-12

Conversation

@Broccolito

Copy link
Copy Markdown
Collaborator

Fixes from the final end-to-end check of main after #391, #392, #393 and #394 merged. The check ran four sandboxed dev app instances and the CLI on the integrated tree (the same tree as main at 2a795b502), with real model turns on Versa Azure GPT-5.5 (private) and Claude Code (public). 52 checks passed; these six commits fix what failed. None is a merge loss: several existed on main before the redesign and only became visible under real use.

What changed

  • A running chat moves up when its turn starts (5e3e5453b, sidebar). The daemon stamps updated_at when a message is sent, but the sidebar only re-read the list when the turn finished, so a chat with a long turn sat in place for minutes. The row now moves when the turn starts, and still waits while the pointer is over the list. The same commit hides the New chat shortcut hint on the browser surface (biorouter serve), where the shortcut does not exist.
  • The summary's Code figure counts file edits (dfb15d29a, summary rail plus crates/biorouter/src/agents/code_delta.rs). It used to guess added and removed lines from diff-shaped text in the transcript, so it showed +0 −0 after a real file write and −9 after an investigation that changed nothing. It now counts the edits the file tools and Code Execution actually made.
  • A table's right-edge fade is no wider than what is still past the edge (d073e7035, markdown tables). A table that overflowed by 10px hid its right-aligned last column under a fixed 40px fade.
  • The /bug approval card shows a readable report body and one warning glyph (414ac9cb9, tool cards). The body rendered as one escaped JSON line 33,000 to 61,000px wide, while the card asked the person to read it before approving.
  • A toast joins the docked summary rail's column (aa0b2c674, toasts) instead of covering the conversation.
  • An app's preview tab draws the application glyph its card draws (94e62909b, preview panel).

How it was verified

Each fix has a test that fails without it (vitest, Chromium browser tests where layout is involved, and Rust unit and integration tests for the Code count). Targeted suites, tsc, ESLint and Prettier pass on every changed file; cargo clippy -D warnings, rustfmt and code_execution_integration pass for the Rust change. CI on this PR is the full gate.

🤖 Generated with Claude Code

…ion glyph its card draws

The preview tab glyph (iconForArtifact) returned ChartColumn for every ui://
resource, so an Agent Drafter app drew lucide-chart-column on its tab and
lucide-app-window on its transcript card. The tab now asks the card's own
classifier (artifactCardKind) and draws ENTITY_ICONS.application for an app;
Auto Visualiser figures and reports keep ChartColumn. The ui:// address lookup
is shared with ArtifactKindMeta so the bar's kind word and the tab glyph read
the same uri.
…ody and one warning glyph

The Arguments preview was the backend's pretty JSON in a whitespace-pre box,
so a string argument was one escaped line. platform__report_bug's body (the
text that becomes a public issue) measured 68,874px wide in a 724px box, about
90 characters visible with literal \n, under a card saying "Read the body
below". A parseable arguments object now renders as named fields, each string
value the exact text with real line breaks, wrapped by an authored rule
(.br-tool-preview-text: pre-wrap, overflow-wrap anywhere) in tool-call.css.
Non-string values stay JSON; a clipped blob is never parsed and is shown as
wrapped raw text beside the Truncated note. Collapse is decided on the wrapped
line estimate, so a single long line still folds behind Show more. Never
rendered as Markdown: the person is checking what will be published.

The private card drew its AlertTriangle and then the prompt's own leading
"⚠ " (bug_report::private_warning). The card now drops a leading warning
glyph (with or without VS16) and keeps the rest exactly; a glyph inside the
sentence stays, and a glyph-only prompt is kept rather than blanked. Done in
the card, not the producer: the CLI and TUI print the prompt as bare text, where
that glyph is the only warning sign, and persisted cards are fixed too.

Tests: ToolCallConfirmation.test.tsx (5 failing before, 1 guard), and a
real-Chromium geometry test in toolCardsGeometry.browser.test.tsx
(scrollWidth 68,874 > 724 before; wraps at 760 and 580px after).
…s no wider than what is still past the edge

A table 475px wide in a 465px box had 10px out of view and a fixed 40px
mask, which dimmed a right-aligned last column (Value, ls -la, 2, 0) almost
to nothing at rest. useOverflowsSideways now measures what remains
(scrollWidth - clientWidth - scrollLeft), rounds it to whole pixels and caps
it at 40, and scrollRegionProps writes it as --br-overflow-fade beside
data-overflow. The shared .br-md-code-body / .br-md-table-scroll mask reads
it, so the fade covers no more of the view than is hidden and narrows away
as the box scrolls to its end instead of vanishing at once. Applies to chat
and document markdown tables and fenced code alike.

Measured in the artifact harness at the final check's geometry (475 in 465):
fade 10px at rest, 6px after 4px of scroll, none at the end; a 327px box
keeps the full 40px until 40px remain. Tests: MarkdownContent (10px, 6px,
cleared at end; 40px cap; code block) and the stylesheet pins in
transcriptMarkdown.test.ts and artifactPaper.test.ts, which asserted the old
fixed 40px.
…column instead of covering the transcript

Stepped 16px left of the docked Chat summary card, the sticky extension-load
report stood over the person's own message for minutes (final app check,
'Toasts do not cover transcript content'): beside the rail is the
conversation. toastClearance gains a third side, 'column', for the rail card:
the stack takes the card's width (--toast-clear-width, read by App.tsx's
container min/max width), lines its right edge up with the card's, and sits
8px under it when it fits above the window's 16px bottom inset; over a card
that fills the rail it stays at its corner height, still in the column. The
summary popover keeps its 'beside' step. Unit, source and Chromium tests
cover the short card, the full card, find open beside the rail, and the rail
folding away.
…tarts; no New chat hint in a browser

A running chat stayed in place in the sidebar until its turn finished. The list
re-read only on a finished turn, a new chat, a meta change, focus and visibility,
and the running set only drew the spinner. R-30 stopped opening a chat from moving
it, so this delay could now be seen. useSidebarSessions now takes turnSessionIds
(sessionsInTurn: running, not finished, not an agent restart). When a turn starts,
the hook raises that row's updated_at to the start time with no request, the way a
saved rename does. applyTurnRaises keeps that raise on every page read during the
turn, and drops it when the turn ends. A running chat the list has not read yet is
brought in by a head read. The move still waits while the pointer is over the list
(applyHeldArrangement).

On the browser surface (biorouter serve) the New chat row no longer shows a
Ctrl+T / Cmd+T hint. That shortcut is the Electron menu accelerator, which a browser
page never receives, and in a Windows or Linux browser Ctrl+T opens a browser tab
(SD-8). The desktop app keeps the hint.

Tests: useSidebarSessions.turnActivity.test.tsx (new) and AppSidebar.test.tsx
(browser surface draws no hint; desktop still does). Each failed before the fix.
…dits, not diff-shaped text

The Code row scanned every string in the transcript for +N -M, N insertions(+),
a diff --git or a fenced block. A chat whose Code Execution script wrote
final-check-notes.md read +0 -0, and a /bug investigation that changed nothing
read +0 -9. It now counts successful text_editor edits only: write/create,
str_replace (old/new as a line LCS, or a unified diff's hunk lines), insert,
and undo_edit reversing the same file's last counted edit. A direct call is
measured from its arguments; a script carries biorouter/code-delta, which the
daemon measures from each sub-call's FULL arguments (agents/code_delta.rs),
because a record's args are cut at 2 KB and records past the budget are
dropped. Scripts recorded before that fall back to records whose args parse.
Shell-written files are not counted.

Tests: summary/codeDelta.test.ts (23; 22 red on the old function, incl. the
script write +0 instead of +10 and noise +8 -20 instead of 0),
codeDeltaCases.json run by both the vitest table and agents::code_delta (5),
code_execution_integration case31 against a real truncated write (red with the
meta withheld: left None). Replaying session 20261012_6 from the final-a
sandbox: +0 -0 before, +10 -0 after (the file is 10 lines). Doc:
chat-summary-rail.md.
@Broccolito
Broccolito merged commit fe57607 into main Oct 12, 2026
17 checks passed
@Broccolito
Broccolito deleted the claude/final-check-fixes-2026-10-12 branch October 12, 2026 19:40
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