Switch four `&s[..N]` / `&s[..s.len().min(N)]` sites to `chars().take(N).collect::<String>()` so truncation lands on character boundaries instead of mid-codepoint. The agentic summary preview log was panicking when generated content hit an em-dash at byte 200; the few-shot passage cap, brief_json_args debug formatter, and a test assertion message had the same latent bug. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>