A laptop is never a complete gate (people pause it, use their phone, use apps Claros can’t see). For actions that must never happen — a merge that changes production, a wire, a refund over a limit, an access change — put the gate where the action executes. Claros for Mac stays the early warning.

GitHub required check

Every pull request gets a claros check on its head commit. Claros reads the pull request as one action (title, description, author, branches, the files it changes and their diff) against every rule that can apply to GitHub — instant checks first, the judge when a rule needs reading. Rules set for another app never apply. When the owner approves, the check runs again and passes for exactly that diff. Every push runs it again. Set it up (a workspace admin):
  1. Connect GitHub on Admin → Connectors (a token that can read the repositories and write commit statuses), or install the Claros GitHub App (below).
  2. GET /api/gates/github gives the webhook URL and its secret. In the repository (or organization) settings → Webhooks, add it: payload URL = that URL, content type application/json, secret = that secret, events = Pull requests.
  3. Make it required: Settings → Branches (or Rules → Rulesets) → the protected branch → Require status checks to pass before merging → add claros. From then on a pull request that breaks a stop rule can’t merge, and one that waits on an ask merges only once its owner says yes.
With a plain token Claros posts a commit status (context claros: success / failure / pending). Only GitHub Apps may write check runs: when the server has an App (CLAROS_GITHUB_APP_ID and CLAROS_GITHUB_APP_PRIVATE_KEY, the App’s permissions: Checks write, Pull requests read, Contents read, subscribed to Pull request events) and the webhook comes from its installation, the answer is a check run with the rule and owner in its output. Either can be required. To check a pull request by hand: POST /api/gates/github/run {"repo": "acme/app", "pr": 42} (editors).

Any system: POST /v1/gate

A payment flow, an ERP approval step, an access-request tool — anything that can call out before it acts — asks Claros with an agent-scope key:
allow is true when nothing is held (allowed, or a nudge: act, and show the nudge if you can). On an ask, poll decision_url (?wait=30 holds the request up to 30 s; ask_wait in the body sets how long the question stays open, default an hour) and act only when it answers proceed: true — with payload_sha256, only for the same payload. A stop is final for that payload. payload may be nested: every row of a list is checked. system is matched against the app a rule is set for.

Where each rule is enforced

The evidence pack (GET /api/evidence/aiuc1, rule_controls) and the oversight report say, per rule, where it actually acted in the period — from the checks it decided, not from configuration:
“Checked before they went” is the share of Claros for Mac’s sends on that rule answered before the send (held, or answered from the draft’s check). Fixes after the fact: Fixes.