| name | create-ticket |
| description | Create a new ticket (persistent conversation/work thread) in EvoNexus. Assigns to an agent, sets priority, optionally links to a goal or project. Writes via POST /api/tickets. Use when the user says 'create a ticket', 'open an issue', 'add to Zara's queue', 'track this topic for later', 'assign X to Y agent', or wants to turn an ad-hoc conversation into persistent work. |
Create Ticket
Create a ticket — persistent conversation/work thread with state and assignee.
When to use
Use tickets when:
- The topic will come up again (customer retention, recurring bug, ongoing partnership)
- The work needs an assignee and status workflow
- A heartbeat should pull it from an inbox (tickets are the inbox)
- Multiple people / agents will discuss over time (threaded comments)
Don't use tickets for:
- Ephemeral questions (use a chat session)
- Deterministic scheduled work (use a routine)
- State-checking protocols (use a heartbeat + decision prompt)
Step 1: Collect fields
Ask the user:
- Title — short, specific ("Cliente X reclama de latência")
- Description — context (optional but recommended)
- Priority —
urgent, high, medium (default), low
- Assignee agent — which agent handles this? Common picks:
zara-cs — support / CS
flux-finance — billing / payments
atlas-project — project blockers
aria-hr — HR / hiring
lex-legal — contracts / compliance
- Goal link? Optional
goal_id if this work moves a specific goal. Skip if not.
- Project link? Optional
project_id for grouping without a specific goal.
Step 2: Call the API
Use from dashboard.backend.sdk_client import evo — auto-handles URL + auth.
The runtime injects the current agent slug and session id into your system prompt — pass them through so the ticket records provenance.
import json
from dashboard.backend.sdk_client import evo
ticket = evo.post("/api/tickets", {
"title": "Cliente X reclama de latência",
"description": "Print anexado no Intercom, 4s para carregar /dashboard",
"priority": "high",
"assignee_agent": "zara-cs",
"goal_id": 3,
"source_agent": "<agent-slug>",
"source_session_id": "<session-uuid>",
})
print(json.dumps(ticket))
Response includes the created ticket with id, status=open, created_at.
Step 3: Show what happens next
Explain to the user:
- Ticket appears in
/issues?assignee=zara-cs inbox
- Zara's next heartbeat (step 3 — query inbox) will see it
- If priority is
urgent, it jumps to front of queue
- When Zara acts, the ticket gets:
locked_at / locked_by = zara-cs (atomic checkout)
- Comments added by Zara showing what was done
- Status eventually changes (in_progress → review → resolved → closed)
- Auto-release after
lock_timeout_seconds (default 1800s) if Zara crashes mid-work
Step 4: Mentions (optional)
If the user says "and tell Flux to check billing", add a comment with:
from dashboard.backend.sdk_client import evo
evo.post(f"/api/tickets/{ticket['id']}/comments", {
"body": "@flux-finance please confirm this customer's billing status",
})
The @flux-finance is parsed and fires a wake trigger — Flux's heartbeat wakes (within 30s debounce window) and picks up the ticket.
Step 5: Direct user to UI
/issues — global list with filters and search
/tickets/<id> — detail view with full timeline (comments + activity + status changes)
- Bulk actions in
/issues: close, reopen, delete, reassign, relink_goal
Notes
- Tickets vs sessions: tickets persist (days/weeks), sessions are ephemeral. A session can bind to a ticket.
- Closing a ticket doesn't delete comments or activity — the timeline remains.
- Priority order:
urgent > high > medium > low (enum with internal rank).
Related: .claude/rules/tickets.md, .claude/rules/heartbeats.md, .claude/rules/goals.md.