fix(dired): correct the reporting-channel claim #161 falsified

The module doc said an uncaught raise inside a `pmacs.async` coroutine
"goes to *errors*, not the status line". #161's COHERENCE finding shows
that is wrong, and in the worse direction: `pmacs.error` is never
defined in production, so `step()`'s guarded report is dead and the raise
falls through to a bare `error()` inside `pmacs._async.tick()` -- whose
result `EditorState::tick_async` discards with `let _ =`. The failure
reaches nowhere at all, and dired would look like it silently did
nothing.

So the per-coroutine `pcall` plus `pmacs.editor.set_status` is
load-bearing, not tidy, and the doc now says which channel is dead, which
is live, and that the acceptance suite observes the live one -- the
corollary COHERENCE draws from that finding.

The ledger records the integration, the reruns on the merged tree, and
the ops lesson that cost three CI runs: a conflicting PR has no merge
ref, so GitHub creates no `pull_request` run and nothing reports the
absence.
This commit is contained in:
Levi Neuwirth 2026-07-25 16:14:06 -04:00
parent bdd7611d0e
commit 08e2807fcc
2 changed files with 48 additions and 12 deletions

View File

@ -48,11 +48,28 @@
-- 3. EVERY LISTING IS ASYNC. `pmacs.fs.read_dir` is worker-dispatched, -- 3. EVERY LISTING IS ASYNC. `pmacs.fs.read_dir` is worker-dispatched,
-- so each command spawns a coroutine and the work after the first -- so each command spawns a coroutine and the work after the first
-- `:await()` resumes on a later tick --- outside interactive -- `:await()` resumes on a later tick --- outside interactive
-- dispatch. Two consequences: errors must be `pcall`ed and reported -- dispatch. Three consequences:
-- here (an uncaught raise inside `pmacs.async` goes to *errors*, not --
-- the status line), and `pmacs.window.*` calls made after the await -- * Errors MUST be `pcall`ed and reported here, and that is
-- act for the *ambient* active frontend, since interactive origin -- load-bearing rather than tidy. An uncaught raise inside a
-- does not survive the tick boundary. -- `pmacs.async` coroutine reaches `step()`, which reports through
-- `pmacs.error` --- a channel that **is never defined in
-- production** (`COHERENCE.md` §1.1) --- and so falls through to a
-- bare `error()` inside `pmacs._async.tick()`, whose result
-- `EditorState::tick_async` discards with `let _ =`. The failure
-- would not reach the status line, the `*errors*` buffer, or a log:
-- it would reach nowhere, and dired would look like it silently did
-- nothing.
-- * Reporting therefore goes through `pmacs.editor.set_status`, which
-- exists and which the acceptance suite observes --- the corollary
-- COHERENCE draws from that dead channel: report through a surface
-- a test can see, or the guard is indistinguishable from the
-- silence it was meant to fix.
-- * `pmacs.window.*` calls made after the await act for the *ambient*
-- active frontend, since interactive origin does not survive the
-- tick boundary; and `pmacs.editor.move_to_line` acts on the
-- ambient *buffer*, which is why every post-await re-seat is
-- guarded (see `seat_cursor`).
-- Emacs 28's dired-kill-when-opening-new-dired-buffer, as a setting -- Emacs 28's dired-kill-when-opening-new-dired-buffer, as a setting
-- rather than a hardcoded policy: buffer-per-directory accumulates -- rather than a hardcoded policy: buffer-per-directory accumulates

View File

@ -286,13 +286,32 @@ If it does not, stop and repair the remote/fetch configuration.
with `git checkout --`, which reverts to **HEAD** — so a fix must be with `git checkout --`, which reverts to **HEAD** — so a fix must be
committed *before* it is bitten. Round 1's fixes were briefly wiped by committed *before* it is bitten. Round 1's fixes were briefly wiped by
exactly that. exactly that.
- Verification on this branch: `cargo fmt --check` clean; strict workspace - **Canonical main integrated at `46a1b8f`** (multi-root LSP affinity
Clippy clean; 1,829 default + 2,006 CRDT library tests; dired acceptance #161), merged rather than rebased per the #135/#137 precedent so the
**25 default + 25 CRDT**; m8_1 10 / m8_2 15 / m8_3 32 unchanged; M4 121; review anchors stay addressable. Two things worth carrying:
required GPU 155; **isolated-`XDG_CONFIG_HOME` workspace sweep 3,189 - **A conflicting PR silently stops running CI.** GitHub builds
passed across 92 suites, zero failures**; `git diff --check` clean. The `pull_request` runs against the merge ref, which does not exist while
sweep needs the isolated config for the reason recorded in the the PR conflicts, so no run is created and nothing reports a
bottom-panel lane below. failure — the checks list simply stays as it was. Three pushes to
this branch produced no CI at all before the cause was found. Watch
`mergeable` on a long-lived lane, not just the check list.
- #161's own COHERENCE finding **falsified a claim in this lane's
module doc**: `pmacs.error` is never defined in production, so an
uncaught raise inside a `pmacs.async` coroutine does not reach
`*errors*` as the comment said. It reaches a bare `error()` inside
`pmacs._async.tick()`, whose result `tick_async` discards with
`let _ =` — i.e. nowhere. That makes dired's per-coroutine `pcall` +
`set_status` load-bearing rather than tidy, and the comment now says
so.
- Verification on the merged tree: `cargo fmt --check` clean; strict
workspace Clippy clean; 1,829 default + 2,006 CRDT library tests; dired
acceptance **25 default + 25 CRDT**; m8_1 10 / m8_2 15 / m8_3 32
unchanged; multi-root 13 (main's new suite, green under this lane's
`mod.rs` changes); M4 121; required GPU 155;
**isolated-`XDG_CONFIG_HOME` workspace sweep 3,202 passed across 93
suites, zero failures**; `git diff --check` clean. The sweep needs the
isolated config for the reason recorded in the bottom-panel lane
below.
- Coherence (framing §0.5, required since #163): serves `COHERENCE.md` §20 - Coherence (framing §0.5, required since #163): serves `COHERENCE.md` §20
Priority 1, which names this work explicitly; journey step 7's file half Priority 1, which names this work explicitly; journey step 7's file half
goes from no surface to a surface; **adds no interaction island** — keys goes from no surface to a surface; **adds no interaction island** — keys