Support-Console Case/Ticket Resolution Skill
When to use
Use this skill for support-operations tasks that hand you a small batch/queue/worklist
(CSV or JSON) of tickets, mobile cases, or an enterprise complaint, and ask you to
classify each item and emit a strict JSON answer. Every decision must be derived from
records in the shared support-console REST API — never from the customer's free-text
report alone. The free-text note only hints where to look; the record fields decide.
API base URL and lookup chaining
Base URL: <remote-env-url> (overrides any 127.0.0.1:8057 in prompts).
All endpoints are GET and read-only. Use curl -s.
Core endpoints and how to chain them:
GET /api/catalog — endpoint list + record counts (sanity check only).
- Tickets:
GET /api/tickets/<id> -> gives account_id, service_area, service_type,
subscribed_mbps, status.
- Then
GET /api/accounts/<account_id> for account status + authentication.
GET /api/outages?service_area=<area> for active outages in that area.
GET /api/diagnostics/<ticket_id> for pre-fix metrics + root_causes.
GET /api/troubleshooting/<ticket_id> for post-fix metrics + steps.
- Mobile cases:
GET /api/cases/<id> -> gives customer_id, line_id, device_id,
issue_type, customer_location.
GET /api/lines/<line_id> (status, suspension_reason, roaming_enabled, data_used_gb, plan_id).
GET /api/devices/<device_id> (settings/toggles).
GET /api/plans/<plan_id> (data_limit_gb, data_refueling_price_per_gb).
GET /api/bills (filter by customer_id; find Overdue bill + amount_due_usd).
- Enterprise:
GET /api/enterprise/incidents/<id>, GET /api/enterprise/accounts,
GET /api/enterprise/export-runs?incident_id=<id>, GET /api/enterprise/sla/<ent_acct_id>,
GET /api/enterprise/messages?query=<text> (single keyword works best; try the client
name, "credential", "backfill", "alert", etc.).
A "not_found" / error account => the account ID is invalid (see INVALID_ACCOUNT rule).
Output-format discipline (applies to every task)
- Return ONLY a JSON object conforming exactly to that task's
answer_template.json.
- Preserve the input order of items (payload/CSV order, or ascending case_id when the
template says so). Do not sort or drop items.
- Match enums EXACTLY (case + spelling). Booleans are real booleans.
- Numbers: respect stated precision — "two decimals" => 4.00, "one decimal" => 2.0.
- Empty string
"" for ID fields that don't apply (e.g. outage_id, bill_id), not null.
- Recompute every summary/count field from your own per-item decisions; an inconsistent
summary loses points even when the items are right. Counts depend on the routes/statuses
you assigned, so finalize items first, then tally.
SOP 1 — Offline ticket batch resolution / queue triage
(answer template has ticket_decisions[] + a batch_summary/queue_summary)
For each ticket, evaluate blockers in this PRIORITY order. The FIRST that matches decides
status/route/blocker; stop there.
- Invalid account —
GET /api/accounts/<id> returns not_found, OR the ticket's
account_id does not match the ACC- pattern (e.g. BAD-####).
=> status FAILED, route/blocker INVALID_ACCOUNT, team NONE, diagnostic = false.
- Auth failure — account
authentication.last_login_status == "FAILURE" or
account_recovery_status == "FAILURE".
=> status FAILED, blocker AUTH_FAILED (route AUTH_FAILED), team NONE, diagnostic = false.
- Suspended / overdue — account
status == "Suspended".
=> status FAILED (a suspension cannot be cleared in-session), blocker OVERDUE_SUSPENSION,
team ACCOUNTS_PAYABLE (when that team enum exists; else NONE), diagnostic = false.
In a route-only template with INELIGIBLE_ACCOUNT, use route INELIGIBLE_ACCOUNT.
PITFALL: a suspended/overdue account is FAILED, NOT PENDING_ACTION.
- Active outage —
GET /api/outages?service_area=<area> has an entry with
active == true AND the ticket's service_type is in its service_types.
=> status PENDING_ACTION (customer must wait), blocker ACTIVE_OUTAGE,
route OUTAGE_WAIT (route-template) / team NONE, set outage_id, diagnostic = false.
- Otherwise a real service issue — run diagnostics + troubleshooting logic below.
Service-issue resolution (account Active, no outage):
- Read diagnostics (pre) and troubleshooting (post) metrics.
diagnostic_required/
diagnostic_needed = true for these real service tickets.
- Compute issue flags from the DIAGNOSTIC (pre-fix) metrics:
latency_issue = latency_ms > 100
stability_issue= jitter_ms > 30
bandwidth_issue= bandwidth_mbps < ~80% of subscribed_mbps
(note: bandwidth can legitimately exceed the subscribed rate -> no issue then)
- Decide RESOLVED vs ESCALATED from the POST-troubleshooting metrics:
- If post latency_ms <= ~100 AND post jitter_ms <= ~30 (issue cleared)
=> status RESOLVED, route AUTO_TROUBLESHOOTING, team NONE.
- If post metrics are STILL above threshold (troubleshooting did not fix it)
=> status ESCALATED, route ESCALATION, pick team by root cause:
- FIBER_DROP_DAMAGE / SIGNAL_LOSS / physical line fault -> FIELD_OPS
(blocker PHYSICAL_LINE_FAULT)
- BACKBONE_CAPACITY / network capacity -> NETWORK_ENGINEERING
(blocker NETWORK_CAPACITY)
- PROVISIONING_STALE / CONFIGURATION_DRIFT / profile issues -> TIER2_SUPPORT
(blocker PROVISIONING_STALE)
- For non-service blockers (rules 1-4) all three issue flags can be false; the flags are
only graded meaningfully for diagnosed service tickets.
Summary block: count statuses (RESOLVED/PENDING_ACTION/ESCALATED/FAILED) and route teams
(TIER2_SUPPORT/FIELD_OPS/NETWORK_ENGINEERING/ACCOUNTS_PAYABLE) across your decisions.
tickets_requiring_customer_wait = number of PENDING_ACTION / OUTAGE_WAIT tickets.
SOP 2 — Contact-center / mobile-data case triage
(answer template has case_decisions[] + a queue_summary/worklist_summary)
For each case, pull line + device (+ bill/plan as needed) and pick the SINGLE root-cause fix.
Read the actual device/line FIELD that contradicts working service; the reported issue text
just points you at the category.
Diagnosis -> action map:
line.status == "Suspended" with suspension_reason == "OVERDUE_BILL": customer wants to
pay -> primary SEND_PAYMENT_REQUEST, secondary RESUME_LINE_REBOOT, bill_id = the Overdue
bill, charge_amount_usd = that bill's amount_due_usd, route BILLING_RECOVERY.
device.sim_status == "missing" (no service): primary RESEAT_SIM, route SELF_SERVICE.
device.mobile_data_enabled == false: primary TOGGLE_MOBILE_DATA, route DEVICE_SETTING_FIX
(or SELF_SERVICE).
device.data_saver_mode == true (slow data): primary TOGGLE_DATA_SAVER,
route DEVICE_SETTING_FIX.
device.vpn_connected == true (slow data): primary DISCONNECT_VPN, route SELF_SERVICE.
device.network_mode_preference is an old mode (e.g. "3g_only") on slow data:
primary SET_NETWORK_MODE, route DEVICE_SETTING_FIX. (NOT a carrier update.)
- Roaming abroad (
customer_location == "abroad", no data):
- If the DEVICE roaming is off (
phone_roaming_enabled == false) but the line is fine
-> primary TOGGLE_ROAMING, this is a device toggle => route SELF_SERVICE,
carrier_update_required = false.
- If the LINE roaming is off (
line.roaming_enabled == false) -> primary
ENABLE_LINE_ROAMING, route CARRIER_UPDATE, carrier_update_required = true.
- MMS can't send photos (
can_send_mms == false): missing messaging permission.
primary GRANT_MESSAGING_PERMISSION, set permission to exactly the missing one(s):
sms, storage, or sms_and_storage (check messaging_permissions.sms/.storage;
the value off is the one to grant). Route SELF_SERVICE.
- Over data limit (
line.data_used_gb > plan data_limit_gb, data stopped):
primary REFUEL_DATA. data_refuel_gb = the customer's accepted_refuel_gb from
preferences (respect does_not_want_plan_change). charge_amount_usd =
data_refuel_gb * plan data_refueling_price_per_gb. Route DATA_RECOVERY.
- Nothing actionable / out of scope -> TRANSFER_HUMAN, route HUMAN_TRANSFER.
secondary_action = NO_ACTION unless a clear follow-up is implied (e.g. resume+reboot
after a payment). permission = NONE unless granting messaging permission.
Route vs carrier_update_required — CRITICAL distinction (cost points until corrected):
- CARRIER_UPDATE /
carrier_update_required = true is ONLY for line/carrier-side changes,
chiefly ENABLE_LINE_ROAMING (line.roaming_enabled was false).
- Anything the agent flips on the device (roaming toggle, mobile-data toggle, data-saver,
network-mode, VPN, SIM reseat) is a device/self-service fix, NOT a carrier update.
Summary counts (recompute from your routes):
- data_refuel_cases = REFUEL_DATA cases; carrier_updates = CARRIER_UPDATE routes;
device_setting_fixes = DEVICE_SETTING_FIX routes; human_transfers = HUMAN_TRANSFER routes;
self_service_fixes = SELF_SERVICE routes; billing_recoveries = BILLING_RECOVERY routes.
total_estimated_customer_charge_usd = sum of all per-case charge_amount_usd,
two decimals. Charges only arise from data refuels and overdue-bill payments.
SOP 3 — Enterprise export-complaint response package
(single flat object; identify the incident from the complaint email's reference)
Steps:
- Identify the incident from the email's reference ->
GET /api/enterprise/incidents/<id>.
That record directly gives enterprise_account_id, severity, engineering_owner,
account_owner, product, status. Copy these IDs/severity verbatim.
GET /api/enterprise/export-runs?incident_id=<id>: the consecutive FAILED runs define the
failure window. start_date = first failed run_date, end_date = last failed run_date,
failed_days = count of FAILED runs. The shared failure_code (e.g. STALE_CREDENTIAL) is
the root-cause category. A later SUCCEEDED run is the recovery run, not a backfill.
GET /api/enterprise/sla/<ent_acct_id>: sla_credit_percent = the contract's export
credit percent when its credit_trigger (e.g. "3 consecutive failed runs") is met.
GET /api/enterprise/messages?query=<client/keyword>: corroborate root cause; the channel
a key alert landed in matters. If the credential/alert evidence was posted to an
ARCHIVED alerts channel (channel name containing "archive"), set
contributing_alert_issue = ARCHIVED_ALERT_ROUTE; else NONE (or UNKNOWN if truly unclear).
share_permissions: include exactly the users listed in response_requirements
(permission_users_to_include), in that listed order. The finance/account stakeholder
gets view; the engineering/working reviewer gets edit. (upload_only is rarely correct.)
- Naming artifacts follow
naming_style: produce a lowercase-hyphen channel slug from the
client name (+ "export"/"incident"); a "-" evidence folder; and a
" Export Failure Report" title. Reuse the client's exact account name
(including any "Inc.") for the title.
response_status: when an SLA credit must still be applied/approved, NEEDS_FINANCE_REVIEW;
otherwise mirror the incident's own status (e.g. UNDER_INVESTIGATION).
Enterprise pitfalls learned:
backfill_days is NOT automatically the failed-day count. Only count days that the
evidence (messages/export-runs) explicitly says were (or must be) manually backfilled.
If no backfill is confirmed for THIS client, use 0 — do not copy the failed_days number,
and do not borrow a backfill figure that belongs to a different client's incident.
- Messages and SLA figures from OTHER incidents/clients show up in keyword searches.
Always confirm the message's client/account matches the incident before using its
numbers (credit %, backfill days, root cause).
- Copy owner user-ids and IDs exactly from the incident/account records; do not invent.
General pitfalls (cross-task)
- Derive from records, not from the customer's wording. The note tells you the symptom
category; the record field tells you the truth (and sometimes contradicts the note).
- Apply blocker precedence (invalid > auth > suspension > outage > service issue); a
higher-priority blocker overrides any technical diagnosis underneath it.
- A fix only counts as RESOLVED when post-fix metrics actually clear thresholds; marginal
improvement that stays above threshold is an ESCALATION.
- Recompute summaries last, strictly from your finalized per-item decisions.
- Keep precision and enum spelling exact; preserve item order.
1---2name: reflect-3-attempt-01-223description: Support-Console Case/Ticket Resolution Skill4---5# Support-Console Case/Ticket Resolution Skill67## When to use8Use this skill for support-operations tasks that hand you a small batch/queue/worklist9(CSV or JSON) of tickets, mobile cases, or an enterprise complaint, and ask you to10classify each item and emit a strict JSON answer. Every decision must be derived from11records in the shared support-console REST API — never from the customer's free-text12report alone. The free-text note only hints where to look; the record fields decide.1314## API base URL and lookup chaining15Base URL: `<remote-env-url>` (overrides any `127.0.0.1:8057` in prompts).16All endpoints are GET and read-only. Use `curl -s`.1718Core endpoints and how to chain them:19- `GET /api/catalog` — endpoint list + record counts (sanity check only).20- Tickets: `GET /api/tickets/<id>` -> gives `account_id`, `service_area`, `service_type`,21 `subscribed_mbps`, `status`.22 - Then `GET /api/accounts/<account_id>` for account `status` + `authentication`.23 - `GET /api/outages?service_area=<area>` for active outages in that area.24 - `GET /api/diagnostics/<ticket_id>` for pre-fix metrics + `root_causes`.25 - `GET /api/troubleshooting/<ticket_id>` for post-fix metrics + `steps`.26- Mobile cases: `GET /api/cases/<id>` -> gives `customer_id`, `line_id`, `device_id`,27 `issue_type`, `customer_location`.28 - `GET /api/lines/<line_id>` (status, suspension_reason, roaming_enabled, data_used_gb, plan_id).29 - `GET /api/devices/<device_id>` (settings/toggles).30 - `GET /api/plans/<plan_id>` (data_limit_gb, data_refueling_price_per_gb).31 - `GET /api/bills` (filter by customer_id; find Overdue bill + amount_due_usd).32- Enterprise: `GET /api/enterprise/incidents/<id>`, `GET /api/enterprise/accounts`,33 `GET /api/enterprise/export-runs?incident_id=<id>`, `GET /api/enterprise/sla/<ent_acct_id>`,34 `GET /api/enterprise/messages?query=<text>` (single keyword works best; try the client35 name, "credential", "backfill", "alert", etc.).3637A "not_found" / error account => the account ID is invalid (see INVALID_ACCOUNT rule).3839## Output-format discipline (applies to every task)40- Return ONLY a JSON object conforming exactly to that task's `answer_template.json`.41- Preserve the input order of items (payload/CSV order, or ascending case_id when the42 template says so). Do not sort or drop items.43- Match enums EXACTLY (case + spelling). Booleans are real booleans.44- Numbers: respect stated precision — "two decimals" => 4.00, "one decimal" => 2.0.45- Empty string `""` for ID fields that don't apply (e.g. `outage_id`, `bill_id`), not null.46- Recompute every summary/count field from your own per-item decisions; an inconsistent47 summary loses points even when the items are right. Counts depend on the routes/statuses48 you assigned, so finalize items first, then tally.4950---5152## SOP 1 — Offline ticket batch resolution / queue triage53(answer template has `ticket_decisions[]` + a `batch_summary`/`queue_summary`)5455For each ticket, evaluate blockers in this PRIORITY order. The FIRST that matches decides56status/route/blocker; stop there.57581. **Invalid account** — `GET /api/accounts/<id>` returns not_found, OR the ticket's59 account_id does not match the `ACC-` pattern (e.g. `BAD-####`).60 => status FAILED, route/blocker INVALID_ACCOUNT, team NONE, diagnostic = false.612. **Auth failure** — account `authentication.last_login_status == "FAILURE"` or62 `account_recovery_status == "FAILURE"`.63 => status FAILED, blocker AUTH_FAILED (route AUTH_FAILED), team NONE, diagnostic = false.643. **Suspended / overdue** — account `status == "Suspended"`.65 => status **FAILED** (a suspension cannot be cleared in-session), blocker OVERDUE_SUSPENSION,66 team ACCOUNTS_PAYABLE (when that team enum exists; else NONE), diagnostic = false.67 In a route-only template with INELIGIBLE_ACCOUNT, use route INELIGIBLE_ACCOUNT.68 PITFALL: a suspended/overdue account is FAILED, NOT PENDING_ACTION.694. **Active outage** — `GET /api/outages?service_area=<area>` has an entry with70 `active == true` AND the ticket's `service_type` is in its `service_types`.71 => status PENDING_ACTION (customer must wait), blocker ACTIVE_OUTAGE,72 route OUTAGE_WAIT (route-template) / team NONE, set `outage_id`, diagnostic = false.735. **Otherwise a real service issue** — run diagnostics + troubleshooting logic below.7475Service-issue resolution (account Active, no outage):76- Read diagnostics (pre) and troubleshooting (post) metrics. `diagnostic_required`/77 `diagnostic_needed` = true for these real service tickets.78- Compute issue flags from the DIAGNOSTIC (pre-fix) metrics:79 - `latency_issue` = latency_ms > 10080 - `stability_issue`= jitter_ms > 3081 - `bandwidth_issue`= bandwidth_mbps < ~80% of subscribed_mbps82 (note: bandwidth can legitimately exceed the subscribed rate -> no issue then)83- Decide RESOLVED vs ESCALATED from the POST-troubleshooting metrics:84 - If post latency_ms <= ~100 AND post jitter_ms <= ~30 (issue cleared)85 => status RESOLVED, route AUTO_TROUBLESHOOTING, team NONE.86 - If post metrics are STILL above threshold (troubleshooting did not fix it)87 => status ESCALATED, route ESCALATION, pick team by root cause:88 - FIBER_DROP_DAMAGE / SIGNAL_LOSS / physical line fault -> FIELD_OPS89 (blocker PHYSICAL_LINE_FAULT)90 - BACKBONE_CAPACITY / network capacity -> NETWORK_ENGINEERING91 (blocker NETWORK_CAPACITY)92 - PROVISIONING_STALE / CONFIGURATION_DRIFT / profile issues -> TIER2_SUPPORT93 (blocker PROVISIONING_STALE)94- For non-service blockers (rules 1-4) all three issue flags can be false; the flags are95 only graded meaningfully for diagnosed service tickets.9697Summary block: count statuses (RESOLVED/PENDING_ACTION/ESCALATED/FAILED) and route teams98(TIER2_SUPPORT/FIELD_OPS/NETWORK_ENGINEERING/ACCOUNTS_PAYABLE) across your decisions.99`tickets_requiring_customer_wait` = number of PENDING_ACTION / OUTAGE_WAIT tickets.100101---102103## SOP 2 — Contact-center / mobile-data case triage104(answer template has `case_decisions[]` + a `queue_summary`/`worklist_summary`)105106For each case, pull line + device (+ bill/plan as needed) and pick the SINGLE root-cause fix.107Read the actual device/line FIELD that contradicts working service; the reported issue text108just points you at the category.109110Diagnosis -> action map:111- `line.status == "Suspended"` with `suspension_reason == "OVERDUE_BILL"`: customer wants to112 pay -> primary SEND_PAYMENT_REQUEST, secondary RESUME_LINE_REBOOT, `bill_id` = the Overdue113 bill, `charge_amount_usd` = that bill's `amount_due_usd`, route BILLING_RECOVERY.114- `device.sim_status == "missing"` (no service): primary RESEAT_SIM, route SELF_SERVICE.115- `device.mobile_data_enabled == false`: primary TOGGLE_MOBILE_DATA, route DEVICE_SETTING_FIX116 (or SELF_SERVICE).117- `device.data_saver_mode == true` (slow data): primary TOGGLE_DATA_SAVER,118 route DEVICE_SETTING_FIX.119- `device.vpn_connected == true` (slow data): primary DISCONNECT_VPN, route SELF_SERVICE.120- `device.network_mode_preference` is an old mode (e.g. "3g_only") on slow data:121 primary SET_NETWORK_MODE, route DEVICE_SETTING_FIX. (NOT a carrier update.)122- Roaming abroad (`customer_location == "abroad"`, no data):123 - If the DEVICE roaming is off (`phone_roaming_enabled == false`) but the line is fine124 -> primary TOGGLE_ROAMING, this is a device toggle => route SELF_SERVICE,125 `carrier_update_required = false`.126 - If the LINE roaming is off (`line.roaming_enabled == false`) -> primary127 ENABLE_LINE_ROAMING, route CARRIER_UPDATE, `carrier_update_required = true`.128- MMS can't send photos (`can_send_mms == false`): missing messaging permission.129 primary GRANT_MESSAGING_PERMISSION, set `permission` to exactly the missing one(s):130 `sms`, `storage`, or `sms_and_storage` (check `messaging_permissions.sms`/`.storage`;131 the value off is the one to grant). Route SELF_SERVICE.132- Over data limit (`line.data_used_gb` > plan `data_limit_gb`, data stopped):133 primary REFUEL_DATA. `data_refuel_gb` = the customer's `accepted_refuel_gb` from134 preferences (respect `does_not_want_plan_change`). `charge_amount_usd` =135 data_refuel_gb * plan `data_refueling_price_per_gb`. Route DATA_RECOVERY.136- Nothing actionable / out of scope -> TRANSFER_HUMAN, route HUMAN_TRANSFER.137138`secondary_action` = NO_ACTION unless a clear follow-up is implied (e.g. resume+reboot139after a payment). `permission` = NONE unless granting messaging permission.140141Route vs carrier_update_required — CRITICAL distinction (cost points until corrected):142- CARRIER_UPDATE / `carrier_update_required = true` is ONLY for line/carrier-side changes,143 chiefly ENABLE_LINE_ROAMING (line.roaming_enabled was false).144- Anything the agent flips on the device (roaming toggle, mobile-data toggle, data-saver,145 network-mode, VPN, SIM reseat) is a device/self-service fix, NOT a carrier update.146147Summary counts (recompute from your routes):148- data_refuel_cases = REFUEL_DATA cases; carrier_updates = CARRIER_UPDATE routes;149 device_setting_fixes = DEVICE_SETTING_FIX routes; human_transfers = HUMAN_TRANSFER routes;150 self_service_fixes = SELF_SERVICE routes; billing_recoveries = BILLING_RECOVERY routes.151- `total_estimated_customer_charge_usd` = sum of all per-case `charge_amount_usd`,152 two decimals. Charges only arise from data refuels and overdue-bill payments.153154---155156## SOP 3 — Enterprise export-complaint response package157(single flat object; identify the incident from the complaint email's reference)158159Steps:1601. Identify the incident from the email's reference -> `GET /api/enterprise/incidents/<id>`.161 That record directly gives `enterprise_account_id`, `severity`, `engineering_owner`,162 `account_owner`, `product`, `status`. Copy these IDs/severity verbatim.1632. `GET /api/enterprise/export-runs?incident_id=<id>`: the consecutive FAILED runs define the164 failure window. `start_date` = first failed run_date, `end_date` = last failed run_date,165 `failed_days` = count of FAILED runs. The shared `failure_code` (e.g. STALE_CREDENTIAL) is166 the root-cause category. A later SUCCEEDED run is the recovery run, not a backfill.1673. `GET /api/enterprise/sla/<ent_acct_id>`: `sla_credit_percent` = the contract's export168 credit percent when its `credit_trigger` (e.g. "3 consecutive failed runs") is met.1694. `GET /api/enterprise/messages?query=<client/keyword>`: corroborate root cause; the channel170 a key alert landed in matters. If the credential/alert evidence was posted to an171 ARCHIVED alerts channel (channel name containing "archive"), set172 `contributing_alert_issue = ARCHIVED_ALERT_ROUTE`; else NONE (or UNKNOWN if truly unclear).1735. `share_permissions`: include exactly the users listed in `response_requirements`174 (`permission_users_to_include`), in that listed order. The finance/account stakeholder175 gets `view`; the engineering/working reviewer gets `edit`. (upload_only is rarely correct.)1766. Naming artifacts follow `naming_style`: produce a lowercase-hyphen channel slug from the177 client name (+ "export"/"incident"); a "<client-slug>-<date>" evidence folder; and a178 "<Client Full Name> Export Failure Report" title. Reuse the client's exact account `name`179 (including any "Inc.") for the title.1807. `response_status`: when an SLA credit must still be applied/approved, NEEDS_FINANCE_REVIEW;181 otherwise mirror the incident's own status (e.g. UNDER_INVESTIGATION).182183Enterprise pitfalls learned:184- `backfill_days` is NOT automatically the failed-day count. Only count days that the185 evidence (messages/export-runs) explicitly says were (or must be) manually backfilled.186 If no backfill is confirmed for THIS client, use 0 — do not copy the failed_days number,187 and do not borrow a backfill figure that belongs to a different client's incident.188- Messages and SLA figures from OTHER incidents/clients show up in keyword searches.189 Always confirm the message's client/account matches the incident before using its190 numbers (credit %, backfill days, root cause).191- Copy owner user-ids and IDs exactly from the incident/account records; do not invent.192193---194195## General pitfalls (cross-task)196- Derive from records, not from the customer's wording. The note tells you the symptom197 category; the record field tells you the truth (and sometimes contradicts the note).198- Apply blocker precedence (invalid > auth > suspension > outage > service issue); a199 higher-priority blocker overrides any technical diagnosis underneath it.200- A fix only counts as RESOLVED when post-fix metrics actually clear thresholds; marginal201 improvement that stays above threshold is an ESCALATION.202- Recompute summaries last, strictly from your finalized per-item decisions.203- Keep precision and enum spelling exact; preserve item order.