* docs(skills): make captions non-optional in changelog-video The Jul 13-20 build shipped without captions because the pipeline had two soft failure modes: - Empty vo-words.json from the TTS provider was silently accepted, so align-captions.mjs had nothing to align. captions.json was never produced. - Step 5 tolerated the master-skeleton's LINES array staying empty. The build lint-checked and validated clean, but the caption rail rendered no text. This adds three hard gates on top of the existing scaffold: - Step 4 adds a whisper forced-alignment fallback so a missing TTS timestamp payload no longer breaks the caption pipeline. Whisper only supplies timings; captions still use the DISPLAY layer from script-tokens.json. - Step 5 flags an empty LINES array as a shipped bug and shows the exact IIFE-input shape it expects. - Step 6 adds gate 5: sample 3-4 frames across the VO window and confirm visible caption text on each. If any spoken window renders no caption, the build is red. Anti-patterns table gets two rows covering the empty-LINES and missing-word-timings failure modes. .claude and .agents mirrors stay byte-identical. Follow-up to #2669 (pre-build gate); paired with the v5 rebuild that retrofitted captions onto the shipped Jul 13-20 video. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(skills): bump changelog caption size to 32px for phone-screen legibility 25px reads too small at 1080² when the video is viewed on a phone without zoom. Bumped to 32px (font-size 25→32, top 1002→990, height 40→52, alpha .92→.94) so captions carry across small-screen playback. Change is CSS-only on the master-skeleton; existing per-scene chrome and layouts are untouched. Retrofitted the Jul 13-20 v6 build with the same values (identical CSS block) so the shipped video and the future default match. .claude and .agents mirrors stay byte-identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(skills): sync caption position refs to top: 990 across SKILL.md + build-spec Miga caught: the master-skeleton bump to top: 990 / 32px / height: 52 was not reflected in the SKILL.md prose or build-spec.md. All three files now name the same values so the doc, gate, and code stay consistent. Also clarifies build-spec.md's caption-rail line to point at SKILL.md step 5 as the source of the LINES-populated requirement. .claude and .agents mirrors byte-identical. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * docs(skills): sync script-voice.md caption rail to top: 990 / 32px Third and final stale reference to top: 1002 / 25px — script-voice.md was still stating the pre-bump values. Now matches master-skeleton.html, build-spec.md, and SKILL.md. Also bumps the 'keep critical small text out' guidance from ~80px to ~100px to reflect the slightly taller caption rail. Full-directory sweep confirms zero remaining occurrences of 1002 or 25px across .claude/ and .agents/ skill mirrors. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Project-local Codex CLI skills
Skills in this directory are auto-discovered by Codex CLI (verified against
Codex 0.144.3) when the hyperframes repo is opened as the working
directory. They are NOT part of the marketplace-distributed plugin (that
set lives under skills/ and is manifested by .codex-plugin/). Two
separate namespaces, on purpose:
.agents/skills/— repo-native, run only against this repo (weekly changelog videos, doctrine-heavy authoring flows). Codex CLI's project-local skill dir.skills/— marketplace-distributable, installed into other projects vianpx hyperframes skillsornpx skills add heygen-com/hyperframes.
Weekly changelog video
The changelog-video skill turns a weekly changelog markdown into a
~45–60s branded 1080×1080 MP4 (motion-doctrine layout, Annie VO,
seam-gated cuts, caption rail). It ships pre-configured — fonts,
background pattern, house BGM, lexicon, and the align-captions script
all live inside changelog-video/. Its five dependency skills
(motion-doctrine, cut-the-curve, captions-overlay, seam-craft,
oversized-cursor) sit alongside so the router graph is complete on
clone.
Weekly usage:
- Regenerate the digest markdown for the target range:
bun run changelog:weekly --from YYYY-MM-DD --to YYYY-MM-DD(this only reads git; the--writevariant is what the docs cron uses). - In Codex CLI at the repo root, invoke
/changelog-videowith the generated markdown. The agent will present its script + visualization plan for review before rendering. - Accept, and the agent produces
weekly-changelog-<range>.mp4gated byhyperframes check(0 errors) +seam-gate verify(0 fail/warn).
TTS uses the tracked skills/hyperframes-media/scripts/heygen-tts.mjs
(no extra install needed). Runtime dependencies you need on PATH:
- Node ≥ 22
- HeyGen CLI ≥ 0.3.0, authenticated via
heygen auth login --oauth ffmpeg(for VO wav conversion + frame QA)- A headless Chrome for HyperFrames rendering (
hyperframes doctorwill point out the exact ask if it's missing)
The parallel set at .claude/skills/ is a byte-identical copy so
Claude Code users get the same auto-discover behaviour — keep the two
in sync when editing. A scripts/check-skill-mirror.mjs check enforces
this at CI time.