Storyboard Comparison Workbench
Turn storyboard alternatives into a reviewable web experience before spending time rendering final video. Treat the audio timeline as the master clock and every visual version as another mapping onto the same scene slots.
Default product decisions
- Provide a single-version preview and a synchronized comparison view.
- Use one audio element and one
currentTime value for every preview; never run independent players in comparison cards.
- Keep curated comparison presets read-only. Put uploads and subtitle edits in an explicitly labeled shared working version.
- When no login is requested, explain through the interface that anyone with the URL can view the site and anyone using the shared editor changes the same hosted state.
- Save named snapshots before restoring or replacing a shared working version.
- Export the selected version's images, original audio, SRT, and reproducible project manifest as one package.
- Prefer static frames and clean scene changes. The workbench is for visual decisions, not final encoding.
Workflow
- Inspect the project and choose the implementation surface.
- Reuse an existing site when one exists.
- If the project contains
.openai/hosting.json, use the available Sites building and hosting skills.
- For a new public workbench, use the available site-building skill rather than hand-rolling deployment infrastructure.
- Establish the shared timeline.
- Obtain the true audio duration; do not infer it from the last subtitle.
- Define stable scene IDs and contiguous start/end times.
- Normalize each storyboard alternative to the same ordered scene IDs.
- Read
references/data-contract.md, then create the JSON project manifest.
- Validate the inputs before building UI.
- Run
scripts/validate_project.py PROJECT.json.
- Fix missing images, inconsistent scene coverage, duplicate IDs, aspect-ratio mismatches, and cues beyond the project duration.
- Build preview and comparison modes.
- Render the active scene for the current audio time.
- In comparison mode, render the active scene from every selected version at that exact time.
- Make the timeline, scene thumbnails, subtitles, and play state all call the same seek function.
- Read
references/player-and-storage.md for the required playback state model.
- Add collaboration only to the requested scope.
- For review-only work, ship static read-only presets.
- For shared editing, store uploaded image bytes in object storage and project metadata/snapshots in a database.
- Keep public presets immutable even when the shared working version is editable.
- Treat “knowing the URL” as discoverability, not authentication or authorization.
- Add production handoff.
- Download the currently selected version, not an implicit default.
- Include scene files with stable numbered names, original audio, SRT, and a manifest recording timing and version metadata.
- Deploy and verify the hosted site.
- Validate a production URL, not only local development.
- Run
scripts/check_audio_range.py https://SITE/api/audio when audio is served through an endpoint.
- Complete every item in
references/validation-checklist.md, including real seeking while playback is active.
Non-negotiable playback safeguards
- Serve audio with HTTP byte-range support. A visually movable range input does not prove that media is seekable.
- A valid range request must return
206, Accept-Ranges: bytes, Content-Range, and the partial Content-Length; invalid ranges return 416.
- Use the scrubber's continuous input event so dragging previews the requested time immediately.
- After seeking, confirm the media element's actual
currentTime changed and stayed changed while the playback update loop continued.
- Do not let animation-frame state overwrite a requested seek with stale
currentTime.
Deliverables
Return:
- the deployed comparison URL;
- the reusable source project;
- the project manifest and version asset folders;
- storage and access-mode notes;
- validation results, including the range-response check and at least two non-zero seeks;
- instructions for adding the next storyboard version.
Do not claim the workbench is ready merely because the first frame plays. Version switching, synchronized comparison, subtitle timing, uploads when enabled, snapshots, asset export, and seeking all require explicit verification.
1---2name: storyboard-comparison-workbench3description: Build and publish a browser-based storyboard review workbench that plays multiple visual versions against one shared audio and subtitle timeline. Use when Codex needs to create a public link for comparing storyboards, add version switching or synchronized side-by-side playback, let collaborators replace scene images and save snapshots, export a final-production asset package, or fix playback issues such as an audio scrubber that jumps back to the beginning.4---56# Storyboard Comparison Workbench78Turn storyboard alternatives into a reviewable web experience before spending time rendering final video. Treat the audio timeline as the master clock and every visual version as another mapping onto the same scene slots.910## Default product decisions1112- Provide a single-version preview and a synchronized comparison view.13- Use one audio element and one `currentTime` value for every preview; never run independent players in comparison cards.14- Keep curated comparison presets read-only. Put uploads and subtitle edits in an explicitly labeled shared working version.15- When no login is requested, explain through the interface that anyone with the URL can view the site and anyone using the shared editor changes the same hosted state.16- Save named snapshots before restoring or replacing a shared working version.17- Export the selected version's images, original audio, SRT, and reproducible project manifest as one package.18- Prefer static frames and clean scene changes. The workbench is for visual decisions, not final encoding.1920## Workflow21221. Inspect the project and choose the implementation surface.23 - Reuse an existing site when one exists.24 - If the project contains `.openai/hosting.json`, use the available Sites building and hosting skills.25 - For a new public workbench, use the available site-building skill rather than hand-rolling deployment infrastructure.262. Establish the shared timeline.27 - Obtain the true audio duration; do not infer it from the last subtitle.28 - Define stable scene IDs and contiguous start/end times.29 - Normalize each storyboard alternative to the same ordered scene IDs.30 - Read `references/data-contract.md`, then create the JSON project manifest.313. Validate the inputs before building UI.32 - Run `scripts/validate_project.py PROJECT.json`.33 - Fix missing images, inconsistent scene coverage, duplicate IDs, aspect-ratio mismatches, and cues beyond the project duration.344. Build preview and comparison modes.35 - Render the active scene for the current audio time.36 - In comparison mode, render the active scene from every selected version at that exact time.37 - Make the timeline, scene thumbnails, subtitles, and play state all call the same seek function.38 - Read `references/player-and-storage.md` for the required playback state model.395. Add collaboration only to the requested scope.40 - For review-only work, ship static read-only presets.41 - For shared editing, store uploaded image bytes in object storage and project metadata/snapshots in a database.42 - Keep public presets immutable even when the shared working version is editable.43 - Treat “knowing the URL” as discoverability, not authentication or authorization.446. Add production handoff.45 - Download the currently selected version, not an implicit default.46 - Include scene files with stable numbered names, original audio, SRT, and a manifest recording timing and version metadata.477. Deploy and verify the hosted site.48 - Validate a production URL, not only local development.49 - Run `scripts/check_audio_range.py https://SITE/api/audio` when audio is served through an endpoint.50 - Complete every item in `references/validation-checklist.md`, including real seeking while playback is active.5152## Non-negotiable playback safeguards5354- Serve audio with HTTP byte-range support. A visually movable range input does not prove that media is seekable.55- A valid range request must return `206`, `Accept-Ranges: bytes`, `Content-Range`, and the partial `Content-Length`; invalid ranges return `416`.56- Use the scrubber's continuous input event so dragging previews the requested time immediately.57- After seeking, confirm the media element's actual `currentTime` changed and stayed changed while the playback update loop continued.58- Do not let animation-frame state overwrite a requested seek with stale `currentTime`.5960## Deliverables6162Return:6364- the deployed comparison URL;65- the reusable source project;66- the project manifest and version asset folders;67- storage and access-mode notes;68- validation results, including the range-response check and at least two non-zero seeks;69- instructions for adding the next storyboard version.7071Do not claim the workbench is ready merely because the first frame plays. Version switching, synchronized comparison, subtitle timing, uploads when enabled, snapshots, asset export, and seeking all require explicit verification.