claude.symlink/skills/visualization-check/SKILL.md
Use when reviewing a data visualization or figure for clarity, checking if a graph communicates its message without additional context, or iterating on R/Python plot scripts until a naive reader can fully understand the figure.
npx skillsauth add htlin222/dotfiles visualization-checkInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Iterative review cycle using a context-free subagent as a naive reader. The subagent sees ONLY the image — no study context, no axis explanations, no expected conclusions. If the subagent can't understand the figure, a real reader won't either.
digraph viz_check {
rankdir=TB;
node [shape=box];
start [label="User provides image path\n(and optionally the generating script)" shape=doublecircle];
preprocess [label="Downscale to preview\n(sips → /tmp)"];
launch [label="Dispatch review subagent\n(read-only, context-free)"];
feedback [label="Subagent returns structured report:\ncomprehension / issues / rating"];
decide [label="Clarity >= 4 AND\nmain message correct?" shape=diamond];
analyze [label="Map feedback to\nactionable script changes"];
fix [label="Edit generating script\n+ apply viz best practices"];
render [label="Re-render the figure"];
done [label="Figure passes naive reader test\n— DONE" shape=doublecircle];
start -> preprocess;
preprocess -> launch;
launch -> feedback;
feedback -> decide;
decide -> done [label="yes"];
decide -> analyze [label="no"];
analyze -> fix;
fix -> render;
render -> preprocess [label="downscale new\nrender + dispatch\nfresh subagent"];
}
High-DPI publication figures (300 DPI, 2000-4500px wide) consume excessive context tokens and can cause subagents to hit context limits. Always downscale before dispatching.
Use sips (built into macOS) to create a preview copy:
sips --resampleWidth 800 "{ORIGINAL_PATH}" --out "/tmp/viz_check_preview.png"
/tmp/ — never modify the original figure./tmp/viz_check_preview.png) in the subagent prompt, not the original./tmp/viz_check_preview_{basename}.pngWhen reviewing multiple figures in parallel, batch-preprocess first:
for fig in path/to/figures/*.png; do
basename=$(basename "$fig")
sips --resampleWidth 800 "$fig" --out "/tmp/viz_check_preview_${basename}"
done
Then dispatch each subagent with its corresponding /tmp/viz_check_preview_{basename}.png.
You MUST dispatch a review subagent for each review round. Do not attempt to self-review — the whole point is context-free eyes.
| Setting | Value | Why |
|---------|-------|-----|
| subagent_type | Explore | Read-only tools only (Read, Glob, Grep). Prevents accidental modifications to scripts or figures. |
| max_turns | 3 | Subagent only needs to read the image and write the report. |
| Resume | NEVER | Each round uses a fresh subagent. Never resume a previous reviewer. |
You are a naive reader seeing this figure for the first time. You have NO context about
the study, data, or purpose. Read the image file, then produce a structured review.
## Image
Read the image at: {PREVIEW_PATH}
## Structured Review Template
### A. Comprehension (what you understood)
1. What is this figure showing? Describe in your own words.
2. What are the axes/labels? Summarize each.
3. What is the main message or takeaway?
### B. Confusion Points (what is unclear)
List EVERY element that is unclear, ambiguous, or hard to read. Be specific —
reference position (top-left, bottom panel, etc.) and quote any problematic text.
### C. Visual Quality Checklist
For each item, mark PASS / FAIL / N/A:
- [ ] Colors distinguishable (also in grayscale?)
- [ ] All text readable at this size (no overlapping labels?)
- [ ] Reference lines / thresholds labeled
- [ ] No unnecessary chart junk (gridlines, borders, decorations)
- [ ] Legend (if any) self-explanatory without context
- [ ] Good data-ink ratio (data vs non-data elements)
- [ ] Abbreviations spelled out or self-evident
### D. Clarity Rating
Rate 1 (incomprehensible) to 5 (instantly clear). Justify in one sentence.
### E. Top 3 Recommended Fixes
Prioritized list of the most impactful improvements.
Do NOT include in the subagent prompt:
Even saying "this is a survival curve" gives away too much. Let the subagent figure it out.
Map the subagent's confusion points to specific script changes:
| Subagent Says | Likely Fix |
|---------------|------------|
| "Can't read axis labels" | Increase axis.text size, reduce tick density |
| "Don't know what colors mean" | Add/improve legend, use more distinct palette |
| "Too many lines/elements" | Simplify: fewer series, facet instead of overlay |
| "What's this dotted line?" | Label reference lines directly on plot |
| "Can't tell the trend" | Increase line width, reduce noise, add smoothing |
| "Axes are confusing" | Better axis titles, consider log scale, add units |
| "Too cluttered" | Remove gridlines, reduce chart junk, increase whitespace |
| "Colors look similar" | Use colorblind-safe palette (viridis, okabe-ito) |
| "Abbreviation unclear" | Spell out on first use, or add subtitle/footnote |
scale_color_viridis_d() or Okabe-Ito.theme_minimal() or theme_classic().# Good defaults for publication figures
theme_publication <- theme_minimal(base_size = 14) +
theme(
axis.title = element_text(size = 14, face = "bold"),
axis.text = element_text(size = 12),
legend.position = "bottom",
panel.grid.minor = element_blank(),
plot.title = element_text(size = 16, face = "bold")
)
# Colorblind-safe palettes
scale_color_viridis_d() # Sequential
scale_color_brewer(palette = "Set2") # Categorical
sips --resampleWidth 800 the new render to /tmp/ (the old preview is stale)Typical iterations: 2-3 rounds.
When checking multiple independent figures, dispatch review subagents in parallel — one per figure. Each subagent touches only its own image (no shared state).
digraph multi_fig {
rankdir=LR;
node [shape=box];
dispatch [label="Dispatch N subagents\nin parallel"];
fig1 [label="Subagent 1\nreviews fig1.png"];
fig2 [label="Subagent 2\nreviews fig2.png"];
fig3 [label="Subagent 3\nreviews fig3.png"];
collect [label="Collect all reports\nand fix sequentially"];
dispatch -> fig1;
dispatch -> fig2;
dispatch -> fig3;
fig1 -> collect;
fig2 -> collect;
fig3 -> collect;
}
For figures that share visual consistency requirements (same color scheme, axis style), do a final synthesis step after individual reviews to check cross-figure consistency.
Explore (read-only) to prevent the reviewer from accidentally modifying files./visualization-check path/to/figure.png
If you also know the generating script:
/visualization-check path/to/figure.png --script path/to/plot_script.R
The agent will:
/tmp/ preview (sips --resampleWidth 800)testing
Converts narrative medical text into Pocket Medicine bullet-style notes with proper abbreviations, then modularizes sections exceeding 20 lines into linked standalone files.
devops
Use when deploying Docker services on the local VM (hostname: vm, Pop!_OS) with Traefik reverse proxy and Homepage dashboard. Covers crane image workflow, Traefik file-provider registration, Homepage services.yaml entries, and compose templates on the traefik-proxy network.
development
Runs Vale prose linter on markdown/text files and auto-fixes issues. Use when the user asks to lint, proofread, or improve writing quality of markdown or text files.
development
Update dev docs before session compaction to capture progress. Use before compacting conversation, ending sessions, or switching tasks.