Roadmap¶
Status legend: ✅ shipped · 🚧 in progress · 📋 planned
v0.1 — Foundations (current release)¶
- ✅ Normalized contract model with source locations
- ✅ OpenAPI 3.0/3.1 spec plugin (files + URLs), ref/validation findings
- ✅ Semantic diff with stable change IDs
- ✅ Direction-aware breaking rules catalog (ERROR/WARN/INFO)
- ✅ Semver policy engine
- ✅ Changelog generation (Markdown/HTML)
- ✅ Schema-driven test generation + failure minimization
- ✅ Stateful workflow engine (YAML manifests)
- ✅ Deterministic mock server with fault modes
- ✅ Contract coverage measurement
- ✅ Runtime drift detection
- ✅ HAR import + central redaction
- ✅ Sanitized replay with allowlists and production opt-in
- ✅ Performance budgets, baselines, regression gates
- ✅ Defensive security contract checks
- ✅ Auth profiles (env-referenced, never persisted)
- ✅ GraphQL foundation (load + structural diff)
- ✅ gRPC foundation (proto load + RPC/field-number checks)
- ✅ Versioned result artifacts + .apiverity bundles
- ✅ Full CLI with JSON output and stable exit codes. The command count is not
written here: it is in
docs/capabilities.json, generated from the parser, because it has been wrong in prose twice - ✅ Typed SDK surface
- ✅ Plugin system (6 entry-point groups)
- ✅ Reporters: terminal/JSON/YAML/Markdown/JUnit/SARIF/HTML
- ✅ React+TS frontend with 34 routes across six page groups (Overview,
Contract, Testing, Runtime, Agents, Team) on real generated fixture data.
Both counts are derived from
web/src/pages/index.tsxand pinned bytests/unit/test_frontend_page_count.py - ✅
apiverity servelocal bundle server - ✅ Composite GitHub Action (
action.yml) and a reusable workflow. Both exist because they are consumed differently: the action is a step in a job you own, the workflow is a whole job that brings the single non-spammy PR comment. validate/diff/breaking/semver gate either way - ✅ Deterministic fixture APIs + integration tests
v0.2 — Deepening (second transformation pass, 2026-08-26)¶
- ✅ Protocol-aware compatibility: GraphQL breaking rules + dangerous-change category; gRPC wire-compat rules; whole-contract HTTP compat findings surfaced by
apiverity breaking - ✅ GraphQL loader FIXED (kind-casing bug silently loaded zero operations); return types captured for nullability analysis
- 📋 GraphQL fuzzing: argument-level case generation from SDL
- 📋 AsyncAPI message/channel compatibility rules
- 📋 Workflow inference from explicit OpenAPI link objects (safe subset done)
- ✅ Shadow contract inference from sanitized traffic corpora (
apiverity infer) - 📋 Response-size/bandwidth metrics, TLS timing breakdown
v0.2-server — Self-hosted team/enterprise layer¶
- ✅ Worker enrollment + pull-based job queue (idempotency keys, backpressure)
- ✅ SSE run progress streaming (
GET /v1/runs/<id>/events) - ✅ Backup/restore/export/import incl.
apiverity server-db - ✅ API rate limiting + job/rate-limit Prometheus counters
- ✅ Opt-in redacted OTLP trace export
- 📋 Concrete OIDC/SAML providers (IdentityProvider protocol exists; needs a real IdP)
- ✅ Per-operation consumer registry and blast radius
(
breaking --consumers), with softening gated behind a registry that declares itself complete
v0.3 — Agent governance (third pass, 2026-09-10)¶
The wager: static MCP manifest diffing is already claimed by several published packages, so it ships here as table stakes and is never the headline. Declared-versus-live drift and fleet posture were open, and that is what this pass built.
- ✅ MCP tool manifests as the sixth contract format, diffed by the shared rules
- ✅ Declared-versus-live drift over Streamable HTTP, plus spec conformance against a server with no manifest at all
- ✅ Tool-description poisoning and annotation integrity (OWASP MCP03), run as
part of
validate - ✅ Authentication posture: what a server hands a caller with no credential
- ✅ Shadow servers, from client configuration rather than a network scan
- ✅
mcp.lock: a reviewed baseline for a tool surface, with a version that lives in the file you own because the protocol has nowhere for one - ✅ Call budgets with sliding windows
- ✅ Credential scanning of responses and tool results, reported without ever recording the credential
- ✅ OWASP MCP / Agentic / API Top 10 mapping, with the controls this tool cannot assess named rather than omitted
- ✅ Evidence packs for SOC 2, ISO 42001, DORA and the EU AI Act: records, not verdicts
- ✅ Ghost routes: what the contract deleted and the deployment kept
- ✅ A non-breaking alternative published for every rule
- ✅ Agent-governance pages in the dashboard, on data a real run produced
v0.4 — Ecosystem¶
- 📋 VS Code extension for inline breaking-change review
- 📋 SARIF ingestion into GitHub Code Scanning UI (first-class)
- 📋 Plugin marketplace documentation + example plugin repo
- 📋 OpenTelemetry trace correlation for drift findings, and the GenAI semantic conventions
- ✅ SOAP/WSDL 1.1 as a spec format (
apiverity/specs/wsdl.py) - ✅ Arazzo 1.1.0 workflow import/export (
workflow --to-arazzo, and an Arazzo description runs directly) — what does not survive the conversion is reported rather than dropped, and the export is validated against the OAI's own published JSON Schema - 📋 GraphQL federation / supergraph diffing
- 📋 Live-traffic capture (proxy/sidecar) — the interface is specified, the socket work is not done
- ✅ Multi-contract aggregation with CODEOWNERS-derived ownership
(
apiverity sweep,--basefor a whole-repo breaking verdict)
Known limitations¶
- GraphQL/gRPC testing parity with OpenAPI is partial: conformance harnesses exist as interfaces; live validation needs real servers (BLOCKED).
- Performance measurement runs concurrently and sweeps concurrency levels
(
regression --concurrency N,regression --curve 1,2,4,8). It measures the client and the service together, and says so: a plateau at the top of the sweep is reported as "the sweep did not go far enough", not as the service's ceiling. - Consumer impact is per operation, not per field: a
Changecarries a field name only inside a human-readable description, so attributing a removed response field to whoever reads that field would mean parsing a message. pip install api-verity-labdoes not work. Publishing is wired through OIDC and gated behind aPUBLISH_ENABLEDrepository variable that has never been set, which also blocksuvxandpipx. This needs the maintainer's PyPI account, not a code change.- Workflow graph rendering is tabular (step list) rather than a visual DAG.
Non-goals¶
- No hosted/cloud service; api-verity-lab stays local-first.
- No exploit payload libraries or offensive security tooling.
- No unrestricted interception proxy by default.
This roadmap is synced with reality each release; see the issue tracker for the live backlog.