Labs · Agent Agreement Preflight
Check a signature request before your agent sends it
Your agent drafts an NDA, a service agreement, a lease. Before anyone is asked to sign, this check says whether the request is ready, needs your approval, or is blocked — and exactly why. It never signs, never sends, and never says whether a signature is legally valid.
Not an e-signature service
Jithox does not sign, does not send, does not store your document and does not talk to a signature provider. Only the document's fingerprint (a sha256 hash) and opaque references travel. The decision is a deterministic policy check, not legal advice.
Step 4 of 4 · Result. Nothing is signed or sent by this page.
Result
Evaluated on the fixed clock 2026-09-10T12:00:00Z, so everyone sees the same answer.
Blocked
Something is wrong or missing. Fix what is named; nothing was prepared or sent.
Nothing was signed, sent, stored or paid.
Why
- An AI agent may not be the signer without a standing grant or registered representation.
- The request reaches someone outside your workspace.
- The document carries sensitive data.
- The signature level is not stated.
- Your approval of this exact request is missing.
What to add
- Record the standing grant or registered representation under which signer:security-bot acts, with scope and expiry.
- State the signature level the request will use (simple, advanced or qualified).
- Ask the owner to approve action hash cf64614dfc0d37367eddc5b11b741a95a1eff03c55a1540d10d291a1cccc9e2a before the expiry.
What your agent may do now
- —
What never happens here
- Send the signature request (never here; only the owner, through the chosen provider, after approval)
- Sign or apply any signature or seal
- Declare a signature or the document legally valid
- Consent, accept or waive anything on anyone's behalf
- Store or transmit the raw document
- Call the provider's API
Provider cost
EUR 2.50 · Within the budget; nothing is charged by this check.
Signature level
Unknown level. Jithox policy asks at least "advanced" for a other document before an agent prepares it; whether a level is legally sufficient is not assessed here.
Signers
- signer:security-bot · An AI agent acting on behalf of someone · ✕
- signer:customer-ciso · The other party · outside your company
Approval reference (the exact request you would approve)
cf64614dfc0d37367eddc5b11b741a95a1eff03c55a1540d10d291a1cccc9e2a
Unsigned and hash-bound: anyone can recompute it. It is not a signature and says nothing about legal validity.
Developer details
Request as evaluated
{
"schemaVersion": "jithox.agreement-preflight-request/v1",
"document": {
"type": "other",
"hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb",
"version": "draft-3",
"title": "Authorisation to test",
"dataClass": "confidential"
},
"signers": [
{
"role": "agent_on_behalf",
"ref": "signer:security-bot",
"external": false,
"authority": {
"kind": "owner_instruction",
"ref": "instruction:sec-2026-09"
}
},
{
"role": "counterparty",
"ref": "signer:customer-ciso",
"organisationRef": "org:customer-EXAMPLE",
"external": true,
"authority": {
"kind": "none"
}
}
],
"agent": {
"id": "security-bot",
"client": "chatgpt"
},
"owner": {
"ref": "owner:jithox",
"workspaceRef": "ws:security"
},
"jurisdiction": {
"country": "NL",
"signatureLevel": "unknown"
},
"expiry": {
"requestedExpiresAt": "2026-09-17T12:00:00Z",
"reminderPolicy": {
"enabled": true,
"everyDays": 3,
"maxReminders": 3
}
},
"provider": {
"id": "dropbox_sign",
"estimatedCostMinor": 250,
"currency": "EUR"
},
"budget": {
"maxAmountMinor": 1000,
"currency": "EUR"
},
"revocable": "yes",
"requiredEvidence": [
{
"id": "ev-scope-letter",
"kind": "authority_proof",
"ref": "artifact:scope-letter-v3",
"supplied": true
}
],
"humanApproval": null,
"idempotencyKey": "security-pentest-auth-2026-09-10"
}Result
{
"schemaVersion": "jithox.agreement-preflight-result/v1",
"policyVersion": "jithox.agreement-preflight-policy/v1",
"status": "preview_local_build",
"preflightId": "agp_cf64614dfc0d3736",
"decision": "BLOCKED",
"reasonCodes": [
"signer_role_unsupported_for_agent",
"external_recipients",
"data_class_requires_approval",
"signature_level_unknown",
"approval_missing"
],
"reasons": [
{
"code": "signer_role_unsupported_for_agent",
"message": "\"signer:security-bot\" is an agent acting on behalf of someone without a standing grant or registered representation. An agent never signs by itself."
},
{
"code": "external_recipients",
"message": "The request would reach at least one party outside the workspace. The owner approves this exact request (its hash) before anything is sent."
},
{
"code": "data_class_requires_approval",
"message": "The document carries confidential data; the owner approves who receives it."
},
{
"code": "signature_level_unknown",
"message": "The signature level is unknown. The owner decides which level this document needs; a preflight does not."
},
{
"code": "approval_missing",
"message": "The owner has not approved this exact request yet."
}
],
"missingRequirements": [
{
"code": "authority_missing",
"requirement": "Record the standing grant or registered representation under which signer:security-bot acts, with scope and expiry."
},
{
"code": "signature_level_unknown",
"requirement": "State the signature level the request will use (simple, advanced or qualified)."
},
{
"code": "approval_missing",
"requirement": "Ask the owner to approve action hash cf64614dfc0d37367eddc5b11b741a95a1eff03c55a1540d10d291a1cccc9e2a before the expiry."
}
],
"allowedPreparationSteps": [],
"prohibitedSteps": [
"Send the signature request (never here; only the owner, through the chosen provider, after approval)",
"Sign or apply any signature or seal",
"Declare a signature or the document legally valid",
"Consent, accept or waive anything on anyone's behalf",
"Store or transmit the raw document",
"Call the provider's API"
],
"approvalRequired": true,
"approvalStatus": "missing",
"cost": {
"relevant": true,
"estimatedMinor": 250,
"currency": "EUR",
"budgetMinor": 1000,
"withinBudget": true,
"source": "caller",
"note": "Within the budget; nothing is charged by this check."
},
"signatureLevel": {
"requested": "unknown",
"policyMinimum": "advanced",
"meetsPolicy": null,
"note": "Unknown level. Jithox policy asks at least \"advanced\" for a other document before an agent prepares it; whether a level is legally sufficient is not assessed here."
},
"signers": [
{
"ref": "signer:security-bot",
"role": "agent_on_behalf",
"external": false,
"authorityOk": false
},
{
"ref": "signer:customer-ciso",
"role": "counterparty",
"external": true,
"authorityOk": true
}
],
"expiresAt": "2026-09-17T12:00:00.000Z",
"actionHash": "cf64614dfc0d37367eddc5b11b741a95a1eff03c55a1540d10d291a1cccc9e2a",
"evidence": {
"required": [
"ev-scope-letter"
],
"supplied": [
"ev-scope-letter"
],
"missing": []
},
"replayProtection": {
"scope": "process_memory",
"durable": false,
"idempotencyKey": "security-pentest-auth-2026-09-10"
},
"receipt": {
"kind": "agent_agreement_preflight_receipt",
"signature": "unsigned_hash_bound",
"algorithm": "sha256-canonical-json",
"digest": "848384367e4c0561e487db5b5f104732ce29c0ecf3f02f57a7263c2edd6cb0a1",
"boundTo": {
"actionHash": "cf64614dfc0d37367eddc5b11b741a95a1eff03c55a1540d10d291a1cccc9e2a",
"decision": "BLOCKED",
"policyVersion": "jithox.agreement-preflight-policy/v1",
"evaluatedAt": "2026-09-10T12:00:00.000Z",
"preflightId": "agp_cf64614dfc0d3736"
},
"note": "This receipt is NOT signed, is NOT a signature, and says nothing about legal validity. It is bound by a sha256 digest over the canonical decision; anyone can recompute it."
},
"signed": false,
"sent": false,
"legalValidity": "not_assessed",
"executed": false,
"evaluatedAt": "2026-09-10T12:00:00.000Z"
}How it works
1 · Your agent describes the request
Document fingerprint and version, who signs with which authority, data class, country and signature level, expiry, provider and budget, evidence.
2 · Jithox checks it deterministically
The same request always gets the same decision: policy rules, no model, no lookups, no storage.
3 · You decide
Ready, needs approval, or blocked — with reasons and an approval reference you can approve. Sending stays with you and your provider.
How Jithox's own teams use it
Four teams, four requests, four decisions on a fixed clock. Demonstrations, not live requests.
Evaluated on the fixed clock 2026-09-10T12:00:00Z, so everyone sees the same answer.
MCP/Agent Tooling
Partner terms for a new MCP integrator
The tooling bot prepared partner terms for an integrator. The counterparty is external and the document is confidential, so the owner approves this exact request before it leaves.
exclamation markNeeds your approval
external_recipients · data_class_requires_approval · approval_missing
Security
Pentest authorisation letter drafted by the agent
The security bot wanted to be recorded as the signer of a customer's authorisation letter. An agent never signs by itself: without a standing grant with scope and expiry the request is blocked.
crossBlocked
signer_role_unsupported_for_agent · external_recipients · data_class_requires_approval · signature_level_unknown · approval_missing
Commerce
Reseller agreement with a web shop, approved
The commerce bot prepared a reseller agreement; the owner already approved this exact hash. External and within budget, so it is ready to prepare — sending stays with the owner.
check markReady to prepare
external_recipients · approval_valid
First Cash
Statement of work with a client, over budget
The first-cash bot prepared a statement of work and picked a provider whose estimated cost is above the stated budget. Blocked until the budget or the provider changes; nothing is charged.
crossBlocked
external_recipients · budget_exceeded · approval_missing
What is true about this check
- It is a policy check, not legal advice: it says nothing about whether a signature is legally valid.
- Only the document's sha256 fingerprint travels; the document itself never does.
- Signers are opaque references; an e-mail address, phone number or bank account is refused.
- An AI agent is never the signer: it may act only under a recorded standing grant or representation, with scope and expiry.
- Anything that reaches someone outside your workspace needs your approval of the exact request hash.
- The provider cost is estimated beforehand and compared with your budget; nothing is charged by this check.
- The receipt is unsigned and hash-bound; anyone can recompute it.
- It is a free Labs preview: not sold, not in the sitemap, not a promise.
What this never does
- Sign a document.
- Claim a legal identity.
- Send a signature request.
- Consent on anyone's behalf.
- Store a raw document.
- Call an external provider.
- Claim a signature is legally valid.
- Send customer data to a model.
Free. The interactive check, the API and the connection tool cost nothing in this build; a paid receipted check is a proposal for the owner, not a price. Status: preview local build.
Developer details
Three free routes and one connection tool. The request and result schemas are closed; every decision, reason code and error code is listed in the schema document.
Developer details
- Schema:
- GET https://jithox.com/api/agreement-preflight/v1/schema
- Evaluate:
- POST https://jithox.com/api/agreement-preflight/v1/evaluate
- Fixtures:
- GET https://jithox.com/api/agreement-preflight/v1/fixtures
- Policy:
- jithox.agreement-preflight-policy/v1 · 60/min
- MCP:
- agreement_preflight @ https://jithox.com/api/agent-connection/v1/mcp · CONFIG_READY
- Decisions:
- READY_TO_PREPARE · NEEDS_APPROVAL · BLOCKED · UNAVAILABLE
Through your Jithox connection the tool is called agreement_preflight and needs the scope actions:prepare:agent-agreement-preflight. CONFIG_READY: listed and callable; no client is CERTIFIED against it until a production canary has run.