Skip to main content
Drift is about a successful response whose shape changed. It needs a frozen baseline, so it is silent during warmup. A request that simply failed is an incident, which needs no baseline at all.

The eight kinds

The level is graded by what breaks consumers: something removed or retyped is ERR, a new value is WARN, something purely additive is INFO. A finding the provider’s new spec documents is downgraded to INFO with a note saying so. See Spec watch.

The smallest example

One letter changes, and if status == "success" quietly stops matching:
Nobody’s changelog mentioned it. The fingerprint on that line is the handle you feed back in.

Fingerprints

A fingerprint is fp_ plus twelve hex characters of a hash over the upstream, method, template, status class, kind, field, before and after. The same divergence has the same fingerprint however many requests carry it, and a changed diff is a new fingerprint by construction. Presentation details such as the documented note are never part of it, so annotating a finding cannot re-alert it.

From a finding to a test

from-drift pins the contract you integrated against as a scenario pack. It passes while your sandbox still honours that baseline and fails the moment you re-import a spec that adopts the provider’s change, so the break happens on your laptop. See Generated packs.

What is not drift

  • Latency. Recorded, never a finding.
  • Values of fields you declared volatile. Their presence, type and nullability are still checked. See Volatile fields.
  • Anything on a muted template.
  • Anything before warmup. See Warmup and baselines.
Every event is written to <data_dir>/events.ndjson in the drift event schema, and pikopod incidents --only drift lists them.