Install any skill in seconds. Free to start, no credit card required.
Get Started Free →This FigMirror skill should be used when the user asks to "mirror this figure's style", "copy this figure's style", "make a chart that looks like this paper", "reproduce this figure with my data", "match this paper's aesthetic", "I want a NeurIPS-quality version of this", or any variant where they hand over a cropped or uncropped reference figure AND their own data and want their data rendered in the same visual register. ALSO triggers when the user attaches a paper-figure screenshot plus tabula
.claude/skills/vila-lab-figmirror/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 49% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 130% | 0% |
| case-10 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-12 | ✗→✓ | ▲ Improved | 127% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 55% | 0% |
figmirror)Use this skill when the user wants to:
style, not in data.
bars, layered waterfalls, or plane projections when the reference or data is actually 3D.
.py script with editable inline data plus PNG/PDFoutputs.
PNG/JPG). It may include margins, captions,neighboring panels, or page text; Stage 0 preprocesses it.
dirty terminal text.
Enable references/three-d-prompting.md only when the user asks for a 3D figure, the reference is visibly 3D, or the parsed data requires a 3D encoding such as x/y/z, surfaces, trajectories, layered profiles, closed objects, 3D small multiples, 3D bars, or plane projections. Do not use this insert to turn an ordinary 2D task into 3D.
data-gen, and launching the main Codex process.
role dispatch, artifact checks, Reviewer audit-view staging, JSON parsing, stop decisions, and final selection.
figmirror-drawer custom subagent throughspawn_agent with fork_context=false. It writes each iteration's matplotlib script, render, notes, and floor self-check in the staged workdir.
figmirror-reviewer custom subagent throughspawn_agent with fork_context=false. It sees only the staged audit view: the far-view composite, full-resolution reference/draft near views, the Reviewer prompt, the aesthetic library, and bounded history. It returns strict JSON including boxes; the Orchestrator writes that JSON to audit_iter<N>.json and deterministically renders annotated.png plus notes.md for the next Drawer.
subagents, and optional candidate-scoring path for strict reproduction.
references/preprocessor.md for Stage-0 reference crop cleanup.references/orchestrator-codex.md for loop wiring and stop conditions.references/drawer.md for the Drawer instructions.references/reviewer.md for the Reviewer instructions.references/aesthetic-library.md for the L2 convention library.references/three-d-prompting.md only when the 3D insert gate is enabled.inputs/reference_raw.png, then run thereference preprocessor to write inputs/reference_clean.png, inputs/reference_crop_check.png, and inputs/reference_crop_report.md.
to make up data or proceed without confirmation, record that in data_echo.md and continue; otherwise ask for confirmation.
references/three-d-prompting.mdplus references/three-d/ beside the normal prompts. The router selects exactly one mode file: three-d/style-transfer.md for ordinary user-data figures, or three-d/strict-reproduction.md for reproduction, comparison, or candidate/control replacement. For strict 3D reproduction runs that need quantitative candidate diagnosis, also stage scripts/score_3d_candidates.py; do not use that scorer for ordinary style transfer. The top-level Orchestrator owns final selection and must run the selected mode's rendered-image gates before copying any candidate to the final figure. Always stage scripts/figannot.py; it is the deterministic operator for building audit composites and drawing Reviewer boxes.
references/orchestrator-codex.md andspawns figmirror-drawer for each iter. The Drawer writes figure_iter<N>.py, img_iter<N>.png, notes_iter<N>.md, and floor_selfcheck_iter<N>.txt; the Orchestrator verifies those files before any Reviewer handoff.
audit_view_<N>, run scripts/figannot.py compose to createcomposite.png and review_prompt.txt, and spawn figmirror-reviewer as described in references/orchestrator-codex.md. The Reviewer sees the composite far view, full-resolution reference/draft near views, aesthetic library, optional 3D insert, bounded anchors/changed lists, and prior audit JSON, then returns strict JSON for the Orchestrator to persist.
scripts/figannot.py draw so audit_view_<N>/annotated.png andaudit_view_<N>/notes.md become the next Drawer invocation's explicit stateless visual history.
If the caller supplied max_iters, select the best floor-passing close iteration when that limit is reached. If the caller enabled auto-until-shipped, keep iterating until ship or a real blocker.
figure.py, figure.png, figure.pdf, output.png,floor_selfcheck_final.txt, selection.md, process.md, and status.json. output.png is the evaluator-facing PNG and may be identical to figure.png.
text<workdir>/ inputs/ reference_raw.png reference_clean.png reference_crop_check.png reference_crop_report.md data.txt aesthetic-library.md prompts/ preprocessor.md drawer.md reviewer.md orchestrator-codex.md aesthetic-library.md three-d-prompting.md # router, only for 3D runs three-d/ # mode files and routed 3D modules, only for 3D runs tools/ figannot.py score_3d_candidates.py # optional for strict 3D candidate diagnosis figure_iter0.py img_iter0.png notes_iter0.md floor_selfcheck_iter0.txt audit_view_0/ reference_clean.png img_iter0.png composite.png composite_meta.json review_prompt.txt aesthetic-library.md anchors.md changed.md three-d-prompting.md # router, only for 3D runs three-d/ # mode files and routed 3D modules, only for 3D runs review.json annotated.png notes.md audit_iter0.json audit_iter0.stderr ... figure.py figure.png figure.pdf output.png floor_selfcheck_final.txt selection.md process.md status.json
and signature motifs ARE style, not layout numbers. Reproduce them.
bands, error bars, streamline fields, stacked/offset construction, insets. Dropping or flattening one is a fidelity failure, not a simplification. Only the data values and labels change to match data.txt.
inputs/reference_raw.png is the preserved upload; inputs/reference_clean.pngis the Stage-0 crop used for L1 measurement.
(references/aesthetic-library.md); L3 opinion is disallowed.
data.txt or source code to the Reviewer audit view.plt.rcParams["pdf.fonttype"] = 42.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 21,053 | 5,046 | -76% | 1 | 1 | 0% | 4,371 | 2,415 | -45% | 0 | 0 | — |
case-02 | fail→fail | 27,270 | 5,571 | -80% | 1 | 1 | 0% | 5,409 | 2,418 | -55% | 0 | 0 | — |
case-03 | fail→fail | 21,292 | 5,003 | -77% | 1 | 1 | 0% | 4,229 | 2,341 | -45% | 0 | 0 | — |
case-04 | pass→pass | 4,181 | 3,076 | -26% | 1 | 1 | 0% | 665 | 2,559 | +285% | 0 | 0 | — |
case-05 | fail→pass | 11,525 | 4,705 | -59% | 1 | 1 | 0% | 1,976 | 2,951 | +49% | 0 | 0 | — |
case-06 | fail→fail | 8,374 | 3,708 | -56% | 1 | 1 | 0% | 1,402 | 2,821 | +101% | 0 | 0 | — |
case-07 | pass→pass | 6,891 | 1,553 | -77% | 1 | 1 | 0% | 1,169 | 2,349 | +101% | 0 | 0 | — |
case-08 | fail→pass | 25,368 | 2,917 | -89% | 1 | 1 | 0% | 1,152 | 2,651 | +130% | 0 | 0 | — |
case-09 | pass→pass | 9,129 | 3,204 | -65% | 1 | 1 | 0% | 1,316 | 2,682 | +104% | 0 | 0 | — |
case-10 | fail→pass | 13,466 | 2,647 | -80% | 1 | 1 | 0% | 2,210 | 2,530 | +14% | 0 | 0 | — |
case-11 | fail→fail | 10,212 | 2,270 | -78% | 1 | 1 | 0% | 1,463 | 2,491 | +70% | 0 | 0 | — |
case-12 | fail→pass | 5,944 | 1,888 | -68% | 1 | 1 | 0% | 1,073 | 2,440 | +127% | 0 | 0 | — |
case-13 | fail→fail | 14,531 | 1,751 | -88% | 1 | 1 | 0% | 2,572 | 2,365 | -8% | 0 | 0 | — |
case-14 | fail→fail | 10,419 | 9,239 | -11% | 1 | 1 | 0% | 1,795 | 3,668 | +104% | 0 | 0 | — |
case-15 | fail→fail | 7,310 | 2,287 | -69% | 1 | 1 | 0% | 999 | 2,507 | +151% | 0 | 0 | — |
case-16 | fail→pass | 12,572 | 4,750 | -62% | 1 | 1 | 0% | 1,878 | 2,906 | +55% | 0 | 0 | — |
case-17 | pass→pass | 6,171 | 4,681 | -24% | 1 | 1 | 0% | 863 | 2,936 | +240% | 0 | 0 | — |
case-18 | fail→pass | 12,681 | 4,887 | -61% | 1 | 1 | 0% | 1,819 | 2,814 | +55% | 0 | 0 | — |
case-19 | fail→pass | 7,256 | 2,553 | -65% | 1 | 1 | 0% | 1,206 | 2,534 | +110% | 0 | 0 | — |
case-20 | fail→fail | 10,258 | 12,342 | +20% | 1 | 1 | 0% | 1,616 | 4,441 | +175% | 0 | 0 | — |
case-21 | fail→fail | 15,425 | 22,784 | +48% | 1 | 1 | 0% | 3,126 | 6,407 | +105% | 0 | 0 | — |
case-22 | fail→fail | 2,676 | 4,527 | +69% | 1 | 1 | 0% | 405 | 2,754 | +580% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 18 counted toward the lift figure. The other 4 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +32 percentage points is the difference between those two pass rates over the 18 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.