fix(ui): stabilize task loading and live feeds (#13095)

Coordinate initial conversation reveal, preserve message identity and reading anchors during live updates, and bound transcript reads with recoverable retries. Cover desktop/mobile navigation and rich task loading with actual-route browser tests.

Verified all Linux CI gates, 5,575 local UI tests, eight layout browser scenarios, and recorded native Codex walkthroughs. Greptile: 5/5; all review findings resolved.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
DottaandPaperclip authored and GitHub committed 2026-09-09 10:00:37 -05:00
1 parent 35fdc0c66b
commit cd4c4ed205
32 files changed
+1286 -179

No files matched your search

@@ -134,12 +134,10 @@ function renderItem(
return (
<TaskChatBubble
item={item}
// Human messages are inserted optimistically and later replaced by
// their canonical server IDs. Animating either mount makes the same
// text visibly fade twice during that handoff; user sends should
// paint immediately and remain visually stable.
// Hydration and live-to-durable reconciliation may move a logical
// message between parents. Mounting must never replay a fade.
animateEntry={
item.author !== "human" && !item.attachedTurn?.standaloneHeader
false
}
actions={
item.attachedTurn?.standaloneHeader
@@ -372,7 +370,9 @@ export function TaskChatThreadView({
{streamlined
? renderedItems.map(({ item, content }, index) => (
<div
key={item.id}
key={item.kind === "message" ? item.renderKey ?? item.id : item.id}
data-thread-anchor={item.kind === "message" ? item.renderKey ?? item.id : item.id}
id={item.kind === "message" ? `comment-${item.id}` : undefined}
className={taskChatItemSpacingClass(item, renderedItems[index - 1]?.item ?? null)}
data-thread-item-kind={item.kind === "message" ? item.author : item.kind}
>
@@ -381,7 +381,9 @@ export function TaskChatThreadView({
))
: items.map((item, index) => (
<div
key={item.id}
key={item.kind === "message" ? item.renderKey ?? item.id : item.id}
data-thread-anchor={item.kind === "message" ? item.renderKey ?? item.id : item.id}
id={item.kind === "message" ? `comment-${item.id}` : undefined}
className={cn(
index > 0 &&
item.kind === "interaction" &&