CRM Support-Console Ticket Resolution
You resolve same-day support work by reading records from a shared, read-only
support-console HTTP API and producing JSON that exactly matches the task's
answer_template.json. Every decision must be evidence-backed from console
records — never inferred from the customer's wording alone.
There are four recurring task families. Identify which one you have from the
answer template fields, then follow the matching SOP below. The detailed
decision tables for each family live in references/.
Step 0 — Universal setup (do this every time)
- Read the inputs. Open
prompt.txt and every file under payloads/.
The answer_template.json defines the EXACT output shape, field names, enum
values, ordering rule, and number formatting. Treat it as the contract: emit
only those keys, only those enum spellings, and respect its stated ordering
("preserve payload order" vs "ascending case_id order").
- Fix the base URL. Prompts often say
http://127.0.0.1:8057. The harness
overrides this — use the base URL from environment_access.md (currently
http://127.0.0.1:8086). If a different base URL is provided by the harness,
that wins over anything in the prompt.
- Pull the backing record for every input row. For each ticket/case/incident,
GET its record plus all dependent records (account, outage, diagnostics,
troubleshooting, line, device, bill, plan, SLA, export-runs, messages) BEFORE
deciding. Use
curl -s <base>/api/.... Endpoints are listed in
environment_access.md and /api/catalog. /api/search?q= and
/api/enterprise/messages?query= do full-text lookups when an ID is unknown.
- Output only JSON. Return exactly one JSON object conforming to the template.
No prose, no markdown fences. Numbers: honor "two decimals" / "one decimal"
as the template states (e.g.
4.0, 86.40). Empty-when-not-applicable string
fields are the literal empty string "", never null.
- Compute summaries by counting your own decisions. Every family ends with a
summary block whose counters must be derived by tallying the decision rows you
just produced — recount, do not estimate. Verify each counter sums correctly.
Identify the task family
| Signal in answer_template |
Family |
SOP |
ticket_decisions[] with final_resolution_status, resolution_route, latency_issue/stability_issue/bandwidth_issue, escalation_team |
A. Ticket batch resolution |
below + references/connectivity.md |
ticket_decisions[] with key_blocker, route_team, diagnostic_required |
B. Queue classification |
below + references/connectivity.md |
case_decisions[] with primary_action, permission, bill_id, final_route (SELF_SERVICE/BILLING_RECOVERY/...) |
C. Mobile case queue |
references/mobile.md |
case_decisions[] with data_refuel_gb, carrier_update_required, final_route (DATA_RECOVERY/...) |
D. Mobile-data worklist |
references/mobile.md |
incident_id, failure_window, sla_credit_percent, share_permissions, evidence_folder |
E. Enterprise response package |
references/enterprise.md |
Families A and B are both connectivity-ticket triage and share the same gating
order and diagnostic thresholds — read references/connectivity.md for both.
They differ only in output fields and which enum names are used.
The gating principle (connectivity families A & B)
The single most important rule: gates are evaluated in a fixed order, and the
FIRST gate that fires decides the outcome. Diagnostics/troubleshooting are only
consulted if every gate passes. Running diagnostics on a ticket that should have
been stopped by an earlier gate is the most common error.
Order (stop at the first match):
- Account validity — account id not found in
/api/accounts →
FAILED, blocker INVALID_ACCOUNT (route INVALID_ACCOUNT). No diagnostics.
- Authentication — account exists but auth is broken
(
authentication.last_login_status == "FAILURE" or
account_recovery_status == "FAILURE") → FAILED, AUTH_FAILED. No diagnostics.
- Account standing —
status != "Active" (e.g. "Suspended") →
FAILED. The suspension sub-reason is read from the ticket/queue note text:
"overdue" → OVERDUE_SUSPENSION routed to ACCOUNTS_PAYABLE; "fraud" →
FRAUD_SUSPENSION. (Family A calls this INELIGIBLE_ACCOUNT, team NONE.)
No diagnostics.
- Active outage — an entry from
/api/outages?service_area=<area> is
active: true AND lists the ticket's service_type in service_types →
PENDING_ACTION, blocker ACTIVE_OUTAGE, route OUTAGE_WAIT, outage_id set.
This ticket "requires customer wait." No diagnostics (the network is the cause).
- Diagnostics & troubleshooting — only now run the metric logic in
references/connectivity.md to decide RESOLVED vs ESCALATED and the
issue flags / escalation team.
Full enum mappings, thresholds, and the escalation-team routing table are in
references/connectivity.md.
Mobile families (C & D)
For each case, the next operation is chosen from the device/line/bill records by
matching the case issue_type and the offending field. The two families share an
action vocabulary but differ in a subtle, important way around roaming and in
their output fields and routes. The complete decision tables, the
roaming distinction, the charge/refuel math, and the route mapping are in
references/mobile.md. Read it whenever the template has primary_action.
Enterprise family (E)
Assemble an incident-response package by joining the incident, enterprise account,
SLA contract, export-runs, and messages. The failure window comes from consecutive
FAILED export runs; the SLA credit comes from the contract; owners come from the
incident; channel/folder/title follow naming conventions; share permissions follow
the requirements payload. Full field-by-field derivation is in
references/enterprise.md.
Common misjudgments to avoid
- Skipping a gate. A suspended or auth-failed account never gets diagnostics,
even if diagnostics records exist in the console. The gate order is absolute.
- Reading metrics from the wrong record. The issue flags
(latency/stability/bandwidth) come from the pre-fix
/api/diagnostics/<id>.
Whether the ticket RESOLVED or ESCALATED is judged on the post-fix
/api/troubleshooting/<id> numbers. Don't mix them up.
- Trusting the customer's words over the records. "Whole office outage" only
becomes OUTAGE_WAIT if
/api/outages actually shows an active matching outage.
Otherwise it's a normal diagnostic case.
- Honoring the prompt's stale base URL. Always use the environment_access URL.
- Order/format drift. Preserve the template's row order, enum spellings, and
decimal formatting. A correct decision in the wrong enum string still fails.
- Hand-waving the summary. Recount decisions; don't approximate.
- Inventing values not present in records or requirements (e.g. a user who
isn't in the console — pull such users only from the requirements payload).
1---2name: crm-support-ticket-resolution-33description: Resolve CRM support-console tasks by reading the shared read-only support console API and emitting the exact JSON the answer_template demands. Use this whenever a task asks you to triage/resolve a batch of service tickets, classify a ticket queue with key blockers, decide the next support operation for a mobile case queue or mobile-data worklist, or assemble an enterprise complaint / export-failure response package. Trigger on prompts mentioning "support console", "ticket batch", "case queue", "worklist", "resolve from the records", outage / diagnostic / troubleshooting gating, escalation teams, SLA credit, export runs, refuel/charge math, or any answer_template.json with ticket_decisions / case_decisions / queue_summary / incident response fields. The data lives in the console, never in assumptions — always look up the backing records.4---56# CRM Support-Console Ticket Resolution78You resolve same-day support work by reading records from a shared, read-only9support-console HTTP API and producing JSON that exactly matches the task's10`answer_template.json`. Every decision must be **evidence-backed** from console11records — never inferred from the customer's wording alone.1213There are four recurring task families. Identify which one you have from the14answer template fields, then follow the matching SOP below. The detailed15decision tables for each family live in `references/`.1617## Step 0 — Universal setup (do this every time)18191. **Read the inputs.** Open `prompt.txt` and every file under `payloads/`.20 The `answer_template.json` defines the EXACT output shape, field names, enum21 values, ordering rule, and number formatting. Treat it as the contract: emit22 only those keys, only those enum spellings, and respect its stated ordering23 ("preserve payload order" vs "ascending case_id order").242. **Fix the base URL.** Prompts often say `http://127.0.0.1:8057`. The harness25 overrides this — use the base URL from `environment_access.md` (currently26 `http://127.0.0.1:8086`). If a different base URL is provided by the harness,27 that wins over anything in the prompt.283. **Pull the backing record for every input row.** For each ticket/case/incident,29 GET its record plus all dependent records (account, outage, diagnostics,30 troubleshooting, line, device, bill, plan, SLA, export-runs, messages) BEFORE31 deciding. Use `curl -s <base>/api/...`. Endpoints are listed in32 `environment_access.md` and `/api/catalog`. `/api/search?q=` and33 `/api/enterprise/messages?query=` do full-text lookups when an ID is unknown.344. **Output only JSON.** Return exactly one JSON object conforming to the template.35 No prose, no markdown fences. Numbers: honor "two decimals" / "one decimal"36 as the template states (e.g. `4.0`, `86.40`). Empty-when-not-applicable string37 fields are the literal empty string `""`, never null.385. **Compute summaries by counting your own decisions.** Every family ends with a39 summary block whose counters must be derived by tallying the decision rows you40 just produced — recount, do not estimate. Verify each counter sums correctly.4142## Identify the task family4344| Signal in answer_template | Family | SOP |45|---|---|---|46| `ticket_decisions[]` with `final_resolution_status`, `resolution_route`, `latency_issue`/`stability_issue`/`bandwidth_issue`, `escalation_team` | **A. Ticket batch resolution** | below + `references/connectivity.md` |47| `ticket_decisions[]` with `key_blocker`, `route_team`, `diagnostic_required` | **B. Queue classification** | below + `references/connectivity.md` |48| `case_decisions[]` with `primary_action`, `permission`, `bill_id`, `final_route` (SELF_SERVICE/BILLING_RECOVERY/...) | **C. Mobile case queue** | `references/mobile.md` |49| `case_decisions[]` with `data_refuel_gb`, `carrier_update_required`, `final_route` (DATA_RECOVERY/...) | **D. Mobile-data worklist** | `references/mobile.md` |50| `incident_id`, `failure_window`, `sla_credit_percent`, `share_permissions`, `evidence_folder` | **E. Enterprise response package** | `references/enterprise.md` |5152Families A and B are both connectivity-ticket triage and share the same gating53order and diagnostic thresholds — read `references/connectivity.md` for both.54They differ only in output fields and which enum names are used.5556## The gating principle (connectivity families A & B)5758The single most important rule: **gates are evaluated in a fixed order, and the59FIRST gate that fires decides the outcome.** Diagnostics/troubleshooting are only60consulted if every gate passes. Running diagnostics on a ticket that should have61been stopped by an earlier gate is the most common error.6263Order (stop at the first match):64651. **Account validity** — account id not found in `/api/accounts` →66 FAILED, blocker INVALID_ACCOUNT (route INVALID_ACCOUNT). No diagnostics.672. **Authentication** — account exists but auth is broken68 (`authentication.last_login_status == "FAILURE"` or69 `account_recovery_status == "FAILURE"`) → FAILED, AUTH_FAILED. No diagnostics.703. **Account standing** — `status != "Active"` (e.g. "Suspended") →71 FAILED. The suspension *sub-reason* is read from the ticket/queue note text:72 "overdue" → OVERDUE_SUSPENSION routed to ACCOUNTS_PAYABLE; "fraud" →73 FRAUD_SUSPENSION. (Family A calls this INELIGIBLE_ACCOUNT, team NONE.)74 No diagnostics.754. **Active outage** — an entry from `/api/outages?service_area=<area>` is76 `active: true` AND lists the ticket's `service_type` in `service_types` →77 PENDING_ACTION, blocker ACTIVE_OUTAGE, route OUTAGE_WAIT, `outage_id` set.78 This ticket "requires customer wait." No diagnostics (the network is the cause).795. **Diagnostics & troubleshooting** — only now run the metric logic in80 `references/connectivity.md` to decide RESOLVED vs ESCALATED and the81 issue flags / escalation team.8283Full enum mappings, thresholds, and the escalation-team routing table are in84`references/connectivity.md`.8586## Mobile families (C & D)8788For each case, the next operation is chosen from the device/line/bill records by89matching the case `issue_type` and the offending field. The two families share an90action vocabulary but differ in a subtle, important way around roaming and in91their output fields and routes. The complete decision tables, the92roaming distinction, the charge/refuel math, and the route mapping are in93`references/mobile.md`. Read it whenever the template has `primary_action`.9495## Enterprise family (E)9697Assemble an incident-response package by joining the incident, enterprise account,98SLA contract, export-runs, and messages. The failure window comes from consecutive99FAILED export runs; the SLA credit comes from the contract; owners come from the100incident; channel/folder/title follow naming conventions; share permissions follow101the requirements payload. Full field-by-field derivation is in102`references/enterprise.md`.103104## Common misjudgments to avoid105106- **Skipping a gate.** A suspended or auth-failed account never gets diagnostics,107 even if diagnostics records exist in the console. The gate order is absolute.108- **Reading metrics from the wrong record.** The issue flags109 (latency/stability/bandwidth) come from the *pre-fix* `/api/diagnostics/<id>`.110 Whether the ticket RESOLVED or ESCALATED is judged on the *post-fix*111 `/api/troubleshooting/<id>` numbers. Don't mix them up.112- **Trusting the customer's words over the records.** "Whole office outage" only113 becomes OUTAGE_WAIT if `/api/outages` actually shows an active matching outage.114 Otherwise it's a normal diagnostic case.115- **Honoring the prompt's stale base URL.** Always use the environment_access URL.116- **Order/format drift.** Preserve the template's row order, enum spellings, and117 decimal formatting. A correct decision in the wrong enum string still fails.118- **Hand-waving the summary.** Recount decisions; don't approximate.119- **Inventing values not present in records or requirements** (e.g. a user who120 isn't in the console — pull such users only from the requirements payload).