paper-figure
Skill75 starsChanged 4 months agoMITView on GitHub
Generate publication-quality figures and tables from experiment results. Use when user says \"plot this\", \"make a figure\", \"generate figures\", \"paper figures\", or needs plots for a paper. Also invoked by `/auto`'s Ledger Figures hook to produce per-claim figures embedded into `CLAIMS_LEDGER.md`.
11 other projects use a version of this, 8 of them edited.
Adopted by
Most recently taken up by
- 296711867/figcraft-skillstheir own version, first seen Oct 15, 2026
- ShinKiHun/claude-skillstheir own version, first seen Oct 13, 2026
- Yulivu/debuffer-skillsedited, first seen Oct 13, 2026
- yvesory/academic-research-suiteedited, first seen Oct 9, 2026
- Niko-mzz/Doctor-Ge-SCI-paper-Writingtheir own version, first seen Oct 8, 2026
- talhaMah56/claude_skillsedited, first seen Sep 12, 2026
Used with
Projects with it also use resubmit-pipeline, paper-illustration and 7 more.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
raja21068Skillresubmit-pipeline
Workflow 5: orchestrate a text-only resubmit of a polished paper to a different venue under hard constraints (no new experiments, no bib edits, no framework changes, never overwrite prior submissions). Phase 0 physical isolation, Phase 0.5 health + anonymity check, Phase 1 audit (proof / claim / citation), Phase 2 microedits via auto-loop with edit-whitelist + citation-audit --soft-only, Phase 3 kill-argument adversarial gate, Phase 4 final compile + Overleaf push via /overleaf-sync. Use when user says \"resubmit pipeline\", \"重投流程\", \"port paper to <new venue>\", \"resubmit to <venue>\", \"tighten paper for resubmission\", or has a rejected/withdrawn paper to move to a different top venue under tight time budget.
Also in 5 projects that use this
raja21068Skillpaper-illustration
Generate publication-quality AI illustrations for academic papers using Gemini image generation. Creates architecture diagrams, method illustrations with Claude-supervised iterative refinement loop. Use when user says \"生成图表\", \"画架构图\", \"AI绘图\", \"paper illustration\", \"generate diagram\", or needs visual figures for papers.
Also in 6 projects that use this
- +7 more from raja21068
Other versions11 projects use a version of this.
Word for word · 0
None found.
Edited · 8
- wanshuiyin/Auto-claude-code-research-in-sleep★ 19k55% same
- Chanw-research/claude-code-paper-writing★ 4272% same
- catalsqlb-cmd/Prism-H★ 1672% same
- Yulivu/debuffer-skills★ 961% same
- yvesory/academic-research-suite★ 943% same
- Yusong-Enceladus/claude-skills★ 861% same
- raja21068/AutoResearch★ 272% same
- talhaMah56/claude_skills★ 056% same
Wrote their own version · 3
- 296711867/figcraft-skills★ 13same name
- Niko-mzz/Doctor-Ge-SCI-paper-Writing★ 4same name
- ShinKiHun/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository52 other files it gives its agents.
- ablation-plannerSkill
- analyze-resultsSkill
- arxivSkill
- auto-claimSkill
- auto-experimentSkill
- auto-iteration-loopSkill
- autoSkill
- verify-pick-alternativesSkill
- auto-verifySkill
- data-ruleSkill
- experiment-auditSkill
- experiment-planSkill
- experiment-queueSkill
- finetune-hyperparameter-sweepSkill
- imageSkill
- multiple-choice-evaluationSkill
- experiment-tipsSkill
- steering-block-selectionSkill
- steering-coefficient-tuningSkill
- hypothesis-batchSkill
- idea-creatorSkill
- impact-checkSkill
- mechanic-db-searchSkill
- mechanism-auditSkill
- mechanism-behavior-discoverySkill
- mechanism-exploreSkill
- causal-attributionSkill
- CircuitSkill
- Feature Dictionary LearningSkill
- gradient-detectionSkill
- Magnitude AnalysisSkill
- Multi-Modal InterpretabilitySkill
- Neural Feature LearningSkill
- ProbingSkill
- Representation and Parameter AnalysisSkill
- SHAPSkill
- mechanism-skillsSkill
- Vocabulary ProjectionSkill
- mguideSkill
- mhistorySkill
- monitor-experimentSkill
- msearchSkill
- next-roundSkill
- notifySkill
- novelty-checkSkill
- research-litSkill
- research-refine-pipelineSkill
- research-refineSkill
- research-reviewSkill
- result-to-claimSkill
- run-experimentSkill
- training-checkSkill
The file
We split this skill into the rules it gives an agent
7 rules. 2 are common, 0 are distinctive, and 5 are very specific to this project.
2
Common
Most of the 9 edited versions we read keep these.
0
Distinctive
This author's own choices. Worth a look.
5
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 51
When /auto's Ledger Figures hook calls this skill, the orchestrator passes a YAML-shaped payload in $ARGUMENTS:
- Very specific: line 167
Create a shared style configuration script in the active output dir (project root figures/ for standalone, figures/<claim_id>/ for …
- Common: line 211
Use this decision tree for data-driven figures (inspired by Imbad0202/academic-research-skills):
- Very specific: line 224
When the plan entry's type is already set (always the case in auto-ledger mode), use it directly without re-classifying.
- Very specific: line 329
If the figure already exists in figures/, preserve it and generate only the LaTeX \includegraphics snippet
- Very specific: line 343
Verify all output files exist and are non-empty.
- Common: line 384
Before finishing, verify each figure (from pedrohcgs/claude-code-my-workflow):
“Common” is measured: kept by at least 6 in 10 of the 9 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Paper Figure: Publication-Quality Plots from Experiment Data
Generate all figures and tables for a paper based on: $ARGUMENTS
This skill has two calling modes, sharing the same plotting machinery:
- Standalone paper mode (default): driven by
PAPER_PLAN.mdfrom/paper-plan. Produces vector PDFs infigures/pluslatex_includes.texfor paper-write. - Auto-ledger mode (
mode: auto-ledger): driven by an inline plan supplied by/auto's Ledger Figures hook. Image figures produce PDF (vector, for later paper use) and PNG (raster, for Markdown embed); table figures produce.md(inline-renderable for the ledger) and.tex(publication-grade) — all underfigures/<claim_id>/, plus a machine-readableINDEX.jsonper claim. Tables are first-class artifacts in this mode, on equal footing with charts. See "Auto-ledger invocation contract" below.
Scope: What This Skill Can and Cannot Do
| Category | Can auto-generate? | Examples |
| Data-driven plots | ✅ Yes | Line plots (training curves), bar charts (method comparison), scatter plots, heatmaps, box/violin plots |
| Comparison tables | ✅ Yes | LaTeX tables comparing prior bounds, method features, ablation results |
| Multi-panel figures | ✅ Yes | Subfigure grids combining multiple plots (e.g., 3×3 dataset × method) |
| Architecture/pipeline diagrams | ❌ No — manual | Model architecture, data flow diagrams, system overviews. At best can generate a rough TikZ skeleton, but expect to draw these yourself using tools like draw.io, Figma, or TikZ |
| Generated image grids | ❌ No — manual | Grids of generated samples (e.g., GAN/diffusion outputs). These come from running your model, not from this skill |
| Photographs / screenshots | ❌ No — manual | Real-world images, UI screenshots, qualitative examples |
In practice: For a typical ML paper, this skill handles ~60% of figures (all data plots + tables). The remaining ~40% (hero figure, architecture diagram, qualitative results) need to be created manually and placed in figures/ before running /paper-write. The skill will detect these as "existing figures" and preserve them.
Constants
- STYLE =
publication— Visual style preset. Options:publication(default, clean for print),poster(larger fonts),slide(bold colors) - DPI = 300 — Output resolution
- FORMAT =
pdf— Output format in standalone mode. Options:pdf(vector, best for LaTeX),png(raster fallback). In auto-ledger mode the formats are chosen per figure bytype: image types (line / bar / ...) writepdf+png; thetabletype writesmd+tex. The caller passes the union (formats: pdf,png,md,tex) — each figure-script then picks the subset that matches its type. - COLOR_PALETTE =
tab10— Default matplotlib color cycle. Options:tab10,Set2,colorblind(deuteranopia-safe) - FONT_SIZE = 10 — Base font size (matches typical conference body text)
- FIG_DIR =
figures/— Default output directory in standalone mode. In auto-ledger mode this is overridden by the caller-suppliedoutput_dir(typicallyfigures/<claim_id>/). - REVIEWER_MODEL =
$LLM_MODEL— Model used via llm-chat MCP for figure quality review. Skipped whenreview: falseis passed (default in auto-ledger mode to keep ledger renders cheap).
Inputs
- PAPER_PLAN.md — figure plan table (from
/paper-plan). Used in standalone mode. plan_inline— an inline figure plan passed via$ARGUMENTS(auto-ledger mode). Replaces PAPER_PLAN.md when present; same schema as the PAPER_PLAN.md figure table.- Experiment data — JSON files, CSV files, or screen logs in
figures/,runs/<run-id>/,verify/, or project root. - Existing figures — any manually created figures to preserve.
Resolution order at Step 1: plan_inline > PAPER_PLAN.md > scan-and-ask. The third branch is unreachable in auto-ledger mode — if neither inline plan nor PAPER_PLAN.md is present, return status: no-plan instead of prompting (the caller decides what to do).
Auto-ledger invocation contract
When /auto's Ledger Figures hook calls this skill, the orchestrator passes a YAML-shaped payload in $ARGUMENTS:
mode: auto-ledger
project_root: <abs path> # cwd for all relative paths
claims: # one or more claims, batched in a single call
- claim_id: C1
claim_title: "<short statement>"
output_dir: figures/C1/
plan_inline:
- id: c1_robustness # filename stem; image types produce <id>.pdf + <id>.png
type: bar # one of {line, bar, grouped_bar, scatter, heatmap, box, violin, multi_panel, table}
data: verify/C1_<short>/ROBUSTNESS.md
caption: "Robustness of C1 across method/dataset/model swaps."
x: variant
y: metric_value
group: axis # optional; for grouped_bar
- id: c1_training_curves
type: line
data: runs/<run-id>/metrics.json
caption: "Training dynamics for C1's main-experiment run."
x: step
y: [train_loss, val_loss]
- id: c1_k_sensitivity # table types produce <id>.md + <id>.tex (no pdf/png)
type: table
data: runs/<run-id>/k_sweep.json
caption: "K-sensitivity of top-K ablation accuracy."
columns: [K, overall_acc, joy, sadness, anger, fear, surprise, disgust]
formats: pdf,png,md,tex # union; each figure picks the subset matching its type
review: false # skip Step 7 REVIEWER_MODEL review
style: publicationPer-claim outputs (auto-ledger mode):
figures/<claim_id>/
├── paper_plot_style.py # shared style config (one copy per claim dir is fine; small file)
├── gen_<id>.py # per-figure generator script (image OR table)
├── <id>.pdf # image figures: vector for paper-write
├── <id>.png # image figures: raster for Markdown embed
├── <id>.md # table figures: inline-renderable for the ledger
├── <id>.tex # table figures: publication-grade LaTeX
└── INDEX.json # machine-readable summary (see schema below)Image types write .pdf + .png and skip .md / .tex; the table type writes .md + .tex and skips .pdf / .png. The per-figure generator script chooses the format pair based on type.
INDEX.json schema:
{
"claim_id": "C1",
"claim_title": "<short>",
"generated_at": "<iso-8601>",
"figures": [
{
"id": "c1_robustness",
"type": "bar",
"caption": "Robustness of C1 across method/dataset/model swaps.",
"png": "figures/C1/c1_robustness.png",
"pdf": "figures/C1/c1_robustness.pdf",
"md": null,
"tex": null,
"source_data": "verify/C1_<short>/ROBUSTNESS.md",
"status": "ok"
},
{
"id": "c1_k_sensitivity",
"type": "table",
"caption": "K-sensitivity of top-K ablation accuracy.",
"png": null,
"pdf": null,
"md": "figures/C1/c1_k_sensitivity.md",
"tex": "figures/C1/c1_k_sensitivity.tex",
"source_data": "runs/<run-id>/k_sweep.json",
"status": "ok"
}
],
"skipped": [
{"id": "c1_grid", "reason": "source_data missing: runs/<run-id>/grid.json"}
]
}Every figure entry carries all four artifact slots — png, pdf, md, tex — with the unused pair set to null. status is ok on successful render or error with an error_detail field if the figure-generator script raised. Skipped entries (data file missing, plan entry of unsupported type, etc.) live in the skipped array — the script never raises for skip cases. INDEX.json is the only contract the caller relies on; the orchestrator parses it to populate claims_ledger.json[claim].figures[].
Return value (auto-ledger mode): a one-line summary per claim — "C1: 2/3 figures generated, 1 skipped (data missing)" — plus the absolute path of each INDEX.json written. No LaTeX include snippets are produced in this mode.
Workflow
Step 1: Read Figure Plan
Resolve the plan source in this order:
- Auto-ledger mode (
mode: auto-ledgerin$ARGUMENTS): use the inlineplan_inlinefrom each claim entry. PAPER_PLAN.md is ignored even if it exists. Standalone mode, PAPER_PLAN.md present: parse the Figure Plan table:
| ID | Type | Description | Data Source | Priority | |----|------|-------------|-------------|----------| | Fig 1 | Architecture | ... | manual | HIGH | | Fig 2 | Line plot | ... | figures/exp.json | HIGH |- Standalone mode, no PAPER_PLAN.md: scan for data files in
figures/,runs/, project root, and ask the user which figures to generate. - Auto-ledger mode with neither: return
status: no-plan(do not prompt — the orchestrator is non-interactive).
For each entry, classify:
- Auto-generatable from data
- Needs manual creation (architecture diagrams, etc.) — flagged
[MANUAL], skipped here - Comparison table — generated as LaTeX in standalone mode; as both Markdown (
.md, for inline ledger embed) and LaTeX (.tex, for paper-write) in auto-ledger mode. Treated the same as any other figure type in both modes — no opt-in required.
Step 2: Set Up Plotting Environment
Create a shared style configuration script in the active output dir (project root figures/ for standalone, figures/<claim_id>/ for auto-ledger):
# paper_plot_style.py — shared across all figure scripts in this dir
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rcParams.update({
'font.size': FONT_SIZE,
'font.family': 'serif',
'font.serif': ['Times New Roman', 'Times', 'DejaVu Serif'],
'axes.labelsize': FONT_SIZE,
'axes.titlesize': FONT_SIZE + 1,
'xtick.labelsize': FONT_SIZE - 1,
'ytick.labelsize': FONT_SIZE - 1,
'legend.fontsize': FONT_SIZE - 1,
'figure.dpi': DPI,
'savefig.dpi': DPI,
'savefig.bbox': 'tight',
'savefig.pad_inches': 0.05,
'axes.grid': False,
'axes.spines.top': False,
'axes.spines.right': False,
'text.usetex': False, # set True if LaTeX is available
'mathtext.fontset': 'stix',
})
# Color palette
COLORS = plt.cm.tab10.colors # or Set2, or colorblind-safe
def save_fig(fig, name, formats=('pdf',), out_dir=FIG_DIR):
"""Save figure under out_dir for every format in `formats`."""
paths = []
for fmt in formats:
path = f'{out_dir}/{name}.{fmt}'
fig.savefig(path)
paths.append(path)
print(f'Saved: {path}')
return pathsIn auto-ledger mode formats=('pdf', 'png') so each call writes both files; the PNG is what the ledger Markdown will reference.
Step 3: Auto-Select Figure Type
Use this decision tree for data-driven figures (inspired by Imbad0202/academic-research-skills):
| Data Pattern | Recommended Type | Size |
| X=time/steps, Y=metric | Line plot | 0.48\textwidth |
| Methods × 1 metric | Bar chart | 0.48\textwidth |
| Methods × multiple metrics | Grouped bar / radar | 0.95\textwidth |
| Two continuous variables | Scatter plot | 0.48\textwidth |
| Matrix / grid values | Heatmap | 0.48\textwidth |
| Distribution comparison | Box/violin plot | 0.48\textwidth |
| Multi-dataset results | Multi-panel (subfigure) | 0.95\textwidth |
| Prior work comparison | LaTeX table | — |
When the plan entry's type is already set (always the case in auto-ledger mode), use it directly without re-classifying.
Step 4: Generate Each Figure
For each figure in the plan, create a standalone Python script:
Line plots (training curves, scaling):
# gen_fig2_training_curves.py
from paper_plot_style import *
import json
with open('figures/exp_results.json') as f:
data = json.load(f)
fig, ax = plt.subplots(1, 1, figsize=(5, 3.5))
ax.plot(data['steps'], data['fac_loss'], label='Factorized', color=COLORS[0])
ax.plot(data['steps'], data['crf_loss'], label='CRF-LR', color=COLORS[1])
ax.set_xlabel('Training Steps')
ax.set_ylabel('Cross-Entropy Loss')
ax.legend(frameon=False)
save_fig(fig, 'fig2_training_curves', formats=FORMATS, out_dir=OUT_DIR)Bar charts (comparison, ablation):
fig, ax = plt.subplots(1, 1, figsize=(5, 3))
methods = ['Baseline', 'Method A', 'Method B', 'Ours']
values = [82.3, 85.1, 86.7, 89.2]
bars = ax.bar(methods, values, color=[COLORS[i] for i in range(len(methods))])
ax.set_ylabel('Accuracy (%)')
# Add value labels on bars
for bar, val in zip(bars, values):
ax.text(bar.get_x() + bar.get_width()/2, bar.get_height() + 0.3,
f'{val:.1f}', ha='center', va='bottom', fontsize=FONT_SIZE-1)
save_fig(fig, 'fig3_comparison', formats=FORMATS, out_dir=OUT_DIR)Comparison tables (standalone — LaTeX only):
\begin{table}[t]
\centering
\caption{Comparison of estimation error bounds. $n$: sample size, $D$: ambient dim, $d$: latent dim, $K$: subspaces, $n_k$: modes.}
\label{tab:bounds}
\begin{tabular}{lccc}
\toprule
Method & Rate & Depends on $D$? & Multi-modal? \\
\midrule
\citet{MinimaxOkoAS23} & $n^{-s'/D}$ & Yes (curse) & No \\
\citet{ScoreMatchingdistributionrecovery} & $n^{-2/d}$ & No & No \\
\textbf{Ours} & $\sqrt{\sum n_k d_k / n}$ & No & Yes \\
\bottomrule
\end{tabular}
\end{table}Comparison tables (auto-ledger — both .md and .tex):
# gen_c1_k_sensitivity.py
import json, os
from textwrap import dedent
with open('runs/<run-id>/k_sweep.json') as f:
rows = json.load(f)['sweep'] # {K: {overall_acc, per_emotion: {...}}}
cols = ['K', 'overall', 'joy', 'sad', 'ang', 'fear', 'surp', 'dis']
# Markdown
md_rows = [
f"| {k} | {v['overall_accuracy']*100:.1f}% | " + " | ".join(
f"{v['per_emotion'][e]['acc']*100:.1f}%" for e in
['joy','sadness','anger','fear','surprise','disgust']) + " |"
for k, v in rows.items()
]
md = "| " + " | ".join(cols) + " |\n" + "|" + "|".join(["---"]*len(cols)) + "|\n" + "\n".join(md_rows) + "\n"
with open(f'{OUT_DIR}/c1_k_sensitivity.md', 'w') as f: f.write(md)
# LaTeX (mirror)
tex = dedent(r"""
\begin{table}[t]
\centering
\caption{K-sensitivity of top-K ablation accuracy.}
\label{tab:c1_k_sensitivity}
\begin{tabular}{l""" + "c"*(len(cols)-1) + r"""}
\toprule
""" + " & ".join(cols) + r""" \\
\midrule
""") + "\n".join(
f"{k} & {v['overall_accuracy']*100:.1f}\\% & " + " & ".join(
f"{v['per_emotion'][e]['acc']*100:.1f}\\%" for e in
['joy','sadness','anger','fear','surprise','disgust']) + r" \\"
for k, v in rows.items()
) + "\n" + r"""\bottomrule
\end{tabular}
\end{table}
"""
with open(f'{OUT_DIR}/c1_k_sensitivity.tex', 'w') as f: f.write(tex)The .md and .tex carry the same numbers in their native formats — the orchestrator embeds the .md inline into CLAIMS_LEDGER.md, and paper-write later picks up the .tex verbatim. Keep cell formatting consistent across both (same significant figures, same percent signs) so the two render identically.
Architecture/pipeline diagrams (MANUAL — outside this skill's scope):
- These require manual creation using draw.io, Figma, Keynote, or TikZ
- This skill can generate a rough TikZ skeleton as a starting point, but do not expect publication-quality results
- If the figure already exists in
figures/, preserve it and generate only the LaTeX\includegraphicssnippet - Flag as
[MANUAL]in the figure plan andlatex_includes.tex
Auto-ledger mode error containment. Wrap each per-figure script invocation in a try-block: a script that raises must NOT abort the batch. Record the failure in INDEX.json.figures[].status = "error" with error_detail, and continue to the next figure. A missing data file is a skipped entry (not an error). This keeps the Ledger Figures hook fail-soft, as required by /auto.
Step 5: Run All Scripts
# Run all figure generation scripts
for script in gen_fig*.py; do
python "$script"
doneVerify all output files exist and are non-empty. In auto-ledger mode, after all scripts finish, write INDEX.json summarizing every plan entry's terminal state (ok / error / skipped).
Step 6: Generate LaTeX Include Snippets
Standalone mode only. For each figure, output the LaTeX code to include it:
% === Fig 2: Training Curves ===
\begin{figure}[t]
\centering
\includegraphics[width=0.48\textwidth]{figures/fig2_training_curves.pdf}
\caption{Training curves comparing factorized and CRF-LR denoising.}
\label{fig:training_curves}
\end{figure}Save all snippets to figures/latex_includes.tex for easy copy-paste into the paper.
Skipped in auto-ledger mode — the ledger Markdown embed is the only consumer, and the orchestrator constructs the image-link Markdown itself from INDEX.json.
Step 7: Figure Quality Review with REVIEWER_MODEL
Skipped when review: false (auto-ledger mode default). Otherwise, send figure descriptions and captions to REVIEWER_MODEL for review:
mcp__llm-chat__chat:
prompt: |
Review these figure/table plans for a [VENUE] submission.
For each figure:
1. Is the caption informative and self-contained?
2. Does the figure type match the data being shown?
3. Is the comparison fair and clear?
4. Any missing baselines or ablations?
5. Would a different visualization be more effective?
[list all figures with captions and descriptions]Step 8: Quality Checklist
Before finishing, verify each figure (from pedrohcgs/claude-code-my-workflow):
- Font size readable at printed paper size (not too small)
- Colors distinguishable in grayscale (print-friendly)
- No title inside figures — titles go only in LaTeX
\caption{}(from pedrohcgs) - Legend does not overlap data
- Axis labels have units where applicable
- Axis labels are publication-quality (not variable names like
emp_rate) - Figure width fits single column (0.48\textwidth) or full width (0.95\textwidth)
- PDF output is vector (not rasterized text)
- No matplotlib default title (remove
plt.titlefor publications) - Serif font matches paper body text (Times / Computer Modern)
- Colorblind-accessible (if using colorblind palette)
Output
Standalone mode:
figures/
├── paper_plot_style.py # shared style config
├── gen_fig1_architecture.py # per-figure scripts
├── gen_fig2_training_curves.py
├── gen_fig3_comparison.py
├── fig1_architecture.pdf # generated figures
├── fig2_training_curves.pdf
├── fig3_comparison.pdf
├── latex_includes.tex # LaTeX snippets for all figures
└── TABLE_*.tex # standalone table LaTeX filesAuto-ledger mode (one tree per claim under the project root):
figures/
├── C1/
│ ├── paper_plot_style.py
│ ├── gen_c1_robustness.py
│ ├── gen_c1_training_curves.py
│ ├── c1_robustness.pdf
│ ├── c1_robustness.png
│ ├── c1_training_curves.pdf
│ ├── c1_training_curves.png
│ └── INDEX.json
├── C2/
│ └── ...
└── INDEX.md # (written by the /auto orchestrator, not this skill)figures/INDEX.md is the orchestrator's global index — this skill only writes the per-claim subtrees and their INDEX.json files.
Key Rules
- Every figure must be reproducible — save the generation script alongside the output
- Do NOT hardcode data — always read from JSON/CSV files
- Use vector format (PDF) for all plots — PNG only as fallback (or as the Markdown-embed companion in auto-ledger mode)
- No decorative elements — no background colors, no 3D effects, no chart junk
- Consistent style across all figures — same fonts, colors, line widths
- Colorblind-safe — verify with https://davidmathlogic.com/colorblind/ if needed
- One script per figure — easy to re-run individual figures when data changes
- No titles inside figures — captions are in LaTeX (standalone) or Markdown
alt-text (auto-ledger) only - Comparison tables count as figures — first-class artifacts in every mode. Standalone mode writes a
.texfile; auto-ledger mode writes both a.md(for inline ledger embed) and a.tex(for paper-write), exactly parallel to how image types write both.pngand.pdf. - Auto-ledger mode is fail-soft — a script error degrades to a single
INDEX.jsonentry withstatus: error; never raise out of the batch
Figure Type Reference
| Type | When to Use | Typical Size |
| Line plot | Training curves, scaling trends | 0.48\textwidth |
| Bar chart | Method comparison, ablation | 0.48\textwidth |
| Grouped bar | Multi-metric comparison | 0.95\textwidth |
| Scatter plot | Correlation analysis | 0.48\textwidth |
| Heatmap | Attention, confusion matrix | 0.48\textwidth |
| Box/violin | Distribution comparison | 0.48\textwidth |
| Architecture | System overview | 0.95\textwidth |
| Multi-panel | Combined results (subfigures) | 0.95\textwidth |
| Comparison table | Prior bounds vs. ours (theory) | full width |
Acknowledgements
Design pattern (type × style matrix) inspired by baoyu-skills. Publication style defaults and figure rules from pedrohcgs/claude-code-my-workflow. Visualization decision tree from Imbad0202/academic-research-skills.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

