Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when producing the JSON error body an HTTP API returns on a failure response: format it as a Problem Details object, not an ad-hoc error shape. Do NOT use for success-response payloads or for choosing which HTTP status code to return.
.claude/skills/http-problem-details/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 100% | 31 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +23% | +62% | 0% | 22 | 54d agov1 |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-10 | ✗→✓ | ▲ Improved | — | — |
| case-16 | ✗→✓ | ▲ Improved | — | — |
| case-09 | ✗→✓ | ▲ Improved | — | — |
Enforces the Problem Details object shape on every JSON error body an HTTP API returns for a 4xx or 5xx response. Apply whenever the task is to produce the body of a failure response, an API error payload, or an error-envelope schema — not a success payload and not the choice of status code itself.
An error body is a single JSON object whose members come from this fixed set. Do not invent other top-level names for them.
title — a short, human-readable summary of the problem type. It is the same stringfor every occurrence of that type; it does not embed the specific request's details. Use it in place of any error, message, msg, or reason member.
status — the HTTP status code as a JSON number (integer), equal to the status onthe response line. Never a string ("404"), never a made-up internal code.
detail — a human-readable explanation specific to this occurrence: what went wrongfor this particular request. This is where the request-specific sentence goes, not title.
type — a URI reference (string) identifying the problem type. When you have nodedicated documentation URI, use the exact literal "about:blank"; in that case title should be the HTTP status phrase (e.g. "Not Found").
instance — an optional URI reference identifying the specific occurrence (often therequest path or a trace URL). Include it when a caller could act on it.
remaining balance, a retry hint) are added as sibling members of title/status, NOT nested under an error, data, meta, or problem wrapper. The object is never wrapped.
invalid-params: an array of objectseach with exactly name (the offending field) and reason (why it failed).
application/problem+json — notapplication/json.
The base's wrong default is on the left; the conforming Problem Details object is on the right.
Internal error, generic (no dedicated type URI):
BEFORE {"success": false, "error": "Internal Server Error", "code": 500}
AFTER {
"type": "about:blank",
"title": "Internal Server Error",
"status": 500,
"detail": "The request could not be completed due to an unexpected condition."
}Conflict on a versioned resource (dedicated type, request-specific detail):
BEFORE {"error": "conflict", "message": "The document was modified by someone else"}
AFTER {
"type": "https://api.example.com/problems/edit-conflict",
"title": "Edit Conflict",
"status": 409,
"detail": "The document changed since revision 41; reload before saving.",
"instance": "/documents/9c2/revisions/41"
}Validation failure (extension member at the top level):
BEFORE {"error": "Validation failed", "fields": {"email": "invalid", "age": "too low"}}
AFTER {
"type": "https://api.example.com/problems/validation",
"title": "Your request parameters didn't validate.",
"status": 422,
"invalid-params": [
{"name": "email", "reason": "must be a well-formed address"},
{"name": "age", "reason": "must be at least 18"}
]
}type to the literal "about:blank" and maketitle the status phrase; do not omit type and do not invent a fake URL.
title vs detail → title is constant per problem type ("Out of Credit"); detailvaries per request ("Your balance is 30 but the item costs 50."). If a value names a specific amount, id, or path, it belongs in detail, not title.
extension member (invalid-params for validation); do not return a bare JSON array of errors as the whole body.
add it as a top-level extension member with a descriptive name; consumers ignore members they don't recognize.
title and the specific explanation detail. Don't use error,message, msg, or errorMessage.
status an integer equal to the response's HTTP status. Don't quote it and don'tsubstitute a private numeric code.
error,data, result, or meta.
"about:blank" when there is no type URI. Don't drop the type member entirely.application/problem+json. Don't label it application/json when a contenttype is requested.
{"error": "..."} or {"message": "...", "code": ...} — the ad-hoc shape the basereaches for by default.
title and leaving detail generic (they areswapped): title is type-level, detail is occurrence-level.
error or data envelope instead of top-level members."status": "404" (string) instead of the integer 404.errors/fields/violations instead of the registeredinvalid-params, or giving its entries keys other than name and reason.
title; specific explanation is detail; they are not swapped.status is the integer HTTP code, not a string, not a private code.type is present — a URI, or the literal "about:blank".invalid-params with name + reason entries.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | 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 +23 percentage points is the difference between those two pass rates over the 22 comparable cases.
The publisher has shipped newer versions since this run, so these numbers describe v1, not the version currently listed.
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/10/2026 | +73% |
Other measured skills in the registry, with their headline benchmark lift.