diff --git a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue index 35283f3a..41fbebdd 100644 --- a/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue +++ b/web/hwlab-cloud-web/src/components/workbench/ConversationPanel.vue @@ -299,8 +299,11 @@ function messageActivityMeta(message: ChatMessage): { text: string; label: strin } function messageTimingForDisplay(message: ChatMessage): ChatMessage["timing"] { - if (!isRunningMessage(message)) return message.timing ?? message.runnerTrace?.timing ?? null; - return message.runnerTrace?.timing ?? message.timing ?? null; + // The main message card consumes only the durable message timing projection. + // Trace timing belongs to TraceTimeline/details; letting trace hydration drive the + // card timer makes running turns jump when a later trace snapshot carries an + // older startedAt/lastEventAt window. + return message.timing ?? null; } function terminalMessageDurationMs(message: ChatMessage, timing: ChatMessage["timing"]): number | null {