Real vs. simulated
Partifact mirrors the shape of a real automotive parts-procurement API. This page is the one place that says exactly where the mirror is faithful, where it simplifies, and where it proposes something the original contract does not have. When another page touches one of these boundaries, it links here.
Faithful to the contract
Section titled “Faithful to the contract”- The wire convention: RPC over POST, date-versioned paths, dotted method names.
- Two-header authentication on every call, and the unauthenticated install handshake that mints credentials.
- The error model: each method declares a type-tagged union, and the variant object is the response body. The 401 / 403 / 404 distinction preserves the same privacy-scoping behaviour as the original: a cross-organisation read is hidden, not denied.
- Webhooks: the 8-field envelope, HMAC-SHA256 signing, the 5-minute replay window.
- The procurement lifecycle through
order_confirmed, which is where the public contract ends. - The basket carries no currency field. Currency is a procurement-level concept and first appears on the procurement. An integrator who reads a currency off a basket offer is inventing it.
Added for the demo, beyond the public contract
Section titled “Added for the demo, beyond the public contract”The public lifecycle terminates at order_confirmed. So that the tests can run end to end, the sandbox adds two steps past that point: placing the procurement and reading the reconciled invoice. They are not part of the public contract and exist only to let the demo complete a full loop.
The boundary is labelled at runtime, not just in prose: the MCP tools return is_extension: true and the HTTP responses carry x_extension: true, so neither a reader nor an agent can mistake the added steps for the real contract.
Simplified on purpose
Section titled “Simplified on purpose”| Area | What is simplified | Why |
|---|---|---|
| OAuth | No external authorization server, no PKCE, no token refresh or expiry clock. Grant values are seeded fixtures. The access code is genuinely single-use (reuse returns invalid_access_code); the _15m in its name is a fixture label, not an enforced window. | The demo runs end to end with nothing external to stand up. The install contract and its error model are intact. |
| Supplier seed | Each sandbox holds one confirmable supplier, so only orders placed with that supplier can be confirmed. The tools say so. | Keeps the two-party protocol drivable by a single agent. |
| Process model | In single-agent runs, the supplier-confirm step and webhook delivery are collapsed into one process. Envelopes and the state machine are unchanged. | Same reason. |
| Backend | The production stack behind the original API is not reproduced in any form. Partifact reproduces the contract surface only. | Faking infrastructure would add nothing to the questions being tested. |
Wire names
Section titled “Wire names”The wire contract keeps its original header names, including Partly-Integration-ID and the partly-hmac-sha256 signature header. They are part of the protocol shape being mirrored; renaming them would make the mock unfaithful to the contract it reproduces. All credential values (partifact_…) are Partifact’s own.
Defects found and their status
Section titled “Defects found and their status”The tests surfaced three real defects in the sandbox (a webhook-secret provisioning gap, a lost-write race, a crash on overlapping confirms). They are documented with The numbers, and the operator test fed three further fixes back. None have been silently patched out of the published results.