Protocol Support¶
Status legend, verified against this repository's code and tests:
- VERIFIED — behavior implemented, deterministic tests pass in CI.
- PARTIAL — real foundation exists; named limitations apply.
- BLOCKED — needs hardware/credentials/services we do not have; interface + local mocks only.
| Capability | OpenAPI 3.0/3.1/3.2 | Swagger 2.0 | GraphQL SDL | gRPC/protobuf | AsyncAPI | SSE / WebSocket | MCP | WSDL 1.1 / SOAP |
|---|---|---|---|---|---|---|---|---|
| Load + normalize | VERIFIED | VERIFIED | VERIFIED | VERIFIED | PARTIAL | PARTIAL | VERIFIED | VERIFIED |
| Source locations | VERIFIED | VERIFIED | VERIFIED | VERIFIED | PARTIAL | n/a | PARTIAL (JSON pointer, no line numbers) | VERIFIED (line numbers, from a paired expat pass) |
| Semantic diff | VERIFIED | as OpenAPI | VERIFIED | VERIFIED | PARTIAL | PARTIAL | VERIFIED | VERIFIED |
| Breaking rules | VERIFIED | as OpenAPI | VERIFIED | VERIFIED | BLOCKED* | BLOCKED* | VERIFIED | VERIFIED |
| Dangerous-change category | n/a | n/a | VERIFIED | PARTIAL (width changes) | n/a | n/a | VERIFIED (hints, description edits) | VERIFIED (BRK-SOAP-*: action, style, version) |
| Lint / governance packs | VERIFIED | as OpenAPI | VERIFIED (protocol-filtered) | VERIFIED (protocol-filtered) | PARTIAL | PARTIAL | PARTIAL | PARTIAL (security lint applies; the adapter reads no security requirements) |
| Case generation (pos/neg) | VERIFIED | as OpenAPI | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED (generators emit JSON, not SOAP envelopes) |
| Conformance testing vs runtime | VERIFIED | as OpenAPI | PARTIAL | BLOCKED* | BLOCKED* | BLOCKED* | VERIFIED (MCP-CONF-*) |
BLOCKED |
| Mock / virtualization | VERIFIED | as OpenAPI | BLOCKED | BLOCKED | BLOCKED | BLOCKED | BLOCKED | BLOCKED |
| Drift detection | VERIFIED | as OpenAPI | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED* | VERIFIED (Streamable HTTP; stdio out of scope, see docs/mcp-drift.md) | BLOCKED |
| Performance budgets/regressions | VERIFIED | as OpenAPI | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED* | BLOCKED |
* Interface and fixtures exist or are planned; live validation requires a real GraphQL server / gRPC server / broker, which this project does not ship or impersonate. Nothing here fakes a passing run.
Notes per protocol¶
- OpenAPI is the strongest lane: full pipeline from diff through testing, drift, replay gating, mock/virtualization and performance budgets.
- Swagger 2.0 compiles into the same normalized model as OpenAPI 3 --
host/basePath/schemesfolded into servers, abodyparameter into a request body,definitionsinto schemas -- so every capability in that column is whatever the OpenAPI column is, minus what the adapter reports as lost at load:SWAGGER2-SERVER-SYNTHESIZEDwhen one server URL is synthesised from three fields,SWAGGER2-OAUTH-FLOW-LOSSYwhen 2.0's one-flow-per-definition model is flattened,SWAGGER2-PARAM-INfor anin:value 2.0 does not define.
This table said "via v2 normalization" in eight cells and the paragraph here
said the same. There was a core/model_v2.py -- stable entity ids, canonical
hashes, artifact migration and contract bundles, nothing to do with Swagger,
and specs/swagger2.py did not import it. The mechanism named was not the
mechanism involved, and that module has since been deleted.
fixtures/apis/swagger2/petstore.yaml is the document these cells are now
measured against; there was no Swagger 2.0 fixture at all before it.
- GraphQL: root-type fields become operations; arguments become typed
parameters; return types are captured so nullability evolution
(String! -> String, String -> String!) is analyzed with a distinct
dangerous-change category. Enum/interface/union member semantics inside
output types are not yet modeled.
- gRPC: lightweight built-in proto parser (no protoc). Field-number reuse
and duplicate RPCs detected at load; cross-revision wire compatibility
covers RPC removal, message type swaps, scalar wire-type changes,
integer-width changes and enum-value removal. Streaming RPC shapes are
parsed but not exercised at runtime.
- AsyncAPI: channels/messages/bindings normalize into operations;
message-level compat rules land with production-quality bindings coverage.
- SSE/WebSocket: documented event/message contracts are represented as
first-class operations (EVENT, WS_MESSAGE) — no inference of
undocumented protocols.
- WSDL 1.1 / SOAP: portTypes become operations keyed
portType.operation; the XSD subset a WSDL actually uses becomes
SchemaNodes, with xs:choice carried as a oneof and attributes under an
@ prefix. Faults are keyed by name rather than by the HTTP 500 they all
share. A DOCTYPE is refused before any entity is expanded. Everything the
model does not carry — xs:group, xs:union, restriction-derived complex
types, substitutionGroup, external schema documents — emits a
SPEC-WSDL-* finding naming it rather than being dropped silently. Nothing
downstream of the contract (mocking, fuzzing, drift) speaks SOAP; see
docs/spec-support.md.
Evidence: every VERIFIED cell maps to tests under tests/ that run on every
push (see .github/workflows/ci.yml).