Skip to content

feat(dashboard,tui): consolidate 17 dashboard tabs → 9, 9 TUI tabs → 7 (#2627)#2641

Merged
rysweet merged 2 commits into
mainfrom
feat/issue-2627-the-dashboard-and-tui-have-accumulated-too-many-ta
Jul 6, 2026
Merged

feat(dashboard,tui): consolidate 17 dashboard tabs → 9, 9 TUI tabs → 7 (#2627)#2641
rysweet merged 2 commits into
mainfrom
feat/issue-2627-the-dashboard-and-tui-have-accumulated-too-many-ta

Conversation

@rysweet

@rysweet rysweet commented Jul 6, 2026

Copy link
Copy Markdown
Owner

Summary

The dashboard (and TUI) had accumulated too many tabs with adjacent/overlapping purposes. This PR inventories every tab, proposes a consolidation, and implements it — collapsing the dashboard from 17 → 9 tabs and the TUI from 9 → 7, onto a single shared taxonomy. No data is lost: every former standalone tab becomes a labelled sub-section (<h2 class="subsection">) inside its parent tab, and every retired top-level slug keeps working as a deep-link alias.

Closes #2627.

Inventory (before)

Dashboard (17): overview, goals, traces, logs, processes, memory, costs, chat, workboard, thinking, brain-failures, merge-decisions, pr-readiness, terminal, overseer, status, journal.

TUI (9): Overview, Goals, Engineers, Activity, Meeting, Stats, Status, Overseer, Journal.

Proposal → consolidated taxonomy

Nine canonical dashboard tabs; the TUI mirrors the same names/order and renders the seven whose data exists in the terminal (it omits the web-only Pull Requests and Resources — adding those would be new feature work, not consolidation). Overseer and Journal are owned by separate, recently-merged features and are carried through unchanged.

# Canonical tab Absorbs (dashboard) Absorbs (TUI) Sub-sections In TUI?
1 Overview overview, status Overview, Status, Stats Summary · Health · Stats yes (1)
2 Goals goals, workboard Goals Goals · Work Board yes (2)
3 Activity logs, traces, thinking, brain-failures Activity Logs · Traces · Thinking · Failures yes (3)
4 Workers processes, terminal Engineers Processes · Engineers · Terminal yes (4)
5 Pull Requests merge-decisions, pr-readiness Merge Decisions · Readiness no (web-only)
6 Resources memory, costs Memory · Costs no (web-only)
7 Chat chat Meeting (renamed) yes (5)
8 Overseer overseer (unchanged) Overseer (unchanged) yes (6)
9 Journal journal (unchanged) Journal (unchanged) yes (7)

Rationale

  • Overview / Status / Stats all answered "is the system healthy right now?" from three angles → one tab with Summary (what the agent is doing), Health (system status, PRs, issues, cluster), Stats (the operational snapshot rollup).
  • Logs / Traces / Thinking / Brain Failures were four flavours of "what has the agent been doing?" → one Activity tab.
  • Processes / Terminal (plus the TUI's Engineers view) are all "the workers running on this host" → Workers.
  • Merge Decisions / PR Readiness are two views of the same PR pipeline → Pull Requests.
  • Memory / Costs are both "resources the agent consumes/produces" → Resources.
  • Meeting → Chat: the TUI label now matches the dashboard's Chat tab (the underlying meeting backend is unchanged).
  • No tab is named "Bridge" (binding constraint).

Data preservation & deep-links

  • Absorbed panels keep their exact markup and element ids; only the wrapping tab changed and their old <h1 class="page-h1"> became <h2 class="subsection"> (so each tab still owns exactly one page <h1>).

  • A client-side TAB_ALIASES allowlist maps every retired slug to its parent tab. resolveHashTab() validates location.hash against ^[a-z-]+$, resolves the alias, scrolls to a section-<slug> anchor, and falls back to Overview on any unknown/malformed hash — the hash is never concatenated into a DOM selector, so a crafted #hash can't inject markup.

    #status → Overview, #workboard → Goals, #logs|#traces|#thinking|#brain-failures → Activity, #processes|#terminal → Workers, #merge-decisions|#pr-readiness → Pull Requests, #memory|#costs → Resources.

Concurrency

Rebased onto the latest origin/main, which already integrates the Journal refresh (#2618) and the enhanced Overseer detail (#2616/#2620). The consolidation keeps both as standalone tabs, untouched. Designed to merge last; the coordinated tab-registration files are tab_meta.rs, index_html/part_00.rs/part_01.rs, and the TUI app.rs/tabs/mod.rs.

Tests

  • Rust: tests_tab_meta.rs (canonical taxonomy, no retired top-level slugs, exactly nine page-h1s, sub-section headers, TAB_ALIASES), tests_routes_a/b.rs, TUI app.rs (ALL_TABS == 7, digits 1–7). Full cargo test --all-features green; cargo clippy --all-targets --all-features -- -D warnings clean; cargo fmt clean.
  • Python tab-identity smoke test (test_tab_clarity.py): nine canonical slugs, retired-slug deep links resolve to their parent, unknown hash → Overview with no injection.
  • Playwright specs updated for the new tab set (logs → Activity, thinking → Activity, workboard → Goals, terminal → Workers, merge-decisions/pr-readiness → Pull Requests).

The durable tab taxonomy and its invariants are documented in docs/dashboard.md (Tab Identity Contract + Canonical tab taxonomy + Deep links). No point-in-time snapshot doc is committed.

@rysweet rysweet force-pushed the feat/issue-2627-the-dashboard-and-tui-have-accumulated-too-many-ta branch from 61189e9 to a6dc8ee Compare July 6, 2026 05:20
rysweet and others added 2 commits July 6, 2026 05:39
#2627)

The dashboard and TUI had accumulated too many tabs with adjacent/overlapping
purposes. Consolidate both surfaces onto a single shared 9-tab taxonomy
(dashboard) / 7-tab subset (TUI). No data is lost — every former standalone
tab now lives as a labelled sub-section (<h2 class="subsection">) inside its
parent tab, and every retired top-level slug keeps working as a deep-link
alias.

Canonical tabs: Overview, Goals, Activity, Workers, Pull Requests, Resources,
Chat, Overseer, Journal. The TUI mirrors the shared names/order and renders the
seven tabs whose data exists in the terminal (it omits the web-only Pull
Requests and Resources). Overseer and Journal are carried through unchanged.

Dashboard:
- tab_meta.rs: TAB_METADATA 17 → 9 canonical entries.
- part_00/part_01 HTML: 17 tab-content panels merged into 9, absorbed <h1>s
  demoted to <h2 class="subsection">, scroll anchors added for retired slugs.
- JS: single activateTab/runTabFetches dispatcher fires every sub-section's
  fetches per parent tab; TAB_ALIASES allowlist + resolveHashTab() map retired
  slugs to their parent tab, validate location.hash against ^[a-z-]+$, and fall
  back to Overview with no DOM injection. openAgentLog() now targets Workers.

TUI:
- app.rs enum Tab / ALL_TABS / label / from_key (1–7) / number → 7 tabs;
  Meeting→Chat, Engineers→Workers, Stats/Status folded into Overview.
- overview.rs stacks Summary/Health/Stats panels; meeting.rs→chat.rs,
  engineers.rs→workers.rs; stats.rs/status.rs removed; ui.rs/mod.rs/main.rs
  updated.

Tests: tab_meta, routes_a/b, TUI app.rs, the Python tab-identity smoke test,
and the Playwright specs (logs/thinking/workboard/terminal/pull-requests) all
updated for the new tab set.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…set (#2627)

overview.spec.ts asserted >=13 tabs with the old tab labels, and
dashboard-audit.spec.ts asserted >=11 — both predate the consolidation.
Update to the nine canonical tabs (Overview, Goals, Activity, Workers,
Pull Requests, Resources, Chat, Overseer, Journal).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@rysweet rysweet force-pushed the feat/issue-2627-the-dashboard-and-tui-have-accumulated-too-many-ta branch from a6dc8ee to e03381a Compare July 6, 2026 05:48
@rysweet rysweet merged commit 646a1fd into main Jul 6, 2026
13 checks passed
@github-actions

github-actions Bot commented Jul 6, 2026

Copy link
Copy Markdown

📊 Coverage Summary

Generated by cargo llvm-cov --workspace --summary-only (nightly, excluding test files)

Module Lines Covered Coverage
Total 140341 116828 83.2%

Coverage data from CI run. Test files matching tests?/ are excluded from line counts.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant