Agents Shipgate is the deterministic merge gate for AI-generated agent capability changes. Underneath that tagline is a protocol: the set of guarantees that let a coding agent know — without human interpretation — whether it may continue, must repair, or must stop for human authority.
This page is the map. It names the eight contracts that make up the protocol and
points each one at the artifact that already implements it. It documents what
exists; it does not propose new architecture. For the exact JSON field list, see
agent-contract-current.md; for the stability
guarantees, see ../STABILITY.md.
One decision engine. report.json.release_decision.decision is the only
release gate, and no agent-facing field gates independently of it. Some
fields are direct projections of the decision (merge_verdict, the decision
mirror); others project from related head-scan substrate — capability_review
from capability_change, applicability from scan applicability
(decision-presence plus execution/applicability), the control and deny-lists from the
trust-root surface list — but all are subordinate to the decision, and none
computes a second verdict. This is enforced structurally (construction-time
validators in
../src/agents_shipgate/schemas/verifier.py)
and covered by a totality test, so a field that drifts from the gate fails CI
rather than shipping.
Everything below is a contract about how that one decision is surfaced and protected — never a new way to decide.
- Guarantee: a diff is classified deterministically as relevant or not, so an agent neither wastes a run on a docs-only change nor skips a real capability change.
- Implements it:
triggers.json(machine-readable mirror of the AGENTS.md trigger table) andagents-shipgate verify --preview. - Agent reads:
run_shipgate/control.next_action(exactinitcommand for unconfigured repos, exactverifycommand for configured ones). - Prevents: silently skipping an MCP/OpenAPI/SDK surface change; running on prose.
- Guarantee: review is framed by the change in capability, not the change in files.
- Implements it:
capability_change(report.json, v0.22+) →capability_review(verifier.json). - Agent reads:
capability_review.top_changes[]with{id, impact, rationale, related_finding_ids}. - Prevents: reviewing "+20 lines in refund.py" instead of "a money-movement action was added".
- Guarantee: a single machine verdict the agent can switch on, that cannot disagree with the gate.
- Implements it:
merge_verdict(mergeable/human_review_required/insufficient_evidence/blocked/unknown), a projection ofrelease_decision.decision; plusapplicability(verified/not_applicable/unknown), derived from whether Shipgate evaluated the change (decision-presence +head_status) — orthogonal to the verdict, never a second gate. - Agent reads:
merge_verdict,can_merge_without_human. - Prevents: a second verdict; and — via
applicability— reading amergeablethat came from a skipped scan as "verified safe".
- Guarantee: mechanical gaps are separated from authority gaps, and every fix attempt ends with a fresh verdict.
- Implements it:
fix_task{actor, safe_to_attempt, instructions[], forbidden_shortcuts[], verification_command}—../src/agents_shipgate/cli/verify/fix_task.py. - Agent reads:
fix_task.actor: coding_agent+safe_to_attempt: truemeans "apply the listed mechanical fix, then re-runverification_command";actor: humanmeans stop. - Prevents: an agent inventing its way past an authority gap; a one-shot "fix" that never re-verifies.
- Guarantee: the reward-hacking moves are named explicitly and stand on
every verdict, including
mergeable— green is never "anything goes". - Implements it:
forbidden_actions[](the action-level deny-list) andforbidden_file_edits[](a path-level deny-list of whole-file trust roots) —../src/agents_shipgate/checks/verify.py, projected by../src/agents_shipgate/cli/verify/orchestrator.py. - Agent reads:
verifier.json.{forbidden_actions, forbidden_file_edits}. - Prevents: suppressing findings, lowering severity, fabricating
approval/idempotency evidence, deleting the CI gate. The file deny-list is
deliberately not an allow-list, and excludes
shipgate.yaml/.agents-shipgate— their trust boundary is key-level (editing an action's scope is a legitimate fix; achecks.ignore/ baseline expansion is not), so those are covered byforbidden_actionsinstead.
- Guarantee: human authority is declared evidence, never inferred — and it cannot be synthesized by the change under review.
- Implements it:
human_ack(report.json declared state) plus the self-approval prohibition surfaced ascontrol.state="review_publishable"(publish for review, merge denied) orcontrol.state="human_review_required"(stop outright), andcontrol.reason. - Agent reads:
control.state,control.human_review, andcontrol.next_action. - Prevents: a PR that adds its own
human_ack(or weakens the policy) and then self-approves in the same change.
- Guarantee: the rules that evaluate a change cannot be quietly weakened by that same change.
- Implements it: the hardcoded
TRUST_ROOT_SURFACESand theSHIP-VERIFY-*checks (suppression-immune, severity-floor-protected) in../src/agents_shipgate/checks/verify.py. Touching a trust root forces human review; a clear weakening blocks. - Agent reads:
capability_review.trust_root_touched,capability_review.policy_weakened. - Prevents: an agent editing
shipgate.yaml, the CI gate,AGENTS.md, the policy pack, the baseline, or a waiver to make its own change pass.
- Guarantee: an agent-capability release leaves an attestation, not a memory: which capability shipped, under which verdict, acknowledged by whom.
- Implements it:
agents-shipgate attestderives a deterministic, local, JSON-first attestation fromverifier.json(+ the siblingreport.json) — base/head SHAs, the verdict, the capability delta, optional org/CI context, declaredhuman_ackdetails, a policy-snapshot hash, content hashes of every verify artifact, verify-run binding (run_id,verify_run_sha256), explicit CI event facts, policy-pack pin records, and capability lock/diff hash bindings when verify emitted them. It is content-addressed; event time is copied only from explicit input or CI payloads, never generated fromnow(), and it does not gate. Schema:attestation-schema.v0.5.json. - Agent reads: the attestation is a durable record for humans and
registries, not a control signal — the agent still acts on
control.state(contracts 3–5). - Prevents: "we think a human approved that refund tool last quarter" with no record to point at.
The imperative questions collapse into one discriminated block,
verifier.json.control, which an autonomous agent can act on directly:
agents-shipgate-reports/agent-handoff.json exposes the same control block
beside gate, blocked_by[], remediation_plan[], and verify-run
reproducibility metadata for agents that want one compact artifact. It is a
projection only; it cannot disagree with verifier.json or introduce a second
verdict.
state="complete"→ the capability-change task is done; merge.state="agent_action_required"→ perform onlynext_action, then rerun and read the fresh artifact.state="review_publishable"→ do not merge or claim completion; publish the change for review and surfacehuman_review.why.state="human_review_required"→ stop and surfacereasonplus the human action; do not edit anything inforbidden_file_editsor take anyforbidden_actionsto get past the gate.
completion_allowed, must_stop, and can_merge_without_human are exact
projections. A contradictory artifact fails construction instead of creating a
second gate.
Field-level contract: agent-contract-current.md.
Stability guarantees across 0.x: ../STABILITY.md.
