visual-audit
Perform adversarial visual audit of Quarto or Beamer slides checking for overflow, font consistency, box fatigue, and layout issues.
SKILL.md.claude/skills/visual-audit/SKILL.md
GitHubVisual Audit of Slide Deck
Perform a thorough visual layout audit of a slide deck, on the source and on the rendered pixels.
Steps
Resolve the deck named in
$ARGUMENTSand load its premises:python3 scripts/deckpath.py $ARGUMENTS --field qmd # the source python3 scripts/deckprofile.py $ARGUMENTS # resolved profile JSON cat "$(python3 scripts/deckpath.py $ARGUMENTS --field config)" # <deck>.deck.ymlThe density numbers below come from the profile JSON (
bullets_max,bullets_max_with_figure,bullets_max_two_line,box_density,max_nesting); quote the deck's own budget in every density finding.Determine the ruleset:
- Main theme (
clean-academic.scss) -> full design-principles audit (.claude/rules/slide-design-principles.md) - Legacy theme (
clean-academic-legacy.scss) or SUNY's own theme -> legacy audit only (overflow, spacing); skip density limits
- Main theme (
Screenshot every slide:
python3 scripts/shoot_slides.py $ARGUMENTS --out /tmp/$ARGUMENTS-shotsThis renders the html first when it is missing or older than the qmd, then writes one 1280x720 PNG per slide in reading order (vertical stacks included). Read every PNG - the pixels catch what the source hides: real overflow, wrapped bullets, a figure that failed to load, a video slide stuck on a black frame. (
bash scripts/preview.sh <name>still opens the deck in a browser when you need to interact with a slide.)Audit every slide for:
DENSITY (new decks, budgets from the profile JSON): >1 core message, more bullets than
bullets_max(bullets_max_with_figurewith a figure; one less again if any bullet wraps to two lines), more wrapped bullets thanbullets_max_two_line, any three-line bullet, more colored boxes thanbox_density, nesting deeper thanmax_nestingOVERFLOW: Content exceeding slide boundaries - confirm on the PNGs FONT CONSISTENCY: Any.smaller/.smallestin a new deck (forbidden), inline font-size overrides below 1em CENTERING (new decks): ad-hoc positioning fighting the theme, unjustified{.top-align}or{.left}, a deck that re-enablesauto-stretchover theQuarto/_quarto.ymlproject default of false (or a_fixtures/qmd that fails to repeat it - fixtures sit outside the project defaults) BOX FATIGUE: more boxes on one slide than the budget, wrong box types LAYOUT: Missing transitions, missing framing sentences, semantic colorsProduce a report organized by slide with severity and recommendations, its header stating the profile, the audience (from
deck.yml, else the profile), and the budget appliedFollow the split-first principle:
- Split into two slides (the default answer)
- Cut content (move to speaker notes)
- Two columns (only for genuinely side-by-side pairings)
- Reduce image/SVG size
- Font size reduction - never recommend it