TEST: narrate in the claude-code-action job, publish that narration

1 hour ago

Until now, the job that published an explainer also narrated it. This change moves narration into the job where Claude writes the slides. Claude runs the narrate command, reads what the voice produced, fixes words it got wrong, and runs it again. The job that publishes then uploads that exact audio instead of making its own.

Ask about this presentation

Chapters

  1. 0:00Claude now narrates its own pull request explainer
  2. 0:21Claude can't publish, so the publish job has to be separate
  3. 0:45The write job prompt stops before publish and keeps the audio
  4. 1:09A new narrate command writes the same audio publish would
  5. 1:34The publish job downloads the folder and ships it as the repository
  6. 2:01The same change adds judged mode and a missing-key message
  7. 2:27Review the job split and the handoff first
Show transcript

Claude now narrates its own pull request explainer

The narration it judged is the narration that ships

Until now, the job that published an explainer also narrated it. This change moves narration into the job where Claude writes the slides. Claude runs the narrate command, reads what the voice produced, fixes words it got wrong, and runs it again. The job that publishes then uploads that exact audio instead of making its own.

Claude can't publish, so the publish job has to be separate

write job: Claude, no identity token and publish job: id-token write

The reason there are two jobs is that Claude Code Action removes the variables that mint the run's GitHub identity before Claude starts. So Claude can write and narrate, but it can't publish as the repository. Only the second job, on a fresh runner, holds the id-token write permission. It's the same split that PyPI trusted publishing and GitHub Pages use between building and publishing.

The write job prompt stops before publish and keeps the audio

spec to slides to plan to pronunciation-report to narrate to fix to repeat

The new workflow file prompts Claude to run every step of the present skill except login and publish. It checks pronunciation and narrates with the Kokoro voice af heart, then judges the result: warnings, words held too long, slides that run long. It edits, runs both checks again until they're clean, and leaves the audio folder next to the slides. The whole folder is uploaded as an artifact.

A new narrate command writes the same audio publish would

present.mjs narrate --html index.html --voice kokoro:af_heart

The present script gains that narrate command. It needs no account, requires a voice so the audio matches what publish will use, and refuses cloned voices because those depend on the account. It prints each slide's duration, word timings and any pronunciation warnings. Publish then checks the voice and speed, and if they match, it uploads the saved audio. Only slides whose text changed are synthesized again.

The publish job downloads the folder and ships it as the repository

download artifact to check to narrate-and-publish to comment

In the publish job, a new step copies the downloaded folder to where the agent's output would normally be, so the existing structure check and publish step run unchanged. Publishing now defaults to the repository's own OIDC identity unless Bisque keys are present. Private repositories get private visibility instead of unlisted. A failed publish retries once after thirty seconds, and content problems publish as warnings.

The same change adds judged mode and a missing-key message

when: judged and missing-key.ts and plugin marketplace files

Alongside that, the action gets a when input. With judged, the model first decides whether a pull request is worth explaining, and a skipped run says why. There's a clearer message when the model key is missing, the watch-link comment code is reworked, and the repository now carries its own plugin marketplace files with the watch, video and bisque-say skills. Those are side work; the narration handoff is the part to review.

Review the job split and the handoff first

Pull requests from forks run without secrets, so only same-repo branches get one

A few limits to keep in mind. Pull requests from forks run without secrets, so this explains branches in the same repository. Narration is only reused when the voice and speed match, otherwise publish narrates again. I read the workflow, the action steps and the narrate command closely, and skimmed the new tests and skill documents. Start your review with the workflow file and the step that copies the presentation.

What happened in AI today, in your inbox

One short email each evening. Read it and you’re caught up.

Built in New York with ❤️