Skip to main content
This walk-through uses a fictional provider, examplepay, so every command is safe to copy. Every block of output came from running the real binary.

1. Install and run the demo

demo needs no config. It stands up a fake provider, sends traffic through the agent, changes the provider’s responses behind your back, and prints the alerts. See Installation for Homebrew, release binaries and the container image.

2. Scaffold a config

pikopod.yaml is read from the working directory unless --config says otherwise. Unknown keys are startup errors, so a typo can never silently do nothing. The full key list is in the configuration reference.

3. Import a spec into a sandbox

--spec takes a local file or an http(s) URL: OpenAPI 3.x, Swagger 2.0, a Postman collection, a GraphQL schema, or a documentation page. Use your provider’s spec URL, or download the small example spec these docs use to follow along exactly:
The sandbox is deterministic: same seed, same bytes, every run. Pin one with --seed when you want reproducible transcripts. The credential is what the sandbox expects on every request, sent the way the spec’s auth scheme says.
No spec? Point --spec at the provider’s documentation page. pikopod looks for a linked or embedded spec first, then the site’s well-known spec paths, and only falls back to extracting one with a model if you configured your own key. See Importing from a docs URL.

4. See which failures already bound to your API

There is no binding step. The moment a spec is imported, pikopod’s eleven failure stories attach themselves to the operations it declares. scenario list shows what attached and, for anything that did not, why.
Eleven failure stories bind themselves to the operations your spec declares. The one that cannot bind says why: the spec declares no webhook event, so there is nothing to deliver twice. pikopod never guesses a test into existence. See Archetypes.

5. Run two of them

Runs are ephemeral by default: each one drives its own requests at a throwaway copy of the sandbox, so nothing you serve is touched. Exit 0 when everything passes, 1 when an assertion fails, 2 on a tool error. See Running scenarios.

6. Serve it and make your own tests meet the failure

Two listeners start, and which one you point at depends on what you are pointing: For this step, point your tests at the sandbox. Then, in another terminal, put it into a scenario’s standing state so your own tests, Postman, or plain curl meet the failure:
Or arm one fault directly:
See Modes and Faults.

7. Gate a build on a breaking spec change

This needs no sandbox, no proxy and no config file. It reads straight from git with no checkout:
Add --format githubactions in CI and every finding lands inline on the pull request diff. See Spec diff and CI integration.

8. Watch a real provider

Tell the agent where the real provider is. pikopod init left a placeholder; replace it with the provider’s real base URL:
Restart pikopod up, then point your app’s provider base URL at http://127.0.0.1:4700/examplepay, keeping your real provider credentials. The agent forwards everything untouched and observes afterwards. What to expect, and when:
  • Incidents fire from the first request. A 5xx, a 429, or an unreachable provider is a fact about one request and needs no history.
  • Drift stays quiet for 50 samples and 48 hours per endpoint. A shape change is a claim about what is normal, and a reference built from five responses has not seen your optional fields yet. This is on purpose, and it is why nothing about drift appears on day one.
  • pikopod status shows progress: every endpoint the agent has seen, its sample count, and whether it is warmed up.
For a same-day evaluation, shorten the gates and reset them later:
See Observe.

9. Reproduce the failure on your laptop

The generated pack is an ordinary scenario. Commit it and it guards that path forever. When the agent runs on another host, pikopod incidents export <fp> writes a bundle that reproduce accepts in place of the fingerprint. See Reproduce.

10. Regress forever

Replay runs offline against recorded traffic and frozen baselines. See Replay gate.

What just happened

  • import normalized the spec into pikopod’s internal representation, where every field carries provenance, and registered a sandbox under data_dir.
  • scenario list bound eleven provider-agnostic archetypes to the operations the spec declares, refusing the one it could not ground.
  • scenario run expanded two archetypes into concrete steps and ran them against an ephemeral engine.
  • up started two listeners in one process: the sandbox on :4600 and the observing agent on :4700.
  • spec-diff normalized two spec versions and derived a severity for every change by one fixed rule.
  • incidents read the event log, and reproduce turned one event plus its redacted recording into a runnable pack.

Adopt it in this order

  1. Day one: the sandbox and the CI gate. Import the spec, run the archetypes in CI with a pinned seed, and add spec-diff to the pull request pipeline. Nothing is installed in your request path.
  2. Then: the agent in staging. Point the staging app at the agent and let it warm up somewhere low-stakes. Incidents are useful immediately; drift becomes useful after two days.
  3. Then: the agent in production. One agent as a shared service, its data_dir on a persistent volume. The first thing production sees is a tool that has already been quiet for two days. See Deployment.

Next steps

The loop

Why the sandbox and the observer are one tool.

Use it from a coding agent

The same checks over MCP, with honest verdicts.

Webhooks

Deliveries wrapped and signed the way the provider documents.

Deployment

Where the agent runs, and where its state lives.