CI integration and badge

Block a pull request below a threshold, and show the score in a README.

GitHub Actions

yaml
- name: cabfy audit
  env:
    CABFY_API_KEY: ${{ secrets.CABFY_API_KEY }}
  run: npx cabfy audit https://my-store.com --fail-under 60

That's all. Commit, branch and run URL are picked up from the environment automatically — no extra flags. The step fails if the score drops below 60, which fails the job.

Choosing the threshold

60 is the boundary between fail and warn: below it, a structural obstacle stops an agent from working. That's the right starting point for a blocking gate, because it only fires on a real problem. Moving to 85 (the pass boundary) means demanding excellence on every commit — workable once the store is already in good shape, brutal before that.

An audit measures the store, not the pull request
An audit measures a store in production, not the code in the pull request. The score therefore doesn't move with every commit: it moves when the store changes. Running the audit on a daily schedule rather than on every push is often more honest — and consumes less quota.

GitLab CI

yaml
audit:
  image: node:22
  script:
    - npx cabfy audit https://my-store.com --fail-under 60
  variables:
    CABFY_API_KEY: $CABFY_API_KEY

The badge

A public SVG badge showing the latest score a store obtained, to embed in a README.

  • Dashboard, "Badges" section: pick a store you've already audited, or type its URL.
  • The token and badge URL are shown only once — copy the suggested Markdown snippet.
  • The badge updates itself as new audits complete: nothing to regenerate.
markdown
[![cabfy](https://agent-readiness-three.vercel.app/badge/arb_xxxxxxxx.svg)](https://my-store.com)

The badge is cached for five minutes: allow for that delay before a new score shows up.

What the badge doesn't say

A revoked token, and a store with no completed audit, both render a gray "no data" badge rather than a broken image or an HTTP error. That's intentional: a public badge should never reveal why it has no data. If you see "no data" where you expect a score, first check that the badge's store URL matches the audited one exactly.

Regenerating a badge means revoking the old one first
A badge is tied to one account-store pair, one at a time. To regenerate one for the same store, revoke the existing badge first — otherwise creation is refused.