fix(styles): make the anime-ghibli playbook loadable again - #468
Open
bbudaedu wants to merge 1 commit into
Open
Conversation
`load_playbook("anime-ghibli")` raised a ValidationError, and since
`lib.checkpoint._validate_style_playbook` fails closed, that took down every
run using the style:
init_project(..., style_playbook="anime-ghibli")
CheckpointValidationError: Unknown or invalid style_playbook 'anime-ghibli'.
Available playbooks: [..., 'anime-ghibli', ...]
The playbook is listed by `list_playbooks()` and offered by name in
`pipeline_defs/animation.yaml`, so the error even names it as an available
alternative to itself.
Four schema violations, repaired on whichever side the evidence pointed to —
widen the schema where a shipped renderer feature backs the key, conform the
playbook where it is only vocabulary drift:
- `overlays.section_title` — the schema allowed stat_card/key_term/code_block
and none of the four overlay types `Overlay` in Explainer.tsx actually
renders. Added section_title/stat_reveal/hero_title/provider_chip, plus
`accent` on overlay_style to match the renderer's accentColor prop.
- `asset_generation` anime_scene knobs — scene_type, multi_image_per_scene,
images_per_scene, image_variation_guidance, default_particles,
default_particle_color, default_vignette all map onto real AnimeScene props.
Added to the schema.
- `identity.category: anime-illustration` and `pace: gentle` — no code reads
either field for behavior, so the playbook now uses the canonical `custom`
and `slow` rather than expanding the enums for one style.
- `color_palette.spirit_glow` / `golden_hour` — ad-hoc named colors. Folded
into the `accent` array; both hexes are preserved and still referenced by
name in consistency_anchors.
With this, `_build_theme_from_playbook("anime-ghibli")` returns the Ghibli
palette instead of `{}`, so the style no longer silently falls back to the
default dark theme at render time.
Regression coverage iterates the catalog instead of a hardcoded list, which is
how this slipped: tests/qa/test_07_playbook_intelligence.py names the three
playbooks that existed when it was written, so anime-ghibli and
premium-minimalist never had load coverage. The new tests assert that every
playbook `list_playbooks()` advertises both validates and is accepted by
`init_project`, and that the schema's overlay vocabulary tracks the renderer's.
Verified: 6 of the new tests fail on the unfixed tree; full suite goes
964 -> 979 passed with no regressions.
This was referenced Aug 3, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The defect
load_playbook("anime-ghibli")raises aValidationErroron currentmain. Becauselib/checkpoint.py::_validate_style_playbookfails closed, that takes down every run using the style:The playbook is returned by
list_playbooks()and offered by name inpipeline_defs/animation.yaml, so the error names it as an available alternative to itself. A run that selects it cannot write a checkpoint at all.There is a quieter half too:
VideoCompose._build_theme_from_playbook("anime-ghibli")swallows the load error and returns{}, so nothemeConfigreaches Remotion and the style silently falls back to the default dark theme at render time.The repair
Four distinct schema violations. Each was repaired on the side the evidence pointed to — widen the schema where a shipped renderer feature backs the key, conform the playbook where it is only vocabulary drift:
overlays.section_titleOverlayunion inremotion-composer/src/Explainer.tsxrenderssection_title/stat_reveal/hero_title/provider_chip. The schema allowedstat_card/key_term/code_block— not one of the types the renderer supports. Added all four, plusaccentonoverlay_styleto match the renderer'saccentColorprop.asset_generationextrasscene_type,multi_image_per_scene,images_per_scene,image_variation_guidance,default_particles,default_particle_color,default_vignettemap onto realAnimeSceneprops (images,particles,particleColor,vignette).identity.category: anime-illustration,pace: gentleidentity.categoryis only ever written bylib/playbook_generator.py, andhyperframes_style_bridgereadsmotion.pace, notidentity.pace. Using the canonicalcustom/slowbeats expanding a public enum for one style.color_palette.spirit_glow,golden_houraccentarray; both hexes are preserved and still referenced by name inconsistency_anchors.After the fix,
_build_theme_from_playbook("anime-ghibli")returns the Ghibli palette (primaryColor: "#2D5016",accentColor: "#FFB347",backgroundColor: "#0A0A1A", …) instead of{}.Why it slipped, and the coverage that stops it recurring
tests/qa/test_07_playbook_intelligence.py:50loads a hardcoded list of three playbook names — the three that existed when it was written.anime-ghibliandpremium-minimalistwere added later and never got load coverage.tests/styles/test_playbook_catalog.pyiterates the catalog instead, asserting the invariant that makes this class of bug impossible to ship:list_playbooks()advertises also passesload_playbook()init_project()— guarding the fail-closed checkpoint path specificallyVerification
anime-ghibliload,anime-ghibliinit_project, and all four overlay types); all pass after.make lint: passed.🤖 Generated with Claude Code