Skip to main content

CodeRifts · honesty map · measured

What each path does — and does not

A map of the integration paths, not another product pitch. Every row states what the path does and what it does not. Rows with only the first half are what produced the confusion this page exists to end.

How to read this. “Prevents” means the path can stop work without a human interpreting a report. “Reports” means a human or agent still decides. Nothing here invents a capability that is not already live.

Verified enforcement closure

ENFORCING

1 / 7

paths

ADVISORY

5 / 7

paths

EVIDENCE

1 / 7

paths

CodeRifts evaluates every listed path. 1 of 7 currently satisfies all path-specific conditions required for an ENFORCING claim; 5 of 7 are ADVISORY today, and 1 of 7 is an evidence mechanism that is not on the enforcement scale at all. Each missing condition is named in its own row below.

A path is labeled ENFORCING only when every known closure condition inside its stated boundary is satisfied and supported by evidence. Measured 2026-09-17; the labels above are read from /docs/data/enforcement-closure.json, and a build gate fails if this page disagrees with it.

Short table

Path Can prevent… Without extra wiring…
@coderifts/agent-guard a tool call (through its table) nothing — must wire tools
PR comment — reports only
API Contract Check a merge (if all four conditions) not a gate after bare install
contract-gate a merge (Action, when required + issuer-bound) App check phase-1 clamped; name-only pin spoofable by anyone, issuer-bound pin by anyone who can edit workflows
MCP tools — agent must honour the verdict
CLI / pre-push a push (if the hook runs) not a merge gate
conformance 7/7 — (records a trusted-executor transition) not PATH B; not a GitHub merge; not externally witnessed

Enforcement and decision paths

Runtime guard — @coderifts/agent-guard

npm package · tool-table composition · fail-closed

ADVISORY · GUARDED TABLE · COMPOSITION DECLARES CLOSURE INCOMPLETE

Does

Prevents a breaking contract call from running when the call goes through the returned tool table. Fail-closed on BLOCK, REQUIRE_APPROVAL, unverifiable receipt, unwired monitoring, and similar integrity failures.

Does not

Does not see calls the host registers outside that table. Does not block a human merge on GitHub. Does not replace branch protection or the PR report path.

Becomes a gate when: wire only the tools returned by withCodeRifts / the guarded registry — the runtime sees only calls through that surface. See agents quickstart.

PR comment — GitHub App

one install · signed BLOCK / WARN / ALLOW on the pull request

ADVISORY · PR

Does

Reports a signed governance decision on every pull request that changes analysable contracts (and related opt-in gates). Visibility for reviewers with no CI YAML required.

Does not

Prevents nothing on its own. A red comment does not stop merge, push, or an agent tool call unless something else enforces the verdict.

The opt-in gates are named, not implied. MigraGuard is one: switched on per repository, it reads the migration file together with a live code reference and holds both in memory — neither is persisted. It appears in the Policy Violations list of the comment, and like the rest of the comment it reports.

Becomes a gate when: nothing beyond installing the App. See GitHub integration.

Kubernetes admission webhook — coderifts/k8s-admission customer-hosted · open source

Admission review · denies the apply

ENFORCING · ADMISSION · CUSTOMER-PINNED KEYRING

Measured 2026-09-20 from the repository’s own README: fail-closed, with named deny reasons — receipt_missing, receipt_invalid, scope_mismatch, dsse_malformed. It runs in your cluster and you pin KEYRING_PATH.

Becomes a gate when: the webhook is registered for the resources you care about and the keyring you pinned is the one that signed the receipts.

The boundary it states about us: “No CodeRifts-operated service is called at admit time.” That is the point and also the limit — nothing we run can observe, delay or rescue an admit decision made in your cluster, and a keyring you stop updating is a keyring we cannot refresh for you.

Gateway verifier — coderifts/gateway-verifier target-side · open source

Request path · refuses the call

ENFORCING · REQUEST · CALLER-PINNED KEYRING

It calls itself a target verifier: it checks evidence the caller already holds, then forwards. Measured 2026-09-20 from its README — proves the receipt token is authentic under the caller-pinned keyring, unexpired for the configured clock, and that the resolved intent (operation and target) matches the receipt scope.

Becomes a gate when: it sits in front of the target and every route it must protect is mapped. A missing or unmapped route is refused, not waved through.

Does not prove: that the change was preflighted correctly; that execution_action was CONTINUE; that artifacts still match; that the upstream policy is right; that the keyring is fresh. It is not an analysis service — nothing here asks whether a request is risky.

Required status check — CodeRifts — API Contract Check app_id 2860592 · the CodeRifts App

GitHub check run · can block merge when fully configured

ENFORCING · MERGE · 4-CONDITION CLOSURE VERIFIED

Otherwise ADVISORY. Otherwise nothing. The four conditions, and where they stand on coderifts/demo, measured 2026-09-17: branch protection requires the context by name · the name is CodeRifts / contract-gate · the check is bound to app_id 2860592 · enforce_admins is on. All four hold today, measured 2026-09-17 by reading them back from the GitHub API: protection is present on main, checks[] carries the context bound to app_id 2860592 (the checks[] shape is what binds an issuer — the legacy contexts[] mirror cannot), and enforce_admins is true. Closure 4/4. A red check returned 405 … is FAILING; a green one passed the rule check and reached the head-SHA precondition. The gate distinguishes.

Does

Can prevent a merge when branch protection requires this context, the check is bound to the CodeRifts App (app_id: 2860592), an analysable schema is present, and administrators cannot bypass (enforce_admins).

Does not

Does not block by default after a bare App install. Name-only required checks (no app_id) are spoofable by anyone who can post a check with that name; issuer-bound ones (app_id set) narrow that to anyone who can edit .github/workflows, because the enforcing issuer is shared. Neutral completion (no analysable schema) is non-blocking. Does not stop runtime agent calls. The branch does not require being up to date with main. strict is false on purpose: a pull request that is behind can still merge once its check is green. What is required is the check, not the rebase — with strict: true a blocked and an allowed pull request both reported behind, which is exactly the distinction this gate exists to make. No human review is required either: required_pull_request_reviews is unset, so the check is the gate.

Becomes a gate when: all four conditions together — documented at Make the Check Block a Merge (link, not repeated here).

Contract-gate — CodeRifts / contract-gate app_id 15368 · the GitHub Actions App

two surfaces, same check name · Action can block · App check advisory

ADVISORY · MERGE · CLOSURE REQUIRES IMMUTABLE-SHA WORKFLOW PIN

The pin ladder, and only the last rung closes it: NAME ONLY is spoofable by anyone able to create the named check · ISSUER BOUND narrows the set to actors able to use or edit a workflow under the shared issuer · IMMUTABLE WORKFLOW SHA closes workflow identity. Issuer binding is a real strengthening; it is not a closure. Measured 2026-09-17 on coderifts/demo: the SHA pin exists on one feature branch, main carries no workflow and no branch protection.

Does

Two different surfaces post a check with this same name; only one of them can block. The GitHub Action coderifts/contract-gate posts a real check conclusion, and when that check is required by branch protection and bound to the Action’s issuer, a failing conclusion prevents the merge. That is a genuine gate.

Does not

The GitHub App’s identically named check still prevents nothing: phase-1 clamps its conclusions to neutral rather than failure unless MERGEGATE_ENFORCE is true, and it defaults false. Requiring that check and expecting a red X to stop a merge is the confusion this page exists to end. A pin by check name alone (a bare contexts[] entry with no issuer binding) is also not a gate — it is spoofable, and CLI enforce --check (since 4.9.0) reports name-only required checks as not inescapable — still true on 8.6.3, measured 2026-09-15 (the shipped version that day; 8.6.6 as of 2026-09-23, not re-measured). Issuer binding narrows who can forge it; it does not close it. The enforcing issuer is github-actions[bot] (app id 15368), which every workflow in the repository shares, so an app_id pin proves the check came from Actions — not that it came from the CodeRifts workflow. Anyone who can edit .github/workflows can post a passing check under the same issuer. Pinning the required workflow by immutable SHA is what closes that, and until it is in place the issuer-bound case is narrower than name-only, not airtight. A red PR comment prevents nothing on its own.

Becomes a gate when: require the Action’s check, bound to its issuer rather than pinned by name — coderifts setup-required-check, or the Action’s ENFORCEMENT.md. The App check needs MERGEGATE_ENFORCE before it can block. Same honesty as docs.

MCP tools — three canonical tools

preflight_change_set · verify_receipt · get_decision_details

ADVISORY · CAN ISSUE AUTHORITY · DOES NOT EXECUTE

Does

Gives an agent a preflight that is deterministic per engine build and clock (preflight_mode required: analyze = risk only; authorize = operation-bound + optional receipt), receipt verification, and stored-decision lookup over Streamable HTTP.

Does not

Prevents nothing by itself. The agent (or host) must treat an authorize verdict as binding (branch on execution_action; verify receipt). Analyze is informational — not permission. Without a runtime guard, a model can ignore the verdict and still call the broken API.

Becomes a gate when: an agent or host that treats authorize + receipt verification as binding — e.g. wire @coderifts/agent-guard, or refuse non-CONTINUE execution_action. Contract: Decision Spec v2. See for-agents and mcp.json.

CLI / pre-push hook

local check before code leaves the machine

ADVISORY · INSTALLED PRE-PUSH HOOK · TWO IN-HOOK FAIL-OPEN PATHS

Does

Can prevent a push when configured as a pre-push (or CI job) that fails on a bad verdict. Catches issues before they hit the remote.

Does not

Does not prevent a merge on GitHub once the branch is already updated (e.g. web UI merge, force-push by another actor, or a push that bypassed the hook). Does not wrap agent tool calls at runtime.

Becomes a gate when: the hook or job must actually run and fail closed on the verdict. See CLI integration.

Evidence path

Evidence is not enforcement. This path proves what happened; it stops nothing.

Conformance END_TO_END (7/7) — @coderifts/conformance@0.8.11

public npm package · recorded assurance profiles · hermetic bare-Git

EVIDENCE · PROVES · DOES NOT PREVENT

Does

Reports END_TO_END COVERED (7/7) via TARGET_STATE_TRANSITION_PROVEN: a governed ref moved to the authorized commit under a signed grant, observed afterwards by a separate read-only process. All seven assurance profiles are COVERED.

Does not

Does not mean CodeRifts witnessed or signed the provider state. Boundary, exactly: proof_scope TRUSTED_EXECUTOR, provider_witness NOT_APPLICABLE, externally_witnessed false. Not a provider merge (PATH B). Not externally witnessed. Not the GitHub positive provider-loop.

Becomes a gate when: read the honesty table, not the number alone. See What each proof proves. The GitHub loop stays on provider canary.