From 22d72fa7f703f6fcd2453e1cef8deee63a276d02 Mon Sep 17 00:00:00 2001 From: Levi Neuwirth Date: Sun, 9 Aug 2026 18:02:02 +0200 Subject: [PATCH] docs: record the LaTeX lane as implemented, step zero discharged MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Section-local edit to the lane's own block in `docs/active-work.md`. The heading moves from "BRANCHED, framing in review" to "IMPLEMENTED, gates green, no PR yet", and the §3 `.texlabroot` caveat is written up as discharged rather than merely resolved: what texlab actually does, how it was observed, and the one place the framing now reads stale. The substantive finding recorded here is not "the marker works". It is that texlab's own root walk only sees markers belonging to documents already in its workspace, and the workspace comes from the folders the client supplies — so texlab honours the root pmacs hands it and never corrects a too-narrow one. That makes `config.latex.root` the project scope rather than a hint, which is worth carrying forward whether or not anyone rereads the framing. Also recorded: the shared-`CARGO_TARGET_DIR` trap, because a bare `cargo test` in this worktree fails with compile errors from a sibling lane's code and reads exactly like a broken branch. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai --- docs/active-work.md | 89 ++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 17 deletions(-) diff --git a/docs/active-work.md b/docs/active-work.md index 7be4ce1..d279c33 100644 --- a/docs/active-work.md +++ b/docs/active-work.md @@ -265,7 +265,7 @@ also removed: this branch's "R8 NEEDS A LANE" investigation block, and durable facts are in the retired registry row and the handoff §6 census. -## LSP LaTeX coverage — BRANCHED, framing in review +## LSP LaTeX coverage — IMPLEMENTED, gates green, no PR yet **Written with the lane's first commit**, per the standing correction from #171 and #215. @@ -278,9 +278,10 @@ authoritative tip** — the ref, not a SHA. Recover with - **Framing `docs/lsp-language-coverage-framing.md`, revision 2 — IMPLEMENTATION AUTHORIZED 2026-08-09**, after a summary of its four corrections rather than a findings round on the document itself. - Recorded that way deliberately: **the §3 `.texlabroot` verification - caveat is still live and binding**, and is step zero of the work, not - a footnote it can be read past. **Revision 1 was UNTRACKED on `main` in one checkout** and + Recorded that way deliberately: the §3 `.texlabroot` verification + caveat was live and binding, and was step zero of the work rather + than a footnote it could be read past. **It is now discharged — see + below.** **Revision 1 was UNTRACKED on `main` in one checkout** and therefore did not travel; committing it here is the fix. - **Scope: one `pmacs.lsp.config.latex` entry plus its root resolver.** `texlab` 5.25.1 is installed and unused; a `.tex` buffer highlights @@ -300,19 +301,73 @@ authoritative tip** — the ref, not a SHA. Recover with read `COHERENCE.md:1669` ("first slice in flight") when `:124` and `:867` both record multi-root affinity as **merged (#161)**; that line contradicts the same document twice and wants a separate fix. -- **Q#LX2 (the LaTeX root) is answered, with a caveat that must be - discharged first.** An upward marker walk — `.texlabroot`, - `latexmkrc`/`.latexmkrc`, `Tectonic.toml`, then the file's own - directory — through `config.latex.root`, which already accepts a - resolver function (`lsp.lua:543`). **`.git` is deliberately excluded**: - a repo root is the wrong answer for LaTeX, and it is the one place - copying the other fourteen entries' instinct is actively wrong. - **Whether texlab honours `.texlabroot` is UNVERIFIED** — only its - version and CLI were checked, and the CLI exposes no such surface. - Confirm against a live session before implementing; if it is not a - real marker, the walk starts at `latexmkrc`. -- **Gates:** `scripts/gate --acceptance `. No - `--protocol` — a config entry, no wire. +- **Q#LX2 (the LaTeX root) is answered.** An upward marker walk through + `config.latex.root`, which already accepts a resolver function + (`lsp.lua:543`), falling back to the file's own directory. + **`.git` is deliberately excluded**: a repo root is the wrong answer + for LaTeX, and it is the one place copying the other fourteen + entries' instinct is actively wrong. +- **STEP ZERO IS DISCHARGED — §3's `.texlabroot` caveat, by + observation.** Marker 1 **ships**, and the framing's premise for it + was corrected in the process. + - **`.texlabroot` is a real texlab marker.** texlab v5.25.1's + `crates/distro/src/language.rs` maps `.texlabroot`/`texlabroot` → + Root, `Tectonic.toml` → Tectonic, `.latexmkrc`/`latexmkrc` → + Latexmkrc; `ProjectRoot::walk_and_find` + (`crates/base-db/src/deps/root.rs`) walks ancestors testing all + three, innermost wins. The shipped marker set is **texlab's own**, + including the bare `texlabroot`/`latexmkrc` spellings the framing + did not list. + - **But texlab cannot apply that walk to fix a root pmacs gets + wrong**, which is the correction that matters. Each arm searches + `workspace.iter()` — documents ALREADY LOADED — and the workspace + comes from the folders the CLIENT supplies. Hand-driven LSP + sessions confirmed it: with `rootUri` at a `chapters/` + subdirectory, no marker above it (`.texlabroot` included) widened + texlab's view and its dependency graph never reached the parent + document; with `rootUri` at the marker directory the parent + resolved, marker present or not. **texlab honours the root it is + handed and never corrects a too-narrow one**, so what + `config.latex.root` returns *is* the project scope. That makes the + resolver the whole value of the lane rather than a nicety. + - **`args = {}` is also observed**, not assumed: bare `texlab` + answers `initialize` with `TexLab 5.25.1` over stdio, so the `run` + subcommand is not needed. + - **§3 therefore reads slightly stale** — it frames marker 1 as + conditional on texlab honouring the file, when the operative fact + is that texlab honours the *client-supplied root*. Worth a revision + 3 by whoever next touches the document; not smuggled into this + lane's commit. +- **`.git` exclusion needed more than omitting it from the list.** + `project_root_for` falls through to `pmacs.project.detect` when a + resolver returns nil, and **that** walk includes `.git` — so a + resolver declining on a markerless file would hand texlab the + repository root by the back door. The resolver therefore never + declines for a file that has a directory. Pinned end to end through + attach, with the same fixture asserting the shared detector really + would have answered the repo root. +- **Commit `a9ef37f`** — `builtin/runtime/lsp.lua` plus + `tests/lsp_latex_acceptance.rs` (14 tests, one per §6 bullet plus the + boundary and decline cases). No `settings`/`init_options` (Q#LX1); no + filetype mappings (§2, asserted both ways). +- **Gates: ALL GREEN** via + `./scripts/gate --acceptance lsp_latex_acceptance` — fmt, clippy, + lib, lib-crdt, the new suite, m4, gpu, the workspace sweep (115 + suites, zero failures), diff-check. No `--protocol` — a config entry, + no wire. +- **Seven mutations each fail the suite**: resolver declining on no + marker (6 tests), no marker walk (4), a redundant `filetypes.tex` + (1), boundary ignored (1), `io.open` truthiness so a directory counts + as a marker (1), marker set narrowed (4), command renamed with + opinionated settings added (1). +- **Trap for the next agent in this worktree:** this machine exports a + shared `CARGO_TARGET_DIR`, so a bare `cargo test` compiles against a + sibling worktree's artifacts and fails with errors from code that is + not in this tree. Use `scripts/gate`, or + `CARGO_TARGET_DIR="$(./scripts/gate --print-target-dir)"` for ad-hoc + runs. `scripts/gate`'s own header documents this; the failure looks + like a broken branch, which is why it is recorded here. +- **No PR opened**, by instruction. ## `scripts/gate --protocol` build step — **MERGED as #229** (`7cf4653`)