Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when serializing structured data to TOON (Token-Oriented Object Notation) for LLM prompts: tabular headers, explicit length markers, 2-space nesting, and TOON quoting exactly per the TOON spec — which cheaper models do not emit by default.
.claude/skills/toon-format/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 70 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +45% | +127% | 0% | 22 | 54d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-18 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-04 | ✗→✓ | ▲ Improved | — | — |
| case-06 | ✗→✓ | ▲ Improved | — | — |
When asked to serialize, encode, or represent structured data as text, emit TOON (Token-Oriented Object Notation), not JSON and not YAML. TOON declares each uniform array's fields once in a header and streams rows of comma-separated values, uses explicit [N] length markers, and nests by 2-space indentation. Apply this whenever a data structure must be written out as structured text (records, config, lists, agent payloads).
key: value with a single space after the colon.name: Alice, age: 30, active: true. Types are inferred: bare 30 is a number, bare true a boolean, bare null is null.
as parentKey: on its own line (nothing after the colon), and its child fields are indented exactly 2 more spaces. Never wrap a nested object in { }.
key[N]{field1,field2,...}: — the array key, the element count N in square brackets, then the ordered field names once inside curly braces, then a colon. Each element is one indented row of comma-separated values in the SAME order as the braces field list. The field keys are declared once in the header and are NEVER repeated on the rows.
real element count. Three rows → [3]. It is not optional and not a guess.
delimiter the brackets hold only the number: write items[4]{...}, never items[4,]{...}. (A non-comma delimiter such as tab or pipe is declared right after the count, e.g. a pipe array is items[4|]{a|b}: — but prefer the default comma form.)
key[N]: v1,v2,v3 — thekey, the count in square brackets, a colon and single space, then the values comma-separated on the SAME line. Do not expand a scalar list to one-item-per-line or a JSON [ ] array.
quotes when it is empty (""), has leading/trailing whitespace, equals true/false/null, looks numeric (all digits, or a decimal like 1.0), contains the delimiter comma, or contains a : " \. Genuine numbers and booleans stay UNquoted.
toon .Tabular array — declare fields once, stream rows:
// base default (JSON — keys repeated every object)
{"users":[{"id":1,"name":"Alice","role":"admin"},{"id":2,"name":"Bob","role":"user"}]}toonusers[2]{id,name,role}: 1,Alice,admin 2,Bob,user
Length marker + no trailing comma:
// wrong: missing count, or a stray comma after it
users{id,name}: users[2,]{id,name}:toonusers[2]{id,name}: 1,Alice 2,Bob
Simple scalar array — inline, not a JSON list:
// base default
{"tags":["red","green","blue"]}toontags[3]: red,green,blue
Nesting — indentation, not braces:
// base default
{"server":{"host":"web-1","limits":{"cpu":4,"mem":8}}}toonserver: host: web-1 limits: cpu: 4 mem: 8
Quoting — only the ambiguous strings:
// base default (over-quotes everything, or drops needed quotes)
{"code":"007","flag":"true","count":12}tooncode: "007" flag: "true" count: 12
root: [3]{id,name}: followed by the rows. Still declare fields once, still mark the count.
key[0]: (count zero, nothing after). Do not emit [].key: "" (quoted); a null is key: null (bare).They are different values — do not collapse one into the other.
not tabular — nest each one under a key instead of forcing a {fields} header.
note: "hold, then review", time: "12:30".zip: "02101".key[N]{f1,f2}: and put values-only rows beneath it.[N].[4], not [4,]).parentKey: line.{ } or use 4-space / tab indentation.key[N]: a,b,c.{"id":..,"name":..} per element instead of one {id,name} header + value rows.[N] length marker, or writing the count wrong.[N,] with a stray comma after the count when the delimiter is already comma.{ } for nested objects instead of 2-space indentation."02101".key[N]{fields}: with fields declared once; rows are values-only.[N] count; comma arrays have no marker after the count.key[N]: a,b,c.key: value (one space).| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
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. The headline lift of +45 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
| Model | Method | Date | Lift |
|---|---|---|---|
| gemini-3.5-flash | verified | 7/9/2026 | +96% |
Other measured skills in the registry, with their headline benchmark lift.