api-design: add API-first methodology, DX, and contract testing

Extends api-design.md beyond its security/operations focus with three
new dimensions:

- §0 API-First Design Process — OpenAPI 3.1 as single source of truth,
  Spectral governance, dogfooding (UIs consume the public API, no
  privileged backdoors), auth-required-by-default as a design stance.
- §7 Documentation and Developer Experience — Scalar/Mintlify,
  RFC 9457 Problem Details error envelope, interactive playgrounds,
  generated SDKs (Stainless, Speakeasy, Fern), RFC 9745 deprecation
  signals and changelog UX.
- §8 Contract Testing and API Quality — schema validation in the
  test suite, Pact CDC vs provider verification, Schemathesis
  property-based fuzzing, oasdiff drift detection in CI, the API
  test pyramid.

Intro, cross-refs in §3.1/§3.3/§4.1, and Sources block reorganised
by topic. Index entry in BESTPRACTICES.md updated. PLAN file included
for traceability.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Paul O'Reilly
2026-04-25 13:42:03 +12:00
parent 22d49b2c9a
commit 6154031cf9
3 changed files with 431 additions and 6 deletions

View File

@@ -0,0 +1,81 @@
# Enhance api-design.md — API-First Design, DX, and Contract Testing
## Goal
Extend the existing `api-design.md` (security/operational focus) with three new sections covering the **methodology**, **developer experience**, and **testing** dimensions of building APIs. The user's framing: "API-first design" — robust testing, auth required by default, UIs using the same API as the public surface, OpenAPI/Swagger as a humans-friendly contract, and self-documenting features.
We are **enhancing the existing file**, not creating a new one. Same file, new sections.
## Scope
### New Section 0 — API-First Design Process (top of file, before Transport Security)
- Design the contract before writing code
- OpenAPI 3.x as the single source of truth
- Style guides + Spectral linting / API governance
- Design reviews
- Dogfood your own API: UIs and internal tools consume the same public API surface
- No privileged "internal-only" backdoors that bypass auth or expose extra fields
- Auth required by default — design stance, not a bolt-on (mechanics live in §2)
- Anti-patterns: code-first OpenAPI exports as an afterthought, separate "internal" and "public" APIs that drift, anonymous endpoints "because it's internal"
### New Section 7 — API Documentation & Developer Experience (after Service Mesh)
- OpenAPI-driven docs: Swagger UI, Redoc, Scalar, Stoplight Elements
- Interactive playgrounds with example requests
- Examples and error catalogs embedded in the spec
- Generated SDKs (openapi-generator, Speakeasy, Fern, Stainless)
- Public changelog and deprecation signals (`Deprecation` / `Sunset` headers tied to docs)
- Anti-patterns: hand-written docs that drift from code, no examples, no error reference
### New Section 8 — Contract Testing & API Quality
- Schema validation in tests (request and response conformance)
- Contract tests: provider-side (does the API match the spec?) and consumer-driven (Pact)
- Property/fuzz testing the spec (Schemathesis, Dredd) to find edge cases the spec implies but the implementation breaks
- Drift detection: spec-vs-implementation and spec-vs-deployed-API in CI
- The API test pyramid: unit → contract → integration → smoke
- Anti-patterns: tests that mock the API away, contract tests that only validate happy path, no consumer tests when SDKs are published
### Light edits to existing sections
- §3.1 (Versioning) — cross-ref new §7 deprecation patterns
- §4.1 (Schema validation) — cross-ref new §0 (OpenAPI as source of truth) and §8 (drift detection)
- Update the file overview at the top to mention all three new dimensions
## Process
1. ✅ Confirm scope with user (done)
2. Write PLAN.md (this file)
3. Dispatch 3 parallel WebSearch research agents:
- Agent A: API-first methodology, OpenAPI as source of truth, governance/Spectral, dogfooding, design reviews (20242025)
- Agent B: API documentation tooling — Swagger UI / Redoc / Scalar / Stoplight, SDK generation, examples-in-spec, deprecation UX
- Agent C: Contract testing — Pact, Schemathesis, Dredd, OpenAPI-driven test generation, drift detection, the test pyramid for APIs
4. Synthesize research into the three new sections, matching the existing **Principle / Why it matters / How to implement / Anti-patterns** structure
5. Edit `api-design.md` — insert Section 0 at top, Sections 7+8 after current §6, light cross-refs in existing sections, update Sources block
6. Update `BESTPRACTICES.md` index entry to include the new dimensions
7. Validate: file renders cleanly, internal links resolve, no duplication with existing sections
8. Stop. Do not commit unless user explicitly asks.
## Style requirements
- Match the existing file's voice: direct, opinionated, no hedge words
- Each numbered subsection: **Principle:****Why it matters:****How to implement:** (bulleted) → **Anti-patterns:** (bulleted)
- Cite RFCs / OWASP / vendor docs in the Sources block at the bottom of the file
- Keep concrete: name actual tools (Spectral, Schemathesis, Pact, Redoc, etc.), not generic "use a linter"
## Out of scope
- Creating a separate `api-first-design.md` file
- Rewriting or restructuring existing sections (16)
- GraphQL or gRPC specifics — this file is REST/HTTP focused
- A standalone tooling comparison matrix (briefly mention top tools per category, don't review them)
## Open questions
- Whether to add a small "API-first vs. code-first" tradeoff note in §0 — leaning yes, brief
- Whether SDK generation deserves its own §7.x subsection or fits inside doc tooling — leaning own subsection
## Verification
After writing, re-read the file end-to-end and check:
- The three new sections fit the existing tone
- No duplication with §16
- Cross-references work in both directions
- Sources block updated