diff --git a/DESIGN.md b/DESIGN.md
index cf6d712b..50ec028d 100644
--- a/DESIGN.md
+++ b/DESIGN.md
@@ -342,7 +342,15 @@ such detail into a token. New layout spacing must use the scale.
Comment status badges match the same control height.
- Resolved comments collapse to their header by default. A labeled chevron
expands the body and actions; reopening restores the expanded open state.
-- Comment views default to open comments and offer Open, Resolved, and All filters.
+- Comment views default to open comments and offer Open, Resolved, Outdated, and
+ All filters. The Comments panel lists Current comments, then an Outdated section
+ for comments whose code changed or left the diff. Outdated comments carry an
+ "Outdated" badge, a muted placement note, and their original code; they stay
+ out of code lines and render in the file's lineNumber 0 slot. File headers and
+ the file tree show muted outdated counts beside accent current counts. A
+ snapshot-notice-style banner points to open outdated comments. "Keep open"
+ moves an outdated comment to its file on the latest snapshot, still labeled
+ outdated.
Export uses one primary `Copy review` action plus a menu for broader scopes.
- Keep `Save comment` enabled when idle; empty submission focuses the labeled
editor and shows an inline error. Disable it while saving. Deleting a saved
diff --git a/README.md b/README.md
index c79c107f..b35ae5c2 100644
--- a/README.md
+++ b/README.md
@@ -275,8 +275,11 @@ agent-ready XML.
Observations are immutable. New content creates another observation; matching
submissions associate new provenance with an existing review without changing
-its captured diff. Comments and reviewed marks are
-stored in SQLite. Display preferences remain in the browser.
+its captured diff. Comments and reviewed marks belong to the checkout's stream
+(or one piped capture) and are stored in SQLite: later snapshots re-anchor
+comments to moved code, flag outdated ones, and keep marks on files whose patch
+is unchanged. Deleting one snapshot keeps them; they end with the stream's last
+snapshot. Display preferences remain in the browser.
## Piped diffs
@@ -327,7 +330,7 @@ WebMCP while the page is open; see [docs/webmcp.md](docs/webmcp.md).
Local data lives in `$XDG_STATE_HOME/diffx/state.db`, or
`~/.local/state/diffx/state.db`. `--state memory` disables persistence.
-Current schema 10 state persists across restarts. Older, newer or unrecognized
+Current schema 11 state persists across restarts. Older, newer or unrecognized
databases are refused without an automatic reset. To start fresh, stop the
server, back up its state directory, and explicitly choose a new database path.
Legacy commands and pending producer payloads are retired.
diff --git a/apps/web/src/App.tsx b/apps/web/src/App.tsx
index ec3cc157..32135182 100644
--- a/apps/web/src/App.tsx
+++ b/apps/web/src/App.tsx
@@ -1,4 +1,5 @@
import { useReviewState } from "./app-state.tsx";
+import { OutdatedCommentsNotice } from "./CommentsPanel.tsx";
import { DiffWorkspace } from "./DiffWorkspace.tsx";
import { FileExplorerNav, SidebarResizer } from "./FileExplorerNav.tsx";
import { Header } from "./Header.tsx";
@@ -14,6 +15,7 @@ export function App() {