Skip to main content

The TrustRelay Check: Reference for Developers

A reference for the required check TrustRelay publishes on a pull request: the check name, the conclusion it reports in each operating mode, the reason codes you may see, and how an override is recorded.

This page is a reference for the check TrustRelay publishes on a pull request. It lists the fields the check carries, the GitHub conclusion it reports in each operating mode, the reason codes that can appear, and what an override does to the record. It is written for the developer working in the pull request, not for the administrator configuring policy.

For the decision logic behind the outcome, see the decision-engine explanation. For checking a signed record after the fact, see the offline verification guide.

The check on your pull request

TrustRelay publishes a single check run named TrustRelay. It is attached to the head commit of the revision that was evaluated, and it is published with status completed.

FieldValueNotes
NameTrustRelayThe check name branch protection matches on.
StatuscompletedThe check does not stay in progress; it reports a terminal conclusion.
External idtrustrelay:<passport_id>Binds the check to the signed record for this decision.
TitleThe decision outcomeAPPROVE, BLOCK, or ESCALATE; EXCEPTION GRANTED when an override applied.
SummaryThe mode and any safeguardsNames the operating mode, and any safeguard code that changed the conclusion.

If TrustRelay evaluates a new revision, it looks for an existing check run with the same external id and updates it rather than publishing a second check. You should never see two TrustRelay checks for one decision.

What the conclusion means

The GitHub conclusion is not the decision. It is the decision expressed as a merge gate, and the mapping depends on the operating mode the repository is in. This matters in shadow mode, where a decision can be reported without affecting merge eligibility.

Outcomeshadowadvisorylimited_enforcement
APPROVEneutralsuccesssuccess
BLOCKaction_requiredfailurefailure
ESCALATEaction_requiredaction_requiredaction_required
Any outcome with a valid overridesuccesssuccesssuccess

In shadow mode the check never reports success or failure. It reports neutral for an approval and action_required for anything else, so the decision is visible without becoming a merge gate. When you are ready to enforce, the same decision in advisory or limited_enforcement mode becomes a real conclusion.

Only success lets the pull request merge when the check is required. Every other conclusion keeps the merge blocked.

Safeguard codes that change the conclusion

Between the decision and the check publication, TrustRelay compares the state the decision was made against with the state at publication. If anything material changed, the conclusion is made more restrictive and a safeguard code is added to the summary. These codes appear in the check summary, not as decision reason codes.

Safeguard codeWhat changedEffect
check_mode_driftThe operating mode changed between decision and publication.The more restrictive of the two conclusions is used.
check_policy_driftThe policy version changed between decision and publication.Forces action_required if the conclusion would be success.
check_stale_revisionThe head commit is no longer the revision that was evaluated.Forces action_required if the conclusion would be success.
check_fork_sourceThe pull request comes from a fork.Forces action_required if the conclusion would be success.
check_override_validation_unavailableAn override was claimed but could not be validated.The override is not honoured.

The stale-revision code is the one you are most likely to meet. Push a new commit and the check for the previous commit no longer applies to the head, so it will not report success until the new revision is evaluated. This is deliberate: a passing check for a commit you have since replaced is not evidence about the commit you are about to merge.

Reason codes in the decision

Every decision carries reason codes. The first is a system code that names the outcome, and the rest come from the rules that were evaluated.

System codeOutcomeMeaning
SYS_DECISION_APPROVEDAPPROVEAuthorized by policy evaluation.
SYS_DECISION_BLOCKEDBLOCKBlocked by a policy rule.
SYS_DECISION_ESCALATEDESCALATEEscalated for human review.

The rule-derived codes use the form <RESULT>_<RULE_ID>, where the result is the rule's outcome in upper case. A missing sponsor, for example, produces MISSING_SPONSORSHIP_REQUIRED, and conflicting attribution produces CONFLICTING_ATT_NO_CONFLICTING_PROVIDERS. The rule identifiers and their results are described in the decision-engine explanation.

Alongside those, the system defines a stable vocabulary of named codes for the conditions a decision can encounter. Because these are stable strings, a script or a policy report can match on them without parsing prose.

Named codeMeaning
EVD_REQUIRED_MISSINGRequired evidence is missing.
EVD_REQUIRED_INVALIDRequired evidence is invalid.
EVD_REQUIRED_UNSUPPORTEDThe evidence workflow is unsupported.
EVD_REQUIRED_UNAVAILABLEA required evidence source is unavailable.
ATT_AGENT_UNKNOWNAgent involvement cannot be established; all commits are unknown.
ATT_CONFLICTING_PROVIDERSConflicting coding-agent providers were detected.
ATT_LOW_CONFIDENCEAttribution confidence is below the policy threshold.
ATT_SPONSORSHIP_MISSINGNo human sponsorship was established.
POL_RULE_APPLICABILITY_UNKNOWNPolicy rule applicability cannot be determined.
POL_OVERRIDE_GRANTEDAn override was granted; the exception is permitted.
POL_EMERGENCY_BYPASSAn emergency bypass was activated.
SYS_INPUT_SCHEMA_UNSUPPORTEDThe input schema major version is unsupported.
SYS_CANONICALIZATION_UNSUPPORTEDThe canonicalization semantics are unsupported.

Remediating a block

A block names what is missing. The check summary tells you which rule produced the outcome, and the reason code names the condition. In practice a block resolves in one of three ways.

Provide the missing evidence. Link the work item, or make the check that the policy requires produce a result. The decision is re-evaluated when the evidence changes.

Record a human sponsor. If the change was agent-authored and no sponsor is recorded, name one. Sponsorship is what the engine uses to establish accountability for the change.

Resolve the attribution. If the agent provider cannot be established, or two providers disagree about what produced the change, the attribution has to be settled before the change can be approved on evidence.

If none of those is the right answer for this change, an authorized reviewer can override, which is described next.

How an override is recorded

An override is an exception, and it is recorded as one. It is bound to a specific revision, it names who granted it and why, and it carries an expiry. The original decision is never rewritten.

PropertyBehaviour
Bound to a SHAThe override applies to the revision it was granted for.
ExpiresAn override past its expiry is treated as inactive.
Superseded by a new SHAPushing a new commit makes a prior override ineffective.
AttributedThe grant records the actor, the reason, and an optional ticket reference.
AdditiveThe override is stored as a supplement to the passport, not a change to the decision.

When a valid override applies, the check reports success with the title EXCEPTION GRANTED, so the exception is visible in the pull request rather than hidden. The decision that produced the original BLOCK or ESCALATE remains in the record, alongside the override that superseded it.

If you push a new commit after an override was granted, the override no longer applies to the head revision. That is the same stale-revision rule as above, and it is why an override is not a way to make a check pass permanently.

What the check does not tell you

The check reports a decision and the reason for it. It does not report whether the policy is the right policy, whether the evidence was complete when it was collected, or whether the change is a good idea. A success conclusion means the change satisfied the policy that was in force, evaluated against the evidence that was available. Everything about whether that policy and that evidence were adequate belongs to the people who configured them.