- [x] we should be able to execute commands in visual mode, since some commands may relevant to selections. - [x] diff view: local review UX first, independently of GitHub integration, for reviewing local changes and delivering feedback to coding agents. - add comments at the caret or on selected line ranges on either diff side; compose/edit with normal editor interaction, delete drafts, navigate comments, and open a review overview. - use gutter markers and a focused floating comment editor over the whole diff text workspace, without adding source-side splits or inserting comment text into source rows. - support a review summary and local verdict: Looks good / Changes requested. - save and reopen reviews using local files that coding agents can read; no server or client/server protocol. - anchor comments to immutable revision IDs, paths, sides, and source line ranges, never screen coordinates or mutable file indices. - preserve original anchors and mark comments stale when the reviewed snapshot no longer matches; defer automatic reanchoring. - [ ] diff view: attach local review comments to arbitrary contiguous text ranges, not only containing lines. - preserve exact start/end source positions in grapheme coordinates with an exclusive end, including partial-line and multiline selections on either diff side. - characterwise Visual (`v`) anchors the exact selected text; Visual Line (`V`) anchors whole selected lines; no selection retains current-line behavior. - retain gutter markers for discovery and highlight the exact anchored text when its comment is selected. - preserve immutable snapshot identity and existing stale detection; never silently reanchor comments after source changes. - persist precise ranges in SQLite and JSON import/export; migrate existing line-only anchors without losing comments. - future GitHub publishing may map precise local anchors to supported line ranges without reducing precision in the local review. - [ ] persist local reviews automatically in a local SQLite database using rusqlite; no server, hosted storage, or synchronization. - keep one database under $XDG_DATA_HOME/vamp/reviews/, falling back to ~/.local/share/vamp/reviews/; allow a configurable review_directory. - key reviews by repository identity and persistent review ID, preserving reviews and stale comments across revision changes. - autosave committed comment edits and summaries when dismissing or switching review editors; save verdicts and deletions immediately, using transactions rather than per-keystroke writes. - automatically reopen the repository's sole review; offer a selector when several exist. - retain explicit JSON export/import for sharing with coding agents; export must not redirect subsequent autosaves away from the database. - version the database schema and migrate it safely; use review-version checks to reject conflicting edits from multiple editor instances. - surface write failures and conflicts without discarding drafts or marking unsuccessful saves as persisted. - [ ] diff view: GitHub code review integration after the local review UX is usable. - publish local reviews explicitly: general PR comments, inline line/range comments, review summaries, approval, and requests for changes. - preserve explicit PR identity and reviewed commit IDs; validate anchors against GitHub's PR diff and recheck the PR head before submission. - keep authentication, network requests, publishing, and remote thread synchronization out of the local UX work; treat timed-out writes as unknown outcomes rather than automatically retrying. - define follow-on scope for reading/replying to remote threads, editing/deleting published comments, and resolving threads. - [ ] remove the diff palette polling fallback once a released Herdr fix delivers palette-ready DEC 2031 notifications, including palette-only changes with an unchanged light/dark preference. Related upstream issue: [herdrdev/herdr#4183](https://github.com/herdrdev/herdr/issues/4183). - verify that notification-triggered queries return fresh colors in Ghostty through Herdr before removal; retain startup, focus-regain, and notification-driven palette refresh. - [ ] pull a pr description and display it in a buffer: - open a selector that allows you to pick a pr from remote - selector should be searchable - selected pr description is opened in a separate buffer/tab. - open related pr description directly from diff view (should be able to figure out the relevant pr from the branch involved in the diff - if jj, then from tracked bookmark; if just git, then from branch) - [ ] sandboxed, revision-specific LSP analysis for historical diff states and historical tabs. - current limitation: immutable snapshot buffers still use the live repository as their LSP workspace; cross-file analysis can mix historical text with current disk contents. - lazily materialize the complete selected revision, including unchanged files, manifests, and project configuration; run a separate LSP instance rooted in that snapshot. - mount historical source read-only and provide isolated writable scratch directories for caches, indexes, and build output; keep historical navigation targets read-only. - enforce an OS-level sandbox on the LSP process and every child it spawns, including build scripts and procedural macros. A temporary checkout and read-only editor buffers are not security isolation. - deny access to the live checkout, home directory, credentials, and SSH agent; deny network access by default. Additional access or code-execution permissions require explicit approval. - fail closed: if these restrictions cannot be enforced, keep read-only viewing available but do not launch historical LSP analysis; never silently fall back to an unrestricted process. - retain the snapshot and analysis environment while historical views/tabs reference it; stop workers and clean up disposable storage after the final reference closes.