HARNESS · HOW IT WORKS
The policy decides before any action.
Every agent request goes through the same checks, in the same order. If one fails, the request is denied and the reason becomes a receipt.
IN ONE PICTURE
The decision comes before the action.
Every request leaves allowed, waiting for a person or denied. There is no fourth exit.
What fail closed means for a buyer
If the policy does not answer, takes too long or errors, the action does not happen. The risk of a technical failure is a stopped agent, never a loose one. When the path itself goes down there may be no receipt left, but a missing receipt never turns into permission.
How it is built in the Cloud IDE
The managed Claude Code hook has a hard 120 second deadline counted from its start, caps every call to the time left and denies before the ceiling. The managed settings tell Claude Code to block if the hook itself fails ("onFailure": "block") and require the version that has that option. The limits that remain open are on the trust page.
01 / ORDER OF CHECKS
Fail closed, in six steps.
It is the Harness control plane rule, the same in Python and in JavaScript.
- 01
Identity
Does the request have an authenticated owner? No owner, nothing runs.
authentication_required - 02
Scope for the data
Does the owner role cover the data class: public, internal, confidential or personal?
scope_required - 03
Runtime
Executing requires the runtime to be enabled. Planning does not.
runtime_not_enabled - 04
Workspace isolation
Is the target inside the workspace root? Directory traversal is denied.
workspace_boundary_violation - 05
Provider
Does the skill use a known, enabled provider? Direct outbound network stays blocked.
external_provider_blocked - 06
Approval
Sensitive actions wait for a person, and the requester does not approve.
human_approval_required
02 / RECORDED REASONS
Every result has a code.
The code goes into the receipt. That is how the decision can be audited later.
| Code | What it means | Result |
|---|---|---|
preview_only | Planning or reading was allowed; nothing was changed. | allowed |
execution_not_implemented | Every check passed; in this phase execution is simulated. | simulated |
human_approval_required | Sensitive action without a person's approval. | waits |
authentication_required | Request without an identified owner. | denied |
scope_required | The owner role does not cover the data class. | denied |
runtime_not_enabled | Executing without an enabled runtime. | denied |
workspace_boundary_violation | Target outside the workspace root. | denied |
external_provider_blocked | Skill with direct outbound network. | denied |
provider_disabled | Provider blocked in the policy. | denied |
03 / VERIFY A RECEIPT
Paste the JSON and recompute.
Export the receipts in the demo and paste them here. The verifier recomputes every hash in your browser and points to the first receipt that does not match. Today the receipt is a chained SHA-256 hash; key signing comes with early access.