Martin Vogel
ad713bce93
fix(mcp): guarantee valid UTF-8 in tree-format output
...
Dry run 30206811293: macos-15-intel release smoke failed B3 with a
visibly correct 'semantic: 50' table — BSD grep returns no-match for
the ENTIRE output when any line carries a NUL, control byte, or
invalid UTF-8 (verified: printf poisoned input -> grep -qE fails), so
one bad byte in one row silently unmatches every anchored check.
Close the class at the emission choke point: control bytes and
invalid UTF-8 force the quoted form; quoting escapes controls as
\u00XX and replaces invalid sequences with U+FFFD (RFC 3629
validation, NUL-safe). Tool output is valid UTF-8 by construction.
Unit test proven RED-on-revert (raw bytes emitted) and green with the
fix. The smoke's B3 failure path now also dumps od -c bytes so a
future red names the exact byte.
Signed-off-by: Martin Vogel <martin.vogel.tech@gmail.com >
2026-07-27 01:05:12 +02:00
..
2026-07-10 09:12:40 +00:00
2026-07-18 01:26:08 +02:00
2026-07-26 14:01:08 +02:00
2026-06-05 21:53:25 +02:00
2026-06-05 21:53:25 +02:00
2026-07-13 01:50:03 +02:00
2026-03-15 22:37:34 +01:00
2026-07-23 00:53:41 +02:00
2026-07-13 05:21:55 +02:00
2026-07-13 01:50:03 +02:00
2026-05-30 18:26:44 +02:00
2026-07-11 03:28:32 +02:00
2026-06-29 09:45:28 -06:00
2026-07-22 17:48:20 +02:00
2026-07-06 16:39:25 +02:00
2026-07-24 16:08:42 +02:00
2026-07-13 01:50:02 +02:00
2026-07-14 21:13:52 +02:00
2026-07-13 02:00:32 +02:00
2026-07-14 21:13:52 +02:00
2026-04-01 23:22:44 +02:00
2026-06-07 18:29:05 +02:00
2026-06-06 22:16:04 +02:00
2026-07-18 15:26:38 +02:00
2026-07-23 17:36:00 +02:00
2026-05-19 22:47:53 +02:00
2026-07-16 19:20:46 +02:00
2026-07-23 17:35:23 +02:00
2026-07-21 15:32:15 +02:00
2026-07-21 15:32:15 +02:00
2026-07-21 15:32:15 +02:00
2026-07-18 11:48:59 +02:00
2026-07-21 15:32:15 +02:00
2026-07-18 01:26:08 +02:00
2026-07-18 01:26:08 +02:00
2026-07-18 01:26:08 +02:00
2026-07-21 15:32:15 +02:00
2026-07-23 17:36:00 +02:00
2026-06-23 06:38:45 +09:00
2026-06-23 06:38:45 +09:00
2026-03-25 09:28:11 +01:00
2026-07-10 09:12:40 +00:00
2026-06-07 13:00:55 +02:00
2026-07-15 23:43:52 +02:00
2026-06-07 12:35:53 +02:00
2026-06-08 22:55:23 +02:00
2026-07-16 18:19:54 +02:00
2026-07-16 01:21:45 +02:00
2026-06-05 21:53:25 +02:00
2026-07-02 00:37:52 +02:00
2026-06-22 23:51:49 +02:00
2026-03-15 22:37:34 +01:00
2026-06-05 21:53:25 +02:00
2026-07-08 00:05:19 +05:30
2026-06-07 19:13:01 +02:00
2026-06-07 19:13:01 +02:00
2026-06-07 19:13:01 +02:00
2026-06-27 16:23:26 +02:00
2026-06-07 20:05:24 +02:00
2026-06-07 20:05:24 +02:00
2026-06-27 16:23:26 +02:00
2026-07-08 00:05:19 +05:30
2026-07-03 20:16:39 +02:00
2026-05-21 22:52:16 +02:00
2026-07-24 16:08:42 +02:00
2026-07-23 17:36:00 +02:00
2026-07-23 00:53:52 +02:00
2026-07-17 22:32:53 +02:00
2026-07-19 00:42:19 +02:00
2026-06-22 22:04:31 +02:00
2026-07-18 13:48:06 +02:00
2026-06-02 18:52:37 +02:00
2026-06-02 18:52:37 +02:00
2026-06-03 01:33:25 +02:00
2026-07-16 17:37:46 +02:00
2026-07-08 00:05:19 +05:30
2026-07-18 14:38:07 +02:00
2026-06-28 13:05:05 +02:00
2026-07-04 14:34:26 +09:00
2026-03-15 22:37:34 +01:00
2026-07-21 15:32:15 +02:00
2026-07-18 01:26:08 +02:00
2026-06-08 22:55:23 +02:00
2026-06-07 18:29:05 +02:00
2026-07-27 01:05:12 +02:00
2026-07-26 00:55:24 +02:00
2026-06-12 02:17:39 +02:00
2026-07-24 16:08:42 +02:00
2026-07-23 18:58:53 +02:00
2026-07-24 16:08:42 +02:00
2026-07-08 19:13:25 +02:00
2026-07-03 19:57:01 +02:00
2026-07-09 14:09:39 -05:00
2026-07-09 22:32:26 +02:00
2026-07-24 16:08:42 +02:00
2026-07-21 15:32:15 +02:00
2026-07-18 01:26:08 +02:00
2026-07-18 01:26:08 +02:00
2026-07-23 17:36:00 +02:00
2026-05-09 15:44:09 +02:00
2026-05-09 14:16:15 +02:00
2026-07-12 14:51:02 +02:00
2026-07-10 21:07:11 +02:00
2026-06-23 13:52:08 -03:00
2026-07-06 18:32:50 +02:00
2026-05-08 22:26:56 +02:00
2026-07-18 11:48:59 +02:00
2026-06-24 03:15:36 +02:00
2026-07-13 04:17:58 +02:00
2026-07-18 01:26:08 +02:00
2026-07-06 19:32:03 +02:00
2026-06-28 21:57:35 -06:00
2026-07-25 01:01:03 +02:00
2026-07-25 00:37:05 +02:00
2026-07-13 11:43:00 +03:00
2026-07-18 13:31:18 +02:00
2026-06-24 12:54:45 +00:00
2026-03-20 20:32:38 +01:00
2026-07-18 01:26:08 +02:00
2026-07-03 20:16:39 +02:00
2026-07-13 02:00:32 +02:00
2026-07-17 22:32:53 +02:00
2026-07-13 01:48:29 +02:00
2026-03-24 23:48:23 +01:00
2026-06-24 20:33:52 +05:30
2026-07-21 15:32:15 +02:00
2026-03-24 23:48:23 +01:00
2026-06-12 10:51:11 +02:00
2026-06-10 12:11:02 +02:00
2026-07-21 15:32:15 +02:00
2026-07-23 00:53:41 +02:00
2026-04-06 14:34:07 +02:00
2026-07-27 01:01:49 +02:00
2026-07-23 00:53:41 +02:00
2026-07-24 16:08:42 +02:00
2026-06-05 21:53:25 +02:00
2026-07-21 15:32:15 +02:00
2026-07-26 22:37:48 +02:00
2026-07-21 15:32:15 +02:00
2026-06-06 19:48:48 +02:00
2026-07-24 16:08:42 +02:00
2026-03-24 23:48:23 +01:00
2026-04-15 23:56:03 +02:00