# A Release Video Skill From One Opus 5.5 Session

*Opus 5.5 built a release video pipeline in one afternoon of feedback, and I turned what it built into a skill anyone can install.*

> Last Thursday I asked my agent for release notes and a demo video for our weekly release. Opus 5.5 built its own pipeline to do it: HTML scenes rendered frame by frame, sound effects tied to on-screen motion, music composed to the scene timeline, and real product recordings cut into explained demos. The feedback turned into seven rules. The pipeline is now the release-video skill in COG v3.14.0, next to browser-use's video-use, which does the other half of the job.

Published: 2026-09-28 · Reading time: 6 min · Tags: agents, claude-code, video, release-notes, product-management, cog
Canonical URL: https://huytieu.com/blog/release-video-skill-opus-5-5/
Author: Huy Tieu (huytieu.com)

---

Every Thursday my team ships a release, and every Thursday somebody has to explain it. The release note gets written. The demo video usually doesn't, because recording, cutting and scoring a minute of video takes longer than writing the note.

Last Thursday I tried handing the whole thing to my agent. The prompt was the release-hygiene chore I run every week, plus one new line:

> Use your video skill to impress me with the release note. Similar to the attached video (from dwarves foundation) but more on katalon style on this website ...

There was no video skill. The session was running [Opus 5.5](/blog/fable-opus-5-opus-5-5-on-my-own-work/), and it built one.

```
  what came back, 2026-09-25

  release note  ------------------------------  Confluence + docs
  recap video   [#########################]     64.5 s, vertical
  demo 1        [#############]                 35.2 s, real recording
  demo 2        [###################]           51.5 s, real recording

  13 messages from me   252 tool calls   14 failed   ~2 h active
```

<figure>
  <video controls playsinline preload="metadata" poster="/assets/release-video/recap-poster.jpg" style="display:block;width:100%;max-width:360px;margin:0 auto;border-radius:8px;" src="/assets/release-video/recap-opus-5-5.mp4"></video>
  <figcaption>The recap Opus 5.5 made for our September 24 release, the fourth cut, with sound. 64.5 seconds, seven features, every sound tied to something moving.</figcaption>
</figure>

## What it built

The first decision was the interesting one. A language model can't watch a video. It can read one if the video is made of text. So the recap is an HTML page: one `section` element per scene, with timing written into attributes.

```html
<section class="scene" data-start="4" data-dur="7" data-enter="wipe">
  <h1 data-rise="0.4,0.6,40" data-sfx="whoosh,0.5">Saved <em>filters</em></h1>
  <div class="row" data-slide="2.6,0.5,-60" data-sfx="tick,0.45">Status is Failed</div>
</section>
```

A 170-line engine turns every frame into a pure function of time. `renderAt(3.2)` puts the page exactly where it should be at 3.2 seconds, so the renderer can split frames across six headless browsers and stitch them with ffmpeg. The same function lets the agent pull any single frame as a PNG. That is how it reviewed its own work: a contact sheet of stills at every scene midpoint, checked before paying for a full render.

```
  scenes (HTML)  -->  stills at midpoints  -->  look, fix, repeat
        |
        +--> render 30 fps across 6 workers --> recap.mp4
        |
        +--> data-sfx cues --> sfx-track.wav --+
                                               +--> mix, duck, -18 LUFS --> final.mp4
  music plan (sections = scenes) --> bed.mp3 --+
```

The demos went the other way. The agent drove the real product in a browser, recorded each feature end to end on a demo project, and composed the recording into a 1920x1080 clip: a browser-window frame, a caption per step, stretches sped up with the speed written in the caption, and an eased zoom plus a highlight ring on the moment that shows the feature working.

<figure>
  <video controls playsinline preload="metadata" poster="/assets/release-video/demo-poster.jpg" style="width:100%;border-radius:8px;" src="/assets/release-video/demo-automation-status.mp4"></video>
  <figcaption>One of the two explained demos: a real recording on my demo project, with step captions, a 2.5x stretch labeled in the caption, and the zoom and ring on the answer.</figcaption>
</figure>

[browser-use/video-use](https://github.com/browser-use/video-use), public since April, reached the same conclusion from the other side. It edits real footage by giving the model a word-level transcript, plus filmstrip images at decision points, the same move browser-use makes with a page's DOM. Opus 5.5 didn't use it. It arrived at the same principle for a different job: video-use cuts footage that exists, and this pipeline generates footage that doesn't.

## Feedback over the afternoon

The first cut was fast, loud and borrowed. Excerpts from what I sent back:

> The background music is just repeatedly , it should be sound effect of the animation itself ... Don't copy the idea from the other video ... for a lot of the animation and illustration, you use, I would say, incomplete lines, which is not really good because it seems to be low quality ... Also, the video is too fast. I cannot follow everything

While it was working on that I added one more: the number of pull requests, releases and bugs "is not meaningful to put in the video at all". The stats scene went.

Every one of those became a mechanism.

The looping music went away, and each animated element got a `data-sfx` attribute. A script reads every cue from the page and places the sound at that element's start time, so a card that pops in makes a pop and a list that ticks in makes ticks. Fourteen short effects were generated with ElevenLabs for it.

"Don't copy the idea" was about a radar chart. The reference video was for a tech-radar release, so a radar made sense there. In ours it meant nothing. The second cut draws each of the seven shipped features as itself, from the conflict check against the knowledge base to the automation-status field.

The incomplete lines were draw-on strokes that stopped part way. The rule became: shapes finish closed and whole.

Too fast meant 2 seconds per scene. The second cut gives each feature 6.5 to 8, long enough to read every line twice.

Then I asked for some music after all, and the first bed was boring. The fix was a composition plan with sections sized to the scenes: a quiet build under the title, a 120 BPM groove from the first feature so every scene change lands on a beat, a lift on the summary, a hit on the outro. Eight candidates were generated over the afternoon. The agent wrote a small script that compares two-second windows of each track and scores how much it repeats itself, and used it with a tempo and energy check to choose between candidates. Last came the demos, which I said were too fast on screens that had no explanation. They got step captions and slower payoffs. Two of the four features got a demo. The other two had nothing the recorder could reach on the demo project, so they stayed as screenshots in the note.

```
  cut 1   2 s scenes, looping music, radar copied, half-drawn lines, PR stats
  cut 2   6-8 s scenes, sfx from motion, feature-specific art
  cut 3   + quiet music bed          ("make a bit background music")
  cut 4   + 120 BPM sectioned score  ("more lively, scale with the video")
  demos   + captions, labeled speed-ups, zoom and ring on the payoff
```

## Why this worked on 5.5

In [the comparison post](/blog/fable-opus-5-opus-5-5-on-my-own-work/) the biggest gap between the models showed up on long, open-ended turns, where the model has to decide what to read, what to build and when it's done. This session was the extreme case. Thirteen messages from me produced 252 tool calls, and 14 of them failed, a 5.6% rate close to the 5.3% average I measured for 5.5. Most of those calls were things I would not have known to ask for: loudness measurement, a silence check on the final mix, a beat-phase check so the scene cuts land on the music, contact sheets of stills between revisions.

The part I noticed most was that it took the feedback literally and generally at once. My complaint that the music repeats produced a rule that sound comes from motion, and the code that enforces it, along with the new track.

## Now a skill

The pipeline sat in a release folder full of our brand colors and product names. Today I asked for it as a reusable skill with the company-specific parts removed, and it is now `release-video` in [COG](https://github.com/huytieu/COG-second-brain), the public version of my agent setup, at v3.14.0.

<figure>
  <img src="/assets/release-video/template-recap.gif" alt="A 22-second template recap: a title card, a saved-filters scene with three conditions ticking in, a rerun-time scene with a counter dropping from 12 to 4 minutes, and an outro card" width="360" loading="lazy">
  <figcaption>The starter template rendered with the skill's own scripts: four scenes, ten sound cues, 660 frames in about nine seconds.</figcaption>
</figure>

It ships the engine, the parallel renderer, the effects mixer, the music checker, the final mix normalized toward -18 LUFS, the demo composer, templates for scenes, demo specs and music plans, and the seven rules from the review above. Theme is a handful of CSS variables, so it carries no brand. For narrated footage the skill points to video-use and treats its own clips as B-roll there.

> Try: "Make a release video for this milestone. Record each shipped feature on the demo project first."

The same COG release adds `model_compare.py` to [slop-gate](https://github.com/huytieu/COG-second-brain/tree/main/.claude/skills/slop-gate), the script behind the comparison post, so you can replay your own Claude Code transcripts through the gate and see which model breaks your rules. And [no-ai-slop](https://github.com/huytieu/COG-second-brain/tree/main/.claude/skills/no-ai-slop) gets a section on what Opus 5.5 writes now that the em dash is gone: parentheses and semicolons.

Next Thursday is the first release where the video starts from the skill. I'll find out then how much of the afternoon was the pipeline and how much was the feedback.
