From 1ddd50e4ca1ab9411fb4ed0d89094ea3a69fb977 Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Sun, 25 Oct 2026 08:03:09 -0500 Subject: [PATCH 1/5] fix(web): delete confirmation no longer says history is cleared Deleting a thread marks it deleted and stops its work, but its events and projection rows stay in the database. The confirmation said it "permanently clears conversation history". It now says the thread can't be restored and its history stays in T3 Code's database. Co-Authored-By: Claude Opus 5.5 --- apps/web/src/components/Sidebar.tsx | 4 ++-- apps/web/src/hooks/useThreadActionMenu.ts | 2 +- apps/web/src/hooks/useThreadActions.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index e6f23149dfed..4bdc4703b10f 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -2448,7 +2448,7 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve api.dialogs.confirm( [ `Delete ${count} thread${count === 1 ? "" : "s"}?`, - "This permanently clears conversation history for these threads.", + "These threads can't be restored. Their history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), @@ -2812,7 +2812,7 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve api.dialogs.confirm( [ `Delete thread "${thread.title}"?`, - "This permanently clears conversation history for this thread.", + "The thread can't be restored. Its history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), diff --git a/apps/web/src/hooks/useThreadActionMenu.ts b/apps/web/src/hooks/useThreadActionMenu.ts index cddef6046cf8..ccb26c740f9b 100644 --- a/apps/web/src/hooks/useThreadActionMenu.ts +++ b/apps/web/src/hooks/useThreadActionMenu.ts @@ -327,7 +327,7 @@ export function useThreadActionMenu(input: { api.dialogs.confirm( [ `Delete thread "${thread.title}"?`, - "This permanently clears conversation history for this thread.", + "The thread can't be restored. Its history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), diff --git a/apps/web/src/hooks/useThreadActions.ts b/apps/web/src/hooks/useThreadActions.ts index c41873d59400..0130d9ef8f65 100644 --- a/apps/web/src/hooks/useThreadActions.ts +++ b/apps/web/src/hooks/useThreadActions.ts @@ -922,7 +922,7 @@ export function useThreadActions() { localApi.dialogs.confirm( [ `Delete thread "${title}"?`, - "This permanently clears conversation history for this thread.", + "The thread can't be restored. Its history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), From f7c9740c67609d27b32fdfc1c282d0939623bcb6 Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Sun, 25 Oct 2026 11:05:23 -0500 Subject: [PATCH 2/5] fix(web): delete confirmation says conversation history stays Deleting a thread also removes its terminal history, so "its history stays" overstated what is kept. Name conversation history, and say plainly that a deleted thread can't be restored. Co-Authored-By: Claude Opus 5.5 --- apps/web/src/components/Sidebar.tsx | 4 ++-- apps/web/src/hooks/useThreadActionMenu.ts | 2 +- apps/web/src/hooks/useThreadActions.ts | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/apps/web/src/components/Sidebar.tsx b/apps/web/src/components/Sidebar.tsx index 4bdc4703b10f..4e3b2fb17be0 100644 --- a/apps/web/src/components/Sidebar.tsx +++ b/apps/web/src/components/Sidebar.tsx @@ -2448,7 +2448,7 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve api.dialogs.confirm( [ `Delete ${count} thread${count === 1 ? "" : "s"}?`, - "These threads can't be restored. Their history stays in T3 Code's database.", + "You can't restore them. Their conversation history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), @@ -2812,7 +2812,7 @@ export default function Sidebar({ routeReveal }: { routeReveal: SidebarRouteReve api.dialogs.confirm( [ `Delete thread "${thread.title}"?`, - "The thread can't be restored. Its history stays in T3 Code's database.", + "You can't restore it. Its conversation history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), diff --git a/apps/web/src/hooks/useThreadActionMenu.ts b/apps/web/src/hooks/useThreadActionMenu.ts index ccb26c740f9b..326c4c01055f 100644 --- a/apps/web/src/hooks/useThreadActionMenu.ts +++ b/apps/web/src/hooks/useThreadActionMenu.ts @@ -327,7 +327,7 @@ export function useThreadActionMenu(input: { api.dialogs.confirm( [ `Delete thread "${thread.title}"?`, - "The thread can't be restored. Its history stays in T3 Code's database.", + "You can't restore it. Its conversation history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), diff --git a/apps/web/src/hooks/useThreadActions.ts b/apps/web/src/hooks/useThreadActions.ts index 0130d9ef8f65..6d787f0070bd 100644 --- a/apps/web/src/hooks/useThreadActions.ts +++ b/apps/web/src/hooks/useThreadActions.ts @@ -922,7 +922,7 @@ export function useThreadActions() { localApi.dialogs.confirm( [ `Delete thread "${title}"?`, - "The thread can't be restored. Its history stays in T3 Code's database.", + "You can't restore it. Its conversation history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ), From 512f33733c983b02f1f0d956ef475436cf285d1a Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Sun, 25 Oct 2026 11:29:14 -0500 Subject: [PATCH 3/5] test(web): delete confirmation does not claim history is cleared Co-Authored-By: Claude Opus 5.5 --- apps/web/src/hooks/useThreadActionMenu.test.ts | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/apps/web/src/hooks/useThreadActionMenu.test.ts b/apps/web/src/hooks/useThreadActionMenu.test.ts index 3c8255b04c08..7e13a8554a95 100644 --- a/apps/web/src/hooks/useThreadActionMenu.test.ts +++ b/apps/web/src/hooks/useThreadActionMenu.test.ts @@ -21,6 +21,7 @@ const state = vi.hoisted(() => ({ granted: new Set(), effects: [] as string[], completed: deferred(), + confirmMessages: [] as string[], show: vi.fn< ( items: ReadonlyArray>, @@ -73,7 +74,8 @@ vi.mock("../localApi", () => ({ readLocalApi: () => ({ contextMenu: { show: state.show, close: () => {} }, dialogs: { - confirm: async () => { + confirm: async (message: string) => { + state.confirmMessages.push(message); recordEffect("confirm"); return false; }, @@ -162,6 +164,7 @@ beforeEach(() => { state.granted = new Set(["primary"]); state.effects = []; state.completed = deferred(); + state.confirmMessages = []; state.show.mockReset().mockResolvedValue(null); }); @@ -194,3 +197,15 @@ describe("thread menu permissions", () => { expect(onFind).toHaveBeenCalledExactlyOnceWith(target); }); }); + +describe("thread delete confirmation", () => { + it("does not claim deleting clears the thread's history", async () => { + state.granted.add("secondary"); + state.show.mockResolvedValue("delete"); + createMenu().openMenu(position); + await state.completed.promise; + expect(state.confirmMessages).toHaveLength(1); + expect(state.confirmMessages[0]).not.toMatch(/clears conversation history/); + expect(state.confirmMessages[0]).toMatch(/conversation history stays/); + }); +}); From 08b5c239d8b749dba875491c3fab340c0dce145c Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Sat, 31 Oct 2026 23:38:00 +0000 Subject: [PATCH 4/5] test(web): drop the delete confirmation copy test The test only checked dialog wording, which the testing guide says to leave out of tests. The before/after captures prove the copy change. Co-Authored-By: Claude Opus 5.5 --- apps/web/src/hooks/useThreadActionMenu.test.ts | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/apps/web/src/hooks/useThreadActionMenu.test.ts b/apps/web/src/hooks/useThreadActionMenu.test.ts index 7e13a8554a95..3c8255b04c08 100644 --- a/apps/web/src/hooks/useThreadActionMenu.test.ts +++ b/apps/web/src/hooks/useThreadActionMenu.test.ts @@ -21,7 +21,6 @@ const state = vi.hoisted(() => ({ granted: new Set(), effects: [] as string[], completed: deferred(), - confirmMessages: [] as string[], show: vi.fn< ( items: ReadonlyArray>, @@ -74,8 +73,7 @@ vi.mock("../localApi", () => ({ readLocalApi: () => ({ contextMenu: { show: state.show, close: () => {} }, dialogs: { - confirm: async (message: string) => { - state.confirmMessages.push(message); + confirm: async () => { recordEffect("confirm"); return false; }, @@ -164,7 +162,6 @@ beforeEach(() => { state.granted = new Set(["primary"]); state.effects = []; state.completed = deferred(); - state.confirmMessages = []; state.show.mockReset().mockResolvedValue(null); }); @@ -197,15 +194,3 @@ describe("thread menu permissions", () => { expect(onFind).toHaveBeenCalledExactlyOnceWith(target); }); }); - -describe("thread delete confirmation", () => { - it("does not claim deleting clears the thread's history", async () => { - state.granted.add("secondary"); - state.show.mockResolvedValue("delete"); - createMenu().openMenu(position); - await state.completed.promise; - expect(state.confirmMessages).toHaveLength(1); - expect(state.confirmMessages[0]).not.toMatch(/clears conversation history/); - expect(state.confirmMessages[0]).toMatch(/conversation history stays/); - }); -}); From 7d68fbbf23c5df04f6b40a1a8f6fc482c024ec01 Mon Sep 17 00:00:00 2001 From: Victor Vogel Date: Sat, 31 Oct 2026 23:38:44 +0000 Subject: [PATCH 5/5] fix(web): side chat delete confirmation says history stays Deleting a side chat uses the same soft delete as any thread, so its confirmation made the same false claim that history is cleared. Co-Authored-By: Claude Opus 5.5 --- apps/web/src/components/chat/SideChatPane.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/web/src/components/chat/SideChatPane.tsx b/apps/web/src/components/chat/SideChatPane.tsx index 1a5bd1141b31..699edf9acee1 100644 --- a/apps/web/src/components/chat/SideChatPane.tsx +++ b/apps/web/src/components/chat/SideChatPane.tsx @@ -97,7 +97,7 @@ export default function SideChatPane(props: { api.dialogs.confirm( [ `Delete side chat "${shell.title}"?`, - "This permanently clears its conversation history.", + "You can't restore it. Its conversation history stays in T3 Code's database.", ].join("\n"), { variant: "destructive" }, ),