decide D-87 (output/log dock) + resolve Q-28; file T-258 (terminal home)

D-87 — T-54's "output and log panel" is a bottom output dock: read-only,
two tabs (Output = the Logger stream, filterable + auto-scroll; Problems =
diagnostics moved out of the sidebar). Toggled by a single status-bar widget
that replaces the app-status indicator (merged health+log: green check when
clean, warn/error counts otherwise) via click or Cmd/Ctrl+J. Needs a bounded
ring sink on the Logger (no history today). Amends D-47: the dock is the one
surface allowed to push Claude up, capped so Claude stays >=50%.

Resolves Q-28 by splitting on interaction: read-only output (logs/problems)
goes in the dock; the terminal does NOT — it stays a first-class editor-pane
surface, tracked by new T-258 (swap-vs-split, with Q-27). Refines T-54.

Wireframe under docs/design/wireframes/output-dock/.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-06 22:57:18 +02:00
co-authored by Claude Opus 4.8
parent 74cb60f1e3
commit da61af810d
8 changed files with 280 additions and 2 deletions
+2 -1
View File
@@ -128,6 +128,7 @@ You might also want, project-permitting:
- [D-84: Diff view placement — editor-mode inline above Claude, spawned from the git sidebar](decisions/architecture.md#d-84-diff-view-placement--editor-mode-inline-above-claude-spawned-from-the-git-sidebar) — _architecture_
- [D-85: Event bus delivery — bounded ring-buffer back-pressure; in-memory cursor retention, bus-owned if persisted](decisions/architecture.md#d-85-event-bus-delivery--bounded-ring-buffer-back-pressure-in-memory-cursor-retention-bus-owned-if-persisted) — _architecture_
- [D-86: MCP tool surface — full clide namespace generated from the co-registered command registry](decisions/architecture.md#d-86-mcp-tool-surface--full-clide-namespace-generated-from-the-co-registered-command-registry) — _architecture_
- [D-87: Output/log dock — bottom, toggled, read-only (logs + problems)](decisions/architecture.md#d-87-outputlog-dock--bottom-toggled-read-only-logs--problems) — _architecture_
## Open questions
@@ -151,7 +152,6 @@ You might also want, project-permitting:
- [Q-25: Body text face — mono everywhere vs Josefin Sans UI + mono code](questions/architecture.md#q-25-body-text-face--mono-everywhere-vs-josefin-sans-ui--mono-code) — _architecture_
- [Q-26: Small screen layout (< 1000px)](questions/architecture.md#q-26-small-screen-layout--1000px) — _architecture_
- [Q-27: Two-editor split](questions/architecture.md#q-27-two-editor-split) — _architecture_
- [Q-28: Terminal strip scope — shell only or logs/errors/tests](questions/architecture.md#q-28-terminal-strip-scope--shell-only-or-logserrorstests) — _architecture_
- [Q-29: Branch picker location](questions/architecture.md#q-29-branch-picker-location) — _architecture_
- [Q-30: Focus behavior when editor is dirty and viewer is peeked](questions/architecture.md#q-30-focus-behavior-when-editor-is-dirty-and-viewer-is-peeked) — _architecture_
- [Q-31: XWayland fallback for frameless — proper Wayland protocol needed](questions/architecture.md#q-31-xwayland-fallback-for-frameless--proper-wayland-protocol-needed) — _architecture_
@@ -164,6 +164,7 @@ You might also want, project-permitting:
- [Q-19: (withdrawn)](questions/process.md#q-19-withdrawn) — _process_
- [Q-21: Pql absorbs planning vs keeps separate](questions/architecture.md#q-21-pql-absorbs-planning-vs-keeps-separate) — _architecture_
- [Q-22: Ticket persistence strategy](questions/architecture.md#q-22-ticket-persistence-strategy) — _architecture_
- [Q-28: Terminal strip scope — shell only or logs/errors/tests](questions/architecture.md#q-28-terminal-strip-scope--shell-only-or-logserrorstests) — _architecture_
- [Q-32: MCP tool surface — minimum slash-ide or extended clide tools?](questions/architecture.md#q-32-mcp-tool-surface--minimum-slash-ide-or-extended-clide-tools) — _architecture_
- [Q-33: MCP transport — SSE, WebSocket, stdio, or all?](questions/architecture.md#q-33-mcp-transport--sse-websocket-stdio-or-all) — _architecture_
+17
View File
@@ -140,6 +140,7 @@ Core, rendering, IPC, kernel, panel manager.
### D-47: Interaction model — Claude-is-home layout
- **Date:** 2026-04-22
- **Amendment (2026-06-06):** Rule (1) (prompt-bar Y invariant across all states) gains one documented exception: the bottom **output dock** ([D-87](#d-87-outputlog-dock--bottom-toggled-read-only-logs--problems)) may re-baseline the prompt bar by pushing Claude up when it opens, capped so Claude stays the largest surface (≥ 50% of the middle column). Closed dock → original baseline. The dock is the *only* surface permitted to move the prompt-bar Y; everything else still obeys rule (1).
- **Decision:** The prompt bar is pinned to a fixed Y-position in the middle column; every other surface makes room *around* Claude — never on top, never pushing the prompt off-Y. Three hard rules: (1) prompt bar Y-position is invariant across all states (open, collapsed, focus, editor, viewer); (2) the three bottom strips (left icon rail, app strip, right icon rail) align to one continuous horizontal line; (3) Claude is always the largest surface when present. The three-column layout from [D-11](#d-11-panel-manager-is-kernel-layout-is-data-three-column-is-a-preset) is refined: left = overview (tickets, decisions, files, git, PRs), middle = Claude (+ optional editor above), right = context (viewer, pql graph, links, images). Both side panels have a bottom icon rail for section switching; keyboard: `⌥1–5` (left), context-type switcher (right).
- **Rationale:** "Claude is home" means the prompt never moves, regardless of what opens or closes around it. Every layout mutation respects this invariant. The three-column refinement assigns purpose to columns rather than leaving them generic.
- **Cost:** The prompt bar invariant constrains future layout presets — any preset that repositions Claude must explicitly break this rule. Editor mode (see [D-49](#d-49-editor-mode-inline-above-claude-viewer-swap)) is the only case where another surface shares the middle column, and it opens *above* Claude rather than displacing it.
@@ -433,3 +434,19 @@ Core, rendering, IPC, kernel, panel manager.
- **Raised by:** 2026-06-06 — walking Q-32 during the T-208 wind-down; user chose the full namespace but constrained it to single-registry generation to avoid a second maintenance front, noting the extensions-first pattern needs that anyway.
---
### D-87: Output/log dock — bottom, toggled, read-only (logs + problems)
- **Date:** 2026-06-06
- **Status:** accepted
- **Decision:** clide gains a **bottom output dock** — a toggled, **read-only** panel hosting two tabs: **Output** (the kernel log stream) and **Problems** (diagnostics). Resolves [Q-28](../questions/architecture.md#q-28-terminal-strip-scope--shell-only-or-logserrorstests): the bottom strip hosts logs/problems, **not** the terminal.
- **Toggle = one merged status-bar widget.** Clicking it (or `⌘J` / `Ctrl+J`) opens/closes the dock. The widget **replaces the separate app-status indicator** rather than adding a segment (chrome budget, [D-48](#d-48-chrome-budget--no-tabs-no-breadcrumbs-keyboard-first)): it shows green `✓` when clean, `⚠`/`✕` diagnostic counts when not, and a `▲`/`▼` chevron for dock state. The badge means problem counts are visible **without** opening the dock.
- **Output tab:** the `Logger` stream (subsystems: ipc, mcp, extensions, pql, git, pane, …), filterable by **source + level + text**, auto-scrolling (follow tail; scrolling up pauses follow and shows "jump to latest").
- **Problems tab:** diagnostics, **moved out of the left sidebar** — no duplication, and the dock's full width suits `severity · file:line · message` rows the 180–400px sidebar truncated. The status badge replaces the sidebar panel's always-visible glance.
- **Retention:** add a bounded in-memory **ring sink** to the `Logger` (drop-oldest, fixed cap). The logger today only live-broadcasts with no history, so late openers would see nothing; the ring serves "the last N records" on open. Same drop-oldest shape as the [D-85](#d-85-event-bus-delivery--bounded-ring-buffer-back-pressure-in-memory-cursor-retention-bus-owned-if-persisted) event ring.
- **Layout:** the dock occupies the bottom of the workspace column and pushes Claude **up**; the prompt bar rides up with it. Height is resizable (top edge) and open/closed + height persist per workspace. This is an explicit exception to [D-47](#d-47-interaction-model--claude-is-home-layout) rule (1) — see its amendment.
- **Rationale:** Q-28 asked whether the bottom strip should host logs/errors/tests. The answer splits **by interaction**: the dock is **passive** (you skim it) so it earns the always-present-but-collapsed bottom slot; the **terminal is active** (you work in it) so it stays a first-class surface in the editor pane ([D-49](#d-49-editor-mode--inline-above-claude-viewer-swap)), never demoted into a log strip. Merging health into the toggle widget delivers a new capability with **zero new persistent chrome** and keeps the at-a-glance count alive while the dock is closed. Problems moves in because the width fits and the badge covers the glance it used to provide from the sidebar.
- **Cost / risk:** Breaks D-47's literal prompt-bar Y-invariance — mitigated by the explicit amendment, the ≥50% cap (Claude stays the largest surface), and the dock only moving on a deliberate user toggle. Adds bounded log-buffer memory. Relocating Problems costs muscle memory + the slot move. Small-screen behaviour interacts with [Q-26](../questions/architecture.md#q-26-small-screen-layout--1000px): under a short window the dock + ≥50% cap may force a smaller dock or a modal — deferred to Q-26.
- **Cross-reference:** [D-47](#d-47-interaction-model--claude-is-home-layout) (amended — prompt-Y exception), [D-48](#d-48-chrome-budget--no-tabs-no-breadcrumbs-keyboard-first) (merged widget adds no segment), [D-49](#d-49-editor-mode--inline-above-claude-viewer-swap) (where the terminal lives instead), [D-51](#d-51-panel-collapse--12px-spine-with-badge) (collapse-with-badge pattern the toggle echoes), [D-85](#d-85-event-bus-delivery--bounded-ring-buffer-back-pressure-in-memory-cursor-retention-bus-owned-if-persisted) (drop-oldest ring reused), [Q-26](../questions/architecture.md#q-26-small-screen-layout--1000px). Resolves [Q-28](../questions/architecture.md#q-28-terminal-strip-scope--shell-only-or-logserrorstests). Implemented by T-54; the terminal's editor-pane home is tracked separately.
- **Raised by:** 2026-06-06 — T-54 UX design session (Frame0 wireframe under `docs/design/wireframes/output-dock/`). User chose a status-bar-toggled bottom dock scoped to read-only output, Problems folded in, terminal kept first-class in the editor pane.
---
+2 -1
View File
@@ -90,7 +90,8 @@ ticket persistence.
- **Source:** 2026-04-22 interaction model spec (Wireframe — Flows v3), open question 2.
### Q-28: Terminal strip scope — shell only or logs/errors/tests
- **Status:** Open
- **Status:** Resolved → [D-87](../decisions/architecture.md#d-87-outputlog-dock--bottom-toggled-read-only-logs--problems)
- **Resolved (2026-06-06):** Split by interaction. A bottom **output dock** hosts **read-only** output — logs + problems — toggled from a merged health/log status-bar widget (D-87). The **terminal is NOT in the strip**: it's an interactive surface, kept first-class in the editor pane (D-49). So "both, later" became "logs/problems yes, terminal no."
- **Question:** Is the app strip (bottom bar) purely a terminal shell + status, or does it also host tabs for logs, errors, and test output? Probably both, later.
- **Context:** The interaction model spec defines the app strip as 14px with terminal shell + daemon indicator + branch; expanding on focus. If it grows to host logs/errors/tests, it becomes a mini-panel with its own tab model.
- **Source:** 2026-04-22 interaction model spec (Wireframe — Flows v3), open question 3.