pub enum BlockAuthorityV1 {
HarnessGate,
HarnessPolicy,
HarnessDeadline,
Operator,
ProviderClassifier,
ProviderPermissionRule,
ProviderSandbox,
ProviderRefusal,
ProviderHook,
UserRejected,
ProviderQuota,
Unknown,
}Expand description
WHO or WHAT blocked an action – see ObservationKindV1::ActionBlocked.
A strictly wider vocabulary than HostDecisionAuthorityV1: the harness
itself only ever produces HarnessGate/HarnessPolicy/HarnessDeadline/
Operator (see that type’s own variants, which this one mirrors
one-for-one for the harness’s own four), but a block can also come from
the PROVIDER side of the wire – a classifier, a permission rule, a
sandbox, a plain refusal, a hook, or the user declining inside the
provider’s own UI – none of which HostDecisionAuthorityV1 has any
vocabulary for at all. Unknown is the evidence-gated fallback: see
ObservationV1::validate’s pty-hint rule, the only evidence class this
crate lets claim it.
Variants§
HarnessGate
The dangerous-command gate – mirrors [HostDecisionAuthorityV1:: Gate].
HarnessPolicy
The harness’s own host policy – mirrors [HostDecisionAuthorityV1:: Policy].
HarnessDeadline
A deferred request the harness’s policy decided after no operator
answered in time – mirrors [HostDecisionAuthorityV1:: DeadlinePolicy].
Operator
An operator explicitly declined – mirrors [HostDecisionAuthorityV1:: Operator]. The one variant this type shares by name, not just by
meaning, with HostDecisionAuthorityV1.
ProviderClassifier
The provider’s own auto-mode classifier (e.g. Claude Code’s auto mode).
ProviderPermissionRule
A provider-side permission rule (an allow/deny list entry) refused the call, distinct from a classifier’s runtime judgement.
ProviderSandbox
The provider’s sandbox refused the call (a filesystem or network boundary the sandbox itself enforces, not a policy decision).
ProviderRefusal
The provider declined with a stopReason: "refusal" or equivalent,
carrying no more specific typed reason than “the provider itself said
no”.
ProviderHook
A provider-managed hook (e.g. Claude Code’s PermissionDenied hook)
reported the block.
UserRejected
A human declined inside the provider’s OWN UI/CLI (not this
harness’s operator surface) – the provider’s own user-rejected-
shaped outcome.
ProviderQuota
The provider’s own account/plan quota, rate limit, or usage cap was
exhausted – e.g. codex-acp’s session/prompt RPC error carrying
data.codexErrorInfo: "usageLimitExceeded" (measured live
2026-09-05). reason_kind on the sibling ActionBlocked carries
the provider’s own vendor code for this ("usageLimitExceeded",
"rate_limit", …) – this variant only says WHO/WHAT the
authority is, never a second copy of the code itself. Distinct from
ProviderRefusal: a quota exhaustion is an account/plan state, not
the model declining the specific request. A new unit variant on a
closed, exact-version-negotiated wire enum needs no #[serde(default)]
fallback – there is no older payload that could ever carry it, and
NODE_PROTOCOL_VERSION’s exact-match negotiation means an older
binary that does not know this variant never receives one in the
first place.
Unknown
No typed field named who blocked it – text matching may still have
filled reason/help, but never this field; see the module doc
comment’s rule that authority is never guessed.