Merge pull request #210 from levineuwirth/docs-absorption-209

docs: absorption pass at c5f7501#209 landed, and six weeks of drift
This commit is contained in:
Levi Neuwirth 2026-08-01 14:13:17 -04:00 committed by GitHub
commit 4984169022
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 163 additions and 219 deletions

View File

@ -1609,23 +1609,24 @@ missing runtime entity — a real arc).
### Priority 1: Protect the golden product journey
Establish the end-to-end workflow; treat regressions as release
blockers. **State: runs to step 5; thin from step 6 (§2). Mostly wiring,
and unusually cheap:** directory-argument handling (**done**: Journey
Stage 1a); a find-file surface (**done**: #162 open-by-path, #165
browsing); surfacing the LSP spawn failure with guidance (**done**: Journey Stage
1b-2, #204, §1.2); a compile keybinding + `cargo build`/`test` default
(**done**: Journey Stage 1b-1, #203, from the existing
blockers. **State: Stage 1 COMPLETE — the journey runs to step 10 (§2,
§0).** Every item this priority originally named is done:
directory-argument handling (Journey Stage 1a, #182/#183); a find-file
surface (#162 open-by-path, #165 browsing); surfacing the LSP spawn
failure with guidance (Stage 1b-2, #204, §1.2); a compile keybinding +
`cargo build`/`test` default (Stage 1b-1, #203, from the existing
`ProjectKind::Rust`**not** `Cargo`, see §24); a terminal keybinding
(**done**: `C-c t`, #173); a welcome buffer (**in flight**: Journey
Stage 1b-3). The journey acceptance
suite (§19) is the ratchet that keeps it fixed — it **exists now**
(`tests/journey_acceptance.rs`, Stage 1a), seeded with steps 2, 3 and 5,
and carrying step 9 since #203.
(`C-c t`, #173); and a welcome buffer (Stage 1b-3, #205). The journey
acceptance suite (§19) is the ratchet that keeps it fixed —
`tests/journey_acceptance.rs` carries 45 pins over steps 2, 3, 4, 5, 6
and 9, and **stages add rows to it, none removes them**.
Journey Stage 1b is the named remainder, and it splits: **1b-1** (the
compile binding + project-kind defaults) landed as #203 and **1b-2**
(LSP spawn guidance, step 6) as #204; **1b-3**, the welcome buffer
(step 4), is in flight and completes the split.
**The remaining thin end is no longer inside this priority.** Step 1 is
install, which is **P8**; step 11 is background-work ownership, which is
§9; step 12 is session restore, where desktop-save is opt-in *and* a
documented no-op under a daemon. Journey Stage 1 closing is what moves
this priority's own work to done — what is left is other priorities'
work showing up in the journey.
### Priority 2: Make workspace and location explicit
@ -1699,10 +1700,15 @@ implementation — this list is direction, not commitment):
**Stage 1b-1 — landed (#203)**: the compile binding and project-kind
defaults, with the prompt capturing its directory rather than
re-resolving it at accept time. **Stage 1b-2 — landed (#204)**:
LSP-failure surfacing. **Stage 1b-3 — in flight**: the welcome
buffer and `M-x help`. With it the 1b split is complete.
2. **Discovery surface** (P4): the describe/list/where-is command
family, M-x rich rows, help unification, help prefix.
LSP-failure surfacing. **Stage 1b-3 — landed (#205)**: the welcome
buffer and `M-x help`. **The 1b split, and with it Journey Stage 1,
is COMPLETE.**
2. **Discovery surface** (P4): **Stage 1 landed (#207)** — the
describe/list/where-is family, eleven `help.*` commands indexed by
`M-x help`. Remaining: M-x rich rows (a protocol change),
title/category on `Command` (~147 sites), predicate evaluation, help
unification, and the help prefix — where **`C-h` is not free**, see
§18.
3. **Transient keymap layer** (§6): the overlay scope + lifetime
handle + derived `dispatch_idle`, then migrate shadows one per PR.
4. **Extension ownership** (P3): `hook.remove`, owner-carrying

View File

@ -148,181 +148,62 @@ form. All four steps ran clean. **The two-argument form still does not
work** for a remote-only branch (`fatal: invalid reference`), which is
why every lane below spells out the `-b` form.
## CI CRDT coverage lane — **PR #209 OPEN, all 14 checks green**
## CI CRDT coverage — MERGED (#209); kept for its three follow-ons
**This lane had no branch and no owner from #166 until 2026-08-01.** It
now has both, and a PR. Framing:
`docs/ci-crdt-coverage-framing.md` revision 4 (approved at revision 2).
Branch `ci-crdt-coverage` off `githubsucks/main` @ `4223dd3`, developed
in the primary checkout on the laptop, not a worktree.
**Rewritten, not removed.** Rule 4 removes a lane when its ARC is done;
the coverage itself has landed but three named follow-ons have not.
Durable facts — the corrections, the traps, the census tool — are in
`docs/agent-handoff.md` §§1/5 per rule 3, so they are not repeated here.
- **PR: <https://github.com/levineuwirth/pmacs/pull/209>**, opened
2026-08-01, awaiting user review. Six commits: `7a9cf5b` clippy,
`06abbac` m10-perf-gates, `7a8746d` crdt-test, `a776bc3`
feature-census, `57abcd9` docs, plus a review-round commit for the
pmacs-protocol gap below.
- **First CI run: all 14 checks green** (run `30705124856`), including
both new jobs — `Test (crdt)` 12m20s and `M10 Perf Gates (crdt)`
5m40s — and the macOS/luajit leg that is the usual flake surface.
**This was the first time in the project's history that any of these
tests executed in CI.**
- **Acceptance criterion 8 — the count reconciliation — HOLDS against
the real run.** `Test (crdt)` reported **3,717 passed / 0 failed / 30
ignored**. That is 3,746 (the `--all-targets` census, with
`basedpyright` not skipped as it is locally) plus 1 doc test, minus
the 30 ignored: 3,716 + 1 = 3,717. The job demonstrably compiled and
ran the crdt corpus rather than reporting green over nothing.
- **Do not compare the two jobs' raw totals.** In the first run
`Test (ubuntu/luajit)` reported 3,485 and `Test (crdt)` 3,747 — a
difference of 262, not 279, because the jobs ran different *sets*:
3,467 + 1 doc + 17 protocol = 3,485, against 3,746 + 1 doc = 3,747.
**The dark count is the all-targets comparison, 3,746 3,467 = 279.**
A reviewer who subtracts job totals gets a wrong number that looks
entirely plausible.
- **Those two figures are superseded** and are kept only to explain
the trap. Round 1 added a pmacs-protocol step to `crdt-test` and
round 2 added two capability tests to that crate. The current
totals were **predicted from the census and then confirmed exactly**
by run `30706324644` @ `71a1ebd`: `Test (crdt)` **3,766**
(3,746 + 1 doc + 19 protocol) and `Test (ubuntu/luajit)` **3,487**
(3,467 + 1 + 19). Predicting the count *before* the run and matching
it is a stronger reading of acceptance 8 than reconciling afterwards.
- The root-package census is untouched at 3,467 / 3,746 — the new
tests live in a sibling crate, exactly the region
`scripts/feature-census` cannot see.
- **The macOS legs report 3,474, thirteen fewer than ubuntu's 3,487**,
and that is expected: the Linux-gated process tests
(`setsid`, the `bash -m` job-control corroboration) are
`cfg`-compiled out rather than skipped. Do not read it as macOS
coverage loss.
- **Verify CI by `head_sha`, never by the check summary — it bit again
here.** Round 1's run (`30705916037` @ `6519bc3`) was **cancelled**,
not green: round 2's push superseded it, which is the concurrency
group working as designed. A `gh pr checks` summary polled around that
moment reported the *previous* run's results, with plausible timings,
and was briefly reported as round 1 passing. The ledger already
carried this lesson from #178 ("twelve checks green on head `1b44c69`
— verified by `head_sha`, not by the check summary"); it recurs
because the wrong answer looks exactly like the right one.
- **Root cause, unchanged:** `.github/workflows/ci.yml` never enabled
the `crdt` feature anywhere. Every `#[cfg(feature = "crdt")]` test was
therefore **not compiled** in CI, not merely skipped — including the
186 library tests behind `cargo test --lib --features crdt`, which
`CLAUDE.md` lists as a REQUIRED pre-PR gate. CI had never run a
required gate.
- **Re-measured at `4223dd3`: 3,467 vs 3,746 — 279 dark**, up from the
273 recorded at `74301d1`. **Do not quote this number either.** It
moves with every merge, and there is now a tool: `scripts/feature-census
luajit luajit,crdt` reproduces the whole per-target table, the ignored
split, and the zero-test-target count in one command.
- **The 279 are fully dispositioned; 275 are recovered.** 268 by the new
`crdt-test` job, 7 by the new `m10-perf-gates` job, and 4 deliberately
excluded: `m10_11_acceptance`'s three PTY-doubled tests (marked
operator-invoked before tagging) and the #157 CRDT undo repro, an
`#[ignore]`d known-defect marker whose arming belongs to that defect's
lane.
- **The deliberate/accidental classification the old lane text called
"the lane's first task" is finished**, and it found THREE dispositions
rather than two: benches awaiting a job (`m10_2_perf`,
`m10_11_perf`), deliberately-manual operator tests
(`m10_11_acceptance`), and known-defect markers. Collapsing the second
into the first would have given a CI job to tests whose `#[ignore]`
reason says not to.
- **`m10_10_perf` is NOT a perf gate**, and the framing got this wrong
first. Its header says its bounds are "generous ... to catch
catastrophic regressions, not to verify a tight perf claim," so its
lack of `#[ignore]` is the design. Adding one to give it a job would
have shipped a coverage reduction inside a coverage lane. It stays
untouched and rides the plain leg.
- **The clippy obstacle is cleared, and the old inventory was stale in
both directions.** `cargo clippy --workspace --all-targets --features
crdt` had never passed. The previous seven-item list was correctly
labelled "a lower bound, not an inventory" — `--keep-going` is what
converts it. The real set was eight findings across four files; the
`unneeded mut` at `daemon.rs:4965` had been fixed incidentally, a
finding in `bottom_panel_stage2b_gpu_acceptance.rs` was new, and every
`daemon.rs` line number had moved.
- **One job, not two.** The fix-shape recorded here previously put the
GPU-requiring suites onto `gpu-render` "which already has lavapipe and
PMACS_REQUIRE_GPU". **That job runs `cargo test -p pmacs-gpu` — a
different package** from the four root-package suites, so co-locating
them means a new invocation rather than an extension. Splitting also
requires classifying every future suite as GPU-requiring or not, and a
misclassified one skips forever. `crdt-test` installs lavapipe and
sets `PMACS_REQUIRE_GPU=1` for the whole corpus instead.
- **`PMACS_REQUIRE_GPU` is not uniform and cannot serve as blanket
proof**: it appears in `vterm_stage3_acceptance` (twice) and
`bottom_panel_stage2b_gpu_acceptance` (once), and **not at all** in
`gpu_invocation_acceptance` or `gpu_initial_target_acceptance`.
- **The external-tool install block is deliberately not duplicated.**
Measured: it gates `m4_acceptance`, `m6_5_repl_acceptance` and
`m6_8_multi_repl_acceptance`, none of which has a single dark test.
The only tool-gated code in the dark set is `src/process.rs`, whose
two variables need no install.
- **Crdt clippy runs in `crdt-test`, not the `clippy` job.** The `clippy`
job matrixes over Lua flavor and never enables `crdt`, so clearing
those lints once would let them drift straight back and the next job
to compile them would be red on arrival — the exact state this lane
found.
- **Verification on the laptop (integrated Radeon, 16 threads), all at
the exact commands CI runs:** clippy green with and without `crdt`;
fmt; diff-check; `--lib` 1,896; `--lib --features crdt` 2,081; doc
tests; `m10_2_perf` 6/6 in 79s and `m10_11_perf` 1/1 in 5s under
release; and the full serialized sweep with `PMACS_REQUIRE_GPU=1` at
**3,715 passed / 0 failed / 30 ignored in 366s**, reconciling exactly
to the 3,746 census (3,715 + 30 + 1 basedpyright-skipped). The
reconciliation is the point: a sweep that does not reconcile is the
a37 vacuum at corpus scale.
- **What is NOT established, and it is the lane's whole remaining risk:**
the sweep is green *serialized on a developer machine*. The failures
this lane expects are hosted-runner timing and concurrency — real PTY
on CI runners, wgpu under lavapipe, daemon sockets at unfamiliar
concurrency. A green local run removes the "tests are wrong"
explanation and leaves the expected one untested. **Do not quote it as
evidence the CI leg will be green.**
- **Red-first-run policy, decided:** fix in-lane by default, with one
escape hatch keyed on cause class. Lane-configuration failures and
locally-reproducing failures are fixed here; an environment-only
failure (green locally and on Universum, red only on a hosted runner)
becomes a named follow-on rather than an unbounded investigation
inside a workflow-config PR. The local green makes that third class
the most likely red, which is why the hatch exists.
- **Universum (7900 XTX, remote) is where the GPU ambiguity settles.**
The laptop renders the GPU suites but is thermally constrained, which
is the documented condition for a37's "all spaces with nonzero
rendered_nonuniform_frames" signature. Universum can establish the
tests are sound; it cannot establish that the lavapipe CI job passes.
Recovery from a clean checkout:
```sh
git fetch githubsucks
git worktree add ../pmacs-ci-crdt \
-b ci-crdt-coverage \
githubsucks/ci-crdt-coverage
```
- **MERGED as #209** (`main` @ `c5f7501`, 2026-08-01, two review rounds),
framing `docs/ci-crdt-coverage-framing.md` revision 5. The lane had sat
under "NEEDS A LANE" with no branch and no owner since #166.
- **CI compiles and runs the CRDT corpus for the first time.**
`Test (crdt)` runs **3,766** tests where none ran before;
`M10 Perf Gates (crdt)` covers two suites no workflow had ever named;
`cargo clippy --features crdt` is enforced going forward rather than
being a required local gate that rots in CI. **275 of 279 dark tests
recovered**, the other four excluded with stated reasons.
- Branch `ci-crdt-coverage` retained; it carries nothing unmerged.
### Still owned by this lane, not yet done
- **The macOS `crdt` leg.** Deliberately ubuntu-only at first, "decide
about macOS from evidence." **That evidence now exists** and is
favourable: the non-crdt macOS legs pass at 3,474 (thirteen fewer than
ubuntu's 3,487 — `cfg`-compilation of the Linux-gated process tests,
not lost coverage), and no crdt-specific failure appeared anywhere.
This is now a small, decidable addition rather than an open question.
- **The `--lib --features crdt` flake.**
`process::tests::setsid_escapee_is_not_reaped_and_teardown_reclaims_readers`
failed ~1 run in 5 with `active_reader_probe` returning `None`. **It
did not reproduce in this lane's runs** — `--lib --features crdt` was
2,081/2,081 and the full serialized sweep was clean — but a
non-reproduction under serial execution is consistent with the
leading hypothesis rather than evidence against it: the trigger was
observed under *parallel* full-suite load, and every run here was
`--test-threads=1`. The `drain_until` explanation (draining for
`Started` also ticks, and a tick can reap the leader before the
following probe) remains an inference from control flow, not a
falsified root cause. Discriminating it is its own PR — it is a
product-defect hypothesis and everything else here is workflow
configuration.
failed ~1 run in 5 with `active_reader_probe` returning `None`.
**It did not reproduce in #209's runs**`--lib --features crdt` was
2,081/2,081 and the full serialized sweep clean — but that is *not*
evidence against the hypothesis: every run was `--test-threads=1` and
the trigger was observed under **parallel** full-suite load. The
`drain_until` explanation (draining for `Started` also ticks, and a
tick can reap the leader before the following probe) remains an
inference from control flow, not a falsified root cause. **Its own
PR** — a product-defect hypothesis, where everything in #209 was
workflow configuration.
- **`InstanceCapabilities::crdt_replica`'s serde default.**
`#[serde(default = "default_true")]` is a *third* default mechanism,
unconditional, and therefore disagrees with the `Default` impl in a
non-CRDT build. Exercising it needs a self-describing format and
`pmacs-protocol`'s only serde dependency is postcard, which is not
one. Adding `serde_json` as a dev-dependency to test a divergence
#209 did not introduce was refused as scope creep. Parked, not
forgotten.
- **The two unattributed CRDT failures from #178's round-2 gating.** No
test names were captured, so there is nothing to reproduce.
- **macOS.** Ubuntu-only first, deliberately; a macOS `crdt` leg is a
follow-on decided from the first run's evidence.
Recovery, only if a follow-on needs the branch:
```sh
git worktree add ../pmacs-ci-crdt \
-b ci-crdt-coverage-followup \
githubsucks/ci-crdt-coverage
```
## Discovery lane (P4) — STAGE 1 MERGED (#207); STAGE 2 IS NEXT

View File

@ -1,6 +1,11 @@
# Agent handoff — cross-machine continuity
**Last updated: 2026-08-01 (CI CRDT coverage lane opened on `ci-crdt-coverage`; development moved to the laptop). Previously 2026-07-29, as bottom-panel Stage 2B-3 — the GPU panel
**Last updated: 2026-08-01, as the CI CRDT coverage lane #209 — the
first time CI has ever compiled and run the `crdt` half of the test
corpus, closing a gap that left 279 tests (including a REQUIRED
`CLAUDE.md` gate) unexecuted for the project's whole life. Development
moved to the laptop in the same session; the docs absorption #208 sits
beneath it. Previously 2026-07-29, as bottom-panel Stage 2B-3 — the GPU panel
band, compatible protocol-v21 activation, and the negotiated
`panel_capable` flip, completing Arc 7 Stage 2 — opens atop `e003b81`.
Beneath it, bottom-panel Stage 2B-2 (#187) — the
@ -60,13 +65,58 @@ commands, read `docs/active-work.md` immediately after this file.
## 1. Where the project stands (2026-08-01)
- **`main` @ `cfc1710`.** Nine PRs landed since the previous anchor, in
- **`main` @ `c5f7501`.** The CI CRDT coverage lane #209 lands atop the
docs absorption #208 and `cfc1710`. Beneath that, nine PRs landed in
this order: the ledger absorption #199, the process-signal diagnostic
#200, the test ambient-root isolation **framing** #201, the
reap-ledger diagnostic #202, Journey Stage **1b-1** #203, **1b-2**
#204 and **1b-3** #205, the ambient-root isolation **implementation**
#206, and discovery Stage 1 #207. Each has its own bullet below; this
line is the head-of-`main` anchor and nothing else.
- **CI runs the CRDT half of the corpus for the first time — #209.**
`.github/workflows/ci.yml` had never enabled the `crdt` feature, so
every `#[cfg(feature = "crdt")]` test was **not compiled** — not
skipped, not filtered, not reported. **279 tests had never executed in
CI, 186 of them in the library**, behind the
`cargo test --lib --features crdt` invocation `CLAUDE.md` lists as a
**required** pre-PR gate: a required gate CI had never run. `Test
(crdt)` now runs 3,766 tests, `M10 Perf Gates (crdt)` covers two
suites no workflow had named, and `clippy --features crdt` is
enforced. **275 of 279 recovered**; the other four are excluded with
stated reasons. Five durable facts, each of which contradicted
something previously recorded:
- **`gpu-render` runs a DIFFERENT PACKAGE** (`cargo test -p
pmacs-gpu`) from the root-package GPU suites. The long-recorded fix
shape — "move the GPU-requiring crdt suites onto `gpu-render`, it
already has lavapipe" — does not work as written. One job covers the
whole corpus instead, which also cannot develop the hole splitting
invites: a suite added later would otherwise land in the job needing
no GPU and skip there forever.
- **`PMACS_REQUIRE_GPU` is not uniform.** Present in
`vterm_stage3_acceptance` (×2) and `bottom_panel_stage2b_gpu_
acceptance` (×1), **absent entirely** from `gpu_invocation_
acceptance` and `gpu_initial_target_acceptance`. It cannot serve as
blanket proof the GPU suites ran.
- **`m10_10_perf` is a CI-default regression tripwire, not a bench.**
Its header says its bounds are "generous … to catch catastrophic
regressions, not to verify a tight perf claim", so the *absence* of
`#[ignore]` is the design. Giving it a perf job would have shipped a
coverage reduction inside a coverage lane. Classifying the three
`_perf` suites by filename and marker counts got the one whose name
disagreed with its purpose exactly backwards.
- **`--keep-going` is what turns a clippy run into an inventory.**
Clippy abandons remaining targets at the first failure, so any
un-`--keep-going` list is a lower bound. The recorded seven-item
list was stale in *both* directions: one finding had been fixed
incidentally, one was new, and every line number had moved.
- **A feature can matter to a crate a per-test census scores as
unaffected.** `pmacs-protocol`'s `crdt` feature gates no tests — 17
either way — but changes `cfg!(feature = "crdt")` *expressions*
inside the capability defaults, so the same tests exercise different
runtime values. Worse, the crate's only use of those defaults was a
**transport round-trip, which is invariant to the values**: an
all-false default passes identically. Running code is not testing
it, and that gap survived the first review round.
- **Two arcs completed in that run, and their lanes are gone from
`docs/active-work.md` accordingly** (rule 4 removes a lane once its
arc is done *and* its facts are here): **Journey Stage 1** — 1a plus
@ -94,14 +144,10 @@ anchor, so every item is startable.
#### Open lanes (branch exists, work not finished)
- **CRDT half of the corpus is dark in CI — PR #209 OPEN, all 14 checks
green** (`ci-crdt-coverage`, `docs/ci-crdt-coverage-framing.md` rev 4;
opened 2026-08-01, awaiting user review). CI never enabled `crdt`, so
those tests were *not compiled*, not merely skipped — including 186
library tests behind a **required** `CLAUDE.md` gate CI had never run.
The first run reported **3,717 passed / 0 failed / 30 ignored** in
`Test (crdt)`, reconciling exactly to the census, so the job is
demonstrably not vacuous.
- **CRDT half of the corpus is dark in CI — FIXED, merged as #209.**
Now a lane kept only for three follow-ons (macOS leg, the `--lib
--features crdt` flake, the `crdt_replica` serde divergence). See the
arc bullet in §1.
**Re-measure before quoting a number**, and there is now a tool:
`scripts/feature-census luajit luajit,crdt`. Measured 279 dark at
`4223dd3`; 275 recovered, 4 excluded with stated reasons. Two
@ -422,7 +468,7 @@ someone forgot.
disagree — and it still establishes no identity, because it is read
inside the same read-then-act window and no portable mechanism closes
that for a *group* (`pidfd` covers a process; macOS has neither).
- **Discovery arc (P4) — Stage 1 IMPLEMENTED, PR open**
- **Discovery arc (P4) — Stage 1 LANDED (#207)**
(`docs/discovery-stage1-command-family-framing.md`, rev 6, three
review rounds). Eleven `help.*` commands over the existing registries,
indexed by `M-x help`. **§5 moves substrate-without-surface →
@ -453,7 +499,7 @@ someone forgot.
`src/help.rs:76` and one test. A preservation pin registers a
*raising* predicate and asserts the command still runs, so a stage
that starts evaluating must change that pin knowingly.
- **Journey arc (P1) — Stage 1b-3 IMPLEMENTED, PR open**
- **Journey arc (P1) — Stage 1b-3 LANDED (#205)**
(`docs/journey-stage1b3-welcome-framing.md`, rev 4, three review
rounds). The last of the 1b split. An unconfigured launch greets in
`*scratch*`; `M-x help` renders a cheat sheet. **§18 and the scorecard

View File

@ -1,8 +1,11 @@
# JSON + YAML grammars — framing (side quest, highlight family)
**Revision 4 — 2026-07-21. Status: PR #123 open and awaiting review;
the public and checkpoint branches are at fully gated `5c202c5`, rebased
onto `main` `f8096ff`.**
**Revision 4 — 2026-07-21. Status: MERGED as #123 on 2026-07-21.**
*(Status line corrected 2026-08-01: it read "PR #123 open and awaiting
review" for six weeks after the PR merged. The revision-4 body below is
the as-reviewed text and is left unedited.)* At review the public and
checkpoint branches were at fully gated `5c202c5`, rebased onto `main`
`f8096ff`.
The JSON provider and Red Hat YAML 1.24.0 have each passed their
PATH-gated pmacs acceptance, in addition to the deterministic fake-server
config-push proof and the YAML standalone protocol smoke.

View File

@ -4,8 +4,15 @@
"Deferred (named)" section, the handoff §6 consolidated list, the
`docs/roadmap-2026-07.md` arcs, and a code-level marker sweep
(src/, builtin/, pmacs-gpu/, pmacs-protocol/). **Updated 2026-07-15:**
multi-language injections shipped (#122) — item pruned to its remaining
follow-ups; north star and Jupyter gate revised.
multi-language injections shipped (#122).
**Pruned 2026-08-01.** This file had drifted six weeks and was listing
landed work as open — #123 as "PR open" (merged 2026-07-21), #137 as
"in review" (merged), and HTML/CSS as an unshipped grammar (#146). It is
the cross-cutting index, so a stale entry here sends someone to build
something that exists. **`docs/agent-handoff.md` §1a is the authority
for arc state; this file is the long tail.** Re-check an item here
against the handoff before starting it.
**Scope.** This is the *side-quest* backlog: self-contained,
frontend-agnostic-ish work that does **not** belong to the **themes /
@ -42,13 +49,14 @@ The direct continuation of the #114#118 grammar/detection stack.
(`<script>`/`<style>`, template literals, doc-comment code).
- ~~**Modeline detection**~~**SHIPPED as #132.** Bounded Emacs/Vim
metadata now precedes extension → filetype → filename → shebang inference.
- **JSON + YAML — PR #123 open.** Grammars and LSP configs exist on the
feature line; review fixes are preserved on
`json-yaml-handoff-2026-07-20`. A real YAML-through-pmacs smoke,
rebase, and full gates remain before review resumes. JSON is also the
prerequisite for the notebook path; see `docs/active-work.md`.
- ~~**JSON + YAML**~~**SHIPPED as #123** (merged 2026-07-21).
Grammars and LSP configs for both. JSON was the notebook path's
prerequisite, so Jupyter is now gated only on its own arc.
- ~~**HTML + CSS grammars**~~**SHIPPED as #146.** They also lit up
HTML's `INJECTIONS_QUERY` (`<script>` → js, `<style>` → css), so the
injection-consumer follow-up below is partly discharged.
- **More grammars for languages with neither grammar nor LSP** — ruby,
php, html, css, sql, etc.
php, sql, etc. (html and css are done; see above).
- **Grapheme / combining-mark awareness** in the text view
(`text_view.rs` skips zero-width marks).
- **Byte-accurate multibyte cursor placement**`move_active_cursor_to`
@ -120,7 +128,7 @@ The direct continuation of the #114#118 grammar/detection stack.
language-aware indent, per-language comment padding, and per-project
compile commands — the last three are now ordinary work, expressed as
a `buffer.after-load` hook calling `set_local`, not blocked work.
- ~~**Tab-width rendering parity**~~**IMPLEMENTED, IN REVIEW AS #137.** One fixed
- ~~**Tab-width rendering parity**~~**SHIPPED as #137.** One fixed
8-column constant now drives the core/TUI display-column paths, GPU rich-text
projection, and minimap widths. GPU expansion retains source-tab provenance,
so caret, hit, selection, and diagnostic geometry remain byte-correct through
@ -235,14 +243,14 @@ guides (visual, not color).
## North star (highest-leverage first)
**The original north-star items have shipped or reached review** —
multi-language injections (#122), the config registry (#127), JSON + YAML
(#123), mode-system wiring (#129), locals queries (#134), and tab-width
rendering parity (PR #137, review pending). The remaining board now
starts with the broader ranked arcs below rather than another unresolved
cross-frontend rendering invariant.
**Every original north-star item has now SHIPPED** — multi-language
injections (#122), the config registry (#127), JSON + YAML (#123),
mode-system wiring (#129), locals queries (#134), tab-width rendering
parity (#137), modeline detection (#132), and the HTML/CSS grammars
(#146) that were named here as the cleanest remaining one-shot.
Beyond those, the cleanest remaining one-shots in the highlight family are the
HTML/CSS grammars that light up more injection *consumers*; modeline detection
shipped in #132. The most-missed editing table-stakes remain **word-kills +
`C-SPC` set-mark**.
**This file no longer sets direction.** `COHERENCE.md` §20 carries the
priority order and `docs/agent-handoff.md` §1a carries the board; both
postdate this document and are audited. What remains here is the long
tail — genuinely useful, genuinely optional. The most-missed editing
table-stakes are still **word-kills + `C-SPC` set-mark**.