support.triage/1
Triage one support ticket: read it at its current revision, know who raised it, have a proposed classification reviewed, and route it under authority; escalate under authority when its service-level target is breached, and hand it to a person when it cannot be triaged.
- Id:
support.triage - Revision: 1
- Source:
protocols/support-triage/1.yaml
Dependency graph
Which actions may produce which evidence, which claims that evidence establishes, and which outcomes and obligations rest on those claims. Hover or focus a node to trace what it rests on.
Protocol · revision 1
support.triage/1Triage one support ticket: read it at its current revision, know who raised it, have a proposed classification reviewed, and route it under authority; escalate under authority when its service-level target is breached, and hand it to a person when it cannot be triaged.
- Actions7
- Evidence kinds6
- Claims9
- Outcomes3
- Obligations1
- Claim supports claim
- Precondition, traced on hover
- Needs authority
Hover or focus a node to trace what it rests on and what rests on it. Press Enter to pin it, Escape to clear.
Protocol as text
| Name | Description | Rule | Leads to |
|---|---|---|---|
classification.review | approve or reject the proposed classification, under authority | claim classification.proposed needs classification.review effect none | produces classification_review |
escalation.request | request an escalation; needs a current read showing the target breached, and authority | claim sla.breached needs escalation.request effect write | produces escalation_record |
reply.draft | draft a reply to the requester for a person to send; needs the classification decided and authority | claim ticket.classified needs reply.draft effect write | — |
requester.lookup | look up the person who raised the ticket | claim ticket.current effect read | produces requester_profile |
ticket.classify | propose a category and priority for the ticket; changes nothing outside the case | claim ticket.current effect none | produces classification |
ticket.read | read the ticket at its current revision | effect read | produces ticket_snapshot |
ticket.route | route the ticket to a queue or owner; only after the classification is decided (step order, decision record 0084) and the requester is known, and only under authority | all of claim requester.known claim ticket.classified needs ticket.route effect write | produces routing_record |
More columns: swipe horizontally, or focus the table and use the arrow keys.
| Name | Description | Rule | Leads to |
|---|---|---|---|
classification | a proposed category and priority for one ticket revision, each one the deployment declares | — | establishes classification.proposed (about ticket) |
classification_review | a review of the proposed classification; its result is approved or rejected | — | establishes classification.reviewed (approved about ticket) |
escalation_record | the record that an escalation was requested for the ticket, naming where it went | — | establishes escalation.requested (about ticket) |
requester_profile | the requester looked up; its result is identified or unidentified | — | establishes requester.known (identified about requester) |
routing_record | the record that the ticket was routed to a queue or owner, naming the target | — | establishes ticket.routed (about ticket) |
ticket_snapshot | the ticket read at one revision: its id, revision, a digest and its service-level status when read, never its text; its result is breached or within_target. A read older than 15 minutes no longer says whether the target is breached | — | establishes sla.breached (breached about ticket); establishes ticket.current (about ticket) |
More columns: swipe horizontally, or focus the table and use the arrow keys.
| Name | Description | Rule | Leads to |
|---|---|---|---|
classification.proposed | a category and priority are proposed for the current ticket revision | any evidence: classification | supports ticket.classified; gates classification.review |
classification.reviewed | the classification of the current ticket revision is reviewed and approved | evidence = approved: classification_review | supports ticket.classified; requires needs_human (false) |
escalation.requested | an escalation is requested for the current ticket revision | any evidence: escalation_record | requires escalated; requires escalate_sla_breach |
requester.known | the requester is identified | evidence = identified: requester_profile | supports ticket.triaged; requires needs_human (false); gates ticket.route |
sla.breached | the ticket's service-level target is breached, by a current read of the ticket | evidence = breached: ticket_snapshot | requires escalated; requires triaged (false); requires escalate_sla_breach (false); gates escalation.request |
ticket.classified | category and priority are decided on current evidence: the current ticket revision is read, a classification is proposed for it and the review approved it | all of claim classification.proposed claim classification.reviewed claim ticket.current | supports ticket.triaged; gates reply.draft; gates ticket.route |
ticket.current | the ticket has been read at its current revision, recently enough to trust | any evidence: ticket_snapshot | supports ticket.classified; gates requester.lookup; gates ticket.classify |
ticket.routed | the current ticket revision is routed to a queue or owner | any evidence: routing_record | supports ticket.triaged |
ticket.triaged | category, priority and route are decided on current evidence, for an identified requester | all of claim requester.known claim ticket.classified claim ticket.routed | requires triaged |
More columns: swipe horizontally, or focus the table and use the arrow keys.
| Name | Description | Rule | Leads to |
|---|---|---|---|
escalated | the ticket's service-level target is breached and an escalation is requested | all of claim escalation.requested claim sla.breached | — |
needs_human | the ticket goes to a person: the review rejected the proposed classification, or the requester could not be identified | any of claim is false: classification.reviewed claim is false: requester.known | — |
triaged | the ticket is triaged: category, priority and route decided on current evidence, with its service-level target not breached | all of claim is false: sla.breached claim ticket.triaged | — |
More columns: swipe horizontally, or focus the table and use the arrow keys.
| Name | Description | Rule | Leads to |
|---|---|---|---|
escalate_sla_breach | a breached service-level target needs escalation; discharged once a current read shows the target not breached, or once an escalation is requested | any of claim escalation.requested claim is false: sla.breached | — |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Source: protocols/support-triage/1.yaml
Actions
What can be done in a case: what it needs first, which authority it requires, the class of effect it has and the evidence it may produce.
| Action | Description | Precondition | Requires capability | Effect | May produce |
|---|---|---|---|---|---|
classification.review | approve or reject the proposed classification, under authority | classification.proposed is TRUE | classification.review | none | classification_review |
escalation.request | request an escalation; needs a current read showing the target breached, and authority | sla.breached is TRUE | escalation.request | write | escalation_record |
reply.draft | draft a reply to the requester for a person to send; needs the classification decided and authority | ticket.classified is TRUE | reply.draft | write | no evidence |
requester.lookup | look up the person who raised the ticket | ticket.current is TRUE | no authority | read | requester_profile |
ticket.classify | propose a category and priority for the ticket; changes nothing outside the case | ticket.current is TRUE | no authority | none | classification |
ticket.read | read the ticket at its current revision | none | no authority | read | ticket_snapshot |
ticket.route | route the ticket to a queue or owner; only after the classification is decided (step order, decision record 0084) and the requester is known, and only under authority | all of (requester.known is TRUE; ticket.classified is TRUE) | ticket.route | write | routing_record |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Evidence kinds
The kinds of evidence this protocol admits. A kind with a maximum age applies for that long after a record's observed_at: evaluated at a later instant, the record is excluded as expired.
| Evidence kind | Description | Applies for | Produced by | Used by claims |
|---|---|---|---|---|
classification | a proposed category and priority for one ticket revision, each one the deployment declares | no limit | ticket.classify | classification.proposed |
classification_review | a review of the proposed classification; its result is approved or rejected | no limit | classification.review | classification.reviewed |
escalation_record | the record that an escalation was requested for the ticket, naming where it went | no limit | escalation.request | escalation.requested |
requester_profile | the requester looked up; its result is identified or unidentified | no limit | requester.lookup | requester.known |
routing_record | the record that the ticket was routed to a queue or owner, naming the target | no limit | ticket.route | ticket.routed |
ticket_snapshot | the ticket read at one revision: its id, revision, a digest and its service-level status when read, never its text; its result is breached or within_target. A read older than 15 minutes no longer says whether the target is breached | 15m after it is observed | ticket.read | sla.breached, ticket.current |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Claims
Each claim is TRUE, FALSE or UNKNOWN, established from evidence by its predicate. Missing or stale evidence leaves a claim UNKNOWN, never FALSE.
| Claim | Description | True when |
|---|---|---|
classification.proposed | a category and priority are proposed for the current ticket revision | evidence classification about ticket |
classification.reviewed | the classification of the current ticket revision is reviewed and approved | evidence classification_review with result approved about ticket |
escalation.requested | an escalation is requested for the current ticket revision | evidence escalation_record about ticket |
requester.known | the requester is identified | evidence requester_profile with result identified about requester |
sla.breached | the ticket's service-level target is breached, by a current read of the ticket | evidence ticket_snapshot with result breached about ticket |
ticket.classified | category and priority are decided on current evidence: the current ticket revision is read, a classification is proposed for it and the review approved it | all of (classification.proposed is TRUE; classification.reviewed is TRUE; ticket.current is TRUE) |
ticket.current | the ticket has been read at its current revision, recently enough to trust | evidence ticket_snapshot about ticket |
ticket.routed | the current ticket revision is routed to a queue or owner | evidence routing_record about ticket |
ticket.triaged | category, priority and route are decided on current evidence, for an identified requester | all of (requester.known is TRUE; ticket.classified is TRUE; ticket.routed is TRUE) |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Obligations
What must be done before a case can be complete, and what discharges it. An obligation stays open until its predicate is TRUE; its predicate being UNKNOWN does not discharge it.
| Obligation | Description | Discharged when |
|---|---|---|
escalate_sla_breach | a breached service-level target needs escalation; discharged once a current read shows the target not breached, or once an escalation is requested | any of (escalation.requested is TRUE; sla.breached is FALSE) |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Outcomes
The legitimate terminal interpretations of a case, and what each requires.
| Outcome | Description | Requires |
|---|---|---|
escalated | the ticket's service-level target is breached and an escalation is requested | all of (escalation.requested is TRUE; sla.breached is TRUE) |
needs_human | the ticket goes to a person: the review rejected the proposed classification, or the requester could not be identified | any of (classification.reviewed is FALSE; requester.known is FALSE) |
triaged | the ticket is triaged: category, priority and route decided on current evidence, with its service-level target not breached | all of (sla.breached is FALSE; ticket.triaged is TRUE) |
More columns: swipe horizontally, or focus the table and use the arrow keys.
Artifacts
The things whose revisions evidence is bound to.
| Artifact | Description |
|---|---|
requester | the person who raised the ticket, with the organization they belong to |
ticket | the support request a case triages, referenced by its tracker id; its revision moves when the requester's side of the request changes, not when routing fields or internal notes change. The case stores no ticket text |
More columns: swipe horizontally, or focus the table and use the arrow keys.