A successful run returns a narrative (assistantMessage) plus zero or more structured payloads. The runner must create matching tool outputs before citing placeholders — otherwise the job can fail validation after repair rounds.
Syntax is case-insensitive for the word artifact. Identifiers are case-sensitive unless noted.
| Topic | Specification |
|---|---|
| Chart | `{{artifact:chart:<id>}}` — id matches any chart tool (`create_pie_chart`, `create_bar_chart`, `create_line_chart`, `create_area_chart`, `create_scatter_chart`, `create_stacked_bar_chart`). |
| Table | `{{artifact:table:<id>}}` — id matches `create_table` payload. |
| List | `{{artifact:list:<id>}}` — id matches `create_list`. |
| Checklist | `{{artifact:checklist:<id>}}` — id matches `create_checklist` (interactive in chat; updates persist to Storage). |
| SVG | `{{artifact:svg:<id>}}` — id matches `create_svg`. |
| File | `{{artifact:file:<path>}}` — path matches `create_file` `name` exactly (including folders). |
Aligned with server validation and the runner; values are subject to change in code but documented here for operators.
| Topic | Specification |
|---|---|
| Assistant message | ≤ 24,000 characters |
| Files | ≤ 24 files; each `.md` or `.txt`; content ≤ 48,000 chars per file |
| Charts (total) | ≤ 12 (any mix of supported chart kinds) |
| Tables (datasets) | ≤ 8 |
| Lists | ≤ 12 lists; ≤ 48 items per list; ≤ 512 chars per item |
| Checklists | ≤ 8 per job; ≤ 64 items each; item label ≤ 320 chars; each item has stable `id` (`^[a-zA-Z0-9_-]+$`, ≤ 48 chars) and `checked` boolean |
| SVGs | ≤ 8; raw SVG ≤ 64,000 chars; id regexp `^[a-zA-Z0-9_-]+$` |
| Tool / repair rounds | Large tool loop cap (e.g. 24 rounds); up to 4 deliverable repair rounds if placeholders lack tools |
Long-form text artifacts for specs, prompts, and copy-paste bundles.
| Topic | Specification |
|---|---|
| Parameters | `name` (path ending in `.md` or `.txt`), `content` (full UTF-8 body) |
| Name rules | Displayed path; folders allowed (e.g. `specs/MVP.md`). Must match `{{artifact:file:<name>}}` exactly. |
| When to use | Authoritative docs. Prefer `create_list` for static bullets, or `create_checklist` for tickable tasks in the UI. |
Part-of-whole visualization (composition, shares, survey breakdown).
| Topic | Specification |
|---|---|
| Parameters | `id`, optional `title`, `segments`: `[{ label, value }]` with finite non-negative numbers |
| Segments | ≤ 24 segments; values need not sum to 100 (UI normalizes) |
| Placeholder | `{{artifact:chart:<id>}}` — same `id` string |
Compare magnitudes across categories (matrix/scorecard style).
| Topic | Specification |
|---|---|
| Parameters | `id`, optional `title`, `labels[]`, `series[]` (each `{ name, values[] }`), optional `orientation` |
| Orientation | `vertical` (columns) or `horizontal` (bars) — for long category labels use horizontal |
| Constraints | ≤ 32 category labels; ≤ 8 series; each `values` length must equal `labels` length |
| Placeholder | `{{artifact:chart:<id>}}` |
Trends over an ordered X axis (time series, phases, sequential benchmarks).
| Topic | Specification |
|---|---|
| Parameters | `id`, optional `title`, `labels[]` (ordered), `series[]` with `values[]` aligned to labels |
| Placeholder | `{{artifact:chart:<id>}}` |
| Not for | Part-of-whole (use pie) or simple category comparison (often bar) |
Like a line chart with the area under each series filled — good for cumulative or emphasized trends.
| Topic | Specification |
|---|---|
| Parameters | Same shape as `create_line_chart` (`labels[]`, `series[]` with `values[]`) |
| Placeholder | `{{artifact:chart:<id>}}` |
Points in X/Y space — correlations, latency vs throughput, experiment sweeps.
| Topic | Specification |
|---|---|
| Parameters | `id`, optional `title`, `series[]` with `name` and `points: { x, y, label? }[]` (finite `x` / `y`) |
| Placeholder | `{{artifact:chart:<id>}}` |
Stacked vertical or horizontal bars — composition per category when values are additive (non-negative).
| Topic | Specification |
|---|---|
| Parameters | Same shape as `create_bar_chart` (`labels[]`, `series[]`, optional `orientation`) |
| Placeholder | `{{artifact:chart:<id>}}` |
Rectangular grids — mandatory instead of markdown pipe tables in the narrative.
| Topic | Specification |
|---|---|
| Tool shape | Wrapper with `table`: `{ kind: "table", id, title?, columns: string[], rows: string[][] }` |
| Constraints | ≤ 12 columns; ≤ 80 rows; ≤ 512 chars per cell |
| Placeholder | `{{artifact:table:<id>}}` must match `table.id` |
Structured bullets or ordered steps rendered in the dashboard (not raw markdown list syntax).
| Topic | Specification |
|---|---|
| Tool shape | `{ kind: "list", id, title?, ordered?: boolean, items: string[] }` |
| Items | Plain strings — no `-` or `1.` prefixes in items |
| Ordered | `ordered: true` for runbooks, phases, numbered steps |
| Placeholder | `{{artifact:list:<id>}}` |
Same storage layout as lists, but each row is an object with a stable id, label, and checked boolean. In the workspace chat, users can toggle checks; only the checked flags are accepted updates server-side.
| Topic | Specification |
|---|---|
| Tool shape | `{ kind: "checklist", id, title?, items: { id, label, checked }[] }` |
| Item rules | At least one item; duplicate item `id`s (case-insensitive) rejected; `checked` is only honored when `true` |
| Placeholder | `{{artifact:checklist:<id>}}` |
Inline vector diagrams (architecture sketch, simple flows). Not for data charts.
| Topic | Specification |
|---|---|
| Tool shape | `{ id, title?, content }` where `content` is a full `<svg>…</svg>` document |
| Safety | Rejected if markup matches script/event/embed patterns; no foreignObject / iframe |
| Placeholder | `{{artifact:svg:<id>}}` |