From b65c927ac4c013b9b25f117da35c2ce489f0be76 Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Tue, 21 Jul 2026 12:56:17 -0400 Subject: [PATCH] docs: record Themes Arc 4 completion Advance canonical main and protocol state after PR #125, remove the completed statusline lane from the active-work ledger, and mark the first four roadmap arcs complete. Record Arc 5 stage 2 as the next formal roadmap stage. Co-Authored-By: Claude --- docs/active-work.md | 57 ++--------------------------------------- docs/agent-handoff.md | 45 +++++++++++++++++++------------- docs/roadmap-2026-07.md | 57 ++++++++++++++++------------------------- 3 files changed, 51 insertions(+), 108 deletions(-) diff --git a/docs/active-work.md b/docs/active-work.md index eaa720f..bdee719 100644 --- a/docs/active-work.md +++ b/docs/active-work.md @@ -14,7 +14,7 @@ backlog. machine-local: `origin` may name this canonical URL, a release mirror, or something else, and therefore has no authority by name alone. - Canonical base at this snapshot: - `githubsucks/main` @ `bb17ec9` (#123 merged atop #124, protocol v17). + `githubsucks/main` @ `7bc0c61` (#125 merged; protocol v18). - On the transfer source, `origin/main` named a release mirror at `d3fa632` and lagged badly. On the current destination, `origin` names the canonical URL. This difference is why all recovery begins by @@ -48,62 +48,9 @@ git worktree list git status --short --branch ``` -The first command must expose `bb17ec9` or a newer intentional main. +The first command must expose `7bc0c61` or a newer intentional main. If it does not, stop and repair the remote/fetch configuration. -## Active lane: Arc 4 stage 3 — statusline segments - -- Portable branch: `githubsucks/statusline-segments` -- Feature head: - `1be7a30468f1fab73432b363dd8e44c8d2234d93` -- Pull request: #125, - **feat(statusline): composable modeline segments at protocol v18** — - -- State: two review rounds addressed; Revision 3's Q#SL1-Q#SL11 and - Acceptance 1-27 remain implemented and awaiting review. The feature - history is based on canonical `main` - `bb17ec955e083a56aa937b596906fce84a00533a`. The branch is **not - merged**. Review resolutions: - - and - . -- Scope delivered: strict composable per-window `pmacs.statusline` - providers; borrow-released evaluation and per-context failure latches; - legacy-preserving TUI composition; a pure built-in LSP provider; - dynamic modeline-face inventory; protocol-v18 authoritative - `StatuslineSegments`; snapshot/version symmetry; and atomic GPU - validation, face resolution, shaping, clipping, and caching. -- Real TUI smoke: hermetic XDG roots under `/tmp`, live tmux PTYs at - 100x24 and verified 46x24, faced left/right custom runs with CJK, - combining text, and an injected ESC. The ESC rendered as a space; - ordering, clipping, protected `L1:C1 All`, and the separate echo row - remained legible without overlap. Both sessions exited 0; focused TUI - statusline/mode-line tests passed 6 + 1. -- Final verification after review round 2, sequential: - `cargo fmt --check`; workspace/all-target Clippy with `-D warnings`; - 1,619 default library tests (3 ignored); 1,793 CRDT library tests (3 - ignored); 7 default and 8 CRDT statusline acceptance tests; 114 M4 - acceptance tests (3 ignored, `basedpyright` filtered); 109 required - GPU tests; the exact one-invocation workspace sweep (2,718 passed - across 78 suites, 19 ignored, `basedpyright` filtered); and - `git diff --check`. No flaky or environment rerun was needed. -- Recovery state at handoff: `/home/jeans/Repos/active/pmacs-statusline` - is clean, its local branch and `githubsucks/statusline-segments` both - point at the feature head above, PR #125 targets canonical `main`, - and GitHub reports 22 changed files (+5,707/-302), `MERGEABLE`, with - merge-state checks currently `UNSTABLE`. - -Recovery worktree on a machine that does not already have the local -branch: - -```sh -git fetch githubsucks statusline-segments -git worktree add --track \ - -b statusline-segments \ - ../pmacs-statusline \ - githubsucks/statusline-segments -gh pr view 125 --repo levineuwirth/pmacs -``` ## Parked lane: kill-ring browser + persistence diff --git a/docs/agent-handoff.md b/docs/agent-handoff.md index 7124718..0929075 100644 --- a/docs/agent-handoff.md +++ b/docs/agent-handoff.md @@ -1,9 +1,9 @@ # Agent handoff — cross-machine continuity -**Last updated: 2026-07-21, after the statusline stage-3 Revision 3 -review update, JSON/YAML (#123) merge, and cross-machine continuity -audit; main also reflects GPU font preferences (#124), themes stage 1 -(#120), and injections (#122).** This file is the +**Last updated: 2026-07-21, after Themes Arc 4 completed with +statusline segments (#125), JSON/YAML (#123), GPU font preferences +(#124), named UI faces (#120), and multi-language injections (#122).** +This file is the bridge between development machines. If you are an agent reading this on a fresh clone: this document plus the `docs/*-framing.md` files ARE your memory. Read this fully before taking on work, seed @@ -16,9 +16,9 @@ commands, read `docs/active-work.md` immediately after this file. ## 1. Where the project stands (2026-07-21) -- `main` @ `bb17ec9` (JSON + YAML #123 merged atop GPU font preferences - #124), protocol **v17** (`SUPPORTED=[6..17]`; v15→16 shipped - `ThemeFacts`, v16→17 shipped `FontFacts`). +- `main` @ `7bc0c61` (statusline segments #125), protocol **v18** + (`SUPPORTED=[6..18]`; v16 = `ThemeFacts`, v17 = `FontFacts`, v18 = + `StatuslineSegments`). - **Syntax-highlight / language-detection side-quest (#114–#118) LANDED** — a one-shot arc built in sibling worktrees off main while the user's themes lane (`theme-faces`) ran concurrently in the shared @@ -143,14 +143,18 @@ commands, read `docs/active-work.md` immediately after this file. and snapshot geometry changes. Test fixtures enter fontdb before `FontSystem` construction; alternate advances are measured across complete shaped runs, not sampled glyphs. -- **NEXT: themes stage 3 — Lua statusline-segment API.** - Revision 3 is preserved on branch `statusline-segments`, re-scouted - against `bb17ec9` with no relevant substrate drift, and awaits review. - It scopes additive per-window modeline providers, face-name segments, - dynamic `ThemeFacts` inventory, and a new v18 `StatuslineSegments` - channel; the existing LSP status tracker is the first built-in - provider. Approval → implementation → gates → PR. Completing stage 3 - completes Arc 4. +- **Themes (Arc 4) stage 3 LANDED — #125; ARC 4 COMPLETE** + (`docs/statusline-segments-framing.md` rev 3). Strict composable + `pmacs.statusline` providers evaluate per frontend/window through a + borrow-released three-phase transaction with per-context failure + latches. TUI composition is grapheme/display-width correct; the pure + built-in LSP provider proves passive-window context. Protocol v18 + carries complete `StatuslineSegments` replacements and dynamic + modeline faces; snapshot baselines reset symmetrically. GPU validates + untrusted payloads atomically, shapes rich runs without wrapping, and + right-pins the protected suffix under narrow clipping. Review + hardening pins fixed-face sortedness, retains flattened provider + tracebacks, and names unavailable layout contexts accurately. - **PARKED: kill-ring browser + persistence.** Revision 2 framing is preserved on branch `kill-ring-browser`, but its `0efb5cd` scout is stale and must be repeated before implementation. No PR or @@ -165,6 +169,10 @@ commands, read `docs/active-work.md` immediately after this file. - **Arc 3 (persistence) COMPLETE** — saveplace/recentf (#98), desktop-save (#99), autosave/crash-recovery (#100), save-clobber fix (#101). + - **Arc 4 (themes + extensibility) COMPLETE** — named UI faces (#120), + live GPU font preferences (#124), statusline providers (#125). + - **Arc 5 stage 1 COMPLETE** — compile mode (#113); stage 2 vterm is + the next formal roadmap stage. ## 2. How we work (the part that must not drift) @@ -273,9 +281,10 @@ buffer owns a path's recovery slot; only recover/discard release unclaimed crash data; adopt clears the old owner's skip cache. **Protocol** — encoding-breaking bumps are deliberate and versioned -(`SUPPORTED=[6..17]`). v15 = `CompletionPopup` + -`StatusFacts.message`; v16 = `ThemeFacts`; v17 = `FontFacts`. New wire -surface ⇒ bump + both-frontends support + acceptance. +(`SUPPORTED=[6..18]`). v15 = `CompletionPopup` + +`StatusFacts.message`; v16 = `ThemeFacts`; v17 = `FontFacts`; v18 = +`StatuslineSegments`. New wire surface ⇒ bump + both-frontends support + +acceptance. **Fake LSP** (`src/bin/pmacs_fake_lsp.rs`) modes: `fullonly`, `rangeonly`, `rangeonly16` (UTF-16 + fail-closed bounds validation), diff --git a/docs/roadmap-2026-07.md b/docs/roadmap-2026-07.md index dc32d22..2aeba17 100644 --- a/docs/roadmap-2026-07.md +++ b/docs/roadmap-2026-07.md @@ -54,50 +54,37 @@ modes; DAP debugging; GPU splits / multi-buffer / auto-reconnect. ## Arcs, ranked by value-per-effort -### Arc 1 — LSP utility surface: "light up the dark matter" ← ACTIVE +### Arc 1 — LSP utility surface: "light up the dark matter" — COMPLETE -Data layer is done; only UI is missing. +The completion popup and LSP utility panels shipped across #92–#96, +followed by hardening in #102, #105, and #106. Completion, hover, +references, document symbols, and the supporting semantic/signature +paths are now wired through both frontend contracts. -- **1a. In-buffer completion popup** (first). Trigger on typing, - TAB/RET accept, both frontends. GPU needs a wire message — mirror the - minibuffer-dropdown pattern (protocol v12). Framework + popup view - already exist. -- **1b. Panels**: hover popup, code-action picker, references list, - document-symbol outline. Generalize the buffer-list UI pattern - (`*buffer-list*` buffer-local bindings) into a reusable list-buffer - idiom. -- **1c. Semantic-token auto-pull fix** (small): pull on attach + on - edit-flush, like inlay hints already do. -- **1d. Signature-help auto-trigger** on `(`. +### Arc 2 — Editing table stakes — COMPLETE -### Arc 2 — Editing table stakes (interleave with Arc 1) +Query-replace (#97), the real kill ring and `M-y` (#103/#105/#106), +comment toggle (#107), auto-indent (#109), and auto-pairing (#110) +landed. -Each small, core-only, frontend-agnostic: query-replace (isearch -exists; `search.rs` has no replace API), real kill ring + `M-y`, -comment/uncomment, auto-indent on newline, auto-pairing. +### Arc 3 — Persistence/serialization — COMPLETE -### Arc 3 — Persistence/serialization +Saveplace/recentf (#98), desktop save/restore (#99), +autosave/crash-recovery (#100), and the save-clobber fix (#101) landed. -Desktop-save (buffer set + layout + cursors → restore), recentf, -saveplace, autosave + crash recovery, optional backups. Generalize the -`$XDG_STATE_HOME/pmacs/` pattern from minibuffer history. Framing -question: what is a "session" in a daemon world; do CRDT snapshots -ride along. +### Arc 4 — Themes + extensibility surface — COMPLETE -### Arc 4 — Themes + extensibility surface +Stages 1–3 landed as #120, #124, and #125: named `ui.*` faces with +daemon-resolved `ThemeFacts`; the live global `pmacs.gpu.set_font` +preference at protocol v17; and composable per-window +`pmacs.statusline` providers transported to semantic/GPU frontends by +protocol-v18 `StatuslineSegments`. -Extend `pmacs.theme` from syntax captures to named UI faces (modeline, -minibuffer, gutter, selection, status band); wire GPU chrome to it — -Q#UX1 lesson applies: rendering is frontend-local but control is -daemon-owned, so a wire channel (`ThemeFacts`-style) is needed. Add -`pmacs.gpu.set_font` (designed, never built) and a Lua -statusline-segment API. +### Arc 5 — Terminal, staged ← NEXT FORMAL ARC -### Arc 5 — Terminal, staged - -- **Stage 1**: compile-mode / grep-mode / shell-command on the existing - PTY + ANSI + REPL-package substrate (line-oriented output buffer, - error-regex jump-to-file, `M-x compile`). Cheap, transformative. +- **Stage 1 — LANDED (#113)**: compile mode streams line-oriented + process output through the PTY/ANSI substrate, with error-regex + navigation and `M-x compile`. - **Stage 2 (vterm)**: extend `ansi.rs` into a 2D grid model (alt-screen, cursor addressing, scrollback — parser already recognizes and discards these), grid-backed buffer view, GPU