GitHub Actions
fetch-depth: 0sogit:origin/main:openapi.yamlcan be read from object storage. No checkout of the base branch is needed.safe.directorybecause in a CI container the checkout is often owned by another user and git refuses to read it. pikopod detects this and prints the same fix, but setting it up front avoids a red run.--format githubactionsturns every finding into a workflow command carrying file, line and column, so it appears inline on the diff.--handoff report.jsonwrites the JSON report alongside the annotations.pr commentposts one marker-tagged comment and updates it in place on re-runs. Platform, repository, PR number and head SHA are detected from the Actions environment. The token comes fromGITHUB_TOKENorGH_TOKEN, never from a flag.
pr comment degrades: it writes the report to the job summary, or to stdout, and exits 0 with a note on stderr.
GitLab CI
pr comment detects GitLab from GITLAB_CI, reads the project and merge request IID from the CI variables, and needs GITLAB_TOKEN with api scope. Job tokens usually cannot post merge request notes.
Container image
The image isFROM scratch and runs as an unprivileged user:
Exit codes in CI
Treat1 and 2 differently. 1 means the provider changed something that breaks you. 2 means the tool could not run: a document did not parse, a $ref was refused, the checkout was unreadable. A gate that collapses them teaches people to ignore both. See Exit codes.
Gating on recorded traffic too
Once an agent has been observing a provider, add the offline replay gate to the same job. It needs thedata_dir (or a copy of it) and no network:
Running the sandbox in CI
Scenario runs need no server:pikopod scenario run builds its own engine in-process.
--seed so transcripts are byte-identical between runs. Packs are looked up in ./scenarios first, then in <data_dir>/scenarios, so a committed scenarios/ directory is the regression suite.