pmacs/tests
Levi Neuwirth 32064336ee
fix(gate): the guard never fired --- two shell bugs, now covered by tests
Four findings, all upheld, and the first was a live bug I shipped.

1. R-b's non-zero handling was unreachable. scripts/gate runs under
   `set -eu`, so the bare helper invocation killed the shell at exit 1
   or 2 and neither `sigint_status=$?` nor the refusal messages ever
   ran; an unexecutable helper would have escaped as raw 126/127 rather
   than boundary error 2. Reproduced before fixing.

   The first repair was ALSO wrong, and worse: `if ! helper; then
   sigint_status=$?; fi` captures the status of the NEGATED condition,
   which is always 0, so the gate printed the ignored diagnosis and
   then ran the entire suite. The working shape is `helper ||
   sigint_status=$?` --- failure handled, so `set -e` does not fire and
   `$?` is the helper's own --- which is the idiom the helper already
   uses internally. Statuses 1 and 2 pass through unchanged; everything
   else, including 126/127, maps to 2 at the boundary and is never
   reported as "SIGINT is ignored".

   The guard also moved to immediately after the worktree resolves,
   before any log directory, ambient root or tmpdir exists, so a
   refused run leaves nothing behind.

2. The behaviour had no durable coverage, which is exactly why 27
   passing gate tests missed both bugs. Four rows added: helper safe,
   helper ignored, helper error (and never ignored), and gate refusal
   before stage 1. Ignored-SIGINT is simulated with `trap "" INT`,
   which is the real mechanism --- SIG_IGN inherited across fork and
   surviving exec --- not a stand-in. Verified to bite: mutating the
   gate back to either shipped bug fails
   gate_refuses_to_start_when_sigint_is_ignored and nothing else.

3. The ledger now records the implementation, both bugs, the four rows
   and their mutation check.

4. A7 is recorded SATISFIED BY DISCLOSURE, which is the fallback
   revision 12 allows when no non-Linux unix is reachable. The earlier
   "stays open" contradicted the approved contract and is withdrawn.
   Tried: Linux x86_64, all three outcomes, all consumers. Not tried:
   every non-Linux unix. Claimed: POSIX shell only, no /proc, no
   sigaction --- labelled a contract argument, not a measurement.

The full default gate passes all eight stages foreground; it caught a
rustfmt violation in the new test code on the first attempt, which is
the guard-and-gate arrangement working as intended.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016bqGA6s9tTUFzYpbeW3tai
2026-08-19 16:19:06 +02:00
..
common test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
fixtures fix(process): pmacs.process.spawn REQUIRES a purpose — review blocker 2026-08-10 14:51:54 +02:00
support docs: record the pipe-masking gate trap in the handoff 2026-07-29 12:25:29 -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
ambient_isolation_acceptance.rs fix(isolation): the isolation suite must not itself be ambient 2026-07-31 19:46:18 -04:00
auto_indent_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
auto_indent_crdt_acceptance.rs fix(lint): make the crdt targets pass clippy for the first time 2026-08-01 09:38:36 -04:00
auto_pair_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
auto_pair_crdt_acceptance.rs feat(edit): auto-pairing (Arc 2) 2026-07-11 17:11:56 +01:00
autosave_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
bottom_panel_stage1_acceptance.rs test(panel): pin that the OMITTED default degrades on a pre-panel frontend 2026-08-03 11:16:08 -04:00
bottom_panel_stage2a_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
bottom_panel_stage2b_daemon_acceptance.rs fix(tests): eight version assertions the v22 bump broke, five of them defects 2026-08-07 20:15:33 +02:00
bottom_panel_stage2b_gpu_acceptance.rs fix(gpu,daemon): 1a review round 1 --- three P1s, and the version fallout 2026-08-12 17:05:55 +02:00
bottom_panel_stage2b_protocol_acceptance.rs fix(tests): eight version assertions the v22 bump broke, five of them defects 2026-08-07 20:15:33 +02:00
comment_toggle_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
compile_mode_acceptance.rs fix(process): pmacs.process.spawn REQUIRES a purpose — review blocker 2026-08-10 14:51:54 +02:00
compile_mode_crdt_acceptance.rs review round 1: the crdt suite Stage 3 missed, and two stale explanations 2026-08-04 12:08:28 +02:00
completion_popup_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
config_registry_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
cua_region_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
desktop_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
destination_capture_acceptance.rs test(window): pin the cross-frontend exception, and fix two ledger counts 2026-08-10 14:11:43 +02:00
dired_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
discovery_acceptance.rs fix(help): forwarders must work programmatically, not only from M-x 2026-07-31 20:31:00 -04:00
discovery_stage2_acceptance.rs fix: 1a review round 2 --- provenance was armed but never completed 2026-08-12 17:20:15 +02:00
editops_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
find_file_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
folding_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
folding_stage2_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
full_grid_resync_acceptance.rs fix(frontend): honor full_grid — the flag existed and nothing read it 2026-08-06 15:05:59 +02:00
gate_script_acceptance.rs fix(gate): the guard never fired --- two shell bugs, now covered by tests 2026-08-19 16:19:06 +02:00
git_status_stage1_acceptance.rs feat(git): adopt the destination capture --- P1a fixed, lane unblocked 2026-08-10 22:17:37 +02:00
gpu_font_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
gpu_initial_target_acceptance.rs Implement session-scoped GPU initial targets 2026-07-23 19:03:25 -04:00
gpu_invocation_acceptance.rs feat(gate,test): implement R-b + R-d --- the SIGINT deliverability guard 2026-08-19 15:46:57 +02:00
gui_stage1a_acceptance.rs test: A8's contrast waited for a prefix, not the sequence 2026-08-12 22:38:45 +02:00
gui_stage1a_wire_acceptance.rs test: 1a --- A8 raw PTY delivery, and the negotiated-v23 refusal 2026-08-12 21:29:48 +02:00
gui_zoom_acceptance.rs docs(zoom): the ties both round up, they do not oppose 2026-08-06 17:50:03 +02:00
horizontal_scroll_acceptance.rs docs(test): five adopters, four of them decorator families 2026-08-07 22:49:59 +02:00
injection_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
journey_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
kill_ring_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
lean4_server_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
lean4_stage1_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
lean_input_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
line_wrap_acceptance.rs fix(editor): the renderer never got the mode everything else was reading 2026-08-07 18:48:11 +02:00
listview_acceptance.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
long_line_readable_acceptance.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
lsp_dispatch_seams_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
lsp_latex_acceptance.rs fix(lsp): a `/` search boundary no longer disables the LaTeX marker walk 2026-08-10 10:48:49 +02:00
lsp_multi_root_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
lsp_spawn_guidance_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m3_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m4_acceptance.rs fix(tests): D3 round three --- two witness overclaims, and the CI red was a core-count assumption 2026-08-11 17:18:47 +02:00
m5_5_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m5_6_acceptance.rs Initial commit: v0.1.0 2026-05-03 19:51:06 -04:00
m5_7_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m5_8_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m5_perf_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m6_4_repl_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m6_5_repl_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m6_7_scrollback_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m6_8_multi_repl_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m6_perf_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -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 test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -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 test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -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 test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m8_3_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m8_5_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m8_6_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m8_7_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m8_9_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m8_10_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_1_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_2_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_3_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_4_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_5_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_6_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_7_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
m9_8_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -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 test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -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 test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
persistence_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
query_replace_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
resource_reconciliation_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
save_clobber_guard_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
statusline_segments_acceptance.rs fix(gpu,daemon): 1a review round 1 --- three P1s, and the version fallout 2026-08-12 17:05:55 +02:00
tab_width_acceptance.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
terminal_config_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
terminal_copy_mode_acceptance.rs feat(view): horizontal scroll, text and decorations together 2026-08-07 22:43:17 +02:00
theme_faces_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
typed_edit_chain_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00
vterm_stage1_acceptance.rs feat(workers): a required purpose on every job and process — worker identity Stage 1 2026-08-10 14:51:54 +02:00
vterm_stage2_acceptance.rs fix(test): retire R2 and R4 — two readiness predicates weaker than their assertions 2026-08-05 13:41:05 +02:00
vterm_stage3_acceptance.rs fix(gpu,daemon): 1a review round 1 --- three P1s, and the version fallout 2026-08-12 17:05:55 +02:00
worker_identity_acceptance.rs fix(process): name the surface a process purpose actually reaches 2026-08-10 14:51:54 +02:00
worker_shutdown_acceptance.rs test(isolation): migrate the corpus off the ambient roots 2026-07-31 18:48:45 -04:00