AGPL-3.0-or-later · forever.

showcase · tier 2 · ops & support

Support triage

The overnight queue gets classified with schema enums, first replies drafted, urgent tickets escalated.

By 9am the board is tagged, drafted and batched. Humans handle the hard ones. · conformance-gated in nika-spec ↗ · re-proven at every push

The whole file

6 tasks · 4 waves · the plan falls out of the bindings, nothing is scheduled by hand.

t2-support-triage.nika.yamlsource
nika: v1workflow:  id: support-triage  description: "Ticket queue → typed triage → urgent escalation → triage board"model: ollama/qwen3.5:4b   # local · zero key · swap for groq/llama-3.3-70b (triage wants speed)vars:  queue_path: "./support/overnight-queue.json"secrets:  oncall_webhook:    source: env    key: ONCALL_WEBHOOK_URL    egress:                       # sanction the one send · the secret IS the URL      - to: "nika:notify"        host_from_self: truetasks:  batch:    invoke:      tool: "nika:uuid"      args: { version: v7 }  queue:    invoke:      tool: "nika:read"      args: { path: "${{ vars.queue_path }}" }  triage:    with:      queue: ${{ tasks.queue.output }}    infer:      prompt: |        Triage every ticket in this queue ·        ${{ with.queue }}        For each · classify category and urgency, draft a 2-sentence first reply.      schema:        type: object        required: [tickets]        properties:          tickets:            type: array            items:              type: object              required: [id, category, urgency, first_reply]              properties:                id: { type: string }                category: { type: string, enum: [billing, bug, how-to, account, other] }                urgency: { type: string, enum: [low, normal, high, critical] }                first_reply: { type: string }  urgent:    with:      tickets: ${{ tasks.triage.output.tickets }}    invoke:      tool: "nika:jq"      args:        input: "${{ with.tickets }}"        expression: 'map(select(.urgency == "high" or .urgency == "critical"))'  escalate:    with:      urgent: ${{ tasks.urgent.output }}      batch: ${{ tasks.batch.output }}    when: ${{ size(with.urgent) > 0 }}    invoke:      tool: "nika:notify"      args:        channel: webhook        target: "${{ secrets.oncall_webhook }}"        message: "Urgent tickets in triage batch ${{ with.batch }} · ${{ with.urgent }}"        severity: warning  board:    with:      tickets: ${{ tasks.triage.output.tickets }}      batch: ${{ tasks.batch.output }}    invoke:      tool: "nika:write"      args:        path: "./support/triage-${{ with.batch }}.json"        content: "${{ with.tickets }}"outputs:  tickets:    value: ${{ tasks.triage.output.tickets }}    description: "The classified queue with drafted first replies"

nika inspect · engine 0.105.0 · vendored graph, never re-derived

6 declared edges · 4 waves · the plan falls out of the bindings