Skip to content
Back to JOBFLOW

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
}