Workflow swimlane view: minimap + split view fixes, turn bar design v1-v7#120
Merged
Conversation
Design spec (docs/workflow-view-design.md) covering 12 problems, rejected approaches (swimlane/git-graph/heatmap/progressive-disclosure), and final design: Tufte sparkline small multiples replacing the Turns column, with existing ccxray detail UI reused below. Prototype (prototype/tufte/) with 10 real sessions (up to 471 turns), Miller column layout, agent card with context/cache/cost charts, timeline zoom/pan, minimap, workflow collapse, and steps sync. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Overview bar: - Moved from floating overlay to full-width bar at top (Shneiderman: overview first) - Scale labels (0 / mid / end) for orientation - Time formatting: seconds → minutes → hours Sticky main lane: - SVG split into #main-svg (sticky) + #macro-svg (scrollable sub-lanes) - Main agent + time axis never scroll away regardless of sub-lane count - Resize handle between timeline and detail area (drag to adjust split) Agent card: - 2px left border in model color (visual link to timeline lane) - Context chart: zone-colored bar chart (green <40%, yellow 40-83.5%, red >83.5%) - Context % normalized to lane's context window (avoids zigzag from model switches) - Charts X axis: turn-index (dense) with idle gap markers (amber dashed lines when idle >5min) - Click on charts → select turn with blue cursor line Timeline steps: - Idle separator rows: ⏸ duration shown when gap >5min between turns - ctx% colored by cache hit rate: gray = warm (≥50%), yellow = cold (<50%) Interaction: - Drag: horizontal = time pan, vertical = lane scroll (window-level listeners survive re-render) - Scroll: horizontal = time pan, vertical = native lane scroll, Ctrl = zoom - Tooltip suppressed during drag Fixture: - Rebuilt from real ccxray logs (12 sessions, 4 models, 1-32 lanes, 10-319 turns) - scripts/extract-fixture.js for reproducible extraction - Fixed elapsed field: was string seconds, now number milliseconds Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Timeline steps: - Production ccxray style: tool groups with ┌│└ brackets, green tool names - Thinking turns: 🧠 indicator with duration for long thinks - Spawn badges integrated into tool group brackets Overview bar: - Brush-to-zoom: drag to select range when not zoomed (crosshair cursor) - Edge resize: drag left/right edges of viewport to adjust start/end time - Pan: drag middle of viewport to slide - Viewport duration label: blue pill badge at bottom-right corner of viewport rect Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Lane click was slow because renderTimeline() synchronously rebuilds all SVGs + minimap + handlers on every selection change. Now: - Selection changes: deferTimeline() via rAF, agent card + steps render instantly (user sees new lane data immediately, SVG updates next frame) - Zoom/pan/drag: still synchronous renderTimeline() for immediate visual feedback - computeChartLayout: computed once per drawAllSummaryCharts, not 3x Also: design doc updated with round 3 changes (brush-to-zoom, edge resize, production-style tool brackets, viewport duration label). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
SVG text elements intercepted clicks meant for the underlying lane-bg rect. elementFromPoint returned the text (no lane-bg class) → click silently ignored. Fix: pointer-events: none on .lane-label/.lane-label-dim. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Every area of the workflow view now has a canonical term, code ID/class, and description. ASCII layout diagram maps visual position to term. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
P1: content-driven timeline height (lane count × LANE_H, capped at 45vh) P2: charts detach from Agent Card to Steps Panel sticky header (full width) P7: streaming state design (ghost bar, green dot, thinking indicator) P9: iPad touch experience design (44px hit zones, pinch zoom, snap-to-nearest) Lane inference heuristic improved: - Model mismatch is now the primary subagent signal (no time limit) - Orphan lane for model-mismatched turns without spawn match - Placeholder lanes for spawns whose turns are in separate sessions - Cross-session join documented as production requirement Design doc updated with all amendments, scores, and compromises. 5 standalone mockup HTMLs for design review (P1/P2/P7/P9/integrated). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add parentSessionId to link subagent sessions back to their parent orchestrator session. This enables the workflow timeline to pull child session turns into lanes of the parent session. - store.js: linkParentSession() detects subagent-like new sessions (no cwd + ≤2 messages, or wire-parser isSubagent hint) and links them to the most likely inflight parent via inferParentSession() - sse-broadcast.js: expose parentSessionId in SSE entry summaries - index.js: call linkParentSession BEFORE activeRequests increment to avoid self-link (child seeing itself as best parent candidate) - 7 new tests covering linkage, idempotency, and ordering guard Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
New public/workflow-timeline.js (809 LOC): - Lane inference: isSubagent flag + model mismatch + context % drop (excludes compacted turns to avoid false positives) - SVG rendering: lanes with turn bars (color=model, width∝elapsed), 16px context % sparklines, time axis - Overview bar: canvas minimap with brush-to-zoom, edge resize, pan - Interactions: drag-pan, ctrl+wheel zoom, double-click reset, turn bar click → selectTurn(), lane click → agent card - Agent card: lane summary with context/cache/cost stats, top tools - Tooltip, resize handle, rAF-throttled updates - CSS variables for theme support, wf- prefix namespace Also: style.css workflow styles, index.html script tag, 9 data-layer tests covering lane inference and build state. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- selectSession(): build wfState + render timeline, add wf-active class - selectTurn(): highlight selected turn in SVG - addEntry(): store parentSessionId on session, incremental workflow update for both direct and child-session entries - selectProject(): clear workflow timeline on project change - Fix: restore shortSid declaration lost in sessionsMap edit Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- keyboard-nav.js: dispatch wfKeyHandler before arrow-only guard (j/k navigate lane turns, Tab cycles lanes, Esc resets zoom/main) - workflow-timeline.js: wfKeyHandler, wfRenderChartHeader with 3 SVG sparklines (context/cache/cost) and cursor sync across all 3 charts - miller-columns.js: prepend chart header to timeline detail view - style.css: chart header styles Codex review fixes: keyboard dispatch ordering, arrow keys preserved for normal turn nav, cursor line on all 3 sparklines, dynamic viewBox width for long lanes. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The design doc specifies the workflow view spans all 3 right columns as a single vertical stack: Overview → Lanes → Resize → Detail Area (Agent Card + Steps side by side). Previous implementation incorrectly used 3 separate narrow Miller columns. - CSS: #columns.wf-active hides col-sections/col-detail, makes col-turns flex:1 with vertical layout - workflow-timeline.js: restructured DOM to match design doc ASCII art: #wf-overview (label + canvas), #wf-lanes-section (sticky main SVG + scrollable sub-lanes), #wf-resize, #wf-detail-area (agent card 240px + steps panel flex) - miller-columns.js: wf-active on #columns not colTurns, hook in selectSessionAndLatestTurn for URL restore path, detail content redirected to #wf-steps-panel via commitDetailHtml hook Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Refactored chart rendering from static HTML in commitDetailHtml to a dedicated #wf-chart-header element updated by _wfUpdateChartHeader() on every wfDeferRender (zoom/pan/selection). Charts now: - Render full-width using actual container width - Filter to viewport turns when zoomed - Show cursor line across all 3 charts (context/cache/cost) - Display summary labels (PEAK %, hit %, $total) - Update in sync with timeline zoom/pan/brush Also: split #wf-steps-panel into chart header + steps content divs, redirect commitDetailHtml to #wf-steps-content, remove old static wfChartHtml injection from renderDetailCol. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…oint SVG <text> labels sit on top of .wf-lane-bg rects, so elementFromPoint returns the text element instead of the clickable background. Fixed by computing lane index from click Y position relative to the SVG, which works regardless of overlapping elements. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Click any bar in context/cache/cost charts → finds nearest turn from viewport-filtered list → calls selectTurn(idx) → which triggers wfHighlightTurn → wfDeferRender → updates SVG highlight + chart cursor line + overview bar. Full bidirectional sync: chart click → selectTurn → wfHighlightTurn → SVG + charts + overview turn bar click → selectTurn → same chain keyboard j/k → selectTurn → same chain Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace per-turn detail view with prototype-style flat turn list showing all turns in the selected lane. Each row: #num, tools (with brackets), context %, duration. Idle separators for gaps >5min. Full bidirectional sync: - Click step row → selectTurn → SVG highlight + chart cursor + overview - Click chart bar → selectTurn → step row selected + scroll into view - Lane click/Tab → re-render steps for new lane - Zoom/pan → steps outside viewport dimmed (opacity 0.4) - wfHighlightTurn → re-render steps with selection + auto-scroll Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Context/Cache/Cost charts now support left-right drag to pan the timeline viewport (same as SVG lanes). Click still selects nearest turn. Drag detection uses 3px threshold to distinguish pan from click. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Charts now always render ALL turns in the lane (stable bar positions). When zoomed, out-of-viewport bars are dimmed with a semi-transparent overlay matching the overview bar pattern. Drag-to-pan updates the overlay position in real-time via wfDeferRender, giving clear visual feedback of the viewport sliding over the bar chart. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Charts moved from separate detail header into the SVG lane itself: - Unselected lanes: turn bars + context sparkline (28px, unchanged) - Selected lane: turn bars + context + cache hit + cost (48px expanded) This saves vertical space — charts are contextual to the selected agent, not a global header. Deleted _wfUpdateChartHeader and its 120-line DOM/drag handler. Lane heights are now variable; sub SVG Y-offsets and label click detection account for expanded lane. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Overview minimap now shows the selected lane's context % as colored bar chart (green/yellow/red zones) instead of lane density bars. Click selects nearest turn. Viewport overlay + cursor line sync with zoom/pan/selection. Brush-to-zoom still works; click (no drag) selects turn. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Selected lane now shows prototype-style bar charts instead of area sparklines: context % (40px, green/yellow/red zones, threshold lines), cache hit (16px, green/yellow), cost (16px, orange). Each turn = one bar. Labels show "Context % / PEAK 68%", "Cache hit / 94.0%", "Cost / $2.34". Blue cursor line at selected turn. Unselected lanes keep the 16px context area sparkline. Lane height: 28px → 80px when selected. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Expanded lane bar charts redesigned per Tufte layering principles: - Context %: 48px, three-zone colors — green (<40% smart), yellow (40-80% getting dumb), red (>80% danger). Threshold lines at 40%/80% - Cache hit: 20px, red (<80% miss danger) vs green (>=80% healthy) - Cost: 20px, orange bars - 4px gaps + separator lines between chart regions - Labels moved to left label area (240px) — chart area is pure data - Total expanded height: ~108px (was 80px) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Lanes now have dynamic height: - Unselected: 40px (8px turn bars + 28px context sparkline + 4px gap) - Selected: 80px (adds 20px cache hit + 20px cost bar charts) Charts moved from separate #wf-chart-header into the lane SVG itself. Only the selected lane shows cache + cost; unselected lanes show only context sparkline. Removes ~120 LOC of dead _wfUpdateChartHeader code. Lane heights are computed dynamically by _wfLaneHeight/_wfTotalLanesHeight so P1 content-driven sizing and click-to-select Y-coordinate calculations all adapt to the variable lane heights. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace faint area sparkline (15% opacity fill) with colored bar chart matching prototype's context minimap: green (<40%), yellow (40-83.5%), red (>83.5%) at 80% opacity. Add 40% and 83.5% threshold dashed lines. Much more visible, especially on dark backgrounds. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Context uses blue (var(--accent)) as base color instead of green, so the three inline charts are visually distinct: - Context %: blue (<40%), yellow (40-83.5%), red (>83.5%) - Cache hit: green (>50%) / yellow (<50%) - Cost: orange Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Click anywhere in chart area (context/cache/cost bars) finds the nearest turn by time position → selectTurn + scroll steps panel. Fallback from the existing turn-bar/lane-bg click handlers. 2. Overview canvas shows a blue vertical line at the selected turn's position, visible whether zoomed or not. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…r code - Context sparkline: use _wfSparklineArea instead of inline bar chart (area chart is more readable at small sizes) - Remove selected-turn marker from overview canvas (too noisy) - Remove click-on-chart-area-find-nearest-turn fallback (replaced by simpler lane-bg click handler) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- ASCII art: show selected lane expanding to 80px with cache/cost - Vocabulary: Lane height is dynamic (40px unselected, 80px selected), charts are inline SVG in selected lane, Agent Card is text-only, updated code IDs to match production (#wf-* prefix) - P2 revised: "Charts Detach to Steps Panel Header" → "Charts Inline in Selected Lane" — cache/cost render inside the lane SVG - P5 revised: "Chart↔Step Cursor Sync" → "Bidirectional Selection Sync" — all views (lane SVG, steps, agent card, overview) sync on turn/lane selection Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Agent Card now has two parts: - Top: lane summary (context, cache, cost, tool frequency) - Bottom: Section Nav items matching the existing ccxray sections column (Timeline, System, Core, MCP, Skills, Cost Efficiency, Request, Events). Clicking switches the Steps Panel detail view. Steps Panel content depends on Section Nav selection: - Timeline (default): flat turn list - Other sections: existing renderDetailCol views (system prompt viewer, tool definitions, cost analysis, raw request/events) Not yet implemented — design doc only. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Section nav in agent card: Timeline, System, Core, MCP, Skills, Cost Efficiency, Request, Events. Non-timeline sections redirect renderDetailCol output to #wf-steps-content via commitDetailHtml. Fix selectSession missing auto-select — now calls selectTurn like selectSessionAndLatestTurn so agent card + steps panel populate on every session click. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Add overflow-x: hidden to four vertical-only scroll areas: .tl-split-detail, .tl-scroll-area, .detail-scroll, #wf-steps-content Closes #107 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
E1+E2: _wfFindTurn and _wfSyncStepsHighlight now use a Map<turnId, {turn, laneIdx}>
built in wfBuildState and maintained by wfAddEntry. Drops hot-path lookups
from O(lanes×turns) to O(1).
A1: Extract wfStepsRoot() in workflow-timeline.js, replacing 5 copy-pasted
root resolution patterns across keyboard-nav.js, messages.js, miller-columns.js.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…tch, streaming Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Health-first minimap belongs adjacent to Agent Card context stats, not at the Zed-style right edge. Matches existing implementation. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- P16: replace focused mode with always-visible side-by-side layout + draggable resize handle between Steps and Detail - P10 revised: minimap widened to 60-70px, inline step labels (8-9px) replace hover-to-discover, coalescence shows ×N label inline - Minimap always visible (not focused-mode-only) - Updated term definitions, diagrams, scores, and cross-references Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Remove stale "focused split-pane mode" from Timeline term 2. Remove "focused" from Step Row term 3. Bottom bar: "Esc exit" → "Esc reset" 4. P10 heading score 9.7 → 9.3 (matches body) 5. P15 overview indicator line marked as parked (#111 closed) 6. P12 form table: overview marker → viewport rect only 7. Add P10/P16 entries to Compromises table 8. design-principles.md: P10-P15 → P10-P16 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
… lines - Minimap width 36→64px - Inline step labels (8px, hidden when block <8px tall) - Zone threshold dashed lines: 40% green (::before), 80% red (::after) - Bottom label always visible: "45% · 200K" - Blocks base opacity 0.5→0.7 for label readability - Content-type colors preserved (not zone color — zone info via threshold lines) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…handle P15: minimap click calls wfHighlightTurn() to sync overview + swimlane cursor. P16: workflow mode no longer uses focused mode (isFocusedMode stays false, .focused never added to #columns). Split pane renders directly via isWf bypass. inSplitView() helper lets keyboard-nav, auto-follow, and star jumps work in both classic focused and workflow modes. Resize handle between Steps and Detail panels: 5px draggable, persists width to localStorage, clamps min 180px / max parent-200px. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Drop typeof inSplitView guards — miller-columns.js loads first (6 sites) - Move wfState guard into enterFocusedMode() instead of 4 call-site checks - Skip redundant wfHighlightTurn when turn hasn't changed - Consolidate keyboard-nav local vars (_split/_splitN/_inSplitKbd → inSplitView()) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Math.max→Math.min ordering let detail's 320px floor override steps' 180px floor when parent was narrow. Fixed: clamp raw delta to [180, parent-320] so steps minimum always holds. Added CSS min-width: 320px on .tl-split-detail as browser-level enforcement (JS clamp alone doesn't cover viewport resize or zoom). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Belt-and-suspenders: .tl-split .tl-with-minimap gets min-width:180px and max-width:60% in CSS (not just inline style). localStorage value clamped to [180,500] at read time. Inline min-width removed (redundant with CSS rule). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
CSS owns min-width constraints (.tl-split .tl-with-minimap: 220px, .tl-split-detail: 280px). JS initStepsResize reads from computedStyle instead of hardcoding — single source of truth. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
enterFocusedMode() returns early in workflow mode (wfState guard), but selectStep also returned early after calling it — detail never updated. Fix: use inSplitView() guard so workflow mode skips the enterFocusedMode call entirely and falls through to the detail update logic. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
…nimap) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Six design iterations stacked vertically for side-by-side comparison: 4D bar encoding, event track, Usage-style filter, session weather. Real session data inline (68134a99, 128 turns). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
body{height:100vh;display:flex} made all sections flex-shrink when the
window is shorter than the content; overflow-y:hidden on lane sections
then clipped the bars entirely. min-height lets the body grow instead.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ine) v6: lane heads column (agent naming via system-prompt detection, session weather), expandable per-category event tracks, Usage-style filter. v7: bar reduced to 2.5D; context moved to 8px greyscale waterline ribbon (L* linear #424242→#9b9b9b, equal-luminance red handoff at 80%), cache%/ cost$ selection-only tracks, whole-row hover popover, click-to-select. data.js: shared real-session metrics (timings/costs/tokens only). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
DESIGN-DECISIONS.md: per-version screenshots, scores, evaluator criticism quotes mined from session transcripts, rejected-alternative scores, the task-oriented scoring methodology pivot, and 10 cross-version lessons. v7 accepted at 9.26/10 after a 3-round designer/evaluator subagent loop. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
P16 made inSplitView() true in workflow's default state, which broke three things that assumed it meant focused-mode drill-down: - keyboard-nav: split-view intercept swallowed j/k/Tab/Esc before wfKeyHandler could run — dispatch wf lane nav inside the intercept - entry-rendering: live-follow guard used !inSplitView(), so follow-live never advanced selection in workflow view — guard on isFocusedMode - messages: scrollTimelineStepIntoView queried hidden colDetail — route through wfStepsRoot() like keyboard-nav already does Verified in browser against real logs: k/Tab/Esc navigate lanes, scrollTimelineStepIntoView returns true with 198 steps in wf-steps-content. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…-split-list rule overflow:hidden clipped the detail pane entirely on narrow viewports (min-widths sum to ~645px for the split alone). overflow-x:auto keeps the panes reachable. .tl-split-list has no matching markup since P16. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- resize persist is pixel width in ccxray-steps-width, not wf-detail-ratio - overview 1px selected-turn indicator is implemented (#111), not parked - minimap does not yet render system prompt/tools overhead block Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
wfState persists across tab switches, so the unified Escape handler's inSplitView() early-return also fired on Usage/System Prompt and Esc could no longer switch back to Dashboard. Gate both the app.js guard and the workflow key dispatch on activeTab === 'dashboard' so a hidden workflow view never reacts to keys from other tabs. Verified in browser: Esc on Usage returns to Dashboard; workflow lane nav unchanged on the dashboard tab. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… minimap features - 'Impact on existing code' claimed isFocusedMode & friends are removed; implementation bypasses focused mode in workflow and keeps it for classic sessions - first-hover onboarding tooltip and step coalescence marked as design intent, not yet implemented Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…icator doc annotations - the pre-existing wfKeyHandler dispatch outside the split-view intercept could still mutate hidden workflow state from Usage/System Prompt - coalescence marked as design intent in the P10 decision table, tradeoff text, and open-questions table; two more stale 'parked' references to the #111 indicator line updated to implemented Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
76 commits: workflow view 的 minimap/split view 功能與修復(#91/#107/#110/#111),加上 turn bar 視覺系統 v1–v7 的設計定案文件與 prototypes。
Production(public/)
inSplitView()變成 workflow 常態後,三個呼叫方還揣著舊語義——鍵盤攔截吞掉 j/k/Tab/Esc、live-follow 失效、step scroll 查 hidden column;另修 global Esc 跨 tab 失效、窄視窗裁掉 detail paneDocs
docs/design-principles.md:UI 設計決策框架docs/workflow-view-design.md:P10-P16 決策 + 與實作對齊(未實作項明標 design intent)prototype/swimlane/DESIGN-DECISIONS.md:turn bar v1→v7 演進全記錄(evaluator 原話 + 10 條跨版本教訓)Prototypes(不影響 runtime)
prototype/swimlane/:v1-v6 演進對照、dashboard 整合 mocks、v7 waterline(autoresearch 3 輪收案 9.26/10)Review
Codex CLI gate:R1 4 major + 4 minor → R2/R3 追加抓漏 → R4 MERGE-READY。
Known issues
workflow-timeline.js是下一個 branch 的事(spec 在 DESIGN-DECISIONS.md)🤖 Generated with Claude Code