agent-infini
Use the InfiniSynapse CLI (`agent_infini`) for multi-turn AI data-analysis tasks,…
Correctness and legibility checklist for publication figures, plus a matplotlib sidecar. Load before plotting anything and call `apply_figure_style()` (role-mapped font ladder, outward ticks, frameless legends, 300-dpi saves, CJK-safe fonts). Covers data fidelity, label budgets,
$ npx -y skills add xuzhougeng/wisp-science --skill figure-style --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/figure-styleContext preview
The summary Claude sees to decide when to auto-load this skill.
Correctness and legibility checklist for publication figures, plus a matplotlib sidecar. Load before plotting anything and call `apply_figure_style()` (role-mapped font ladder, outward ticks, frameless legends, 300-dpi saves, CJK-safe fonts). Covers data fidelity, label budgets,
name: figure-style description: "Correctness and legibility checklist for publication figures, plus a matplotlib sidecar. Load before plotting anything and call `apply_figure_style()` (role-mapped font ladder, outward ticks, frameless legends, 300-dpi saves, CJK-safe fonts). Covers data fidelity, label budgets, axis/colour/type rules, chart choice by data shape, composition, and a mandatory render-then-inspect QA pass (bbox collisions + per-panel visual crops). Helpers: focal_palette, bar_with_points, strip_with_median, end_of_line_labels, panel_letter, set_frame, panel_crops, save_panel_crops (QA crops go to .cache/, never into the output figures directory). Multi-panel assembly lives in figure-composer; whole-paper figure ordering in paper-narrative." license: Apache-2.0
This skill makes one plot trustworthy and readable. It deliberately has no house aesthetic — frame, font family, and sizes are all parameters of `apply_figure_style()`, which must run before the first plotting call. Multi-panel assembly is `figure-composer`'s job; deciding what each figure in a paper should argue is `paper-narrative`'s.
Loading the Python helpers only defines them; it does not select a matplotlib backend or apply a style. Call `apply_figure_style(...)` explicitly for plotting. The optional `figure_style_self_check()` applies the defaults and checks font wiring when called; it is not a load-time check.
Two tiers of rule live below. **Hard rules** — everything under *Tell the truth*, *Never do*, and *Prove the render*, plus any rule stating a perceptual or factual invariant (semantic-zero centring, colour-vision safety, leader-line anchoring) — apply to every plot with no override. Everything else is a default: deviate when you have a deliberate reason, not by accident.
disappears from the plot or appears as a clearly distinct open/hatched marker named in the key — and it never contaminates a summary statistic drawn next to included rows.
initialisation, or protocol don't sit side by side as if equivalent. Facet them apart or mark the label, and state the difference once in the caption.
categorical label, threshold, and title back to the rule that defines it and check each plotted row satisfies it. A row that contradicts its label means the figure is wrong.
category on the axis. One counterexample means qualifying ("on 3 of 4 pairs") or demoting the title to a description.
unit of replication; any small-multiple that fixes a variable names the fixed value — in-panel, or in the caption when the label budget is tight.
drawn as background (scale bar, category strip) uses an established reference. Infer it from the plotted data only when the structure is itself the finding.
count) has a single canonical value reused identically in every panel, caption, and the abstract — with a definition of what it measures.
The panel shows the pattern; the caption carries the context. Design for a general scientific reader, not for yourself.
figure alone. Deleting a label may only ever leave the reader asking "why is that there?" — never "what is that?". Comparators are named for what they are ("no joint training", "prior method"), not a role word ("baseline"). Gloss any term a general scientist can't parse.
(labelled once per row of small multiples), and at most 2–3 narrative annotations. More than ~6 strings beyond axes/ticks means over budget. Identity labels are floor, not budget.
exclusion rationale, non-comparability footnotes, methods caveats.
doesn't — read it aloud and if a listener would ask "fewer genes *what*?", rewrite. A row of small multiples varying one thing gets one row header, not per-panel titles.
quote; the axis serves the rest.
label, the label stays gone.
`ax.margins(0.04)` — and no mark or text touches a spine.
with an explicit non-zero tick. Nothing may be drawn inside a break gap: the gap has no coordinates.
a log value axis are banned outright — bar length would encode the ratio to an arbitrary floor. Points with a median tick replace them.
bottommost); interior panels keep tick marks only. Panels sharing y and differing only in x abut (`wspace≤0.06`) under one row header.
reshaping the grid, not padding the panel.
"higher = better" cue in the margin — once per row, never per panel, never caption-only, and never rotated with rotated text (`goodness_arrow`).
The open-source, local-first AI research workbench. WISP — Workspace for Intelligent Scientific Practice Search the literature, run Python and R, query ~80 scientific databases, and keep the trail — figures, runs, decisions, and drafts — in one project.
Use the InfiniSynapse CLI (`agent_infini`) for multi-turn AI data-analysis tasks,…
Organize multi-step scientific analyses into reproducible, self-contained modules. Use for…
Use this skill to drive Wisp Browser Runtime sessions (shared daily Chrome or workspace…
Set up and validate a reproducible Python or R environment on a Wisp execution context. Use…
Use Cua Driver through MCP to inspect and operate the user's native desktop apps on Windows,…