✔ S1: `/goal x`, with leading spaces or a tab, refuses text-policy at admission; zero engine bytes (27.653093ms) ✔ S2: every prefix pinned Pi interprets is refused, from the list the code uses; the rest reach the engine exactly (19.870659ms) ✔ S3: `/goal` on the second line is pinned from the source: Pi checks only index 0, so it is admitted and sent exactly (13.928605ms) ✔ S4: a `/` left in the composer is cleared when control transfers and returns; the next submit sends only the new text (25.619289ms) ✔ S5: an observer terminal gets a paste then Enter, as send-message.sh does: not admitted: controller, nothing sent (13.457877ms) ✔ S6: a mediated-shaped registration (no tmux) passed to the board's replyToRow: 409 no tmux session; exec never runs (0.426276ms) ✔ S7: ESC, bracketed-paste markers and U+2028/U+2029 travel as one JSON string; the engine receives the exact text in one record (19.510677ms) ✔ P3: a Pi confirm, select, input or editor dialog is shown disabled with a reason and never answered (124.140672ms) ✔ E1: send, ack, user, toolCall, toolResult, final answer: shown once, no refresh, draft and reading position kept (30.560467ms) ✔ E2: U+2028, U+2029 inside JSON strings and CRLF line ends each parse as one record, on the splitter and through the controller (14.034126ms) ✔ E3: a multipart final, two blocks, null request correlation and duplicate delivery (25.026727ms) ✔ E4: a page read after message_end but before its entry is persisted: marker at the seam, re-read after run-settled, each message once (24.936416ms) ✔ E4: a gap or a new epoch also reconciles; nothing is concatenated across a gap (10.419815ms) ✔ E5: an unknown native event gives no client event; evidence records its type and bytes; the terminal count goes up (23.165412ms) ✔ E6: a tool result delayed across a pause and a reconnect is reconciled without a manual refresh (38.885433ms) ✔ E7: the terminal renders the same stream as the library client, as observer and then as controller, and submits only as controller (35.446877ms) ✔ terminal: engine control characters are made visible; a lost connection refuses submit (18.65797ms) ✔ terminal: outcome unknown is shown as such, with no resend offer, and nothing is resent (0.441355ms) ✔ terminal: text after Enter in the same input chunk starts the next message; it never joins the one submitted (0.28447ms) ✔ terminal: a paste-start marker split right after its ESC still opens the paste; the Enter inside it never submits (0.324686ms) ✔ terminal: Ctrl-T then Enter in one chunk is judged after the takeover, as if typed one key at a time (Filbert F2, #1507) (0.494799ms) ✔ terminal: input held behind Ctrl-T waits for that takeover while an earlier action is still pending (Darkwing T1 on #1522) (31.085386ms) ✔ terminal: a hold inside held input holds again, and once it is drained later input and Ctrl-C still reach the terminal (Darkwing note 1 on #1522) (0.57979ms) ✔ terminal: an action that throws still releases the input held behind it, in order, then rethrows (5.850133ms) ✔ terminal: after an action throws, later input still runs; input() puts the error in the status line (Filbert N1 on #1522) (0.446367ms) ✔ terminal: input() reports an error when it happens, so it never overwrites a later status; held input's promise doesn't carry the holder's error (Filbert N4 on #1522) (0.349162ms) ✔ terminal: invisible and bidi characters are made visible; head, status and notice lines stay one line (0.103951ms) ✔ every record these fixtures produced is a valid CHAT-01 record (E5: no record fails the schema) (221.414486ms) ℹ tests 28 ℹ suites 0 ℹ pass 28 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 2535.684165