Skip to main content
When something breaks, the first question is what changed. Zespan already knows about prompt deploys, agent promotions and policy edits. It cannot see your pipeline’s deploys, a model switch in your config or a feature flag flip unless you tell it. One short call from CI does that, and the change then shows as a marker on your charts, on the Changes page and, where it fits, as the change a finding points to. The call sends metadata only: what kind of change, which service and environment, a short commit id, your version label and a time. It has no field for code, a diff, a commit message, a branch, a file name or a person. If you send an email address or an attribute named like one, Zespan refuses it.
1

Create a change key

In the dashboard go to Settings → API keys → Change keys and create a key (named for the pipeline, for example GitHub Actions). Copy it now: it is shown once. You need the owner or admin role.
2

Store it as a CI secret

Save it as ZESPAN_CHANGE_KEY in your CI provider’s secret store. Do not use your project key for this: a change key can only report changes, so a leaked pipeline secret cannot read your data or run anything that costs money.
3

Add one step after your deploy

Pick the snippet for your pipeline below. Run it after the deploy succeeds.

Add the step

GitHub has no default variable for the environment name or your release label, so write them in (production and v2.4.1 above). Do not use github.ref_name: on a push it is the branch name.
A deploy is the most useful change to report. If you can only add one thing, add that, with a --service that matches your agent or service name.

What you can send

Do not send commit messages, author names or emails, branch names, file names or diffs. There is no field for them. An email address in any text field, or an attribute named author, author_email, author_name, committer, email, user, username, message, commit_message, files, file, diff, patch or branch, is rejected.

Reporting twice is safe

A change with a ref or a version gets a default idempotency key built from its kind, service, environment, ref and version. Send the same release again, because a job retried or fifty pods started together, and Zespan keeps one change: the repeat answers 200 with replayed: true. Changes without a ref or version are not deduplicated, so a second call stores a second change. Each project accepts 60 change reports a minute and 2,000 a day, and a request body up to 16 KB.

Your pipeline never fails because of Zespan

The CLI exits 0 and prints a warning when Zespan cannot be reached or your key is rejected, so a Zespan outage cannot block a deploy. Add --fail-on-error if you want a non-zero exit instead. Invalid input (a missing --kind, an email in a field) exits 2. zespan change --dry-run prints what would be sent and sends nothing.

What Zespan does with it

  • Markers on your charts. Changes show as dashed markers on the Overview, Performance and Errors charts and as rows on the Changes page, with service, environment and version.
  • A named change in findings. When a finding starts at the time of a change you reported, the finding can name it (“a deploy of checkout v2.4.1, reported by your CI”) and its evidence links to the change’s time. A change reported by your CI is your statement, not something Zespan observed, so on its own it never raises a finding above “likely”. When Zespan also sees the new version appear in your traces, the two are combined into one finding with a before-and-after comparison, and that comparison is what can make it stronger. Use the same --service name your SDK reports as the service name, and the same --version, so the two match.
  • Context for drift. A behaviour drift check lists a coinciding change, with the words “Coincidence is not proof of cause”.
  • A guess at the layer, never a decision. A prompt change points at the instructions layer, a model change at the model layer, and so on, always as a possibility. A change you report is never treated as proof of where a failure started.
Findings and drift context that use your reported changes appear once this is turned on for your project; until then, the findings you see do not change. Markers and the Changes page work from the start. On a self-hosted deployment, CHANGE_CI_ATTRIBUTION=on turns it on and off turns it off.
Reported changes are kept for 400 days.

Change keys

A change key (zsc_...) can report changes and nothing else: every other route answers 403 with change_key_scope. Create and revoke keys under Settings → API keys → Change keys (owner or admin). A revoked key stops working on the next request. The list shows each key’s first 12 characters and when it was last used, never the key.
Your project key also works for POST /v1/changes, but it can do much more than report a change. Use a change key in CI.

Next steps