Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the project follows API-first / OpenAPI-first approach: generating controller interfaces, DTOs, and clients from an OpenAPI spec. Use when you see openapi.yaml, openapi-generator-maven-plugin, or ApiDelegate pattern in the project.
.claude/skills/rrezartprebreza-openapi-first/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | -4% | 0% |
| case-02 | ✗→✓ | ▲ Improved | -8% | 0% |
| case-03 | ✗→✓ | ▲ Improved | -9% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 14% | 0% |
| case-04 | ✓→✓ | = Same ✓ | 37% | 0% |
xml<plugin> <groupId>org.openapitools</groupId> <artifactId>openapi-generator-maven-plugin</artifactId> <version>7.5.0</version> <executions> <execution> <goals><goal>generate</goal></goals> <configuration> <inputSpec>${project.basedir}/src/main/resources/openapi.yaml</inputSpec> <generatorName>spring</generatorName> <apiPackage>com.example.api</apiPackage> <modelPackage>com.example.api.model</modelPackage> <configOptions> <delegatePattern>true</delegatePattern> <!-- implement delegate, not controller --> <interfaceOnly>false</interfaceOnly> <useSpringBoot3>true</useSpringBoot3> <!-- still the OpenAPI Generator Jakarta/Spring 6+ switch --> <useTags>true</useTags> <dateLibrary>java8</dateLibrary> <serializationLibrary>jackson</serializationLibrary> <openApiNullable>false</openApiNullable> <skipDefaultInterface>true</skipDefaultInterface> </configOptions> <generateSupportingFiles>true</generateSupportingFiles> <output>${project.build.directory}/generated-sources/openapi</output> </configuration> </execution> </executions> </plugin>
yaml# src/main/resources/openapi.yaml openapi: 3.0.3 info: title: Order Service API version: 1.0.0 paths: /api/v1/orders: post: tags: [Orders] operationId: createOrder requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/CreateOrderRequest' responses: '201': description: Order created content: application/json: schema: $ref: '#/components/schemas/OrderResponse' '400': $ref: '#/components/responses/ValidationError' get: tags: [Orders] operationId: listOrders parameters: - name: page in: query schema: { type: integer, default: 0 } - name: size in: query schema: { type: integer, default: 20 } responses: '200': description: Paginated orders content: application/json: schema: $ref: '#/components/schemas/OrderPage' components: schemas: CreateOrderRequest: type: object required: [customerEmail, items] properties: customerEmail: type: string format: email items: type: array minItems: 1 items: $ref: '#/components/schemas/OrderItemRequest' OrderResponse: type: object properties: id: type: string format: uuid status: type: string enum: [PENDING, PROCESSING, SHIPPED, DELIVERED, CANCELLED] customerEmail: type: string createdAt: type: string format: date-time responses: ValidationError: description: Validation failed content: application/json: schema: $ref: '#/components/schemas/ApiError'
java// Generated: OrdersApi interface with delegate // Your implementation — never modify generated files @Service @RequiredArgsConstructor public class OrdersApiDelegateImpl implements OrdersApiDelegate { private final OrderService orderService; @Override public ResponseEntity<OrderResponse> createOrder(CreateOrderRequest request) { Order order = orderService.createOrder(request); return ResponseEntity.status(HttpStatus.CREATED) .body(OrderApiMapper.toResponse(order)); } @Override public ResponseEntity<OrderPage> listOrders(Integer page, Integer size) { Page<Order> orders = orderService.findAll(PageRequest.of(page, size)); return ResponseEntity.ok(OrderApiMapper.toPage(orders)); } }
gitignoretarget/generated-sources/openapi/
useSpringBoot3=true — uses old javax.* imports; despite the name, this is still the OpenAPI Generator flag for Jakarta/Spring 6+ generation.gitignore, generate on buildskipDefaultInterface=true — generates default methods that hide missing impls| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-18 | fail→fail | 21,278 | 13,557 | -36% | 1 | 1 | 0% | 2,564 | 3,020 | +18% | 0 | 0 | — |
case-04 | pass→pass | 11,973 | 12,906 | +8% | 1 | 1 | 0% | 2,119 | 2,896 | +37% | 0 | 0 | — |
case-01 | fail→pass | 19,600 | 12,500 | -36% | 1 | 1 | 0% | 2,744 | 2,643 | -4% | 0 | 0 | — |
case-02 | fail→pass | 20,469 | 11,783 | -42% | 1 | 1 | 0% | 3,248 | 3,002 | -8% | 0 | 0 | — |
case-03 | fail→pass | 22,084 | 18,010 | -18% | 1 | 1 | 0% | 3,390 | 3,094 | -9% | 0 | 0 | — |
case-05 | fail→pass | 12,973 | 8,219 | -37% | 1 | 1 | 0% | 1,577 | 1,793 | +14% | 0 | 0 | — |
case-06 | pass→pass | 12,388 | 5,150 | -58% | 1 | 1 | 0% | 1,420 | 2,086 | +47% | 0 | 0 | — |
case-07 | fail→fail | 18,829 | 25,568 | +36% | 1 | 1 | 0% | 2,667 | 4,196 | +57% | 0 | 0 | — |
case-08 | pass→pass | 5,399 | 2,714 | -50% | 1 | 1 | 0% | 948 | 1,640 | +73% | 0 | 0 | — |
case-09 | pass→pass | 13,362 | 9,208 | -31% | 1 | 1 | 0% | 1,320 | 1,939 | +47% | 0 | 0 | — |
case-10 | pass→pass | 11,249 | 2,782 | -75% | 1 | 1 | 0% | 1,046 | 1,561 | +49% | 0 | 0 | — |
case-11 | pass→pass | 9,251 | 3,615 | -61% | 1 | 1 | 0% | 1,856 | 1,684 | -9% | 0 | 0 | — |
case-12 | pass→pass | 20,769 | 15,871 | -24% | 1 | 1 | 0% | 2,268 | 2,805 | +24% | 0 | 0 | — |
case-13 | pass→pass | 5,931 | 8,558 | +44% | 1 | 1 | 0% | 967 | 1,759 | +82% | 0 | 0 | — |
case-14 | pass→pass | 10,917 | 5,905 | -46% | 1 | 1 | 0% | 847 | 1,920 | +127% | 0 | 0 | — |
case-15 | pass→pass | 9,804 | 4,095 | -58% | 1 | 1 | 0% | 879 | 1,800 | +105% | 0 | 0 | — |
case-16 | pass→pass | 3,809 | 2,726 | -28% | 1 | 1 | 0% | 808 | 1,603 | +98% | 0 | 0 | — |
case-17 | pass→pass | 5,080 | 3,259 | -36% | 1 | 1 | 0% | 1,112 | 1,860 | +67% | 0 | 0 | — |
case-19 | pass→pass | 9,872 | 10,382 | +5% | 1 | 1 | 0% | 1,801 | 3,050 | +69% | 0 | 0 | — |
case-20 | pass→pass | 12,759 | 11,420 | -10% | 1 | 1 | 0% | 2,350 | 2,886 | +23% | 0 | 0 | — |
case-21 | pass→pass | 3,945 | 2,046 | -48% | 1 | 1 | 0% | 579 | 1,516 | +162% | 0 | 0 | — |
case-22 | pass→pass | 12,115 | 10,515 | -13% | 1 | 1 | 0% | 2,485 | 3,522 | +42% | 0 | 0 | — |
case-23 | pass→pass | 19,957 | 15,738 | -21% | 1 | 1 | 0% | 3,152 | 4,558 | +45% | 0 | 0 | — |
case-24 | pass→pass | 7,210 | 3,769 | -48% | 1 | 1 | 0% | 1,000 | 1,891 | +89% | 0 | 0 | — |
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. 24 cases were attempted. The headline lift of +17 percentage points is the difference between those two pass rates over the 24 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.