diff --git a/PROGRESS.md b/PROGRESS.md
index b39a40b0..9905f7f2 100644
--- a/PROGRESS.md
+++ b/PROGRESS.md
@@ -79,3 +79,17 @@
- M7.2: Multi-provider AI normalization (adapter pattern: Claude/OpenRouter/Ollama)
- M7.3: Tauri desktop build scaffold (frameless window, tray, global shortcut)
- M7.4: Offline mode (useOffline.ts, enhanced PWA image/API caching)
+
+### 2026-03-03 (cont.) — overnight/2026-03-03
+**Completed M8 Chat UX Polish (10 tasks)**:
+- M8.1: Message editing & regeneration (pencil icon, re-send clears subsequent)
+- M8.2: Conversation branching (BranchSwitcher.vue, fork from any assistant msg)
+- M8.3: Reply-to threading (quoted excerpt in input, `> quote` prepend)
+- M8.4: Conversation search (Cmd+F glass panel, match nav, jump to message)
+- M8.5: Auto-title generation (background Haiku call after first exchange)
+- M8.6: Context window visualiser (ContextBar.vue, token estimate, orange→red)
+- M8.7: Conversation export (Markdown/JSON/text, File System Access API)
+- M8.8: Import conversations (AIUI JSON + Claude.ai format parser)
+- M8.9: Context menus (ContextMenu.vue + ContextMenuItem.vue, right-click)
+- M8.10: Scroll position memory (Map per conversation, restore on switch)
+- TEST:M8: All 74 tests pass, typecheck + lint clean
diff --git a/loop/plan.md b/loop/plan.md
index dedc417a..f2e69b51 100644
--- a/loop/plan.md
+++ b/loop/plan.md
@@ -5,17 +5,17 @@
## M8: Chat UX Polish
-- [ ] **M8.1** — Message editing & regeneration (pencil icon on hover, re-send clears subsequent messages)
-- [ ] **M8.2** — Conversation branching (fork from any message, branch switcher pill, each branch stored in IDB)
-- [ ] **M8.3** — Reply-to threading (quoted excerpt in input, thread line visual, prepend `> quote` to message)
-- [ ] **M8.4** — Conversation search (`Cmd+F` glass panel, real-time highlight, up/down to jump between matches)
-- [ ] **M8.5** — Auto-title generation (background AI call after first exchange, silently replaces "New Chat")
-- [ ] **M8.6** — Context window visualiser (slim progress bar, token estimate, orange → red > 80%)
-- [ ] **M8.7** — Conversation export (Markdown / JSON / plain text, File System Access API + `` fallback)
-- [ ] **M8.8** — Import conversations (drag-and-drop JSON, AIUI format + Claude.ai export format, merge into IDB)
-- [ ] **M8.9** — Long-press / right-click context menus (messages + content cards, `ContextMenu.vue` glass-card)
-- [ ] **M8.10** — Scroll position memory (restore per conversation ID, works with virtual scroller)
-- [ ] **TEST:M8** — Run `pnpm test` and `pnpm typecheck && pnpm lint`. Fix all failures before proceeding.
+- [x] **M8.1** — Message editing & regeneration (pencil icon on hover, re-send clears subsequent messages)
+- [x] **M8.2** — Conversation branching (fork from any message, branch switcher pill, each branch stored in IDB)
+- [x] **M8.3** — Reply-to threading (quoted excerpt in input, thread line visual, prepend `> quote` to message)
+- [x] **M8.4** — Conversation search (`Cmd+F` glass panel, real-time highlight, up/down to jump between matches)
+- [x] **M8.5** — Auto-title generation (background AI call after first exchange, silently replaces "New Chat")
+- [x] **M8.6** — Context window visualiser (slim progress bar, token estimate, orange → red > 80%)
+- [x] **M8.7** — Conversation export (Markdown / JSON / plain text, File System Access API + `` fallback)
+- [x] **M8.8** — Import conversations (drag-and-drop JSON, AIUI format + Claude.ai export format, merge into IDB)
+- [x] **M8.9** — Long-press / right-click context menus (messages + content cards, `ContextMenu.vue` glass-card)
+- [x] **M8.10** — Scroll position memory (restore per conversation ID, works with virtual scroller)
+- [x] **TEST:M8** — Run `pnpm test` and `pnpm typecheck && pnpm lint`. Fix all failures before proceeding.
## M9: AI Experience