Add project documentation adapted from gerbil-emacs

ober

fdf49193f788b3b5ecf7ab1e20474a8839a52d75

diff --git a/README.md b/README.md
index e6f9e05..0ca0798 100644
--- a/README.md
+++ b/README.md
@@ -188,3 +188,12 @@ The Gerbil form `(with-output-to-string "" thunk)` is not valid in Chez.
 | `GHERKIN` | `~/mine/gherkin/src` | gherkin library path |
 
 Override on the command line: `make SCHEME=/usr/local/bin/chez build`
+
+## Documentation
+
+| Document | Description |
+|----------|-------------|
+| [docs/jemacs-vs-emacs.md](docs/jemacs-vs-emacs.md) | Feature comparison with GNU Emacs (48 categories, 2168+ commands) |
+| [docs/helm.md](docs/helm.md) | Helm narrowing framework — architecture, matching engine, sources |
+| [docs/shell.md](docs/shell.md) | Shell integration plan — jsh POSIX shell embedding |
+| [docs/repl-server.md](docs/repl-server.md) | TCP debug REPL server for live introspection |
diff --git a/docs/helm.md b/docs/helm.md
new file mode 100644
index 0000000..ebe5c28
--- /dev/null
+++ b/docs/helm.md
@@ -0,0 +1,493 @@
+# Helm for Jemacs — Implementation Plan
+
+## Overview
+
+Port the core Emacs Helm experience to Jemacs: an incremental narrowing framework with multi-source composition, rich action system, and live preview. This replaces the current minibuffer Tab-cycling completion with a full candidate-list UI.
+
+## Current State — COMPLETE ✅
+
+All planned features have been implemented.
+
+### What's implemented ✅
+
+- **Core framework** (`helm.ss`): `helm-source`, `helm-session`, `helm-candidate` structs; multi-match engine; filtering + scoring; session management; action dispatch; match position highlighting; `*helm-current-pattern*` for volatile sources
+- **Multi-match engine**: Space-separated AND tokens, `!` negation, `^` prefix matching, fuzzy mode per-source
+- **TUI renderer** (`helm-tui.ss`): Candidate list in auto-resizing bottom rows (4–12), C-n/C-p/C-v/M-v navigation, RET/C-g/C-j, typing updates pattern, follow mode (C-c C-f), action menu (TAB), M-a mark-all, match character highlighting (yellow), styled source headers
+- **Qt renderer** (`qt/helm-qt.ss`): Narrowing-based candidate panel, same navigation keys, echo-area integration
+- **16 commands** registered in both TUI and Qt: helm-M-x, helm-mini, helm-buffers-list, helm-find-files, helm-occur, helm-imenu, helm-show-kill-ring, helm-bookmarks, helm-mark-ring, helm-register, helm-apropos, helm-grep, helm-man, helm-resume, helm-mode, toggle-helm-mode
+- **14 built-in sources** (`helm-sources.ss`): commands, buffers, recent-files, buffer-not-found (create), files, occur, imenu, kill-ring, bookmarks, mark-ring, registers, apropos, grep, man
+- **Follow mode**: Toggle with C-c C-f; auto-runs persistent action on C-n/C-p; per-source `follow?` flag; initialized from source's follow? field
+- **Action menu**: TAB shows numbered action list from current source; pick by number or RET for default; C-g to cancel; executes on marked candidates if any
+- **Candidate highlighting**: Matched characters shown in yellow (#xffcc00); brighter when selected; works for substring, prefix, and fuzzy matches
+- **Auto-resize**: Helm window grows/shrinks between 4–12 rows based on candidate count + source headers
+- **Source headers**: Styled separator lines with `─── Source Name ───` format, distinct background color
+- **helm-grep**: Volatile source using `rg` (fallback `grep`); helm pattern becomes the search query (≥3 chars); results as `file:line:content`
+- **helm-man**: Cached `man -k` results (up to 2000 entries); fuzzy filtering
+- **helm-find-files (Qt)**: Full helm file browser using helm-source-files (no longer delegates to find-file)
+- **Session resume**: `helm-resume` restores last session with pattern and candidates
+- **Helm-mode toggle**: Rebinds M-x, C-x b, C-x C-b, M-y, C-x r b to helm equivalents
+- **Functional tests**: 37 checks in TUI (`functional-test.ss`), 9 checks in Qt (`qt-functional-test.ss`)
+
+---
+
+## Architecture
+
+### New Files
+
+| File | Purpose | Lines (est.) |
+|------|---------|-------------|
+| `helm.ss` | Core framework: sources, matching, actions, session state | ~600 |
+| `helm-tui.ss` | TUI renderer: candidate list in terminal rows | ~400 |
+| `qt/helm-qt.ss` | Qt renderer: QListWidget or custom painting in a panel | ~500 |
+| `helm-sources.ss` | Built-in sources: buffers, recentf, commands, files, imenu, bookmarks, kill-ring, marks | ~800 |
+| `helm-commands.ss` | TUI `cmd-helm-*` command functions | ~500 |
+| `qt/helm-commands.ss` | Qt `cmd-helm-*` command functions | ~500 |
+
+### Core Data Model (`helm.ss`)
+
+```
+helm-source
+  name          : string          ; display header
+  candidates    : (-> list)       ; thunk producing candidates
+  match-fn      : (-> string candidate bool)  ; custom match (default: multi-match)
+  filter-fn     : (-> string list list)       ; custom filter+sort
+  actions       : alist           ; ((label . procedure) ...)
+  persistent-action : (or procedure #f)       ; C-j preview
+  display-fn    : (or (-> candidate string) #f)  ; custom display
+  real-fn       : (or (-> candidate any) #f)     ; display->real for actions
+  fuzzy?        : bool            ; enable fuzzy matching
+  volatile?     : bool            ; rebuild candidates on every pattern change
+  candidate-limit : integer       ; max candidates (default 100)
+  keymap        : (or keymap #f)  ; source-local keymap override
+
+helm-session
+  sources       : list            ; active helm-source objects
+  pattern       : string          ; current input
+  candidates    : vector          ; filtered candidates (with source tags)
+  selected      : integer         ; cursor index
+  marked        : set             ; marked candidate indices
+  buffer-name   : string          ; for resume
+  actions       : alist           ; current action list (from selected source)
+  scroll-offset : integer         ; visible window start
+  follow?       : bool            ; auto-preview on navigate
+  alive?        : bool            ; session running
+
+helm-candidate
+  display       : string          ; what the user sees
+  real          : any             ; what actions receive
+  source        : helm-source     ; which source produced this
+```
+
+### Matching Engine
+
+The default matching mode is **multi-match**: space-separated tokens, all must match (AND logic).
+
+```
+Pattern         Behavior
+─────────────────────────────────────────────
+"foo bar"       AND: both "foo" and "bar" must match
+"!test"         NOT: exclude candidates matching "test"
+"^init"         PREFIX: must start with "init"
+"foo !test ^s"  Combined: starts with "s", contains "foo", excludes "test"
+```
+
+When `fuzzy?` is `#t` on a source, each token uses `fuzzy-match?` instead of substring.
+
+Implementation: extend `fuzzy-filter-sort` in `core.ss` with `helm-multi-match` that parses tokens and applies the matching rules.
+
+### Action System
+
+```
+RET       Execute default action (first in alist) on selected/marked candidates
+TAB       Show action menu in minibuffer — pick an alternative action
+C-j       Execute persistent-action (preview) — session stays open
+C-SPC     Mark/unmark candidate
+M-a       Mark all visible
+C-g       Quit — restore original state
+```
+
+### Session Lifecycle
+
+1. `helm-run` called with sources, buffer-name, optional initial-input
+2. Candidates computed for each source
+3. Filtered by pattern; grouped by source with headers
+4. Rendered in candidate list UI (TUI: terminal rows; Qt: widget panel)
+5. User types → pattern updates → re-filter → re-render (debounced)
+6. Navigation: C-n/C-p move cursor; C-v/M-v page; C-o next source
+7. On RET: run default action on selected (or all marked); close session
+8. On C-j: run persistent-action; keep session open
+9. On C-g: abort; cleanup
+10. Session stored in `*helm-sessions*` for `helm-resume`
+
+### Rendering
+
+#### TUI (`helm-tui.ss`)
+
+Use the bottom N rows of the terminal (configurable, default: 10). Layout:
+
+```
+──────────────────────────────────────
+ Buffers:                              ← source header
+ > *scratch*                           ← selected (highlighted)
+   main.ss
+   core.ss
+ Recent Files:                         ← source header
+   ~/notes.org
+   ~/.jemacs-init
+──────────────────────────────────────
+ Pattern: scr  [2/47]                  ← minibuffer + count
+```
+
+Rendering uses `tui-print!` at absolute row positions. The editor viewport shrinks by N rows during a helm session.
+
+#### Qt (`qt/helm-qt.ss`)
+
+Use a QListWidget (or custom-painted QWidget) docked below the editor area, above the echo line. Source headers are non-selectable list items with distinct styling. Selected candidate highlighted with cursor color.
+
+Layout mirrors TUI but uses Qt stylesheets for coloring and font.
+
+---
+
+## Implementation Phases
+
+### Phase 1: Core Framework + M-x (MVP) ✅ DONE
+
+**Goal**: Replace M-x with a helm-style candidate list. This validates the entire rendering pipeline.
+
+#### 1.1 Core data model (`helm.ss`) ✅
+
+- Define `helm-source`, `helm-session`, `helm-candidate` structs
+- `helm-multi-match`: parse space-separated tokens with `!`/`^` prefixes
+- `helm-filter`: apply match to candidates, score, sort, limit
+- `helm-run`: main entry point — create session, invoke renderer, handle result
+- `helm-resume`: restore last session
+
+#### 1.2 TUI renderer (`helm-tui.ss`) ✅
+
+- `helm-tui-render!`: draw candidate list in bottom rows
+- `helm-tui-input-loop!`: key handling (C-n, C-p, C-v, M-v, RET, C-g, C-j, TAB, C-SPC, typing)
+- `helm-tui-resize!`: adjust editor viewport when helm opens/closes
+- Input debouncing: re-filter after short delay (or on every keystroke if fast enough)
+
+#### 1.3 Qt renderer (`qt/helm-qt.ss`) ✅
+
+- `helm-qt-render!`: draw candidate list in a QWidget panel
+- `helm-qt-input-loop!`: key handling via Qt event filter
+- `helm-qt-resize!`: adjust splitter/layout when helm opens/closes
+
+#### 1.4 helm-M-x ✅
+
+- Source: `helm-source-commands` — candidates from `*all-commands*` hash, MRU ordered
+- Display: command name + key binding (if any)
+- Action: `execute-command!`
+- Persistent action: show command docstring in echo area
+- Register as `helm-M-x` command; optionally bind to `M-x` when helm-mode is on
+
+### Phase 2: Buffers + Recent Files + Mini ✅ DONE
+
+**Goal**: The quintessential Helm experience — multiple sources in one session.
+
+#### 2.1 Buffer source ✅
+
+- `helm-source-buffers`: candidates from `*buffer-list*` in MRU order
+- Display: buffer name + modified indicator + mode + file path
+- Filters: `*mode` (major mode), `@text` (buffer content search), `/path` (directory), `!exclude`
+- Actions: switch-to-buffer (default), kill-buffer, save-buffer, diff
+- Persistent action: show buffer in other window (preview)
+
+#### 2.2 Recent files source ✅
+
+- `helm-source-recentf`: candidates from `*recent-files*`
+- Display: abbreviated file path
+- Actions: find-file (default), find-file-other-window
+- Persistent action: preview file content
+
+#### 2.3 Create buffer source ✅
+
+- `helm-source-buffer-not-found`: dummy source — user input becomes a new buffer name
+- Action: echoes creation intent; when no candidates match, RET returns pattern text for create-buffer handling
+
+#### 2.4 Compose ✅
+
+- `helm-mini`: combines buffers + recentf + create-buffer
+- `helm-buffers-list`: buffers source only (replaces current stub)
+
+### Phase 3: File Navigation ✅ DONE
+
+**Goal**: Replace `find-file` with a helm-style file browser.
+
+#### 3.1 File source ✅
+
+- `helm-source-files`: candidates from directory listing
+- Display: filename (dirs with trailing `/`)
+- Navigation: C-j descends into directory, C-l / DEL ascends to parent
+- Fuzzy matching on filenames
+- Tilde expansion, environment variables
+- Wildcard support: `*.ss` glob filtering
+- Actions: find-file (default), find-file-other-window, dired
+- Persistent action: preview file content (first N lines in echo or split)
+
+#### 3.2 Integration ✅
+
+- `helm-find-files`: entry point with initial directory from current buffer (TUI and Qt)
+- Bind to `C-x C-f` when helm-mode is on
+
+### Phase 4: Search Commands ✅ DONE
+
+**Goal**: Interactive search and navigation within and across buffers.
+
+#### 4.1 helm-occur ✅
+
+- `helm-source-occur`: candidates = lines of current buffer, numbered
+- Live narrowing: re-filter lines as you type
+- Actions: goto-line (default), save-occur-buffer
+- Persistent action: jump to line without closing
+- Follow mode natural here — navigate lines, see cursor move in buffer
+
+#### 4.2 helm-imenu ✅
+
+- `helm-source-imenu`: candidates = definitions in current buffer (functions, variables, classes)
+- Parse via existing highlighting/definition infrastructure or simple regex
+- Display: symbol name + kind tag (`[fn]`, `[var]`, `[struct]`)
+- Actions: goto-definition (default)
+- Persistent action: jump to definition without closing
+
+#### 4.3 helm-grep ✅
+
+- `helm-source-grep`: volatile source — runs `rg` (fallback `grep`) as subprocess
+- Pattern typed in helm becomes the grep pattern via `*helm-current-pattern*`
+- Candidates rebuild on every pattern change (volatile source, ≥3 chars)
+- Display: `file:line: content`
+- Actions: open-file-at-line (default)
+- Uses synchronous `open-process` + `read-line` (fast enough with `--max-count=200`)
+
+### Phase 5: Utility Commands ✅ DONE
+
+**Goal**: Common Emacs Helm commands for daily use.
+
+#### 5.1 helm-show-kill-ring ✅
+
+- `helm-source-kill-ring`: candidates from kill ring
+- Display: truncated text with line count indicator
+- Actions: insert-at-point (default), append-to-kill-ring
+- Multi-line candidate display for readability
+
+#### 5.2 helm-bookmarks ✅
+
+- `helm-source-bookmarks`: candidates from `*bookmarks*` hash
+- Display: bookmark name + file path + position
+- Actions: jump (default), delete-bookmark, rename-bookmark
+
+#### 5.3 helm-mark-ring ✅
+
+- `helm-source-mark-ring`: candidates from buffer mark ring and global mark ring
+- Display: line content at mark position
+- Actions: jump-to-mark (default)
+- Persistent action: show mark position
+
+#### 5.4 helm-register ✅
+
+- `helm-source-registers`: candidates from register hash
+- Display: register char + content preview
+- Actions: insert (default), jump (for position registers)
+
+#### 5.5 helm-apropos ✅
+
+- Combines: command source + variable source + function source
+- Multi-source: all matching symbols across categories
+- Actions: describe (default), execute (commands), set (variables)
+
+#### 5.6 helm-man ✅
+
+- `helm-source-man`: candidates from cached `man -k .` output (up to 2000 entries)
+- Fuzzy filtering on man page names
+- Actions: open man page (default) — parses "name (section)" format
+
+### Phase 6: Follow Mode + Resume + Polish ✅ DONE
+
+**Goal**: Advanced Helm features that complete the experience.
+
+#### 6.1 Follow mode ✅
+
+- Toggle with `C-c C-f` during any helm session
+- When on: persistent-action fires automatically on C-n/C-p navigation
+- Configurable delay (`*helm-follow-delay*`) to avoid thrashing
+- Per-source `follow?` slot; session inherits from source
+
+#### 6.2 helm-resume ✅
+
+- Store sessions in `*helm-sessions*` alist (buffer-name → session snapshot)
+- `helm-resume`: reopen last session with pattern and cursor position intact
+- `C-c n` during session: cycle through resumable sessions
+- Limit stored sessions (default: 10)
+
+#### 6.3 Polish ✅
+
+- Candidate highlighting: matched characters shown in yellow (#xffcc00), brighter when selected
+- Source headers: styled `─── Source Name ───` separators with distinct background color
+- Candidate count in prompt: `[3/47]`
+- Auto-resize: helm window grows/shrinks between 4–12 rows based on candidate + source count
+- Mode-line integration: `*helm-mode*` flag in core.ss
+- Filtering on every keystroke (fast for sync sources; volatile sources rebuild on pattern change)
+
+---
+
+## Key Bindings
+
+When `helm-mode` is active, these bindings override defaults:
+
+| Binding | Command | Replaces |
+|---------|---------|----------|
+| `M-x` | `helm-M-x` | `execute-extended-command` |
+| `C-x b` | `helm-mini` | `switch-buffer` |
+| `C-x C-f` | `helm-find-files` | `find-file` |
+| `C-x C-b` | `helm-buffers-list` | `list-buffers` |
+| `M-y` | `helm-show-kill-ring` | `yank-pop` |
+| `C-x r b` | `helm-bookmarks` | `bookmark-jump` |
+| `C-c h o` | `helm-occur` | — |
+| `C-c h i` | `helm-imenu` | `imenu` |
+| `C-c h a` | `helm-apropos` | `apropos-command` |
+| `C-c h g` | `helm-grep` | `grep` |
+| `C-c h m` | `helm-man` | `man` |
+| `C-c h b` | `helm-resume` | — |
+| `C-c h SPC` | `helm-mark-ring` | — |
+| `C-c h r` | `helm-register` | — |
+
+### Inside a Helm Session
+
+| Key | Action |
+|-----|--------|
+| `C-n` / `<down>` | Next candidate |
+| `C-p` / `<up>` | Previous candidate |
+| `C-v` / `<next>` | Page down |
+| `M-v` / `<prior>` | Page up |
+| `M-<` | First candidate |
+| `M->` | Last candidate |
+| `C-o` | Next source |
+| `RET` | Default action + close |
+| `C-j` | Persistent action (keep open) |
+| `TAB` | Action menu |
+| `C-SPC` | Mark/unmark candidate |
+| `M-a` | Mark all |
+| `C-g` | Quit |
+| `C-c C-f` | Toggle follow mode |
+
+---
+
+## Feature Parity: TUI and Qt
+
+Per project rules, every helm feature must work in both TUI and Qt. The architecture achieves this through:
+
+1. **Shared core** (`helm.ss`): All data model, matching, filtering, session management, action dispatch
+2. **Renderer interface**: TUI and Qt each implement `helm-render!`, `helm-input-loop!`, `helm-resize!`
+3. **Shared sources** (`helm-sources.ss`): Source definitions are backend-agnostic; they reference `*buffer-list*`, `*recent-files*`, `*all-commands*` etc. from `core.ss`
+4. **Separate command files**: `helm-commands.ss` (TUI) and `qt/helm-commands.ss` (Qt) wire sources to their respective renderers
+
+---
+
+## Dependencies on Existing Code
+
+| Existing module | What helm uses |
+|----------------|----------------|
+| `core.ss` | `fuzzy-match?`, `fuzzy-score`, `*all-commands*`, `*buffer-list*`, `buffer-by-name`, `execute-command!`, `keymap-*`, `echo-state` |
+| `echo.ss` / `qt/echo.ss` | Echo area for messages during helm (e.g. action descriptions) |
+| `persist.ss` | `*recent-files*`, `*bookmarks*`, `*kill-ring*`, `*mark-ring*` |
+| `editor-core.ss` / `qt/commands-core.ss` | Existing buffer/file operations called by helm actions |
+| `highlight.ss` | Definition parsing for imenu source |
+
+---
+
+## Estimated Effort by Phase
+
+| Phase | What | New LOC | Complexity |
+|-------|------|---------|-----------|
+| 1 | Core + M-x | ~1500 | High (framework + two renderers) |
+| 2 | Buffers + Recentf + Mini | ~400 | Medium |
+| 3 | Find-files | ~500 | Medium-High (directory navigation state) |
+| 4 | Occur + Imenu + Grep | ~600 | Medium-High (grep needs async) |
+| 5 | Kill-ring, Bookmarks, Marks, Registers, Apropos, Man | ~500 | Low-Medium |
+| 6 | Follow + Resume + Polish | ~300 | Medium |
+| **Total** | | **~3800** | |
+
+---
+
+## Design Decisions
+
+### 1. Rendering approach
+
+**TUI**: Reserve bottom N terminal rows. The editor viewport (`tui-draw!`) must account for reduced height. This is the simplest approach — no popup windows, no separate buffer.
+
+**Qt**: Insert a QWidget (QListWidget or custom) between the editor area and the echo line. Use a QVBoxLayout with show/hide. This avoids creating separate windows.
+
+### 2. Input handling
+
+Helm takes over the keyboard during a session. Both TUI and Qt must intercept all keystrokes and route them through the helm keymap before falling through to normal editing. The helm session runs a modal input loop that blocks normal editing until completion.
+
+### 3. Async sources
+
+For grep/locate/find, use Chez Scheme's `open-process` + green threads. A reader thread populates candidates incrementally; the renderer polls for new candidates on a timer. This avoids blocking the UI.
+
+### 4. Candidate storage
+
+For sync sources: plain list filtered on each keystroke (fast for <10K candidates).
+For in-buffer sources: string buffer with line-based search (for very large candidate sets like locate results).
+For async sources: growing list appended by reader thread.
+
+### 5. Multi-match as default
+
+Unlike Emacs Helm where multi-match is opt-out, here it's always on. Space separates AND tokens. This is the most useful default. Fuzzy matching is opt-in per source.
+
+### 6. No helm-mode complexity
+
+Rather than a full `helm-mode` that overrides all completion, implement individual `helm-*` commands that can be bound to keys. The `helm-mode` toggle simply rebinds the standard keys to their helm equivalents. This is simpler and less error-prone.
+
+---
+
+## Testing Strategy
+
+### Unit tests (in `emacs-test.ss`)
+
+- `helm-multi-match` parsing and matching logic
+- `helm-filter` with various patterns and source types
+- Source candidate generation (buffers, commands, files)
+- Action dispatch (default, persistent, marked)
+- Session create/resume lifecycle
+
+### Functional tests (in `functional-test.ss` and `qt-functional-test.ss`)
+
+Per CLAUDE.md rules, all tests go through `execute-command!`:
+
+```scheme
+;; Test helm-M-x dispatches correctly
+(set! *test-helm-responses* '("switch-buffer"))
+(execute-command! app 'helm-M-x)
+;; Verify the command was executed
+
+;; Test helm-mini with buffer switching
+(set! *test-helm-responses* '("*scratch*"))
+(execute-command! app 'helm-mini)
+;; Verify buffer switched
+```
+
+### Manual testing
+
+- Verify rendering in both TUI (terminal) and Qt (window)
+- Test with large candidate sets (1000+ commands, 100+ buffers)
+- Test async grep with large codebases
+- Test follow mode responsiveness
+
+---
+
+## Out of Scope (Future Work)
+
+These Helm features are not included in this plan but could be added later:
+
+- **helm-find-files file operations**: Copy, rename, delete, symlink from the file browser
+- **helm-top**: Process management UI
+- **helm-google-suggest**: Web search integration
+- **helm-colors / helm-ucs**: Color/unicode pickers
+- **Childframe display**: Floating popup frame (Qt could do this with QDialog)
+- **helm-org**: Org-specific navigation (headings, agenda)
+- **Async candidate highlighting**: Highlighting match chars in async sources in real-time
+- **helm-descbinds**: Searchable key binding reference
+- **Project-wide sources**: helm-projectile equivalent (project files, project buffers)
diff --git a/docs/jemacs-vs-emacs.md b/docs/jemacs-vs-emacs.md
new file mode 100644
index 0000000..d8569e7
--- /dev/null
+++ b/docs/jemacs-vs-emacs.md
@@ -0,0 +1,1274 @@
+# Jemacs vs GNU Emacs — Feature Comparison
+
+> **Last updated:** 2026-03-10
+> **Jemacs version:** master (262cd55)
+> **Compared against:** GNU Emacs 29.x / 30.x feature set
+> **Command parity:** 2168+ commands registered in both TUI and Qt layers (zero gap)
+
+## Status Legend
+
+| Symbol              | Meaning                                                              |
+|---------------------|----------------------------------------------------------------------|
+| :white_check_mark:  | **Full** — Feature-complete, comparable to Emacs                     |
+| :large_blue_circle: | **Substantial** — Most functionality works, some gaps                |
+| :yellow_circle:     | **Partial** — Core works, significant gaps remain                    |
+| :orange_circle:     | **Minimal** — Basic scaffolding, limited use                         |
+| :red_circle:        | **Stub/Missing** — Registered but non-functional, or absent entirely |
+
+---
+
+## Table of Contents
+
+1. [Core Editing](#1-core-editing)
+2. [Navigation](#2-navigation)
+3. [Search & Replace](#3-search--replace)
+4. [Kill, Yank & Clipboard](#4-kill-yank--clipboard)
+5. [Undo System](#5-undo-system)
+6. [Marks & Regions](#6-marks--regions)
+7. [Registers & Bookmarks](#7-registers--bookmarks)
+8. [Rectangle Operations](#8-rectangle-operations)
+9. [Keyboard Macros](#9-keyboard-macros)
+10. [Minibuffer & Completion](#10-minibuffer--completion)
+11. [Buffer Management](#11-buffer-management)
+12. [Window Management](#12-window-management)
+13. [Frame / Display Management](#13-frame--display-management)
+14. [File Operations](#14-file-operations)
+15. [Dired (Directory Editor)](#15-dired-directory-editor)
+16. [Version Control / Magit](#16-version-control--magit)
+17. [Org-mode](#17-org-mode)
+18. [Programming Support](#18-programming-support)
+19. [LSP (Language Server Protocol)](#19-lsp-language-server-protocol)
+20. [Syntax Highlighting & Themes](#20-syntax-highlighting--themes)
+21. [Completion Frameworks](#21-completion-frameworks)
+22. [Shell & Terminal](#22-shell--terminal)
+23. [Spell Checking](#23-spell-checking)
+24. [Text Transformation & Formatting](#24-text-transformation--formatting)
+25. [S-expression / Paredit](#25-s-expression--paredit)
+26. [Diff & Ediff](#26-diff--ediff)
+27. [Project Management](#27-project-management)
+28. [Help System](#28-help-system)
+29. [Customization & Configuration](#29-customization--configuration)
+30. [Package Management & Extensibility](#30-package-management--extensibility)
+31. [Remote Editing (TRAMP)](#31-remote-editing-tramp)
+32. [EWW (Web Browser)](#32-eww-web-browser)
+33. [Calendar & Diary](#33-calendar--diary)
+34. [Email (Gnus / mu4e / notmuch)](#34-email)
+35. [IRC / Chat](#35-irc--chat)
+36. [PDF / Document Viewing](#36-pdf--document-viewing)
+37. [Treemacs / File Tree](#37-treemacs--file-tree)
+38. [Multiple Cursors / iedit](#38-multiple-cursors--iedit)
+39. [Snippets (YASnippet)](#39-snippets-yasnippet)
+40. [Tab Bar & Workspaces](#40-tab-bar--workspaces)
+41. [Accessibility](#41-accessibility)
+42. [Performance & Large Files](#42-performance--large-files)
+43. [AI / LLM Integration](#43-ai--llm-integration)
+44. [Multi-Terminal (vterm)](#44-multi-terminal-vterm)
+45. [Key Input Remapping](#45-key-input-remapping)
+46. [DevOps / Infrastructure Modes](#46-devops--infrastructure-modes)
+47. [Helm / Narrowing Framework](#47-helm--narrowing-framework)
+48. [Personal Workflow Gap Analysis](#personal-workflow-gap-analysis)
+
+---
+
+## 1. Core Editing
+
+| Feature                        | Status              | Notes                                           |
+|--------------------------------|---------------------|-------------------------------------------------|
+| Self-insert characters         | :white_check_mark:  | Full Unicode support via Scintilla              |
+| Delete / Backspace             | :white_check_mark:  | `C-d`, `DEL`, `C-h`                             |
+| Kill line (`C-k`)              | :white_check_mark:  | Kill to EOL, empty line kills newline           |
+| Open line (`C-o`)              | :white_check_mark:  |                                                 |
+| Newline & indent (`C-j`)       | :white_check_mark:  |                                                 |
+| Transpose chars (`C-t`)        | :white_check_mark:  |                                                 |
+| Transpose words (`M-t`)        | :white_check_mark:  |                                                 |
+| Transpose lines (`C-x C-t`)    | :white_check_mark:  |                                                 |
+| Transpose sexps                | :white_check_mark:  |                                                 |
+| Join line (`M-j` / `M-^`)      | :white_check_mark:  |                                                 |
+| Quoted insert (`C-q`)          | :white_check_mark:  |                                                 |
+| Overwrite mode                 | :white_check_mark:  | Toggle via `<insert>`                           |
+| Auto-fill mode                 | :white_check_mark:  | Automatic line wrapping at fill-column          |
+| Electric pair mode             | :large_blue_circle: | Auto-pairing brackets/quotes, toggleable        |
+| Indent line / region           | :white_check_mark:  | TAB dispatches: indent, complete, or org-expand |
+| Aggressive indent mode         | :white_check_mark:  | Auto-reindent on closing delimiters and newlines |
+| Universal argument (`C-u`)     | :white_check_mark:  | Numeric prefix for repeat/modify commands       |
+| Digit arguments (`M-0`..`M-9`) | :white_check_mark:  |                                                 |
+| Negative argument (`M--`)      | :white_check_mark:  |                                                 |
+| Repeat (`C-x z`)               | :white_check_mark:  |                                                 |
+| Repeat-mode (transient maps)   | :large_blue_circle: | 6 maps: window, buffer, error, undo, page, resize |
+
+**Summary:** Core editing is feature-complete. All standard Emacs editing primitives work.
+
+---
+
+## 2. Navigation
+
+| Feature                     | Status              | Notes                                        |
+|-----------------------------|---------------------|----------------------------------------------|
+| Char/word/line movement     | :white_check_mark:  | `C-f/b/n/p`, `M-f/b`, arrows                 |
+| Beginning/end of line       | :white_check_mark:  | `C-a/e`, `Home/End`                          |
+| Beginning/end of buffer     | :white_check_mark:  | `M-<`, `M->`                                 |
+| Page up/down                | :white_check_mark:  | `C-v`, `M-v`, PgUp/PgDn                      |
+| Scroll other window         | :white_check_mark:  | `M-g v`, `M-g V`                             |
+| Recenter (`C-l`)            | :white_check_mark:  | Cycles top/center/bottom                     |
+| Goto line (`M-g g`)         | :white_check_mark:  |                                              |
+| Goto char (`M-g c`)         | :white_check_mark:  |                                              |
+| Goto column                 | :white_check_mark:  |                                              |
+| Goto matching paren         | :white_check_mark:  | `M-g m`                                      |
+| Goto percent                | :white_check_mark:  | `M-g %` — jump to N% of buffer               |
+| Forward/backward sentence   | :white_check_mark:  | `M-a`, `M-e`                                 |
+| Forward/backward paragraph  | :white_check_mark:  | `M-{`, `M-}`                                 |
+| Forward/backward sexp       | :white_check_mark:  | `M-g f/b`                                    |
+| Back to indentation (`M-m`) | :white_check_mark:  |                                              |
+| Imenu symbol navigation     | :large_blue_circle: | Works for many languages, no sidebar         |
+| Which-function-mode         | :large_blue_circle: | Multi-language: Scheme, Python, C, Go, Rust, JS/TS |
+| Avy jump (char/line/word)   | :large_blue_circle: | `avy-goto-char`, `avy-goto-line`             |
+| Xref go-to-definition       | :large_blue_circle: | Works via grep fallback; LSP backend partial |
+| Xref find references        | :large_blue_circle: | Grep-based                                   |
+| Next/previous error         | :white_check_mark:  | `M-g n/p` navigates compilation errors       |
+| Ace-window                  | :large_blue_circle: | Jump to window by label                      |
+| Pop mark / mark ring        | :large_blue_circle: | Mark stack navigation                        |
+
+**Summary:** Navigation is comprehensive. All standard movement commands plus extras like avy and ace-window.
+
+---
+
+## 3. Search & Replace
+
+| Feature                       | Status             | Notes                                      |
+|-------------------------------|--------------------|--------------------------------------------|
+| Isearch forward/backward      | :white_check_mark: | `C-s`, `C-r` with wrap-around              |
+| Isearch regexp                | :white_check_mark: | `C-M-s`                                    |
+| Query replace                 | :white_check_mark: | `M-%` with y/n/!/q responses               |
+| Query replace regexp          | :white_check_mark: | `C-M-%`                                    |
+| Replace all (non-interactive) | :white_check_mark: |                                            |
+| Occur                         | :white_check_mark: | `M-s o` — results buffer with line numbers |
+| Multi-file occur              | :white_check_mark: |                                            |
+| Grep (project-wide)           | :white_check_mark: | `rgrep`, `project-grep`, `counsel-grep`    |
+| Grep results buffer           | :white_check_mark: | With next/prev error navigation            |
+| Wgrep (edit grep results)     | :white_check_mark: | Edit matches in-place, save back to files  |
+| Keep/flush lines              | :white_check_mark: | `M-s k`, `M-s f`                           |
+| Count matches                 | :white_check_mark: | `M-s c`                                    |
+| Isearch word mode             | :large_blue_circle: | `isearch-forward-word` searches for word at point |
+| Isearch symbol mode           | :large_blue_circle: | `isearch-forward-symbol` searches for symbol at point |
+| Search highlight all matches  | :green_circle:     | Qt: highlights all matches during isearch (current=cyan, others=yellow) |
+
+**Summary:** Search is strong. Isearch with live multi-match highlighting, query-replace, occur, grep, and wgrep all work well.
+
+---
+
+## 4. Kill, Yank & Clipboard
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Kill line / region / word | :white_check_mark: | Full kill ring integration |
+| Kill ring | :white_check_mark: | Stores history of kills |
+| Yank (`C-y`) | :white_check_mark: | |
+| Yank pop (`M-y`) | :white_check_mark: | Cycle through kill ring |
+| Kill ring save (`M-w`) | :white_check_mark: | Copy without killing |
+| Append next kill | :white_check_mark: | |
+| Browse kill ring | :white_check_mark: | Interactive selection |
+| System clipboard integration | :large_blue_circle: | Qt layer has clipboard; TUI limited |
+| Zap to char (`M-z`) | :white_check_mark: | |
+| Zap up to char | :white_check_mark: | |
+| Kill whole line | :white_check_mark: | |
+| Copy from above/below | :white_check_mark: | Copy character from line above/below |
+
+**Summary:** Kill/yank system is complete with kill ring cycling and browsing.
+
+---
+
+## 5. Undo System
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Undo (`C-/`, `C-_`) | :white_check_mark: | |
+| Redo (`M-_`) | :white_check_mark: | Linear redo |
+| Undo grouping | :white_check_mark: | Consecutive edits grouped |
+| Undo boundaries | :white_check_mark: | Commands create boundaries |
+| Undo tree visualization | :white_check_mark: | `M-x undo-tree-visualize` with snapshot history |
+| Persistent undo (across sessions) | :white_check_mark: | `undo-history-save` / `undo-history-load` to `~/.jemacs-undo/` |
+| Selective undo (region) | :white_check_mark: | Undo within region, falls back to normal undo |
+
+**Summary:** Undo/redo with tree visualization (`M-x undo-tree-visualize`), timestamped snapshots (`M-x undo-history`), and snapshot restore. No persistent undo or selective region undo.
+
+---
+
+## 6. Marks & Regions
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Set mark (`C-SPC`) | :white_check_mark: | |
+| Exchange point and mark (`C-x C-x`) | :white_check_mark: | |
+| Mark word / paragraph / defun / sexp | :white_check_mark: | |
+| Select all (`C-x h`) | :white_check_mark: | |
+| Narrow to region / widen | :white_check_mark: | |
+| Transient mark mode | :large_blue_circle: | Region highlighting |
+| Pop mark | :large_blue_circle: | Mark ring navigation |
+| Rectangle mark mode | :white_check_mark: | Toggle with `C-x SPC` |
+
+**Summary:** Mark and region system is solid.
+
+---
+
+## 7. Registers & Bookmarks
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Text to register | :white_check_mark: | `C-x r s` / `C-x r i` |
+| Point to register / jump | :white_check_mark: | `C-x r SPC` / `C-x r j` |
+| Window config to register | :white_check_mark: | Full multi-window state save/restore |
+| Rectangle to register | :white_check_mark: | |
+| Number registers (increment) | :white_check_mark: | `C-x r +` |
+| Append/prepend to register | :white_check_mark: | |
+| File to register | :large_blue_circle: | Save file path to register, jump back with `jump-to-register` |
+| List registers | :large_blue_circle: | |
+| Bookmark set / jump | :white_check_mark: | `C-x r m` / `C-x r b` |
+| Bookmark list | :white_check_mark: | |
+| Bookmark persistence | :white_check_mark: | `~/.jemacs-bookmarks` |
+| Bookmark delete / rename | :white_check_mark: | |
+
+**Summary:** Registers and bookmarks are comprehensive. All core types work including window configurations.
+
+---
+
+## 8. Rectangle Operations
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Kill rectangle | :white_check_mark: | `C-x r k` |
+| Delete rectangle | :white_check_mark: | `C-x r d` |
+| Yank rectangle | :white_check_mark: | `C-x r y` |
+| Open rectangle | :white_check_mark: | `C-x r o` |
+| String rectangle | :white_check_mark: | `C-x r t` — fill column with text |
+| Number lines | :white_check_mark: | `C-x r n` |
+| Clear rectangle | :white_check_mark: | |
+| Rectangle to register | :white_check_mark: | |
+
+**Summary:** Rectangle operations are feature-complete.
+
+---
+
+## 9. Keyboard Macros
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Start recording (`F3` / `C-x (`) | :white_check_mark: | |
+| Stop recording (`F4` / `C-x )`) | :white_check_mark: | |
+| Execute last macro (`F4` / `C-x e`) | :white_check_mark: | |
+| Named macros | :white_check_mark: | `M-x name-last-kbd-macro`, `M-x call-named-kbd-macro` with narrowing |
+| Macro counter | :white_check_mark: | `M-x kbd-macro-counter-insert` / `kbd-macro-counter-set` |
+| Edit macro | :large_blue_circle: | `M-x edit-kbd-macro` shows macro events in buffer (TUI) |
+| Save macros to file | :white_check_mark: | `M-x save-kbd-macros` / `load-kbd-macros` persists to `~/.jemacs-macros` |
+| Execute with count prefix | :large_blue_circle: | `C-u` prefix arg for navigation (char/word/line), `universal-argument`, digit arguments |
+
+**Summary:** Feature-rich macro system: recording/playback, named macros with save/load persistence, counter insert/set, macro viewer. Qt uses narrowing for macro selection.
+
+---
+
+## 10. Minibuffer & Completion
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| M-x (execute-extended-command) | :white_check_mark: | Fuzzy matching command names |
+| File name completion | :white_check_mark: | Tab completion in find-file |
+| Buffer name completion | :white_check_mark: | Fuzzy matching in switch-buffer |
+| Minibuffer history | :white_check_mark: | `M-p` / `M-n` in minibuffer |
+| Recursive minibuffer | :white_check_mark: | `toggle-enable-recursive-minibuffers` flag |
+| Vertico / Selectrum | :white_check_mark: | Mode toggles, uses narrowing framework for vertical completion |
+| Orderless matching | :large_blue_circle: | Multi-match engine: space-separated AND tokens, `!` negation, `^` prefix |
+| Marginalia (annotations) | :white_check_mark: | Annotator registry with `marginalia-annotate!`, command/buffer/file categories |
+| Embark (actions on candidates) | :white_check_mark: | Action registry with `embark-define-action!`, describe/execute/find-file actions |
+| Consult (enhanced commands) | :large_blue_circle: | `consult-ripgrep` (M-s r, narrowing), `consult-line`, `consult-buffer`, `consult-bookmark` |
+| Icomplete / Fido mode | :white_check_mark: | `icomplete-mode` / `fido-mode` toggles |
+| Savehist (persist history) | :large_blue_circle: | `~/.jemacs-history` |
+
+**Summary:** Full completion framework: fuzzy matching, Vertico/Selectrum vertical modes, Marginalia annotations, Embark actions, Icomplete/Fido. Uses narrowing framework for candidate selection.
+
+---
+
+## 11. Buffer Management
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Switch buffer (`C-x b`) | :white_check_mark: | With fuzzy matching |
+| Kill buffer (`C-x k`) | :white_check_mark: | Prompts to save modified |
+| List buffers (`C-x C-b`) | :white_check_mark: | |
+| Next/previous buffer | :white_check_mark: | `C-x <left>/<right>` |
+| Bury buffer | :white_check_mark: | |
+| Rename buffer | :white_check_mark: | |
+| Clone buffer | :white_check_mark: | |
+| Scratch buffer | :white_check_mark: | |
+| Messages buffer | :white_check_mark: | `*Messages*` equivalent |
+| ibuffer (advanced list) | :large_blue_circle: | Interactive: mark/delete/save/execute, filter by name, sort, goto buffer |
+| Uniquify buffer names | :white_check_mark: | Emacs-style `filename<dir>` — renames both old and new same-name buffers |
+| Indirect buffers | :large_blue_circle: | `clone-indirect-buffer` creates text copy with `<clone>` suffix |
+| Buffer-local variables | :large_blue_circle: | `buffer-local-set!/get` per-buffer hash, used for major-mode, dir-locals, org settings |
+
+**Summary:** Core buffer management works well. IBBuffer provides interactive mark/execute/filter/sort.
+
+---
+
+## 12. Window Management
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Split horizontal (`C-x 2`) | :white_check_mark: | |
+| Split vertical (`C-x 3`) | :white_check_mark: | |
+| Delete window (`C-x 0`) | :white_check_mark: | |
+| Delete other windows (`C-x 1`) | :white_check_mark: | |
+| Other window (`C-x o`) | :white_check_mark: | |
+| Balance windows (`C-x +`) | :white_check_mark: | |
+| Resize windows (`C-x ^`, `C-x {`, `C-x }`) | :white_check_mark: | |
+| Windmove (directional) | :white_check_mark: | `S-left/right/up/down` arrow key navigation between windows |
+| Winner mode (undo/redo) | :white_check_mark: | `winner-undo`, `winner-redo` |
+| Ace-window (jump by label) | :large_blue_circle: | |
+| Swap buffers between windows | :white_check_mark: | |
+| Golden ratio mode | :white_check_mark: | Auto-resize focused window |
+| Dedicated windows | :white_check_mark: | `M-x toggle-window-dedicated` prevents buffer replacement |
+| Side windows | :white_check_mark: | Toggle side panel via split (display-buffer-in-side-window) |
+| Window purpose | :white_check_mark: | `set-window-dedicated`, `toggle-window-dedicated` with buffer-type dedication |
+| Follow mode | :white_check_mark: | Synchronized scrolling across windows |
+
+**Summary:** Window management is strong. Splitting, resizing, winner-mode, ace-window, window purpose/dedication all work.
+
+---
+
+## 13. Frame / Display Management
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Single frame (Qt window) | :white_check_mark: | |
+| Multiple frames | :large_blue_circle: | Virtual frame management: `make-frame`/`delete-frame`/`other-frame`/`suspend-frame`, frame count tracking |
+| Fullscreen toggle | :large_blue_circle: | Real toggle via window-state detection (fullscreen ↔ normal) |
+| Font size (zoom) | :white_check_mark: | `C-=`, `C--`, `C-x C-0` |
+| Font family selection | :large_blue_circle: | Configurable |
+| Menu bar | :large_blue_circle: | Qt menu bar with File/Edit/View/etc |
+| Tool bar | :yellow_circle: | `tool-bar-mode` registered; uses M-x for commands |
+| Scroll bar | :large_blue_circle: | Real toggle via Scintilla SCI_SETVSCROLLBAR/SCI_SETHSCROLLBAR |
+| Mode line (status bar) | :white_check_mark: | Shows mode, file, position, modified status |
+| Tab bar | :green_circle: | Qt visual buffer tab bar + workspace tabs (both layers) |
+| Header line | :white_check_mark: | Toggle header line display (file path breadcrumb) |
+| Fringe indicators | :large_blue_circle: | Git-gutter fringe markers (green=add, blue=mod, red=del) via Scintilla margin, both TUI + Qt |
+| Display tables | :white_check_mark: | `set-display-table-entry` / `describe-display-table` |
+| Fill-column indicator | :white_check_mark: | Visual vertical line via Scintilla edge mode (TUI + Qt) |
+| Goto-address-mode | :white_check_mark: | URL detection and highlighting with Scintilla indicators (TUI + Qt) |
+| Subword-mode | :white_check_mark: | CamelCase-aware word navigation: forward, backward, kill (TUI + Qt) |
+| Rainbow delimiters | :white_check_mark: | Color-coded parentheses/brackets via Scintilla indicators |
+| Pulse-on-jump | :white_check_mark: | Auto-flash landing line after >5-line jumps (INDIC_FULLBOX), toggleable |
+| Visual-line-mode | :white_check_mark: | Word wrap via Scintilla SCI_SETWRAPMODE (TUI + Qt) |
+| Whitespace-mode | :white_check_mark: | Show/hide whitespace and EOL markers via Scintilla (TUI + Qt) |
+| Which-key mode | :white_check_mark: | Shows available keybindings after prefix key delay (TUI + Qt) |
+
+**Summary:** Single-frame Qt application. No multi-frame support. Display features work well including fill-column indicator, URL highlighting, pulse-on-jump, visual-line-mode, whitespace display, and which-key hints.
+
+---
+
+## 14. File Operations
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Find file (`C-x C-f`) | :white_check_mark: | With completion |
+| Find file other window (`C-x 4 f`) | :white_check_mark: | |
+| Save buffer (`C-x C-s`) | :white_check_mark: | |
+| Save as (`C-x C-w`) | :white_check_mark: | |
+| Save some buffers (`C-x s`) | :white_check_mark: | Prompts for each modified |
+| Revert buffer | :white_check_mark: | Reload from disk |
+| Auto-revert mode | :white_check_mark: | Auto-reverts unmodified buffers when files change on disk |
+| Auto-save mode | :white_check_mark: | 30s timer writes to `#file#`, per-buffer toggle, recover-file |
+| Backup files | :large_blue_circle: | Creates `file~` backup on first save, toggle with `M-x toggle-backup-files` |
+| Recent files (`C-x C-r`) | :white_check_mark: | |
+| Find file at point | :white_check_mark: | |
+| Find alternate file | :white_check_mark: | |
+| Insert file | :white_check_mark: | |
+| Copy/rename file | :white_check_mark: | |
+| Sudo write | :white_check_mark: | Write as root |
+| File local variables | :large_blue_circle: | Dir-locals via `.jemacs-config` |
+| Find file literally | :large_blue_circle: | Opens file with syntax highlighting disabled (SCLEX_NULL) |
+| File encoding detection | :large_blue_circle: | UTF-8 default; `set-buffer-file-coding-system` with 15 encodings, `revert-buffer-with-coding-system`, per-buffer encoding storage |
+| Line ending conversion | :white_check_mark: | Unix/DOS/Mac detection and conversion |
+| Desktop save/restore | :white_check_mark: | Persist and restore session (open buffers, positions) across restarts |
+
+**Summary:** File operations are comprehensive. Find, save, revert, auto-revert, recent files, desktop save/restore all work.
+
+---
+
+## 15. Dired (Directory Editor)
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Directory listing | :white_check_mark: | File metadata, permissions, sizes |
+| Open file/directory | :white_check_mark: | Enter to open |
+| Navigate up (`^`) | :white_check_mark: | |
+| Create directory | :white_check_mark: | |
+| Mark / unmark files | :white_check_mark: | Mark by regexp |
+| Delete single file | :white_check_mark: | With confirmation |
+| Rename single file | :white_check_mark: | |
+| Copy single file | :white_check_mark: | |
+| Chmod | :white_check_mark: | |
+| Sort toggle | :white_check_mark: | Name/date |
+| Hide details | :white_check_mark: | |
+| Hide dotfiles | :white_check_mark: | |
+| Refresh | :white_check_mark: | |
+| Batch delete (marked) | :white_check_mark: | Delete all marked files with confirmation |
+| Batch rename (marked) | :white_check_mark: | Move/rename marked files to destination |
+| Batch copy (marked) | :white_check_mark: | Copy marked files to destination |
+| Mark by regexp | :white_check_mark: | Mark files matching pattern |
+| Shell command on file | :large_blue_circle: | Runs command, shows output in buffer |
+| Wdired (edit filenames) | :white_check_mark: | Edit mode with rename-on-commit |
+| Image thumbnails | :white_check_mark: | `image-dired-display-thumbnail` / `image-dired-show-all-thumbnails` |
+| Dired-x extensions | :large_blue_circle: | `find-dired` (custom args), `find-name-dired` (by filename pattern) — real `find` subprocess |
+| Async operations | :white_check_mark: | `dired-async-copy`, `dired-async-move` |
+| Virtual dired | :white_check_mark: | `virtual-dired` from file list, `dired-from-find` from glob |
+| Dired subtree | :white_check_mark: | `M-x dired-subtree-toggle` for inline expansion |
+
+**Summary:** Dired is **substantially complete**. Full listing with permissions/sizes, single-file and batch operations on marked files, wdired for inline renaming, find integration, inline subtree expansion, async copy/move. Missing: image thumbnails.
+
+---
+
+## 16. Version Control / Magit
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Git status display | :large_blue_circle: | Interactive status with inline diffs per file |
+| Stage / unstage hunks | :large_blue_circle: | Hunk-level staging via `git apply --cached` |
+| Stage / unstage files | :white_check_mark: | `s` to stage, `u` to unstage in status buffer |
+| Commit with message | :large_blue_circle: | Dedicated `*Magit: Commit*` buffer with diff preview, C-c C-c / C-c C-k |
+| Amend commit | :large_blue_circle: | `a` in magit opens commit buffer pre-filled with previous message |
+| Push / pull | :large_blue_circle: | Upstream detection, auto-set with `-u`, remote selection via narrowing |
+| Log viewing | :large_blue_circle: | Interactive log with date/author, Enter shows commit diff |
+| Diff viewing | :large_blue_circle: | Shows staged + unstaged diffs for file at point |
+| Branch operations | :large_blue_circle: | Checkout/create/delete with narrowing selection |
+| Tag management | :large_blue_circle: | Create/list/delete/push tags with completion |
+| Stash | :large_blue_circle: | Stash create + list + pop + show diff |
+| Blame | :large_blue_circle: | `magit-blame`, `show-git-blame`, `vc-annotate` — real `git blame` with async output |
+| Interactive rebase | :large_blue_circle: | Rebase with narrowing branch selection |
+| Merge UI | :large_blue_circle: | Merge with narrowing branch selection |
+| Cherry-pick | :large_blue_circle: | Interactive commit selection with narrowing |
+| Revert commit | :large_blue_circle: | Interactive commit selection, `--no-edit` |
+| Forge (PR/issue management) | :large_blue_circle: | List/view PRs and issues, create PRs via `gh` CLI |
+| Diff-hl (gutter marks) | :large_blue_circle: | Git diff gutter indicators |
+| Wgrep on grep results | :white_check_mark: | Edit and save back |
+| Magit keymap | :white_check_mark: | 20 bindings: s/S/u/c/d/l/g/n/p/q/b/B/f/F/P/r/m/z/Z/k |
+| VC generic backend | :white_check_mark: | Git backend: real `vc-annotate` (blame), `vc-diff-head`, `vc-log-file` (--follow), `vc-stash`/`vc-stash-pop`, `vc-revert`, `vc-dir` |
+
+**Summary:** Magit has been significantly enhanced. The status buffer shows **inline diffs** per file. **Hunk-level staging/unstaging** works via `git apply --cached`. Branch operations (checkout, merge, rebase) use the **narrowing framework** for interactive selection. 20+ single-key bindings in the magit keymap. **Commit composition** uses a dedicated `*Magit: Commit*` buffer with diff preview and `C-c C-c`/`C-c C-k` keybindings. **Interactive log** shows date/author/subject with graph; pressing Enter shows the full commit diff with highlighting. Forge integration provides PR/issue listing and creation via `gh` CLI.
+
+---
+
+## 17. Org-mode
+
+| Feature | Status | Notes |
+|---------|--------|-------|
+| Heading hierarchy | :white_check_mark: | `* / ** / ***` levels |
+| Heading folding / cycling | :white_check_mark: | TAB cycles visibility |
+| TODO states | :white_check_mark: | TODO/DONE cycling, custom keywords |
+| Priority (`[#A]`, `[#B]`, `[#C]`) | :white_check_mark: | Set and cycle priorities |
+| Tags | :white_check_mark: | Per-heading tags |
+| Timestamps | :white_check_mark: | Active/inactive, SCHEDULED/DEADLINE |
+| Properties | :white_check_mark: | Property drawers |
+| Lists (ordered, unordered) | :large_blue_circle: | |
+| Checkboxes | :white_check_mark: | Toggle `[ ]`/`[X]` |
+| Links | :white_check_mark: | `[[url][description]]` format |
+| Footnotes | :large_blue_circle: | `org-footnote-new` (insert ref+def), `org-footnote-goto-definition` (jump between ref/def) |
+| **Tables** | :white_check_mark: | Create, align, row/col operations, sort, sum |
+| Table formulas | :large_blue_circle: | Basic recalculate |
+| Table CSV import/export | :white_check_mark: | |
+| **Agenda** | :large_blue_circle: | Daily/weekly views, date filtering, tag search |
+| Agenda interactive commands | :large_blue_circle: | Jump to source, toggle TODO from agenda |
+| **Capture** | :large_blue_circle: | Templates with `%?/%U/%T/%f`, template selection, `*Org Capture*` buffer |
+| Capture buffer (C-c C-c / C-c C-k) | :white_check_mark: | Interactive capture with finalize/abort keybindings |
+| Refile | :large_blue_circle: | `M-x org-refile` with narrowing target selection (Qt) |
+| **Babel** (code blocks) | :large_blue_circle: | 8 languages, execution, tangling |
+| Babel session persistence | :white_check_mark: | `:session name` keeps persistent process, sentinel-based I/O |
+| Babel :var evaluation | :white_check_mark: | Resolves named src blocks (executes) and tables (converts to data) |
+| Babel :noweb expansion | :white_check_mark: | `<<block-name>>` refs expanded when `:noweb yes` |
+| **Export** | :large_blue_circle: | HTML, Markdown, LaTeX, ASCII |
+| Export footnotes/cross-refs | :white_check_mark: | `[fn:name]` refs, `<<target>>`/`[[#target]]` cross-refs, all 4 backends |
+| Custom export backends | :white_check_mark: | Register via `org-export-register-backend!`, list with `org-export-list-backends` |
+| **Clock tracking** | :large_blue_circle: | Clock-in/out, goto |