Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude/skills/release-video/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ Run the flow above. Read only the next action file.
## Transversal rules

- The plan lives in `aidd_docs/release-video/scenes.json`; the check and the renderer are in `assets/`, their tests in `scripts/__tests__/`.
- Show only what the product does; mark every invented demo value as an example on screen.
- Show only what the product does; mark every invented figure as an example on screen; a demo of text alone, plainly a session, needs no mark.
- A viewer may watch with the sound off and never read the release notes: the picture carries the message, the sound only makes it lively.
- Never reuse the audio of a published video: it carries that video's own sounds, which then play at moments that mean nothing here.
- Keep product choices with the user, music included: it is judged by listening, which is the user's.
Expand Down
23 changes: 15 additions & 8 deletions .claude/skills/release-video/actions/01-plan.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,25 @@ Cover every feature shipped since the last release with one scene, or one writte

## Input

The repository at the release candidate.
The repository at the release candidate, read again from the last release tag, never from the previous plan.

## Output

`aidd_docs/release-video/scenes.json` that `node .claude/skills/release-video/assets/check-release-video.js` accepts; the next step is [render](02-render.md).

## Process

1. **List.** Run the check. Each surface under "Scènes manquantes" needs a scene or a skip.
1. **List.** Read every commit since the last release tag, whatever its type: `git log <last-tag>..HEAD --no-merges`. Keep what a user would notice, a `refactor:` or `docs:` that changes how a skill behaves included. Then run the check: it sees only `feat:` commits, so it proves nothing is missing from those, not that the plan is complete. Each surface under "Scènes manquantes" needs a scene or a skip.
2. **Read.** Open the skill or command each surface names; take its real behavior, never a guess.
3. **Draft.** Fill the [plan template](../assets/scenes-template.json), one scene per surface, with the templates, rows and fields of [scenes.md](../references/scenes.md).
- Write every title, lead, tag and highlight in everyday words, outcome first: what changes for the user, not how it works. `Count tokens in Codex too` becomes `See what your AI costs, in Codex too`.
- Write every title, tag and highlight in everyday words, outcome first: what the user gains, not what the feature is or how it works. `Count tokens in Codex too` becomes `See what your AI costs, in Codex too`. A title that names a feature without saying what it brings is rewritten.
- A measured gain goes in the title as one figure computed from the scene's own before and after (`38% leaner Brainstorm for small models`); the scene carries no row of numbers beside it.
- Leave `lead` out: the picture must say it, a subtitle under the title competes with it. Add one only when a scene cannot be understood without it.
- Only the demo window shows real commands.
4. **Skip.** Move a surface to `skipped` with a reason only when a user would not notice it.
5. **Fixes.** List the `fix:` commits since the last release tag. A fix is worth a scene only when its before and after can be shown on screen; a fix that only makes figures or states more reliable has none. Group the ones that qualify into one `bullet-grid` scene; the usual outcome is no scene.
6. **Contributors.** Name who shipped the release with `gh api repos/{owner}/{repo}/compare/<last-tag>...next --jq '[.commits[].author.login] | unique'`. Drop bots, keep every human author whatever the type of the commit (a docs commit counts). Put the logins in one `contributors` scene, last.
7. **Intro.** Fill `intro.highlights`, the tags that name the release's big features, so that someone who never used AIDD sees at a glance what it brings: up to three, each a short clear sentence of five words at most, starting from what the user gets (`Telemetry now covers Codex`, not `Report by tool`). Leave `tagline` out: a phrase above the tags says less than they do. Take the facts from the release announcement, so the video and the message say the same thing.
6. **Contributors.** Name who shipped the release with `gh api repos/{owner}/{repo}/compare/<last-tag>...next --jq '[.commits[].author.login] | unique'`. Drop bots, keep every human author whatever the type of the commit (a docs commit counts). Add whoever opened an issue closed since the last tag: `gh api "repos/{owner}/{repo}/issues?state=closed&since=<last-tag date>" --paginate --jq '[.[] | select(.pull_request == null) | .user.login] | unique'`, because someone who reported what a developer then fixed shipped it too. Put the logins in one `contributors` scene, last.
7. **Intro.** Fill `intro.highlights`, the tags that name the release's big features, so that someone who never used AIDD sees at a glance what it brings: up to five, each a short clear sentence of five words at most, starting from what the user gets (`Telemetry now covers Codex`, not `Report by tool`). Leave `tagline` out: a phrase above the tags says less than they do. Take the facts from the release announcement, so the video and the message say the same thing.
8. **YouTube text.** Fill `youtube` in French, in the words of the published videos: `themes` name the release's themes, `programme` has one line per covered surface saying what it does, as in `compter ce que coûte votre travail, par tâche`. `assets/youtube-metadata.js` assembles the title and the description in their published layout.
9. **Judge.** Read the plan against [judge.md](../references/judge.md), which the check cannot do.
10. **Check.** Rerun the check until it passes, then show the plan and fold corrections.
Expand All @@ -30,12 +32,17 @@ The repository at the release candidate.
| Case | Pass |
| --- | --- |
| Uncovered feature | the check names it; the plan gains a scene or a skip |
| Skill changed by a `refactor:` or `docs:` commit | read from the log, not the check; a scene or a written reason |
| Plan left from the previous release | scenes rebuilt from this release's log; none kept because they were there |
| Skip without reason | the check fails; a reason is added |
| Release with no `feat:` commit | no video; plan left empty |
| Invented demo value | marked as an example in the scene |
| Invented figure | marked as an example in the scene |
| Demo of text alone | no mark: a session whose lines are plainly illustrative |
| `fix:` commits a user would notice | one grouped scene; internal ones left out |
| Contributor list | bots dropped; one `contributors` scene, last |
| Scene without a lead | refused on review: a viewer could not tell what it brings |
| Contributor list | bots dropped; commit authors and openers of closed issues; one `contributors` scene, last |
| Scene with a measured gain | one title carrying the figure, computed from the scene's own numbers; no figures row |
| Scene that needs a lead to be understood | the picture is redrawn until it says it alone; a lead is the last resort |
| Title that names a feature, not what it brings | refused on review; rewritten from the user's gain |
| Internal word or text over the limits | the check fails naming the word or the field and where it is |
| Theme split by another one | the check fails naming the theme; its scenes are brought together |
| Surface with no `programme` line, or a title over 100 characters | the check fails naming it |
Expand Down
2 changes: 1 addition & 1 deletion .claude/skills/release-video/actions/02-render.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,5 @@ Turn the accepted plan into the release video and look at it.
| Text that does not fit a window | seen on a frame, fixed in the plan, rendered again |
| Version typed on screen | the real release version, not a placeholder |
| Frame read with the sound off | the picture alone says what the release brings |
| Levels measured | the hook is loud, the bed about 10 dB lower under the scenes and the outro, the ending no louder than the bed, the interface sounds stand out of the bed |
| Levels measured | the hook is the loudest, the bed about 4 dB lower under the scenes and the outro, the ending no louder than the bed, the interface sounds stand out of the bed |
| Finished render | MP4 present, duration reported, nothing published |
8 changes: 4 additions & 4 deletions .claude/skills/release-video/actions/03-compose-music.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# 03 - Compose music

Write a new original 8-bit track when the current one tires or does not fit.
Write a new original track when the current one tires or does not fit.

## Input

Expand All @@ -12,17 +12,17 @@ What to change, in the user's words: slower, calmer, another mood.

## Process

1. **Shape.** Edit `assets/compose-music.py`: tempo, chords and levels, keeping the three parts of [sound.md](../references/sound.md).
1. **Shape.** Edit `assets/compose-music.py`: tempo, chords and levels, keeping the three parts and the bar lengths of [sound.md](../references/sound.md).
2. **Compose.** Run `python3 .claude/skills/release-video/assets/compose-music.py <out.wav>`; it needs numpy.
3. **Encode.** Run `ffmpeg -i <out.wav> -b:a 128k .claude/skills/release-video/assets/music.mp3`.
3. **Encode.** Run `ffmpeg -i <out.wav> -b:a 160k .claude/skills/release-video/assets/music.mp3`.
4. **Hear.** Render per [render](02-render.md) and give the user the MP4 and the track to listen to.
- Keep the track only on the user's word.

## Test

| Case | Pass |
| --- | --- |
| Script run | a wav of about 44 seconds, with hook, bed and ending levels printed |
| Script run | a stereo wav of about 27 seconds, with hook, bed and ending levels printed |
| Track used by a render | the measured levels keep the loud, calm, loud shape |
| Track from another video | refused: only an original composition is kept |
| User has not listened | the track is not declared good, only measured |
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ const withoutGitEnv = () =>
Object.fromEntries(Object.entries(process.env).filter(([key]) => !key.startsWith("GIT_")));

const MAX_TAGLINE_WORDS = 6;
const MAX_HIGHLIGHTS = 3;
const MAX_HIGHLIGHTS = 5;
const MAX_HIGHLIGHT_WORDS = 5;
const MAX_LEAD_WORDS = 14;

Expand Down
Loading
Loading