Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when documenting an SAP API or OpenAPI spec for SAP API Business Hub: apply SAP-specific naming, vendor extensions, and lifecycle metadata the base ignores.
.claude/skills/sap-api-style/SKILL.md| Model | Eval pass | Runs |
|---|---|---|
| gemini-3.6-flash | 80% | 10 |
| Model | Lift | Δ tokens | Δ turns | Cases | Verified |
|---|---|---|---|---|---|
| gemini-3.6-flashbest | +39% | +116% | 0% | 23 | 52d ago |
| gemini-3.5-flash | pending re-run | — | |||
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-07 | ✗→✓ | ▲ Improved | — | — |
| case-03 | ✗→✓ | ▲ Improved | — | — |
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-17 | ✗→✓ | ▲ Improved | — | — |
| case-23 | ✗→✓ | ▲ Improved | — | — |
Enforces the SAP API Business Hub house style on OpenAPI documents — API naming, the x-sap-* vendor extensions, operation/response wording, lifecycle metadata, and character limits. Apply whenever you write or edit an info block, an operation, a response, or deprecation metadata for a REST/OData API destined for SAP API Business Hub. These are arbitrary SAP conventions; do not substitute generic OpenAPI habits.
info.title (API name)"Custom Forms API" -> "Custom Forms"."SAP" prefix. "SAP Document Approval" -> "Document Approval"."Configuring Portal" ->"Portal Configuration"; "Manage Invoices" -> "Invoice Management".
REST, OData, SOAP, GraphQL) in the name.v2, OData v4) in the name — version lives in metadata.info.title must be at most 80 characters.x-sap-shortText.summary, shortDescription, tagline, or info.description for thetile text — those are ignored by the Business Hub tile renderer.
x-sap-shortText must be at most 180 characters.info.description (the long description), which may run to ~2sentences / 1024 chars.
summary and descriptionsummary: action-oriented, starts with a verb (Creates, Retrieves, Updates,Deletes, Searches), no trailing period (preferred), at most 255 characters.
description: begins with a third-person singular present-tense verb — Creates,Retrieves, Updates, Deletes, Returns, Replaces, Cancels.
"This operation", "This endpoint", "This method",or "The API".
you, your).summary verbatim in the description; the description adds detail(side effects, constraints, prerequisites). Omit description entirely if it would only restate the summary.
204 -> "The product was deleted." NOT "No Content".404 -> "The requested product does not exist." NOT "Not Found".201 -> "The sales order was created." NOT "Created".409 -> "An employee with that ID already exists." NOT "Conflict".x-sap-stateInfo)x-sap-stateInfo — NOT the bare OpenAPIdeprecated: true flag (the Business Hub reads x-sap-stateInfo, not deprecated).
x-sap-stateInfo.state is exactly one of: beta, active, deprecated,decommissioned. The fully-retired state is decommissioned — never retired, sunset, removed, obsolete, or eol.
deprecated API MUST also set:deprecationDate — ISO 8601 YYYY-MM-DD.successorApi — the name of the replacement API.plannedDecommissionDate (YYYY-MM-DD), moreInformation (migration URL).active is the default; you may state it explicitly but it is not required.deprecation date before it can be decommissioned, and an API's total lifespan (active + deprecated) should be at least 24 months.
x-sap-apiType is "REST" or "OData" (this is where the protocol belongs — neverthe title).
employeeId), PascalCase for OData(EmployeeId); never snake_case or kebab-case for JSON fields.
| Element | Limit | |---|---| | info.title | 80 | | x-sap-shortText | 180 | | Package short description | 250 | | Operation summary | 255 | | description | 1024 |
Rule 1 — title strips "API":
title: "Custom Forms API"title: "Custom Forms"Rule 1 — title strips "SAP":
title: "SAP Document Approval"title: "Document Approval"Rule 1 — gerund/verb -> noun phrase:
title: "Configuring Customer Portals"title: "Portal Configuration"Rule 1 — protocol + version in name:
title: "SAP Sales Order OData API v4"title: "Sales Order" (protocol -> x-sap-apiType: "OData", version -> version:)Rule 1 — over the 80-char limit:
title: "Advanced Real-Time Inventory and Warehouse Stock Level Monitoring and Replenishment Management for SAP S/4HANA"title: "Inventory and Replenishment Management" (38 chars)Rule 2 — tile text in the right field:
info: { summary: "Manage employee leave requests" }info: { x-sap-shortText: "Submit, approve, and track employee leave requests with policy validation" }Rule 3 — operation description:
description: "This endpoint lets you create a new customer record."description: "Creates a customer record and emits a CustomerCreated event; returns 201 with a Location header."Rule 3 — no summary repetition:
"Create a new user"description: "Create a new user."description: "Creates a user account, sends the activation email, and assigns the default role."Rule 4 — specific response outcome:
responses: { '204': { description: "No Content" } }responses: { '204': { description: "The product was deleted." } }Rule 5 — deprecate, not deprecated: true:
yaml info: title: "Custom Forms" deprecated: true
yaml info: title: "Custom Forms" x-sap-stateInfo: state: deprecated deprecationDate: "2026-06-26" successorApi: "Custom Forms v2" plannedDecommissionDate: "2027-06-26"
Rule 5 — beta service:
info: { title: "Shipment Tracking API", x-beta: true }yaml info: title: "Shipment Tracking" x-sap-stateInfo: state: beta
Rule 5 — decommission term:
state: retiredstate: decommissionedSAP.A product name that genuinely contains it for disambiguation may keep it, but default to removing it — "SAP Travel Management" -> "Travel Management".
the literal word API/APIs. "OAuth" stays; "Forms API" loses API.
summary already says everything, OMITdescription rather than padding it — an empty description beats a restated one.
successorApi; if thereis genuinely no successor, the API is heading to decommissioned, not deprecated.
x-sap-stateInfo at all for a healthy API; addit only to declare beta, deprecated, or decommissioned (or to be explicit).
YYYY-MM-DD strings, quoted in YAML; never01/15/2026 or Jan 15 2026.
API, SAP, a protocol, or a version in info.title. ALWAYS use a bareTitle-Case noun phrase.
description: "This operation creates…". ALWAYS lead with the barethird-person verb "Creates…".
you. ALWAYS describe what the operation does.summary/description. ALWAYS use x-sap-shortText.deprecated: true. ALWAYS use x-sap-stateInfo.state: deprecatedplus deprecationDate and successorApi.
retired/sunset/removed. ALWAYS use decommissioned.The bare base model defaults to these — all wrong for SAP:
"… API" or a "SAP " prefix in the title because that reads natural."Managing Orders") or embeds OData/v2.description: "This endpoint allows you to…" (second person + "This endpoint").summary into description verbatim."No Content" and a 404 "Not Found" (the HTTP reason phrase).deprecated: true instead of x-sap-stateInfo.state: "retired" / "sunset" instead of decommissioned.summary or info.description instead of x-sap-shortText.API, no SAP, no protocol, no version, noun phrase, Title Case, ≤80.x-sap-shortText, ≤180.description starts with a third-person verb; no This …, no you.description adds detail beyond summary (or is omitted).x-sap-stateInfo; state ∈ {beta, active, deprecated, decommissioned}.deprecationDate (YYYY-MM-DD) + successorApi; ≥12 months notice.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-23 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-16 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
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. 23 cases were attempted. The headline lift of +39 percentage points is the difference between those two pass rates over the 23 comparable cases.
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 | +33% |
Other measured skills in the registry, with their headline benchmark lift.