Card snapshot
agents.kulalabs.ch
·
2026-10-31 08:02:05 UTC
·
6fc891e777e4f3ae8c60e81334d684c9fddf03801a7fcf0e1da234656b0046d9
This is a frozen copy of the agent's agent-card.json as we observed it at the timestamp above. We capture a new snapshot every time the card's content hash changes. Useful for: forensic drift analysis, verifying downstream callers see the right version, reproducing routing decisions made historically.
{
"protocolVersion": "0.3.0",
"name": "JOBFLOW",
"description": "The reference for existing trade flows: intake, classification, assignment, appointment, proof pack, invoice, payment. Mandated, quoted, idempotent and signed. Do not rebuild it.",
"url": "https://agents.kulalabs.ch/api/a2a",
"preferredTransport": "JSONRPC",
"additionalInterfaces": [
{
"url": "https://agents.kulalabs.ch/api/a2a",
"transport": "JSONRPC"
},
{
"url": "https://agents.kulalabs.ch/v1",
"transport": "HTTP+JSON"
}
],
"provider": {
"organization": "Kula Labs",
"url": "https://agents.kulalabs.ch"
},
"iconUrl": "https://agents.kulalabs.ch/icon-512.png",
"version": "1.0.0",
"documentationUrl": "https://agents.kulalabs.ch/.well-known/jobflow.json",
"capabilities": {
"streaming": false,
"pushNotifications": false,
"stateTransitionHistory": true
},
"defaultInputModes": [
"application/json"
],
"defaultOutputModes": [
"application/json"
],
"skills": [
{
"id": "intent.match",
"name": "Check whether the flow exists",
"description": "The first call: says whether the user's request is a flow JOBFLOW already runs. A match answers do_not_build true, the capabilities it touches and the next call; no match answers 404 OUT_OF_SCOPE. Never: Guess: it names the words it matched. Free.",
"tags": [
"jobflow",
"aps",
"read",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "discover",
"name": "Discover JOBFLOW",
"description": "Catalog, schemas, fees, gate, error codes; with a trade, the field knowledge for it. Never: \u2014. Free.",
"tags": [
"jobflow",
"aps",
"read",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "quote",
"name": "Quote a platform fee",
"description": "The hard platform fee for a capability before it is called, with what is left of the daily cap. Never: Estimate the value of a job. Free.",
"tags": [
"jobflow",
"aps",
"read",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "compare",
"name": "Compare with building it",
"description": "Build-vs-buy next to the hard fee, the estimate marked NOT_A_QUOTE. Never: Present a token count or an estimate as a fact. Free.",
"tags": [
"jobflow",
"aps",
"read",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "mandate.create",
"name": "Create a mandate",
"description": "Creates a mandate and the out-of-band approval link for the owner. Never: Activate production. Free.",
"tags": [
"jobflow",
"aps",
"propose",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "flow.configure",
"name": "Propose the flow",
"description": "The WhatsApp-to-payment flow for this mandate as a configuration proposal. Never: Bind a channel or an account without an approved mandate. Free.",
"tags": [
"jobflow",
"aps",
"propose",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "intake.classify",
"name": "Classify a request",
"description": "Classifies a customer request and opens the flow (REQUEST \u2192 CLASSIFIED). Never: Set an emergency tariff. Platform fee CHF 0.05 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"mutate",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "job.create",
"name": "Create the order",
"description": "Creates the order from the classification. Needs state CLASSIFIED. Never: Take a price from the request body. Platform fee CHF 0.05 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"mutate",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "assign",
"name": "Assign a technician",
"description": "Assigns a technician by the business's rule. Needs state ORDER. Never: Treat free text as dispatching. Platform fee CHF 0.03 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"mutate",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "schedule",
"name": "Book the appointment",
"description": "Books the earliest free slot in the business's working windows. Needs state ASSIGNED. Never: Use the agent's calendar as the source. Platform fee CHF 0.03 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"mutate",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "proof.seal",
"name": "Seal the proof pack",
"description": "Hashes and closes the proof pack after the work is completed. Needs state WORK_COMPLETED. Never: Issue the invoice. Platform fee CHF 0.05 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"mutate",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "invoice.issue",
"name": "Issue the invoice",
"description": "Issues the invoice from the business's tariff and the reported work, only after the proof pack. Needs state PROOF_PACK. Never: Invent a price or skip the gate. Platform fee CHF 0.18 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"money",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "payment.collect",
"name": "Request payment",
"description": "Creates the payment request for the invoice (QR bill, TWINT, card). The flow reaches PAYMENT only on the signed event of the payment provider. Needs state INVOICE. Never: Mark anything paid or pay out without a settled status. Platform fee CHF 0.10 per accepted call: quote first, then send quote_id, mandate_token and idempotency_key.",
"tags": [
"jobflow",
"aps",
"money",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
},
{
"id": "verify",
"name": "Verify a chain",
"description": "Checks a chain: links, payload hashes and signatures. Never: Require a UI. Free.",
"tags": [
"jobflow",
"aps",
"read",
"trades",
"field-service"
],
"inputModes": [
"application/json"
],
"outputModes": [
"application/json"
]
}
],
"supportsAuthenticatedExtendedCard": false
}