Help us improve
Share bugs, ideas, or general feedback.
From a-team
Enforces a hard gate requiring a written, reviewed API contract (OpenAPI, protobuf, GraphQL schema) before any endpoint or service interface is implemented.
npx claudepluginhub rbraga01/a-team --plugin a-teamHow this skill is triggered — by the user, by Claude, or both
Slash command
/a-team:api-contract-firstThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
```
Guides technical evaluation of code review feedback: read fully, restate for understanding, verify against codebase, respond with reasoning or pushback before implementing.
Share bugs, ideas, or general feedback.
NO API IMPLEMENTATION WITHOUT A REVIEWED CONTRACT.
Writing endpoints before the contract is building to a spec that doesn't exist.
The contract IS the spec. Code that matches it is correct. Code that doesn't is wrong.
Use this skill before writing ANY of these:
Choose the format that matches the project's stack:
REST → OpenAPI 3.x
# docs/api/openapi.yaml
paths:
/orders:
post:
summary: Create a new order
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateOrderRequest'
responses:
'201':
description: Order created
content:
application/json:
schema:
$ref: '#/components/schemas/Order'
'400':
$ref: '#/components/responses/ValidationError'
'401':
$ref: '#/components/responses/Unauthorized'
components:
schemas:
CreateOrderRequest:
type: object
required: [userId, items]
properties:
userId:
type: string
format: uuid
items:
type: array
minItems: 1
items:
$ref: '#/components/schemas/OrderItem'
Events / Async → AsyncAPI or JSON Schema
# docs/events/order-created.yaml
name: order.created
version: 1.0.0
payload:
type: object
required: [orderId, userId, createdAt]
properties:
orderId: { type: string, format: uuid }
userId: { type: string, format: uuid }
createdAt: { type: string, format: date-time }
Before implementation begins, verify the contract satisfies all of these:
Naming & Consistency
/orders not /createOrder)Completeness
Versioning
/v2/) — never modify /v1/ in a breaking waySecurity
Consumer Perspective
Save the contract file to docs/api/ or docs/events/. The contract is reviewed before implementation begins — not after.
Approval gate: the planner agent must reference the approved contract file in the implementation plan. If no contract file is referenced, the plan is not complete.
Implementation is correct when it matches the contract exactly. The contract is the source of truth — not the implementation.
If the implementation reveals that the contract needs to change:
Never silently diverge from the contract. Every divergence is a breaking change waiting to happen.
Write at least one contract test per endpoint that validates the actual response against the OpenAPI schema:
// [VALID] — tests the real implementation against the contract
import { validate } from 'openapi-validator'
import { spec } from '../docs/api/openapi.yaml'
test('POST /orders response matches contract', async () => {
const response = await request(app).post('/orders').send(validPayload)
const errors = validate(spec, '/orders', 'post', response)
expect(errors).toHaveLength(0)
})
These mean you are about to skip the contract step:
All of these precede the same outcome: a client built on undocumented assumptions, followed by a breaking change that neither team sees coming.