Requirements
- The Growth or Scale plan. On other plans the button shows a lock and the plan that includes it.
- Anyone in the workspace who can see the issue can export it, whatever their lens.
Where to find it
- On an issue: open the issue and press Export evidence. The pack covers every event still kept on your plan (its data retention), plus the team's activity on the issue.
- On an alert: in Settings → Notifications → Recent alerts, press Export evidence next to the alert. The pack covers the alert's window: the rule's time window, ending when the alert fired. New-issue and regression alerts have no window, so their pack covers the hour before the alert. It works for alerts about an issue or an API endpoint. When an alert lists several endpoints, the pack covers the first one.
Formats
| Option | Type | Description |
|---|---|---|
| JSON | file | One file with every section and its hash. Best for archives and tools. |
| CSV | zip | One CSV per table (summary, users, daily counts, releases, API calls, activity and so on), plus the JSON the hash covers. |
| Print / Save as PDF | page | Opens an A4 print view. Choose Save as PDF in your browser's print dialog. The view can also save the exact JSON it shows. |
What a pack contains
- Summary: what failed (the issue's title, exception class and the line in your code), first and last occurrence, status, severity and assignee.
- Impact: events and people affected, as counts, plus the list of affected IDs. These are your own user IDs, or install IDs for people who weren't identified.
- Releases: the app versions the issue appeared in, with the release from your repository when it's synced. Once the issue is marked completed, it also shows the version where it stopped.
- Failing API calls: for an issue, the failed calls the same person made in the minute before it happened. For an endpoint alert, that endpoint's failures. Each row has the endpoint, status code, count, people affected, timing and first and last time.
- Who did what: comments with their @mentions, assignments, status changes, tickets created and earlier exports, with names and times. For alerts, also which channels were notified.
- Integrity: when the pack was generated, who generated it, and the SHA-256 of its contents.
Privacy
Nothing new is captured to make a pack. End users appear only as opaque IDs, never names, emails or the traits you send with identify. A user ID that looks like an email is replaced by a hash of it. Packs contain no request or response bodies and no query strings, which Codeskop never captures, and no exception messages. Comment text is included, because your team wrote it. Teammates appear by name, without their email.Every export is recorded
Each export appears in the issue's activity timeline with who made it, the format and the time. An export of an alert about an API endpoint is recorded in the workspace's audit log. Every export builds a fresh pack, so two exports have different times and different hashes.
Check the hash
The hash is the SHA-256 of the pack's JSON with its keys sorted, no whitespace, UTF-8, and the integrity.sha256 field itself removed. To check a pack, remove that field and hash the rest the same way:
verify.py
import hashlib, json with open("codeskop-evidence-issue-9f2c4e1a7b3d5f60-2026-10-21.json", encoding="utf-8") as f: pack = json.load(f) claimed = pack["integrity"].pop("sha256")canonical = json.dumps(pack, sort_keys=True, separators=(",", ":"), ensure_ascii=False)print(hashlib.sha256(canonical.encode("utf-8")).hexdigest() == claimed) # TrueFor a PDF, save the JSON from the print view at the same time. The hash printed in the PDF is the hash of that JSON.