feat(agent-pane): fold lane reports and inbox notices

Merged
TE
5d ago
+1150-31

Consecutive lane reports and inbox notices now fold into one count row. Reports show the verdict first; opening a report preserves the full P1/P2 findings, with session IDs, commits and protocol footer under Details. Single messages keep their own row, sender links, message actions and Find behavior.

Leo, 2026-10-31:

“are these useful or are there ways we can improve it”
“build all”

Risk: normal. This changes transcript presentation only. Existing queued-message grouping (#28113), message disclosures (#27312), and Copy (#28057) are retained. Design contract: design/chat-transcript.md in leo-workspace.

The parser accepts existing report text and the upcoming lane_report / inbox_notice provenance, keeping structured details and opaque thread IDs. Immutable messages and batch extensions are cached; unchanged notices are not reparsed on token updates. No timer, observer or animation loop is added.

The change stays together because parser, transcript batching, pending groups and Find must agree on the same rows. Most added lines are regression coverage, gallery fixtures and localized strings.

Validation: 63 focused Bun tests pass; the five component cases include 49 assertions, covering boundaries, verdict counts, singleton passthrough, cache identity, full findings, Details, sender opening and Find. Full local web checking was interrupted by host disk stalls after reporting existing Settings token/layer/format errors; focused lint on the new/changed components, parsers and tests passes. A combined CI check follows publication.

Before/after: six gallery states (five mixed reports, three inbox notices and a single report, each collapsed/expanded), 2×, synthetic data, light and dark.

StateThemeBeforeAfter
Five reports, collapsedlightBefore: Five reports, collapsed, lightAfter: Five reports, collapsed, light
Five reports, collapseddarkBefore: Five reports, collapsed, darkAfter: Five reports, collapsed, dark
Five reports, expandedlightBefore: Five reports, expanded, lightAfter: Five reports, expanded, light
Five reports, expandeddarkBefore: Five reports, expanded, darkAfter: Five reports, expanded, dark
Three inbox notices, collapsedlightBefore: Three inbox notices, collapsed, lightAfter: Three inbox notices, collapsed, light
Three inbox notices, collapseddarkBefore: Three inbox notices, collapsed, darkAfter: Three inbox notices, collapsed, dark
Three inbox notices, expandedlightBefore: Three inbox notices, expanded, lightAfter: Three inbox notices, expanded, light
Three inbox notices, expandeddarkBefore: Three inbox notices, expanded, darkAfter: Three inbox notices, expanded, dark
Single report, collapsedlightBefore: Single report, collapsed, lightAfter: Single report, collapsed, light
Single report, collapseddarkBefore: Single report, collapsed, darkAfter: Single report, collapsed, dark
Single report, expandedlightBefore: Single report, expanded, lightAfter: Single report, expanded, light
Single report, expandeddarkBefore: Single report, expanded, darkAfter: Single report, expanded, dark

Gallery capture passed: https://github.com/manaflow-ai/cmux/actions/runs/41158893490. Web validation is tracked in https://github.com/manaflow-ai/cmux/actions/runs/41158893861.

The unrelated tooling/guard failures were reproduced from the CI run's exact base, 8b3fa55ef585c369955e0dc19694046969272262, with the same errors:

  • Python registry: tests/test_check_objc_selectors_step.py: linux-guard lane is not run by any workflow.
  • AppCrateLicenseGate.test_the_ten_first_party_gpl_crates_are_named_exactly: the expected list omits cmux-chats-mirror.
  • SigningHooksInStepWithGlaedaTests.test_every_listed_hook_is_one_glaeda_released_with_the_check: the newest released hook is absent from the signing-hook list.

Viewed after image: yes — expanded reports in light/dark, inbox expansion and single-report collapse.

Visual verdict: the count row replaces repetitive report headings; sender/verdict lines stay compact, and the full P1/P2 findings remain legible behind one disclosure.

Agent session: agent session