Skip to content

Workflow swimlane view: minimap + split view fixes, turn bar design v1-v7#120

Merged
lis186 merged 77 commits into
mainfrom
feat/workflow-swimlane-view
Jul 3, 2026
Merged

Workflow swimlane view: minimap + split view fixes, turn bar design v1-v7#120
lis186 merged 77 commits into
mainfrom
feat/workflow-swimlane-view

Conversation

@lis186

@lis186 lis186 commented Jul 3, 2026

Copy link
Copy Markdown
Owner

What

76 commits: workflow view 的 minimap/split view 功能與修復(#91/#107/#110/#111),加上 turn bar 視覺系統 v1–v7 的設計定案文件與 prototypes。

Production(public/)

  • P10-P16:64px minimap(inline labels + zone threshold lines)、P15 minimap click sync、P16 移除 workflow focused mode、split pane min-width 系列、Overview selected-turn indicator line (P15) #111 overview 1px selected-turn indicator、Timeline step list allows unwanted horizontal scroll #107 timeline 橫向捲動修復
  • Codex review 修復(4 輪審到 MERGE-READY):P16 讓 inSplitView() 變成 workflow 常態後,三個呼叫方還揣著舊語義——鍵盤攔截吞掉 j/k/Tab/Esc、live-follow 失效、step scroll 查 hidden column;另修 global Esc 跨 tab 失效、窄視窗裁掉 detail pane
  • 行為驗證:隔離 instance + 真實 log,browser 實測鍵盤導航/scroll/窄視窗

Docs

  • 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

🤖 Generated with Claude Code

Justin Lee and others added 30 commits June 22, 2026 09:53
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>
Justin Lee and others added 27 commits June 27, 2026 16:52
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>
@lis186 lis186 merged commit f2112e0 into main Jul 3, 2026
2 checks passed
@lis186 lis186 deleted the feat/workflow-swimlane-view branch July 3, 2026 14:43
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