docs: dired Stage 2 framing rev 5 — re-scout against main @ 6bee09d
Rev 4 was scouted atc8ec8f3, which is dired Stage 1's own merge commit. Canonical main has moved 153 commits since. This is that re-scout. Every claim below was read on the tree at6bee09d, not inferred. Four dependencies arrived that rev 4 could not have known about: - #178 landed `Buffer::set_generated_contents`, and dired has NOT adopted it — the handoff §4 and COHERENCE §14 both name `dired.lua:371` in the non-adopter inventory. Dired pairs an erroring intercept with a bypass_intercept write over a still-writable rope, so `M-x buffer.undo` empties a listing today, with no keybinding needed. Stage 2 writes that buffer on every mark. New decision Q#DR25 adopts the primitive at the head of 2b, with acceptance items 48-49. - #182 (Journey Stage 1a) demoted dired to a replaceable slot (`pmacs.path.directory_handler`, deliberately not a hook subscriber) and rewrote `open_directory` around `pmacs.window.commit_to`, whose scope REFUSES an await. That constrains §9's serialize-and-await batch. - `tests/journey_acceptance.rs` is a declared ratchet (24 tests, "stages add rows, none removes them"), seven rows assert on dired, and #183 put the GPU row in `gpu_invocation_acceptance.rs` instead — so the ratchet is split across two files and both are gates now. - #179/#181's typed-edit chain: dired participates in neither it nor `buffer.after-edit`, and `set_generated_contents` fires no hook, so Q#DR25 does not drag dired onto the chain. The chain's lessons still bind §5's two NEW hooks. Seven of rev 4's own claims about pmacs were wrong: - W1 (load-bearing): §5 named `drain_external_cancelled` and cited `lsp.rs:1596`. Those are two different functions. `drain_external_cancelled` (:1561) is the unconditional server-scoped drain and is the right precedent; `drain_cancelled_externals` (:1596) is a per-tick token/timeout sweep. A rename flips no token, so following the line number yields a `forget_uri` whose drain half is a silent no-op and the awaiting coroutine hangs forever — the exact failure step 2 exists to prevent. - W2: there is no `fn restart`. The teardown is `start_generation` (:1307-1345), and there is a second precedent rev 4 never named, `LspManager::forget` (:3015-3042). Neither clears the 14 result stores, so rev 4's "surprising" note now holds twice. - W3: `ResponseRoute` has 15 variants, 14 URI-bearing; there are 16 insert sites, 15 URI-bearing. Rev 4's fifteen was a correct count of URI-bearing inserts and an incorrect count of sites. The purge predicate must retain `WorkspaceSymbol { query }` explicitly. - W4: `rec.uri` is read at 57 lines in lsp.lua, not "~20". - W5: the path-owner census has grown to SIX. `lean.lua`'s `M.file_progress` is a URI-keyed Lua module table in no Rust store, so `forget_uri` cannot reach it — independent evidence that the hook, not the Rust method, is the mechanism that scales. - W6: the ledger note named PR #169, which merged. #185 holds the durable records now. - W7: the C1 seam is at mod.rs:7104-7115, and mod.rs defines three `_tick` bindings in different classes. The 2a/2b/2c/Stage-3 cut was re-examined and holds unchanged; §16 adds the ownership warning that 2a overlaps editor_core.rs, lsp.lua and the URI-keyed LSP state with Journey Stage 1b and must not run concurrently with it. §0.5 now cites COHERENCE §20 Priority 1 and §14 by number, and records that #182 put dired on journey step 3 — a claim rev 4 could not make. Status is stated honestly: PROPOSED, never formally approved, and needing explicit framing approval before any implementation branch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Lv428Fth9LRtffwJSsqH7T
This commit is contained in:
parent
55122ba912
commit
8ddc8a7a5f