Skip to content

v1.4.2 — narrator-defined timed body beats

Choose a tag to compare

@marcushyett marcushyett released this 01 May 05:49
· 24 commits to main since this release

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

  1. timed-narration.ts asks Claude for the body as { beats: [{ startS, durS, text, captionText }, ...] }, sorted, non-overlapping, covering [0, masterDurS].
  2. normaliseBeats snaps the narrator's beats into a clean contiguous timeline (preserves text + proportional duration; first beat starts at 0, last ends at bodyDurS).
  3. The editor TTSes each beat separately, computes per-beat playbackRate (clamped 0.7–1.5×), builds one BodyChunk per beat.
  4. 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.