ContractRadar
Machine change-governance: a ~200-byte hash poll detects any contract drift, then localises it to a JSON Pointer, classifies it breaking / minor / cosmetic, and routes it — automatically.
| Service | Rev | Fingerprint (L0) | Fields | Last change | Seen |
|---|---|---|---|---|---|
Payment payment | v3 | sha256:5dbad8eaed… | 3/4 | breaking | demo10s ago |
Order Management order-management | v2 | sha256:603a984092… | 4/4 | breaking | demo10s ago |
Shipment Tracking shipment-tracking | v2 | sha256:bf0edf001a… | 2/4 | minor | demo10s ago |
Billing Account billing-account | v2 | sha256:1e62cc5b02… | 2/3 | cosmetic | demo10s ago |
Customer Account customer-account | v2 | sha256:71185ac338… | 1/2 | minor | demo10s ago |
- paymentbreakingpagedv71d ago
- breakingdomain-changedrange [0, 1000000] → [0, 500000]
#/components/schemas/payment/properties/amount
sha256:a74dae8d54… → sha256:5dbad8eaed… - breakingdomain-changedrange [0, 1000000] → [0, 500000]
- customer-accountminorloggedv62d ago
- minorenum-value-addedenum += 'enterprise'
#/components/schemas/customer-account/properties/segment
sha256:c6dca59d5b… → sha256:71185ac338… - minorenum-value-addedenum += 'enterprise'
- billing-accountcosmeticsuppressedv53d agoacknowledged
- cosmeticmeaning-changedbusiness meaning edited
#/components/schemas/billing-account/properties/amount/description
sha256:65de0ff161… → sha256:1e62cc5b02… - cosmeticmeaning-changedbusiness meaning edited
- shipment-trackingminorloggedv44d ago
- minorfield-addednew optional field 'trackingRef'
#/components/schemas/shipment-tracking/properties/trackingRef
sha256:4602839da6… → sha256:bf0edf001a… - minorfield-addednew optional field 'trackingRef'
- order-managementbreakingpagedv35d ago
- breakingfield-now-required'channel' became required
#/components/schemas/order-management/required
sha256:c81d159a66… → sha256:603a984092… - breakingfield-now-required'channel' became required
- paymentbreakingpagedv26d ago
- breakingenum-value-removedenum -= 'rate_limit'
#/components/schemas/payment/properties/action
sha256:a74dae8d54… → sha256:b8d74dbd80… - breakingenum-value-removedenum -= 'rate_limit'
Breaking changes notify consumers via webhook + Deprecation/Sunset headers (RFC 8594) and the X-API-Change-Level response header.
ContractRadar consumes the Companion Sandbox's L0/L1/L2 change-governance surface.
A whole API spec — paths, schemas, enums, the lot — is reduced to one canonical SHA-256 (servers stripped so a redeploy doesn't flip it). That hash is the entire L0 payload. To ask "did anything change?" you send the hash as an If-None-Match ETag: unchanged → 304 with an empty body; changed → a fresh ~200-byte L0, and only then do you pull L1/L2. Edit the spec below and Poll to watch it drift.
{
"api": "Orders API",
"version": "2.4.1",
"schemaHash": "sha256:5c4617bcf9dc80ababfbec299942c951751dd791a7cddb98c521e2403733064e"
}The L0 stays ~125 bytes no matter how big the spec is — a 2 KB or a 2 MB spec both fingerprint to the same fixed size. And an unchanged poll is a 304 with a 0-byte body. That is the whole "200 bytes a day" cost.
A partner narrows one enum, makes one field required, changes one type — and three integrations break in production weeks later. ContractRadar makes that impossible to miss: it watches every contract for a couple of hundred bytes a day and turns any drift into a dated, localised, severity-graded, machine-readable event.
A ~200-byte L0 hash poll (ETag/304) flips the instant any byte of the contract moves.
L1 Merkle fingerprints + L2 diff pin the change to an exact RFC-6901 JSON Pointer.
Every move is graded breaking / minor / cosmetic — no human reads a diff.
Breaking pages the on-call; consumers get versioned headers + a machine changelog.
per contract, per day — the entire watch cost (L0 hash, ETag/304).
breaking / minor / cosmetic routing, so only real breaks page anyone.
detect → localise → classify → notify; only the DECISION stays human.
| Capability | ContractRadar | Manual changelog | oasdiff in CI | Uptime monitor |
|---|---|---|---|---|
| Catches a one-word / enum / domain change | ||||
| Localises to an exact JSON Pointer | ||||
| Classifies severity automatically | ||||
| Auto-signals consumers (webhook + headers) | ||||
| Zero manual changelog writing | ||||
| Daily watch cost ≈ 200 bytes |
full · partial / manual · none