diff --git a/COHERENCE.md b/COHERENCE.md index 8a71b90..97a0133 100644 --- a/COHERENCE.md +++ b/COHERENCE.md @@ -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 diff --git a/docs/active-work.md b/docs/active-work.md index 8d6d464..c7adaba 100644 --- a/docs/active-work.md +++ b/docs/active-work.md @@ -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: **, 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 diff --git a/docs/agent-handoff.md b/docs/agent-handoff.md index 291d8a7..15357ca 100644 --- a/docs/agent-handoff.md +++ b/docs/agent-handoff.md @@ -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 diff --git a/docs/json-yaml-framing.md b/docs/json-yaml-framing.md index e212bc1..a5bf238 100644 --- a/docs/json-yaml-framing.md +++ b/docs/json-yaml-framing.md @@ -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. diff --git a/docs/side-quest-backlog.md b/docs/side-quest-backlog.md index d103982..c066fe1 100644 --- a/docs/side-quest-backlog.md +++ b/docs/side-quest-backlog.md @@ -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. (`