Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Get JSON out of the model reliably. Prefer tool_use with a schema over prompted-JSON, validate on receive, retry on parse fail. Use when downstream code will parse the response.
.claude/skills/archive228-structured-output/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 4% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -1% | 0% |
| case-22 | ✗→✓ | ▲ Improved | 87% | 0% |
Prompted JSON — "reply as JSON" in the system prompt — fails on ~2-8% of calls in the wild: stray prose before the object, trailing commas, unescaped quotes, code fences. That failure rate is fine for a demo and fatal for a loop that runs a thousand times.
response_format (good) — where supported. Guarantees a valid JSON object at the top level; does not guarantee schema conformance. Cheap upgrade over prompted-JSON.call → parse → if fail: retry once with the parse error appended → parse → if fail: hard fail"severity": "high|medium|low" not "severity": "...".additionalProperties: true without a reason. If the model can add fields, it will, and they'll be inconsistent.{"answer": "yes"}).Otherwise use tool_use.
json.loads with a bare try/except: pass. Silent failure — you'll be debugging a downstream nil for hours.oneOf/anyOf. Split into multiple tools and let the model choose which to call.Loopkit's adversarial-verify output is {"passes": bool, "failures": [...]} — that is exactly the shape this skill formalizes. When you compose skills, keep every machine-consumed hop tool_use'd.
Other measured skills in the registry, with their headline benchmark lift.