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 <noreply@anthropic.com>
This commit is contained in:
Levi Neuwirth 2026-07-21 12:56:17 -04:00
parent 4ae888dda3
commit b65c927ac4
3 changed files with 51 additions and 108 deletions

View File

@ -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**
<https://github.com/levineuwirth/pmacs/pull/125>
- 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:
<https://github.com/levineuwirth/pmacs/pull/125#issuecomment-5036372634>
and
<https://github.com/levineuwirth/pmacs/pull/125#issuecomment-5036628171>.
- 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

View File

@ -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),

View File

@ -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 13 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