v1.4.2 — narrator-defined timed body beats
What changed
The body narration is back to per-beat audio, but the beats are now defined by the narrator instead of the editor. Each beat carries an explicit startS + durS chosen against the body-moment timeline, gets its own TTS file, and is placed at the narrator-declared timestamp. The spoken word lands exactly when the corresponding visual happens — anchored sync by construction.
Why v1.4.0/v1.4.1 was wrong
A single continuous audio file with a global playbackRate has no anchor to the visuals. Even when the narrator perfectly summarised the journey, the words landed at unrelated times — feedback was 'narration talking about something completely different' from what was on screen.
The new contract
timed-narration.tsasks Claude for the body as{ beats: [{ startS, durS, text, captionText }, ...] }, sorted, non-overlapping, covering[0, masterDurS].normaliseBeatssnaps the narrator's beats into a clean contiguous timeline (preserves text + proportional duration; first beat starts at 0, last ends atbodyDurS).- The editor TTSes each beat separately, computes per-beat
playbackRate(clamped 0.7–1.5×), builds oneBodyChunkper beat. - The compositor renders one
<Sequence>per chunk with its own<Audio>+<WordCaption>.
Badges for silent investigative moments keep the 1.4.0 standalone-Sequence model so they stay tied to the original tool-window timestamps regardless of beat pacing.
Bonus fix
The agent was recording ref=e123 (Playwright's internal handle) as the action target, so the narrator had no idea what was actually clicked. Switched the priority so the human-readable element description wins — narrations can say 'clicked Sign In' instead of 'clicked ref=e123'.
Versions
- CLI:
1.4.2 - Plugin:
1.4.2
v1 tag force-updated.