Claude now narrates its own pull request explainer
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
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
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
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
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
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
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.









