Skip to content

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.

red cross

Blocked

Something required is missing or wrong. The reasons below say exactly what, and every next step here is a safe repair step.

Safe repair steps: add what is missing, correct what is wrong, then check again. No button here performs the action.

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
  • The maximum amount (EUR 1300.00) exceeds the standing budget (EUR 500.00). budget_exceeded
  • "Buy something" has an external side effect: the owner must approve this exact action (its hash). approval_missing
  • The action touches payment data. data_classification_requires_approval

What is still missing

  • Ask the owner to approve action hash bb343cef895e689a6616460d7615d6a5a813d9076917d12de9312597ade19255 before the expiry.

What your agent may safely prepare

  • Nothing, until the blockers are resolved.

What must not be performed

  • Placing the order. (never here; only through an official connector after approval)
  • Paying. (never here; only through an official connector after approval)
Budget:
Above the standing budget.
Approval:
required, not yet given
Valid until:
2026-09-10T14:00:00.000Z
Policy version:
jithox.agent-action-policy/v1
Receipt:
unsigned, hash-bound · 3ca304c6571bcd17
Evidence references:
ev-merchant-listing · Preflight ID apf_bb343cef895e689a
Action hash:
bb343cef895e689a6616460d7615d6a5a813d9076917d12de9312597ade19255
Open developer guide

Preflight finished: Blocked. 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": "purchase",
      "target": {
        "kind": "merchant_order",
        "id": "EXAMPLE-shop|TLP-2026|v2026.09"
      },
      "summary": "Buy 12 × EXAMPLE thermal label printer (product version 2026.09) from EXAMPLE-shop.example; maximum total EUR 1,300.00."
    },
    "agent": {
      "id": "commerce-bot",
      "client": "claude"
    },
    "owner": {
      "ref": "owner:jithox",
      "workspaceRef": "ws:commerce"
    },
    "requestedPermissions": [
      "read",
      "spend_money"
    ],
    "dataClassification": "payment",
    "money": {
      "maxAmountMinor": 130000,
      "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-x12",
    "requestedExpiresAt": "2026-09-10T14:00:00Z",
    "evidence": [
      {
        "id": "ev-merchant-listing",
        "kind": "merchant_listing",
        "ref": "artifact:listing-TLP-2026"
      }
    ]
  },
  "result": {
    "schemaVersion": "jithox.agent-action-preflight-result/v1",
    "policyVersion": "jithox.agent-action-policy/v1",
    "status": "preview_local_build",
    "preflightId": "apf_bb343cef895e689a",
    "decision": "BLOCKED",
    "reasonCodes": [
      "external_execution_unsupported",
      "budget_exceeded",
      "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": "budget_exceeded",
        "message": "The maximum amount (EUR 1300.00) exceeds the standing budget (EUR 500.00)."
      },
      {
        "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 bb343cef895e689a6616460d7615d6a5a813d9076917d12de9312597ade19255 before the expiry."
      }
    ],
    "allowedPreparationSteps": [],
    "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": 130000,
      "currency": "EUR",
      "standingBudgetMinor": 50000,
      "withinStandingBudget": false,
      "note": "Above the standing budget."
    },
    "expiresAt": "2026-09-10T14:00:00.000Z",
    "actionHash": "bb343cef895e689a6616460d7615d6a5a813d9076917d12de9312597ade19255",
    "evidence": {
      "supplied": [
        "ev-merchant-listing"
      ],
      "preflightId": "apf_bb343cef895e689a"
    },
    "replayProtection": {
      "scope": "process_memory",
      "durable": false,
      "idempotencyKey": "commerce-buy-TLP-2026-09-10-x12"
    },
    "receipt": {
      "kind": "agent_action_preflight_receipt",
      "signature": "unsigned_hash_bound",
      "algorithm": "sha256-canonical-json",
      "digest": "3ca304c6571bcd17763bd7d65cc35b8450612a1927906b40165c2c524b601c50",
      "boundTo": {
        "actionHash": "bb343cef895e689a6616460d7615d6a5a813d9076917d12de9312597ade19255",
        "decision": "BLOCKED",
        "policyVersion": "jithox.agent-action-policy/v1",
        "evaluatedAt": "2026-09-10T12:00:00.000Z",
        "preflightId": "apf_bb343cef895e689a"
      },
      "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. 1. Describe the action

    Pick what the agent wants to do, say where and for whom, and what could happen.

  2. 2. Check permission, risk and budget

    Jithox compares that with the permissions, the authority, the budget and the approval that already exist.

  3. 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

    Open this example

  • 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

    Open this example

  • 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

    Open this example

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

    Open this example

  • 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

    Open this example

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

    Open this example

  • 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

    Open this example

Growth

  • Draft a social post

    A draft stays in the workspace, so the Growth bot may prepare it.

    green checkSafe to prepare

    Open this example

  • 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

    Open this example

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.

Open Team Builder (Labs)

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 requestBuy 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 responseEvaluated 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
    }

Developer hub · Open Team Builder (Labs)