c5722234ef
The five-circle pipeline conveyed only "which stage we're on" — operators asked for the actual span tree (root → stages → batches/images), the time each span took relative to the whole run, and the recorded JSON in/out. This commit rebuilds the visual layer to match Langfuse's trace view without touching the data layer (polling, attempt selector, retry, copy-span and watchers all unchanged). - Three-column grid (name | status+duration | bar): each span is one row, indented by depth. Status dot 8px, name monospace, duration right-aligned. Bars are absolutely-positioned inside a shared timeline lane, left/width computed from each span's started_at / duration_ms relative to trace.started_at and the run's end (or "now" while running). - Time ruler with five ticks (0% → 100%) above the bars; total duration label on the right. - Sub-spans (embedding.batch[i], multimodal.image[i]) collapsed under each stage by default behind a chevron toggle. Click any row to expand an inline detail panel showing ISO timestamps, status, error_code/message when failed, and input/output/metadata JSON blocks plus a "Copy span JSON" action. - Removed the parse_status gate in doc-content: the timeline is now always rendered when a knowledge detail is open, so completed documents also expose their recorded pipeline for audit. The KnowledgeBase hover popover stays compact-mode-only and still gates on parse_status (popover height matters there). - Running bars grow visibly via a 1s ticker (cleared on unmount). - Last-error block restricted to parse_status === failed. - Added knowledgeStages.totalDuration to en-US / zh-CN / ko-KR / ru-RU.