openpencil/templates/step0/_generators
Fini ad1ed80a8d test(editor): audit preview artifacts by re-rendering them
Preview PNGs and card JPEGs go stale two ways. Editing a document and
forgetting to refresh is the obvious one. The other leaves no trace at
all: the renderer changes, the document does not, and every previously
saved image is silently wrong while git is clean, the tests are green
and the gate passes. That is what happened to three minimal-keynote
frames whose content matched HEAD exactly but whose pixels no longer
did, because the desktop binary had been rebuilt underneath them.

Nothing but re-rendering and comparing bytes can see the second case, so
that is the only criterion here. It rests on rendering being
deterministic — two runs of one document must be byte-identical, which
`--selftest` checks; if that ever stops holding, this tool's verdicts
are void and the renderer is the thing to fix.

Claude-Session: https://claude.ai/code/session_01FqKQqNj8exYwopGDpYUU7x
2026-08-09 21:17:01 +08:00
..
assets feat(editor): add step-0 scene templates for the mass-market track 2026-08-02 11:00:34 +08:00
qa test(editor): audit preview artifacts by re-rendering them 2026-08-09 21:17:01 +08:00
bake_hints.py feat(editor): add step-0 scene templates for the mass-market track 2026-08-02 11:00:34 +08:00
cardlib.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
deck_sounding_navy.py feat(editor): add six 16:9 deck templates 2026-08-09 19:53:37 +08:00
deck_tidemark_slate.py feat(editor): add six 16:9 deck templates 2026-08-09 19:53:37 +08:00
deckkit.py fix(ai): compare the CJK tracking cap as a ratio, not a rounded number 2026-08-09 21:16:35 +08:00
oplib.py fix(ai): compare the CJK tracking cap as a ratio, not a rounded number 2026-08-09 21:16:35 +08:00
previews.sh feat(editor): register the six deck templates in the picker 2026-08-09 19:54:23 +08:00
scene_preview_cards.py feat(editor): register the six deck templates in the picker 2026-08-09 19:54:23 +08:00
tpl1.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl2.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl3.py feat(editor): add step-0 scene templates for the mass-market track 2026-08-02 11:00:34 +08:00
tpl_bookreview_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_card_daily.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_card_metric.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_card_notice.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_card_price.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_card_quote.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_card_spine.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_cards.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_cityguide_carousel.py fix(renderer): keep transparent decoration layers out of the way of clicks 2026-08-09 19:53:09 +08:00
tpl_compare_do_dont.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_compare_myth_truth.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_pricing_tiers.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_scenario_guide.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_spec_table.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_three_way.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_time_shift.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_tradeoff_scale.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_compare_version_diff.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_datareport_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_deck_banxin.py feat(editor): add six 16:9 deck templates 2026-08-09 19:53:37 +08:00
tpl_deck_dossier.py feat(editor): add six 16:9 deck templates 2026-08-09 19:53:37 +08:00
tpl_deck_gridpaper.py feat(editor): add six 16:9 deck templates 2026-08-09 19:53:37 +08:00
tpl_deck_ledger.py feat(editor): add six 16:9 deck templates 2026-08-09 19:53:37 +08:00
tpl_event_deck.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_gradient_tech.py feat(editor): refresh deck template visuals 2026-08-07 02:00:22 +08:00
tpl_infographic_challenge.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_infographic_concept.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_infographic_data.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_infographic_faq.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_infographic_list.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_infographic_map.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_infographic_ranking.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_infographic_steps.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_infographic_story.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_infographic_timeline.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_journal_card.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_lecture_light.py feat(editor): refresh deck template visuals 2026-08-07 02:00:22 +08:00
tpl_minimal_keynote.py style(editor): re-align template tracking to the ratio cap 2026-08-09 21:16:46 +08:00
tpl_opinion_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_pitch_dark.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_qa_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_quote_card.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_slides.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_story_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_toolkit_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_tutorial_carousel.py fix(renderer): keep transparent decoration layers out of the way of clicks 2026-08-09 19:53:09 +08:00
tpl_tutorial_diy.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_tutorial_onboarding.py fix(editor): tighten template copy that wrapped into orphan lines 2026-08-09 02:24:44 +08:00
tpl_tutorial_photo.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_tutorial_recipe.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_tutorial_report.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_tutorial_skincare.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_tutorial_software.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_tutorial_storage.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00
tpl_tutorial_workout.py feat(editor): grow the template library to fifty-eight across six scenes 2026-08-09 02:24:43 +08:00
tpl_yearreview_carousel.py refactor(editor): wrap multi-board templates onto rows 2026-08-09 19:55:00 +08:00