Semantics
Creates a ClientRequest row with a kind classifier so the owner can route it appropriately. Kinds: `bug`, `question`, `change_request`, `billing_question`, `general`. If `project_id` is provided the ticket is scoped to that project; otherwise it lands in the tenant's general inbox.
Invariants
- Tickets are append-only via this capability; status transitions are owner-driven (`new` → `triaged` → `in_progress` → `closed`).
- Same `(email, subject)` within 60s returns the same ticket_id (idempotent window).
When to use
When the user wants to ask a question, report a bug, request a change, or raise a billing concern with a provider. The agent should ask the user to confirm before submitting since this creates a tracked record.
Input schema
{
"type": "object",
"required": [
"requester_name",
"requester_email",
"kind",
"subject",
"body"
],
"properties": {
"body": {
"type": "string",
"maxLength": 5000,
"minLength": 1
},
"kind": {
"enum": [
"bug",
"question",
"change_request",
"billing_question",
"general"
],
"type": "string"
},
"subject": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"project_id": {
"type": "string",
"description": "Optional. If present, the ticket is scoped to that project."
},
"agent_vendor": {
"type": "string"
},
"requester_name": {
"type": "string",
"minLength": 1
},
"requester_email": {
"type": "string",
"format": "email"
}
},
"additionalProperties": false
}Output schema
{
"type": "object",
"required": [
"ok"
],
"properties": {
"ok": {
"type": "boolean"
},
"error": {
"enum": [
"invalid_email",
"invalid_input",
"tenant_not_found",
"unknown_project"
],
"type": "string"
},
"status": {
"enum": [
"new",
"triaged",
"in_progress",
"closed"
],
"type": "string"
},
"ticket_id": {
"type": "string"
}
}
}