llms.txt · git:20261007.7286e03 · 2026-10-07 · sha256 abd82887fc5b11f5

llms.txt git:20261007.7286e03A

Immutable. This exact content never changes and is served at /api/v1/blob/abd82887fc5b11f5.

# markvis

Write a table of numbers in a Markdown code block tagged `chart`, `markvis`, or `vis`. That block is the chart. Same text, same picture. If it cannot draw, keep the table.

Fetch this file. Emit that code block. Do not invent fields.

## Fence (the code block)

Tags `chart`, `markvis`, and `vis` are the same language.

Order:

1. Optional `markvis: 2`
2. One `key: value` per line
3. Blank line
4. Data: CSV, or one GFM table

Fields:

- `type` required. `bar` `line` `area` `scatter` `pie` `hist` `heatmap` `funnel` `waterfall` `radar` `gauge` `sankey` `treemap` `dumbbell` `bullet` `boxplot` `calendar`. Do not invent `donut`, `sunburst`, `chord`, or `stacked-bar`.
- `title` optional. A conclusion, not a slug.
- `theme` optional. Omit means `folio`. Allowed: `folio` `highcharts` `shadcn` `docs` `ant` `recharts` `graphite`. Any other value is `E_UNKNOWN_THEME`: show the table, not a silent swap.
- `palette` optional. Colors only. Allowed: `ink` `porcelain` `warm` `cool` `vivid`. Omit means the theme’s default colors. Any other value is `E_UNKNOWN_PALETTE`: show the table, not a silent swap. Never merge palette into the theme id.
- `unit` optional.
- `x` `y` `series` name real columns. `series` splits series.
- Data required. Not JSON.

Encodings (optional, type-local — not a new type id):

- On `bar` `line` or `area` only: `layout: grouped|stacked|percent`. Omit means grouped (today's look). Wrong type or bad value → table + `E_UNKNOWN_FIELD`.
- On `pie` only: `innerRadius` as a number in `[0, 1]`. Omit means the theme's default hole (`PIE_INNER_RATIO`). Explicit `0` forces a solid pie. Do not invent `donut`.
- On `bar` only: `orient: horizontal|vertical`. Omit means vertical.
- On `waterfall` only: `role` names a column of `delta|total|subtotal`. Empty means delta. Do not treat a step label as a total.
- On `gauge`: `min` and `max` as numbers. Omit `min` means 0. Omit `max` means 100, a labeled range, not the current value. Heatmap may set `min`/`max` as the shared color domain. Radar may set `max`.
- `surface` optional: `light` (default, no canvas fill) `dark` `export`.
- A measure cell that is not a number is `E_BAD_NUMBER` (row and column in the message). An empty cell is a gap on line, area, grouped bar, scatter, hist, heatmap, radar, dumbbell, boxplot, and calendar. It is `E_MISSING_VALUE` when the chart needs every value (pie, funnel, sankey, treemap, waterfall, gauge, stacked, percent).
- A repeated category/series key is `E_DUP_KEY`. Scatter, hist, and waterfall step labels may repeat. Do not keep the last row.
- `markvis` other than `2` is `E_BAD_VERSION`. Omit means 2.
- Sankey: one thickness scale. A cycle is `E_SANKEY_CYCLE`.

Also valid: an HTML comment immediately followed by a GFM table.

`<!-- chart: bar x=month y=tickets title="Mar led Midtown box office at 9.2k tickets" -->`

Comment keys: `type` (required), `x`, `y`, `title`, `unit`, `series`, `theme`, `palette`, `surface`, and legal encodings (`layout`, `innerRadius`, `min`, `max`, `orient`, `role`). Same meaning as fence headers.

## Types

- `bar` — category x, number y. Keep row order. Do not sort. Optional `layout`. Optional `orient: horizontal` for long labels.
- `line` — ordered x, number y. Optional `series`. Keep row order. Optional `layout`.
- `area` — same as line, filled. Optional `layout`.
- `scatter` — number x, number y. One mark per row.
- `pie` — label x, number y >= 0. Do not force the slices to 100. Optional `innerRadius` (see Encodings).
- `hist` — number x. Table keeps the raw rows.
- `heatmap` — x category × series category, y intensity. Long form. `series` is required.
- `funnel` — x stage, y >= 0. Keep order. Centered bands narrow from each stage's value to the next. The label sits to the right of the shape. `series` ignored. Negatives → `E_NEGATIVE_VALUE`.
- `waterfall` — x step, y signed delta. Keep order. Running baseline. `series` ignored.
- `radar` — x spoke, y >= 0. Optional `series`. One scale for every series. A grouped bar is clearer when the exact number matters. Negatives → `E_NEGATIVE_VALUE`.
- `gauge` — one row. Omit `max` means 100. `series` ignored.
- `sankey` — x source, series target (required), y flow >= 0. One row = one link. Self-link → `E_UNKNOWN_FIELD`. Cycle → `E_SANKEY_CYCLE`. Negatives → `E_NEGATIVE_VALUE`.
- `treemap` — x label, y >= 0, optional series parent (two levels only). Negatives → `E_NEGATIVE_VALUE`. `y<=0` omitted from paint.
- `dumbbell` — x category, y number, `series` required with exactly two values (first = from, second = to). Keep row order. A missing value is a gap. A third value → `E_UNKNOWN_FIELD`.
- `bullet` — x label, y actual. Optional `target:` names a column of targets (empty cell = no target). Optional `min` / `max` fix the scale. `series` ignored.
- `boxplot` — x category, y one observation per row (repeat the category). Optional `series` = one box per series. Under five values shows points, not a box.
- `calendar` — x `YYYY-MM-DD` date, y number, one row per day. Row order does not matter. Optional `min` / `max` fix the color domain. A bad date → `E_BAD_DATE`.

On any error: keep the rows, show the table, add one line with the error code. Never drop the numbers.

## Copy these

### Bar

```chart
markvis: 2
type: bar
title: Mar led Midtown box office at 9.2k tickets
unit: tickets
x: month
y: tickets

month,tickets
Sep,5200
Oct,6100
Nov,7800
Dec,8500
Jan,4800
Feb,7200
Mar,9200
Apr,6900
```

### Line

```chart
type: line
title: Walk-up still leads member through week 12
x: week
y: count
series: channel

week,channel,count
W1,walk-up,64
W1,member,28
W2,walk-up,68
W2,member,32
W3,walk-up,71
W3,member,35
W4,walk-up,69
W4,member,38
W5,walk-up,74
W5,member,41
W6,walk-up,72
W6,member,44
W7,walk-up,75
W7,member,47
W8,walk-up,73
W8,member,50
W9,walk-up,76
W9,member,53
W10,walk-up,74
W10,member,55
W11,walk-up,77
W11,member,57
W12,walk-up,78
W12,member,59
```

### Pie

```markvis
type: pie
title: MARTA takes the largest mode share
x: mode
y: count

mode,count
MARTA,38
Walk,24
Drive,22
Bike,11
Other,8
```

Emit the fence. Do not emit a PNG. Do not invent `donut`, `sunburst`, `chord`, or `stacked-bar` as type ids.