Figure composer
Load figure-style with this skill. The sidecar provides pure geometry,
composition, task-building, and review-schema helpers. It does not call models,
delegate Agents, resolve artifacts, or inspect images from Python.
Inputs
Require a one-sentence claim, target width in millimetres, and concrete
project-relative or absolute data paths. Never use artifact ids as paths. For an
existing figure, inspect the real image with view_image and write the outline
yourself; pixels cannot reveal the source data path.
Workflow
- Build an outline matching
figure_outline_schema(). Put real paths in
data_path; use null for schematics.
- Make panel
a the conceptual hook and panel b the primary evidence. Use a
12-column grid and one row per sub-claim.
- Build one instruction per panel with
panel_task(...).
- If
delegate_tasks is advertised, submit the independent panel tasks as one
batch. Grant each task the minimum advertised capabilities needed, normally
visualization plus project_read. Require a concrete PNG filename in each
output schema. If delegation is unavailable, render the panels sequentially
with python.
- Compose returned paths with
compose_figure(...). Do not pass placeholder
markers to the composer.
- Use
compose_crops(...) with Pillow to save temporary crop files, then call
view_image on the composite and every crop. Fix seams, clipped labels,
aliases, empty space, and misplaced panel letters before review.
- Build one reviewer instruction with
composite_review_task(...). Delegate it
with image_inspection, project_read, and reasoning when those capability
ids are advertised; otherwise perform the review in the current Agent.
- Apply outline revisions and regenerate only affected panels. Stop after three
rounds or when there are no blockers and at most two major findings.
Outline example
{
"claim": "Treatment restores the disease-associated trajectory.",
"width_mm": 180,
"ncol": 12,
"row_heights_mm": [42, 60],
"panels": [
{
"letter": "a",
"role": "schematic",
"row": 0,
"col": 0,
"colspan": 12,
"chart_family": "study schematic",
"message": "The experiment tests trajectory rescue.",
"data_path": null,
"ask": "Show cohorts, treatment, sampling, and comparison."
},
{
"letter": "b",
"role": "primary",
"row": 1,
"col": 0,
"colspan": 12,
"chart_family": "trajectory plot",
"message": "Treatment moves cells toward the healthy trajectory.",
"data_path": "results/trajectory.csv",
"ask": "Plot disease, treated, and healthy cells with confidence bands."
}
]
}
Boundaries
- Use
delegate_tasks only as an explicit Wisp tool; never call delegation from
python.
- Use
view_image only on a concrete local image file.
- Keep data preparation in normal project files. Use
run_in_context only when
a deterministic render or preprocessing job is long enough to require a
persisted Run; Agent delegation itself is not a Run.
- Save the accepted composite to a stable project path and report that path.