Labs · preview
Check before your AI agent acts
Jithox checks an action before your AI agent performs it. Describe what the agent wants to do, get one clear answer and the safe next step. Jithox checks; it never executes.
Nothing is executed here
The decision is a fixed rule, not a model, and it runs in your browser with the same code the API uses. Sending, publishing, paying, submitting, testing and changing stay with your official connector, after your approval.
No account. Nothing is sent, nothing is stored, nothing is executed.
Your decision
Evaluated on the fixed clock 2026-09-10T12:00:00Z, so the answer is the same every time.
Your approval is required
Your agent may prepare, but the action itself waits for you to approve its exact hash. Nothing happens until you do.
The decision the owner has to take: approve or refuse exactly this action, identified by the hash below, before it expires.
If the action changes in any way, its hash changes and it must be approved again.
Why
- Jithox does not execute external actions. This preflight can allow preparation and bind an approval; the execution step stays with an official connector after approval. external_execution_unsupported
- "Submit a proposal" has an external side effect: the owner must approve this exact action (its hash). approval_missing
- The action cannot be undone once performed. irreversible_requires_approval
What is still missing
- Ask the owner to approve action hash 4c8e490688f4f05c3fef4e35cde049d8ba811f38c740aaed264fea4f661c42dc before the expiry.
What your agent may safely prepare
- Draft the proposal.
- Check every requirement of the opportunity.
What must not be performed
- Submitting the proposal. (never here; only through an official connector after approval)
- Budget:
- No money is involved in this action.
- Approval:
- required, not yet given
- Valid until:
- 2026-09-10T14:00:00.000Z
- Policy version:
- jithox.agent-action-policy/v1
- Receipt:
- unsigned, hash-bound · 201d4eda1215a1d7…
- Evidence references:
- ev-proposal · Preflight ID apf_4c8e490688f4f05c
- Action hash:
- 4c8e490688f4f05c3fef4e35cde049d8ba811f38c740aaed264fea4f661c42dc
Preflight finished: Your approval is required. Nothing was executed.
Jithox checks; it never executes. Status: preview local build.
Developer details
The request exactly as the API receives it, the result when you have a decision, and the same call as curl. Nothing above this line needs any of it.
{
"request": {
"schemaVersion": "jithox.agent-action-preflight-request/v1",
"action": {
"type": "submit_proposal",
"target": {
"kind": "opportunity",
"id": "opportunity:EXAMPLE-4711"
},
"summary": "Submit the drafted proposal to the client platform."
},
"agent": {
"id": "first-cash-bot",
"client": "chatgpt"
},
"owner": {
"ref": "owner:jithox",
"workspaceRef": "ws:first-cash"
},
"requestedPermissions": [
"read",
"draft_messages",
"send_external_messages"
],
"dataClassification": "internal",
"money": null,
"externalSideEffect": true,
"reversible": "no",
"authority": {
"kind": "none"
},
"humanApproval": null,
"idempotencyKey": "first-cash-submit-4711-2026-09-10",
"requestedExpiresAt": "2026-09-10T14:00:00Z",
"evidence": [
{
"id": "ev-proposal",
"kind": "proposal_draft",
"ref": "artifact:proposal-4711-v2"
}
]
},
"result": {
"schemaVersion": "jithox.agent-action-preflight-result/v1",
"policyVersion": "jithox.agent-action-policy/v1",
"status": "preview_local_build",
"preflightId": "apf_4c8e490688f4f05c",
"decision": "HUMAN_APPROVAL_REQUIRED",
"reasonCodes": [
"external_execution_unsupported",
"approval_missing",
"irreversible_requires_approval"
],
"reasons": [
{
"code": "external_execution_unsupported",
"message": "Jithox does not execute external actions. This preflight can allow preparation and bind an approval; the execution step stays with an official connector after approval."
},
{
"code": "approval_missing",
"message": "\"Submit a proposal\" has an external side effect: the owner must approve this exact action (its hash)."
},
{
"code": "irreversible_requires_approval",
"message": "The action cannot be undone once performed."
}
],
"missingRequirements": [
{
"code": "approval_missing",
"requirement": "Ask the owner to approve action hash 4c8e490688f4f05c3fef4e35cde049d8ba811f38c740aaed264fea4f661c42dc before the expiry."
}
],
"allowedPreparationSteps": [
"Draft the proposal.",
"Check every requirement of the opportunity."
],
"prohibitedExecutionSteps": [
"Submitting the proposal. (never here; only through an official connector after approval)"
],
"approvalRequired": true,
"approvalStatus": "missing",
"budget": {
"relevant": false,
"maxAmountMinor": null,
"currency": null,
"standingBudgetMinor": null,
"withinStandingBudget": null,
"note": "No money is involved in this action."
},
"expiresAt": "2026-09-10T14:00:00.000Z",
"actionHash": "4c8e490688f4f05c3fef4e35cde049d8ba811f38c740aaed264fea4f661c42dc",
"evidence": {
"supplied": [
"ev-proposal"
],
"preflightId": "apf_4c8e490688f4f05c"
},
"replayProtection": {
"scope": "process_memory",
"durable": false,
"idempotencyKey": "first-cash-submit-4711-2026-09-10"
},
"receipt": {
"kind": "agent_action_preflight_receipt",
"signature": "unsigned_hash_bound",
"algorithm": "sha256-canonical-json",
"digest": "201d4eda1215a1d7d252bcf2830e7738a568aad1cddf1db12a766e714f777b7e",
"boundTo": {
"actionHash": "4c8e490688f4f05c3fef4e35cde049d8ba811f38c740aaed264fea4f661c42dc",
"decision": "HUMAN_APPROVAL_REQUIRED",
"policyVersion": "jithox.agent-action-policy/v1",
"evaluatedAt": "2026-09-10T12:00:00.000Z",
"preflightId": "apf_4c8e490688f4f05c"
},
"note": "This receipt is NOT signed. It is bound by a sha256 digest over the canonical decision; anyone can recompute it. A signed receipt needs the fleet's Ed25519 key, which this website does not hold."
},
"executed": false,
"evaluatedAt": "2026-09-10T12:00:00.000Z"
}
}curl -s https://jithox.com/api/agent-preflight/v1/evaluate \
-H 'content-type: application/json' \
-d '{"schemaVersion":"jithox.agent-action-preflight-request/v1","action":{"type":"send_message","target":{"kind":"email","id":"customer:EXAMPLE-1"},"summary":"Reply to the customer's question."},"agent":{"id":"my-agent","client":"claude"},"owner":{"ref":"owner:me"},"requestedPermissions":["read","draft_messages","send_external_messages"],"dataClassification":"internal","money":null,"externalSideEffect":true,"reversible":"no","authority":{"kind":"none"},"humanApproval":null,"idempotencyKey":"reply-customer-1-2026-09-10","requestedExpiresAt":"2026-09-10T14:00:00Z"}'Jithox checks an action before your AI agent performs it.
1. Describe the action
Pick what the agent wants to do, say where and for whom, and what could happen.
2. Check permission, risk and budget
Jithox compares that with the permissions, the authority, the budget and the approval that already exist.
3. Give your agent only the safe next step
One clear answer, with what may be prepared and what must wait for you.
What that looks like
- Draft an e-mail, but do not send it.
- Build a product listing, but do not publish it.
- Prepare a Freelancer proposal, but do not submit it.
- Inspect an authorised ZIP, but do not scan an external target.
- Prepare a purchase, but do not pay.
How Jithox's own four teams use it
The same fixtures the API and the tests use, evaluated on a fixed clock. Nothing here was published, submitted, tested or paid.
Commerce
Buy something: 2 × EXAMPLE-thermal-label-printer at EUR 89.00
The Commerce bot found the printer, the merchant's price quote and the shipping and tax lines. Buying is irreversible and moves money, so the owner approves the exact total first. Preparing the cart and the checkout link is all the bot may do until then.
orange exclamation markYour approval is required
external_execution_unsupported · approval_missing · data_classification_requires_approval
Buy something above the standing budget
The same purchase, but the maximum total the bot asks for exceeds what the standing grant allows. No approval can rescue that: the request is blocked and the bot must come back with a smaller total or a new grant.
red crossBlocked
external_execution_unsupported · budget_exceeded · approval_missing · data_classification_requires_approval
Publish a EUR 29 product on Payhip
The Commerce bot has assembled the listing. Publishing puts a price in front of the public, so the owner approves the exact listing hash first.
orange exclamation markYour approval is required
external_execution_unsupported · no_standing_budget · approval_missing · reversibility_unknown
First Cash
Prepare a freelance proposal
Drafting a proposal changes nothing outside the workspace, so the bot may prepare it now.
green checkSafe to prepare
—
Submit the proposal
Submission reaches a real client and cannot be unsent; it waits for the owner's approval of that exact submission.
orange exclamation markYour approval is required
external_execution_unsupported · approval_missing · irreversible_requires_approval
Security
Inspect a customer's ZIP offline
Inspection is allowed only because the customer's scope is recorded and immutable; nothing live is touched.
green checkSafe to prepare
—
Test a customer target without authorization
No standing grant with a recorded scope and expiry exists, so external testing is blocked outright.
red crossBlocked
external_execution_unsupported · authority_missing · approval_missing · reversibility_unknown · data_classification_requires_approval
Growth
Draft a social post
A draft stays in the workspace, so the Growth bot may prepare it.
green checkSafe to prepare
—
Publish the post automatically
The bot holds no publish permission and no standing grant, so automatic publication is blocked, not merely queued for approval.
red crossBlocked
permission_missing · external_execution_unsupported · approval_missing · reversibility_unknown
What is true on this page
- Preflight executes nothing.
- A preparation decision is not execution permission.
- Receipts are currently unsigned.
- No credential should be entered.
- Unavailable is not approval.
- Changing an action changes its actionHash.
- External actions require separate authority.
Price: the interactive and local preflight is free. API pricing is not published; nothing is charged in this build. Jithox checks; it never executes. Status: preview local build.
With a team plan
In Team Builder (Labs) every team plan can require this preflight before any external action; teams with external actions require it by default, and the plan exports the policy configuration.
For developers and AI agents
Three versioned, compute-only routes over one closed schema. The same rule your browser just ran.
HTTP API
- GET /api/agent-preflight/v1/schema
- Schemas, action types, decisions, reason codes, limits, MCP tool contract, client exports. public, max-age=300.
- POST /api/agent-preflight/v1/evaluate
- One planned action in; one bounded decision with reasons, missing requirements and a hash-bound receipt out. no-store.
- GET /api/agent-preflight/v1/fixtures
- The seven team demonstrations with their evaluated results. public, max-age=300.
Closed vocabularies
- decisions
- ALLOWED_TO_PREPARE · HUMAN_APPROVAL_REQUIRED · BLOCKED · UNAVAILABLE
- actionTypes
- read_data · modify_local_files · inspect_offline_artifact · send_message · publish_content · publish_product · purchase · refund · submit_proposal · accept_contract · security_test_external · change_production
- dataClassifications
- public · internal · confidential · personal · payment
- reversibility
- yes · no · unknown
- authorityKinds
- none · owner_instruction · standing_grant
- agentClients
- claude · chatgpt · gemini · grok_cursor · generic_mcp · generic_http · other
- clientExportStatuses
- CERTIFIED · CONFIG_READY · NOT_CERTIFIED · MCP_HOST_PENDING
The twelve action types
- read_data · Read data · local · authority none
- modify_local_files · Change local files · local · authority none
- inspect_offline_artifact · Inspect an artifact offline · local · authority required
- send_message · Send a message · external · authority none
- publish_content · Publish content · external · authority none
- publish_product · Publish a product · external · money · authority required
- purchase · Buy something · external · money · authority required
- refund · Issue a refund · external · money · authority required
- submit_proposal · Submit a proposal · external · authority none
- accept_contract · Accept a contract · external · money · authority required
- security_test_external · Test a system for weaknesses · external · authority standing grant required
- change_production · Change a live system · external · authority required
Example
Example request — Buy something: 2 × EXAMPLE-thermal-label-printer at EUR 89.00
{
"schemaVersion": "jithox.agent-action-preflight-request/v1",
"action": {
"type": "purchase",
"target": {
"kind": "merchant_order",
"id": "EXAMPLE-shop|TLP-2026|v2026.09"
},
"summary": "Buy 2 × EXAMPLE thermal label printer (product version 2026.09) from EXAMPLE-shop.example: item EUR 89.00 each, shipping EUR 6.90, VAT EUR 38.83 (21%), total EUR 223.73; maximum total EUR 230.00; refundable within 14 days per the merchant's terms."
},
"agent": {
"id": "commerce-bot",
"client": "claude"
},
"owner": {
"ref": "owner:jithox",
"workspaceRef": "ws:commerce"
},
"requestedPermissions": [
"read",
"spend_money"
],
"dataClassification": "payment",
"money": {
"maxAmountMinor": 23000,
"currency": "EUR"
},
"externalSideEffect": true,
"reversible": "yes",
"authority": {
"kind": "standing_grant",
"ref": "grant:commerce-supplies-2026-q3",
"scope": "Office and shipping supplies from approved merchants",
"expiresAt": "2026-09-30T00:00:00Z",
"budget": {
"maxAmountMinor": 50000,
"currency": "EUR"
}
},
"humanApproval": null,
"idempotencyKey": "commerce-buy-TLP-2026-09-10",
"requestedExpiresAt": "2026-09-10T14:00:00Z",
"evidence": [
{
"id": "ev-merchant-listing",
"kind": "merchant_listing",
"ref": "artifact:listing-TLP-2026"
},
{
"id": "ev-price-quote",
"kind": "price_quote",
"ref": "artifact:quote-TLP-2026-09-10"
},
{
"id": "ev-cancellation-terms",
"kind": "merchant_terms",
"ref": "artifact:terms-EXAMPLE-shop"
}
]
}Example response — Evaluated on the fixed clock 2026-09-10T12:00:00Z, so the answer is the same every time.
{
"ok": true,
"status": "preview_local_build",
"result": {
"schemaVersion": "jithox.agent-action-preflight-result/v1",
"policyVersion": "jithox.agent-action-policy/v1",
"status": "preview_local_build",
"preflightId": "apf_302c33f5fbddad3c",
"decision": "HUMAN_APPROVAL_REQUIRED",
"reasonCodes": [
"external_execution_unsupported",
"approval_missing",
"data_classification_requires_approval"
],
"reasons": [
{
"code": "external_execution_unsupported",
"message": "Jithox does not execute external actions. This preflight can allow preparation and bind an approval; the execution step stays with an official connector after approval."
},
{
"code": "approval_missing",
"message": "\"Buy something\" has an external side effect: the owner must approve this exact action (its hash)."
},
{
"code": "data_classification_requires_approval",
"message": "The action touches payment data."
}
],
"missingRequirements": [
{
"code": "approval_missing",
"requirement": "Ask the owner to approve action hash 302c33f5fbddad3c912b04809f3016004e0c1ea3bb1f1664f2d8a68b5fa2dc7c before the expiry."
}
],
"allowedPreparationSteps": [
"Assemble the exact item, price, fees, currency and cancellation terms.",
"Compute the complete total."
],
"prohibitedExecutionSteps": [
"Placing the order. (never here; only through an official connector after approval)",
"Paying. (never here; only through an official connector after approval)"
],
"approvalRequired": true,
"approvalStatus": "missing",
"budget": {
"relevant": true,
"maxAmountMinor": 23000,
"currency": "EUR",
"standingBudgetMinor": 50000,
"withinStandingBudget": true,
"note": "Within the standing budget; the owner still approves this exact action."
},
"expiresAt": "2026-09-10T14:00:00.000Z",
"actionHash": "302c33f5fbddad3c912b04809f3016004e0c1ea3bb1f1664f2d8a68b5fa2dc7c",
"evidence": {
"supplied": [
"ev-merchant-listing",
"ev-price-quote",
"ev-cancellation-terms"
],
"preflightId": "apf_302c33f5fbddad3c"
},
"replayProtection": {
"scope": "process_memory",
"durable": false,
"idempotencyKey": "commerce-buy-TLP-2026-09-10"
},
"receipt": {
"kind": "agent_action_preflight_receipt",
"signature": "unsigned_hash_bound",
"algorithm": "sha256-canonical-json",
"digest": "55b77b2e19fb415ec2a24090627e57f1498f566242f3174af860206d6a803ea2",
"boundTo": {
"actionHash": "302c33f5fbddad3c912b04809f3016004e0c1ea3bb1f1664f2d8a68b5fa2dc7c",
"decision": "HUMAN_APPROVAL_REQUIRED",
"policyVersion": "jithox.agent-action-policy/v1",
"evaluatedAt": "2026-09-10T12:00:00.000Z",
"preflightId": "apf_302c33f5fbddad3c"
},
"note": "This receipt is NOT signed. It is bound by a sha256 digest over the canonical decision; anyone can recompute it. A signed receipt needs the fleet's Ed25519 key, which this website does not hold."
},
"executed": false,
"evaluatedAt": "2026-09-10T12:00:00.000Z"
},
"executed": false,
"stored": false
}Reason codes
- unknown_action_type
- The action type is not one of the twelve known types.
- target_missing
- The action names no target.
- expiry_invalid
- The requested validity is not a valid date and time.
- expiry_in_past
- The requested validity is already in the past.
- expiry_clamped
- The requested validity was longer than the maximum and was shortened.
- permission_missing
- A permission this action needs was not requested.
- permission_excessive
- More permissions were requested than this action needs.
- external_execution_unsupported
- Jithox does not execute external actions; the execution step stays with an official connector after approval.
- authority_missing
- No instruction or grant allows this action.
- authority_expired
- The instruction or grant has expired or has no valid expiry.
- authority_scope_missing
- The grant has no scope.
- authority_scope_not_immutable
- The scope must be recorded as unchangeable first.
- budget_missing
- The action involves money, but no maximum amount and currency were given.
- budget_exceeded
- The maximum amount is above the standing budget.
- currency_mismatch
- The currency does not match the standing budget, or an amount was given for an action without money.
- no_standing_budget
- There is no standing budget, so any amount needs the owner's approval of this exact action.
- irreversible_requires_approval
- The action cannot be undone once performed.
- reversibility_unknown
- Whether the action can be undone is unknown.
- data_classification_requires_approval
- The action touches sensitive data.
- approval_missing
- The owner must approve this exact action.
- approval_expired
- The approval has expired or has no valid expiry.
- approval_hash_mismatch
- The approval belongs to a different action.
- approval_not_yet_valid
- The approval's start is in the future.
- approval_valid
- The owner approved exactly this action.
- duplicate_action
- This action key was already used for a different action.
- dedupe_store_unavailable
- The replay store did not answer, so a duplicate cannot be ruled out.
- evidence_missing
- Attach the quote, invoice, listing or contract the amount comes from.
actionHash
- sha256 over the canonical JSON of: policy version, action type, target, agent id, owner reference, sorted permissions, data classification, money, external side effect, reversibility, authority kind, reference and scope, and the idempotency key.
- The requested expiry, the approval and the evidence are outside the hash: they can change without changing the action.
- Any change inside the hash is a different action and needs its own approval.
Approval binding
- humanApproval.actionHash must equal the request's actionHash, or the decision is BLOCKED with approval_hash_mismatch.
- approvedAt must not be in the future; expiresAt must be a valid instant after now.
- A valid approval turns HUMAN_APPROVAL_REQUIRED into ALLOWED_TO_PREPARE. It never permits execution: the execution step stays under prohibitedExecutionSteps.
Replay rules
- One idempotencyKey per owner claims one actionHash for the lifetime of the check.
- Same key, same hash: idempotent, identical answer. Same key, different hash: BLOCKED with duplicate_action.
- Replay store unreachable: UNAVAILABLE with dedupe_store_unavailable, never a permission. The store scope is in replayProtection.
Receipt
kind, signature (unsigned_hash_bound), algorithm, digest, boundTo {actionHash, decision, policyVersion, evaluatedAt, preflightId}, note. The digest is sha256 over the canonical boundTo object and can be recomputed by anyone.
This receipt is NOT signed. It is bound by a sha256 digest over the canonical decision; anyone can recompute it. A signed receipt needs the fleet's Ed25519 key, which this website does not hold.
Limits
- 60 evaluations per minute per origin
- 32768 bytes per request body
- at most 10 evidence references
- a check is valid for at most 24 hours; longer requests are clamped
- at most 9 requested permissions
Error states
- invalid_body
- 400 — the body is not JSON.
- payload_too_large
- 413 — the body is larger than the payload limit.
- invalid_input
- 400 — the body does not match the closed request schema; the response names the path.
- unknown_action_type
- 400 — action.type is not one of the twelve types.
- secret_detected
- 400 — a field looks like a key, a token or a private key; nothing of it is echoed back.
- personal_data_rejected
- 400 — the target or summary carries an e-mail address, phone number or bank account.
- rate_limited
- 429 with Retry-After — more than the per-minute limit from one origin.
Copyable configuration
A snippet is not a certified client. Every integration carries its honest label.
- CERTIFIED :
- executed end to end against the real endpoint in this build, with evidence
- CONFIG_READY :
- the configuration is complete and validated; it has not yet been run end to end by a real client in this build
- NOT_CERTIFIED :
- attempted and not proven, or not attempted
- MCP_HOST_PENDING :
- the contract is complete; the MCP host that would serve it does not exist yet
Claude Code CONFIG_READY
Add the rule below to the project's CLAUDE.md. Claude Code runs the curl through its Bash tool and reads the decision before it drafts or asks for approval.
CLAUDE.md
## Jithox Agent Action Preflight Before any action that sends, publishes, buys, submits, accepts, tests or changes something outside the workspace: 1. POST the planned action to https://jithox.com/api/agent-preflight/v1/evaluate (schema: https://jithox.com/api/agent-preflight/v1/schema). 2. Act only on ALLOWED_TO_PREPARE. On HUMAN_APPROVAL_REQUIRED, show the owner the actionHash and stop. On BLOCKED or UNAVAILABLE, stop and report the reason codes. 3. Never execute the external step yourself; Jithox does not execute either. Hand an approved hash to the official connector. 4. Never put a credential, key or personal detail in the request; the endpoint refuses them. Command: ```bash curl -s https://jithox.com/api/agent-preflight/v1/evaluate \ -H 'content-type: application/json' \ -d '{"schemaVersion":"jithox.agent-action-preflight-request/v1","action":{"type":"send_message","target":{"kind":"email","id":"customer:EXAMPLE-1"},"summary":"Reply to the customer's question."},"agent":{"id":"my-agent","client":"claude"},"owner":{"ref":"owner:me"},"requestedPermissions":["read","draft_messages","send_external_messages"],"dataClassification":"internal","money":null,"externalSideEffect":true,"reversible":"no","authority":{"kind":"none"},"humanApproval":null,"idempotencyKey":"reply-customer-1-2026-09-10","requestedExpiresAt":"2026-09-10T14:00:00Z"}' ```Codex CLI CONFIG_READY
Add the rule to AGENTS.md at the repository root; Codex reads it at the start of every session and can run the curl in its sandbox.
AGENTS.md
# Agent Action Preflight (Jithox) Before any action that sends, publishes, buys, submits, accepts, tests or changes something outside the workspace: 1. POST the planned action to https://jithox.com/api/agent-preflight/v1/evaluate (schema: https://jithox.com/api/agent-preflight/v1/schema). 2. Act only on ALLOWED_TO_PREPARE. On HUMAN_APPROVAL_REQUIRED, show the owner the actionHash and stop. On BLOCKED or UNAVAILABLE, stop and report the reason codes. 3. Never execute the external step yourself; Jithox does not execute either. Hand an approved hash to the official connector. 4. Never put a credential, key or personal detail in the request; the endpoint refuses them. ```bash curl -s https://jithox.com/api/agent-preflight/v1/evaluate \ -H 'content-type: application/json' \ -d '{"schemaVersion":"jithox.agent-action-preflight-request/v1","action":{"type":"send_message","target":{"kind":"email","id":"customer:EXAMPLE-1"},"summary":"Reply to the customer's question."},"agent":{"id":"my-agent","client":"claude"},"owner":{"ref":"owner:me"},"requestedPermissions":["read","draft_messages","send_external_messages"],"dataClassification":"internal","money":null,"externalSideEffect":true,"reversible":"no","authority":{"kind":"none"},"humanApproval":null,"idempotencyKey":"reply-customer-1-2026-09-10","requestedExpiresAt":"2026-09-10T14:00:00Z"}' ```Gemini CLI CONFIG_READY
Add the rule to GEMINI.md in the project; Gemini CLI loads it as context and can execute the curl with its shell tool.
GEMINI.md
# Jithox Agent Action Preflight Before any action that sends, publishes, buys, submits, accepts, tests or changes something outside the workspace: 1. POST the planned action to https://jithox.com/api/agent-preflight/v1/evaluate (schema: https://jithox.com/api/agent-preflight/v1/schema). 2. Act only on ALLOWED_TO_PREPARE. On HUMAN_APPROVAL_REQUIRED, show the owner the actionHash and stop. On BLOCKED or UNAVAILABLE, stop and report the reason codes. 3. Never execute the external step yourself; Jithox does not execute either. Hand an approved hash to the official connector. 4. Never put a credential, key or personal detail in the request; the endpoint refuses them. ```bash curl -s https://jithox.com/api/agent-preflight/v1/evaluate \ -H 'content-type: application/json' \ -d '{"schemaVersion":"jithox.agent-action-preflight-request/v1","action":{"type":"send_message","target":{"kind":"email","id":"customer:EXAMPLE-1"},"summary":"Reply to the customer's question."},"agent":{"id":"my-agent","client":"claude"},"owner":{"ref":"owner:me"},"requestedPermissions":["read","draft_messages","send_external_messages"],"dataClassification":"internal","money":null,"externalSideEffect":true,"reversible":"no","authority":{"kind":"none"},"humanApproval":null,"idempotencyKey":"reply-customer-1-2026-09-10","requestedExpiresAt":"2026-09-10T14:00:00Z"}' ```Cursor / Grok CONFIG_READY
Save the rule as a Cursor rule file so every agent session in the project applies it; a Grok-based client that reads project rules uses the same file.
.cursor/rules/jithox-agent-preflight.mdc
--- description: Check every external action with Jithox Agent Action Preflight before acting alwaysApply: true --- Before any action that sends, publishes, buys, submits, accepts, tests or changes something outside the workspace: 1. POST the planned action to https://jithox.com/api/agent-preflight/v1/evaluate (schema: https://jithox.com/api/agent-preflight/v1/schema). 2. Act only on ALLOWED_TO_PREPARE. On HUMAN_APPROVAL_REQUIRED, show the owner the actionHash and stop. On BLOCKED or UNAVAILABLE, stop and report the reason codes. 3. Never execute the external step yourself; Jithox does not execute either. Hand an approved hash to the official connector. 4. Never put a credential, key or personal detail in the request; the endpoint refuses them. ```bash curl -s https://jithox.com/api/agent-preflight/v1/evaluate \ -H 'content-type: application/json' \ -d '{"schemaVersion":"jithox.agent-action-preflight-request/v1","action":{"type":"send_message","target":{"kind":"email","id":"customer:EXAMPLE-1"},"summary":"Reply to the customer's question."},"agent":{"id":"my-agent","client":"claude"},"owner":{"ref":"owner:me"},"requestedPermissions":["read","draft_messages","send_external_messages"],"dataClassification":"internal","money":null,"externalSideEffect":true,"reversible":"no","authority":{"kind":"none"},"humanApproval":null,"idempotencyKey":"reply-customer-1-2026-09-10","requestedExpiresAt":"2026-09-10T14:00:00Z"}' ```Any HTTP or CLI agent CONFIG_READY
One JSON request, one JSON answer. No key in this build; the response is no-store and carries the decision, the reason codes and the hash-bound receipt.
curl
curl -s https://jithox.com/api/agent-preflight/v1/evaluate \ -H 'content-type: application/json' \ -d '{"schemaVersion":"jithox.agent-action-preflight-request/v1","action":{"type":"send_message","target":{"kind":"email","id":"customer:EXAMPLE-1"},"summary":"Reply to the customer's question."},"agent":{"id":"my-agent","client":"claude"},"owner":{"ref":"owner:me"},"requestedPermissions":["read","draft_messages","send_external_messages"],"dataClassification":"internal","money":null,"externalSideEffect":true,"reversible":"no","authority":{"kind":"none"},"humanApproval":null,"idempotencyKey":"reply-customer-1-2026-09-10","requestedExpiresAt":"2026-09-10T14:00:00Z"}'MCP tool (future MCP host) MCP_HOST_PENDING
The MCP fleet lives in another repository owned by another team. The exact tool contract (name, input schema, output schema, decisions) is published in this build's schema document and in the Astra handoff under docs/handoffs, so the fleet can add the tool without inventing anything.
No MCP server hosts this tool today. The contract is a closed handoff to the fleet.
MCP tool contract
{ "name": "evaluate_action_preflight", "inputSchema": "https://jithox.com/api/agent-preflight/v1/schema#/request", "outputSchema": "https://jithox.com/api/agent-preflight/v1/schema#/result", "decisions": [ "ALLOWED_TO_PREPARE", "HUMAN_APPROVAL_REQUIRED", "BLOCKED", "UNAVAILABLE" ], "executes": false }