Finding
parse_date_stem() slices &stem[..10] (line 557) and &stem[..8] (566) guarded only by byte length, not is_char_boundary, so a podcast filename with a multibyte UTF-8 char straddling offset 10/8 (e.g. '123456789é - Title.mp3') panics inside the spawn_blocking migration task, aborting the whole run and losing the summary while already-moved files stay moved (no rollback).
Evidence
crates/archon/src/migrate.rs:557,566. Surfaced by the 2026-07-03 deep-audit workflow (adversarially verified + Opus-judged).
Why this matters
A podcast filename with a multibyte UTF-8 character at the date-slice boundary panics the migration task mid-run, aborting the whole migration with already-moved files left in an inconsistent, unrecorded state (no rollback).
Desired correction
Guard the slices with stem.is_char_boundary(10)/(8) (or use stem.get(..10)) before calling looks_like_iso_date, returning None on a non-boundary rather than panicking.
Done when: the defect's failure mode no longer reproduces and a regression test covers it.
Finding
parse_date_stem() slices &stem[..10] (line 557) and &stem[..8] (566) guarded only by byte length, not is_char_boundary, so a podcast filename with a multibyte UTF-8 char straddling offset 10/8 (e.g. '123456789é - Title.mp3') panics inside the spawn_blocking migration task, aborting the whole run and losing the summary while already-moved files stay moved (no rollback).
Evidence
crates/archon/src/migrate.rs:557,566. Surfaced by the 2026-07-03 deep-audit workflow (adversarially verified + Opus-judged).Why this matters
A podcast filename with a multibyte UTF-8 character at the date-slice boundary panics the migration task mid-run, aborting the whole migration with already-moved files left in an inconsistent, unrecorded state (no rollback).
Desired correction
Guard the slices with stem.is_char_boundary(10)/(8) (or use stem.get(..10)) before calling looks_like_iso_date, returning None on a non-boundary rather than panicking.
Done when: the defect's failure mode no longer reproduces and a regression test covers it.