pmacs/tests
Levi Neuwirth e1b859fd4f feat(generated-buffers): dired and listview adopt the authorized write
Stage 1 of generated-buffer immutability
(docs/generated-buffer-immutability-framing.md, revision 5). Closes the
two families the bug is reachable on WITHOUT `M-x`: `compile.lua` and the
search panel rebind all seven undo chords to a no-op, but `dired.lua` and
`listview.lua` rebind nothing, so a bare `C-/` emptied a listing and a
panel. The cheap half is also the exposed half.

An intercept is not read-only. `Buffer::undo` reaches the rope through
`ensure_writable` and never consults the intercept chain, so the
erroring-intercept-plus-`bypass_intercept`-over-a-writable-rope idiom
guarded the edit path and left the history path open. Rebinding chords
does not close it: `M-x buffer.undo` is dispatchable on every buffer in
the tree.

- `dired.lua`'s `paint` and `listview.lua`'s `render` write through
  `pmacs.buffer.set_generated_contents` — lift the lock, whole-buffer
  replace skipping intercepts, discard history, re-assert the lock, fan
  the `Edit` out. Zero `bypass_intercept` writes remain in either file.
- Both keep their named erroring intercept and `set_round_trip_input`.
  The layering at `terminal.lua:351-366` is unchanged: the rope lock
  protects the daemon copy, round-trip input protects a semantic
  frontend's own mirror, and neither substitutes for the other.
- Q#GB13 — `listview.ensure_panel` stops adopting a same-named foreign
  buffer. Ownership is the `panels` table; a collision disambiguates
  `<2>`..`<99>` and raises at the limit, matching `dired.lua:476-504`.
  This is a prerequisite of the lock, not a follow-up: the arc removes
  the `M-x buffer.undo` that was the only recovery from a clobber.
- Q#GB18 — `panels` becomes a compacting list keyed by identity. It was
  written under the requested name and read back under the actual name,
  which a disambiguated panel breaks: `RET`, `g` and `q` fail closed and
  silently, and `listview.open`'s capture guard fails OPEN, capturing a
  panel as its own `q` target — the chained-panel loop its comment says
  it prevents. Ships in the same commit as the disambiguation by the
  framing's ordering constraint.
- Q#GB6 — `EditorCore::notify_buffer_edit` clamps each window coordinate
  against its own post-edit bound, unconditionally. `cursor` is a byte
  position bounded by `Buffer::len`; `view_top` is a line index bounded
  by `TextView::line_count`, and a replace can grow in bytes while
  collapsing lines, so "the buffer shrank" is not a usable trigger. This
  fixes a shipped defect that reaches terminal copy mode.
- Q#GB16(a) — locking these families disables fold CREATION on them,
  because `document_bytes` is spelled `is_read_only()`. Accepted and
  stated rather than shipped silently; the status string now names the
  read-only lock instead of claiming "not a document buffer".

Acceptance: 10 new criteria in `listview_acceptance` (16 total), 6 in
`dired_acceptance` (31 total), 2 in `terminal_copy_mode_acceptance`.
Every criterion's falsifying mutation was run: 5 bite by revert against
`githubsucks/main`, 9 by a named one-line mutation.

Two framing corrections, both recorded in the tests rather than worked
around silently:

- Stage 1 criterion 5 is unreachable as written. `Buffer::apply_edit`
  (`src/buffer.rs:773`) and `begin_edit` (`:725`) call `ensure_writable`
  as their FIRST statement while the intercept chain runs later inside
  `apply_edit_inner` (`:1072`), so once this arc's lock is installed an
  ordinary edit can never reach the intercept. Restated at the one point
  where the two are distinguishable — the lock lifted — which is the
  state the intercept genuinely still covers.
- Criterion 7 cannot bite at the listview adopter. `listview.refresh`
  and `listview.open` both follow `render` with `window.switch_buffer`,
  which rebuilds the `TextView` from scratch and masks a dropped
  fan-out. `dired.revert` does not, so the dired half carries the bite;
  it fails under the mutation with the reported
  `assertion failed: end <= self.len()`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Lv428Fth9LRtffwJSsqH7T
2026-07-29 09:50:09 -04:00
..
common Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
fixtures V0.2-prerequisite pull-forward + M10.11 clean audit round 2026-05-18 10:31:31 -04:00
acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
auto_indent_acceptance.rs fix(edit): PR #109 round 1 — shared search invalidation, daemon anchor clear, bounded indent scan 2026-07-10 15:46:36 -04:00
auto_indent_crdt_acceptance.rs feat(edit): auto-indent on newline (Arc 2) 2026-07-10 12:11:05 -04:00
auto_pair_acceptance.rs test(edit): PR #110 round 3 — pin raw-byte predicate posture and top-level sets guard 2026-07-12 16:20:01 +01:00
auto_pair_crdt_acceptance.rs feat(edit): auto-pairing (Arc 2) 2026-07-11 17:11:56 +01:00
autosave_acceptance.rs fix(persistence): adopt clears the old owner's skip cache; failing sweeps are loud 2026-07-09 12:06:49 -04:00
bottom_panel_stage1_acceptance.rs fix(window): keep pmacs.window.buffer() infallible with no argument 2026-07-24 20:05:51 -04:00
bottom_panel_stage2a_acceptance.rs fix(panel): close Stage 2A review round 3 (2 P1) 2026-07-26 13:18:05 -04:00
bottom_panel_stage2b_daemon_acceptance.rs Close PR 187 review round 2 2026-07-28 21:30:50 -04:00
bottom_panel_stage2b_protocol_acceptance.rs Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
comment_toggle_acceptance.rs feat(edit): comment/uncomment toggle on M-; (Arc 2) 2026-07-09 22:56:44 -04:00
compile_mode_acceptance.rs feat(fold): Stage 2 — grid (daemon-rendered) collapse 2026-07-23 19:24:07 -04:00
compile_mode_crdt_acceptance.rs fix(compile): PR #113 round 4 — column-counted CR rewrites, alt-screen style resync 2026-07-13 17:55:08 +01:00
completion_popup_acceptance.rs fix(lsp): range-only providers, completion-accept boundary, exact codepoint classify 2026-07-09 20:48:08 -04:00
config_registry_acceptance.rs fix(config): reject wrongly-typed spec fields; make trim-on-save buffer-aware 2026-07-21 18:29:18 -04:00
cua_region_acceptance.rs CUA type-over is a single undo step (Q#U1) 2026-06-15 20:00:53 -04:00
desktop_acceptance.rs fix(persistence): reliable daemon gate, unarm, per-pane after-load 2026-07-08 22:27:24 -04:00
dired_acceptance.rs feat(generated-buffers): dired and listview adopt the authorized write 2026-07-29 09:50:09 -04:00
editops_acceptance.rs fix(edit): PR #111 round 1 — scalar-valid UTF-8, per-word capitalize, trim error reporting 2026-07-12 16:34:18 +01:00
find_file_acceptance.rs fix(find-file): review round 1 -- name the real test, pin two gaps 2026-07-25 11:33:46 -04:00
folding_acceptance.rs test(fold): address PR #142 review round 2 — pin the round-1 wiring 2026-07-23 14:25:28 -04:00
folding_stage2_acceptance.rs feat(window): window parameters, fixed extents, and the display policy 2026-07-24 13:53:14 -04:00
gpu_font_acceptance.rs test(font): wire acceptance suite + protocol/design docs (items 2-8, 15) 2026-07-18 11:46:44 +01:00
gpu_initial_target_acceptance.rs Implement session-scoped GPU initial targets 2026-07-23 19:03:25 -04:00
gpu_invocation_acceptance.rs Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
injection_acceptance.rs fix(injections): PR #122 round 2 — sibling precedence, observable cap, docs 2026-07-15 12:07:21 +01:00
journey_acceptance.rs fix(journey): honor the captured window, not the selected one 2026-07-26 18:20:02 -04:00
kill_ring_acceptance.rs fix(edit): exact effective-edit verification for kill/yank-pop 2026-07-09 20:40:48 -04:00
lean4_server_acceptance.rs fix(lsp): close round-six Lean fallback gaps 2026-07-25 22:32:48 -04:00
lean4_stage1_acceptance.rs feat(lean): the Lean 4 language server (Arc 8 Stage 3b) 2026-07-25 17:40:02 -04:00
lean_input_acceptance.rs fix(lean4): count fan-outs where a claim cannot skip the count 2026-07-26 17:15:24 -04:00
listview_acceptance.rs feat(generated-buffers): dired and listview adopt the authorized write 2026-07-29 09:50:09 -04:00
lsp_dispatch_seams_acceptance.rs test(lsp): gate the non-UTF-8 fixture on linux, not merely unix 2026-07-25 17:03:10 -04:00
lsp_multi_root_acceptance.rs fix(lsp): attribute a failing root resolver (COHERENCE §1.2) 2026-07-25 14:24:59 -04:00
m3_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m4_acceptance.rs test(m4): wait for a complete sink record, not a substring of one 2026-07-25 19:25:01 -04:00
m5_5_acceptance.rs Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
m5_6_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m5_7_acceptance.rs Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
m5_8_acceptance.rs tests: widen backoff timing signal 2026-05-25 13:32:54 -04:00
m5_perf_acceptance.rs Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
m6_4_repl_acceptance.rs Fix PTY final-output drain race 2026-05-04 09:44:30 -04:00
m6_5_repl_acceptance.rs tests: quarantine macOS PTY marker cases 2026-05-25 13:02:46 -04:00
m6_7_scrollback_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m6_8_multi_repl_acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
m6_perf_acceptance.rs tests: tune M6 hosted perf profile 2026-05-25 13:43:28 -04:00
m7_3_acceptance.rs Fix CI and Documentation issues 2026-05-04 10:19:19 -04:00
m7_5_acceptance.rs fix(packages): basename-collision reject, SHA-256 cache key, timeout thread join, commit→revision, dead-code (F-005/F-009–F-012) 2026-07-03 18:47:23 -04:00
m7_6_acceptance.rs fix(packages): basename-collision reject, SHA-256 cache key, timeout thread join, commit→revision, dead-code (F-005/F-009–F-012) 2026-07-03 18:47:23 -04:00
m7_7_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_8_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_9_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_10_acceptance.rs fix(packages): basename-collision reject, SHA-256 cache key, timeout thread join, commit→revision, dead-code (F-005/F-009–F-012) 2026-07-03 18:47:23 -04:00
m7_11_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m7_review_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_1_acceptance.rs Pin toolchain to 1.95.0 + mechanical clippy/rustc fixes 2026-05-18 11:38:57 -04:00
m8_1c_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_1d_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_2_acceptance.rs tests: stabilize hosted perf gates 2026-05-25 13:20:18 -04:00
m8_3_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_5_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_6_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_7_acceptance.rs M7 tail: package system, audit lint, lockfile, resolver 2026-05-07 16:50:37 -04:00
m8_9_acceptance.rs test(ci): diagnose the vterm PTY flake; drop the macOS outline budget 2026-07-24 10:34:36 -04:00
m8_10_acceptance.rs V0.2-prerequisite pull-forward + M10.11 clean audit round 2026-05-18 10:31:31 -04:00
m9_1_acceptance.rs T M4.5 async bridge: LSP requests settle async-runtime jobs 2026-05-18 19:36:17 -04:00
m9_2_acceptance.rs style: from_secs(1) for the m9_2 harvest wait (clippy duration units) 2026-06-10 12:07:08 -04:00
m9_3_acceptance.rs Collapse if-let nests into let-chains (MSRV-1.95 collapsible_if sweep) 2026-05-18 14:29:36 -04:00
m9_4_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m9_5_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m9_6_acceptance.rs fix(vterm): harden view anchors and interactive authority 2026-07-22 09:09:44 -04:00
m9_7_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m9_8_acceptance.rs M9 ship gate 2026-05-09 15:04:23 -04:00
m10_2_perf.rs M10.10 ship gate 2026-05-13 16:28:46 -04:00
m10_10_perf.rs M10.10 ship gate 2026-05-13 16:28:46 -04:00
m10_10_postcard_unknown_variant.rs M10.10 ship gate 2026-05-13 16:28:46 -04:00
m10_11_acceptance.rs M11.1: semantic-frontend protocol scaffolding (wire + capability) 2026-05-18 19:39:07 -04:00
m10_11_perf.rs M10.11: adversarial two-laptop acceptance + jitter; the M10 arc verified 2026-05-15 20:51:00 -04:00
m11_5_semantic_acceptance.rs Implement session-scoped GPU initial targets 2026-07-23 19:03:25 -04:00
mode_system_wiring_acceptance.rs Keep the v21 panel wire dark for v20 clients 2026-07-28 14:08:17 -04:00
overlay_reattach_acceptance.rs fix(panels): follow active buffer on semantic frontends; re-attach overlays on switch 2026-07-07 20:46:50 -04:00
persistence_acceptance.rs fix(persistence): symlink confinement, real test-inertness, view_top restore 2026-07-08 18:21:46 -04:00
query_replace_acceptance.rs fix(query-replace): pin the session to its origin buffer (wrong-buffer guard) 2026-07-08 17:07:08 -04:00
save_clobber_guard_acceptance.rs fix(save): refuse to silently clobber a file changed on disk 2026-07-09 14:12:45 -04:00
statusline_segments_acceptance.rs test(protocol): advance touched-suite ratchets to v21 2026-07-27 22:39:15 -04:00
tab_width_acceptance.rs feat(fold): Stage 2 — grid (daemon-rendered) collapse 2026-07-23 19:24:07 -04:00
terminal_config_acceptance.rs fix(terminal): close review round 1 on Stage 1 2026-07-25 21:47:37 -04:00
terminal_copy_mode_acceptance.rs feat(generated-buffers): dired and listview adopt the authorized write 2026-07-29 09:50:09 -04:00
theme_faces_acceptance.rs fix(vterm): harden integrated Stage 2 behavior 2026-07-21 21:38:08 -04:00
typed_edit_chain_acceptance.rs fix(typed-edit): close round-8 review on the consumer chain 2026-07-26 13:39:33 -04:00
vterm_stage1_acceptance.rs fix(vterm): harden integrated Stage 2 behavior 2026-07-21 21:38:08 -04:00
vterm_stage2_acceptance.rs test(vterm): gate terminal readiness on a file, not on host bytes 2026-07-24 14:27:21 -04:00
vterm_stage3_acceptance.rs Fix fixture-specific GPU probe completion 2026-07-28 15:28:14 -04:00
worker_shutdown_acceptance.rs fix(completion): address TUI-validation findings (LSP query gaps, scoping, prefix keys, window scope) 2026-07-07 16:54:14 -04:00