A replay failure becomes useful when it names the exact snapshot path and prints a readable diff. A generic suite failure does not give the same next move.
The current replay harness already does that for a smoke mismatch. In the repository, the replay layer happens to be called Sinji. The role matters more than the name.
What the replay kept
The mismatch bundle preserves the surrounding chain instead of flattening the incident into "suite failed."
source_walkthrough: .tsqoba/sinji/walkthroughs/musha/repl_smoke/walkthrough.yaml source_cassette: .tsqoba/sinji/walkthroughs/musha/repl_smoke/cassette.yaml source_expected_snapshot: .tsqoba/sinji/walkthroughs/musha/repl_smoke/snapshots/03_after_assistant_turn.yaml actual_snapshot: .tsqoba/artifacts/sinji/.../actual_snapshots/03_after_assistant_turn.yaml mismatch_result: snapshot mismatch at termwright.snapshot.save step 16
One detail matters here. The mismatch run compares the in-memory actual snapshot against the bundle-local expected snapshot. The persisted actual_snapshot file comes from the paired --update-snapshots materialization run whose job was to leave the concrete actual artifact behind.
Why the terminal diff matters
The failing output from that replay was useful because it did not hide the mismatch behind a generic red line. It printed the changed text directly.
--- original +++ modified @@ -5,7 +5,7 @@ │ directory: /workspace/repo/.tsqoba/musha/…/workspace │ › Hello -• Hello from Sinji +• Hi from Sinji › <PLACEHOLDER> <FOOTER_LINE>
That is enough to show what drifted, where it drifted, and why the next move is to inspect the named snapshot instead of staring at an opaque suite failure.
Why bundle-local copies matter
The replay family is tracked in the repository: suite, walkthrough, cassette, and expected snapshots all exist as versioned materials. The dated replay bundle then carries local copies of the same chain so the red case can be inspected without mutating tracked fixtures.
That separation matters. It lets the repository keep its tracked replay family stable while still publishing one concrete mismatch package with local artifacts attached.
What changes after a named diff
A flat failure says that something drifted. A named diff says which snapshot drifted, which step produced the mismatch, which expected file was involved, and what text actually changed.
Replay still needs judgment. But once the exact snapshot and diff are named, the next move becomes clear: open the pair, inspect the drift, and decide whether the change is intended.
