Support Console Skill — Task Group 003
Environment
- Base URL:
http://34.46.77.124:8003(remote only; never use localhost) - Service:
task_group_003_support_console - Auth: None required (public API)
- Data shape: All timestamps are ISO-8601 with
Zsuffix. All enums areUPPER_SNAKE_CASE. All IDs are prefixed (see ID glossary below).
ID Prefix Glossary
| Prefix | Entity | Example |
|---|---|---|
ACC- |
Consumer/Business Account | ACC-5107 |
TCK- |
Support Ticket | TCK-5107 |
CASE- |
Mobile Case | CASE-2101 |
CUST- |
Mobile Customer | CUST-2101 |
LINE- |
Mobile Line | LINE-2101 |
DEV- |
Mobile Device | DEV-2101 |
PLAN- |
Mobile Plan | PLAN-PREMIUM |
BILL- |
Bill | BILL-2101 |
ENT- |
Enterprise Account | ENT-3001 |
INC- |
Enterprise Incident | INC-7301 |
RUN- |
Export Run | RUN-AST-0 |
MSG- |
Enterprise Message | MSG-7301-A |
OUT- |
Service Outage | OUT-9102 |
SA- |
Service Area | SA-17 |
Endpoint Catalog
Consumer / Business (Residential Fiber)
| Endpoint | Method | Notes |
|---|---|---|
/api/accounts |
GET | List all accounts |
/api/accounts/<account_id> |
GET | Single account |
/api/tickets |
GET | List all tickets |
/api/tickets/<ticket_id> |
GET | Single ticket |
/api/outages |
GET | List all outages |
/api/outages?service_area=<area> |
GET | Filter outages by service area |
/api/diagnostics/<ticket_id> |
GET | Diagnostic results for a ticket |
/api/troubleshooting/<ticket_id> |
GET | Remediation steps and post-fix metrics |
Mobile / Wireless
| Endpoint | Method | Notes |
|---|---|---|
/api/cases |
GET | List all mobile cases |
/api/cases/<case_id> |
GET | Single case |
/api/customers |
GET | List all mobile customers |
/api/lines |
GET | List all mobile lines |
/api/lines/<line_id> |
GET | Single line |
/api/devices/<device_id> |
GET | Single device |
/api/plans/<plan_id> |
GET | Single plan |
/api/bills |
GET | List all bills |
Enterprise
| Endpoint | Method | Notes |
|---|---|---|
/api/enterprise/accounts |
GET | List enterprise accounts |
/api/enterprise/incidents |
GET | List enterprise incidents |
/api/enterprise/incidents/<incident_id> |
GET | Single incident |
/api/enterprise/export-runs?incident_id=<id> |
GET | Export runs for an incident |
/api/enterprise/messages?query=<text> |
GET | Text search across messages |
/api/enterprise/sla/<enterprise_account_id> |
GET | SLA contract details |
Meta
| Endpoint | Notes |
|---|---|
/health |
Liveness check; returns {"ok": true, "service": "..."} |
/api/catalog |
Endpoint listing + record counts; use to gauge data scale |
Data Models
Account (ACC-*)
account_id, name, service_area, status, tier
authentication: { last_login_status, account_recovery_status, last_login_at }
- status:
Active|Suspended - tier: always
standardin this dataset - authentication.last_login_status:
SUCCESS|FAILURE - authentication.account_recovery_status:
""(normal) |FAILURE
Ticket (TCK-*)
ticket_id, account_id, service_area, service_type, subscribed_mbps, status, issue_summary, created_at
- service_type:
internet|video|voice - subscribed_mbps: 100, 200, 300, 500, 750
- status: always
OPENin this dataset - account_id: can be
BAD-*(non-existent account → intake error)
Diagnostics (/api/diagnostics/<ticket_id>)
ticket_id, bandwidth_mbps, latency_ms, jitter_ms, root_causes[], started_at, completed_at
- root_causes (array of enum strings):
CONFIGURATION_DRIFT— account/profile out of syncFIBER_DROP_DAMAGE— physical line damageSIGNAL_LOSS— signal degradationBACKBONE_CAPACITY— regional backbone overloadVOICE_PROFILE_STALE— voice config needs refreshGENERATED_NOISE— non-deterministic filler (ignore for business logic)
Troubleshooting (/api/troubleshooting/<ticket_id>)
ticket_id, steps[], post_bandwidth_mbps, post_latency_ms, post_jitter_ms, started_at, completed_at
- steps (ordered array):
PROFILE_REFRESH,PROVISIONING_SYNC,LINE_TEST,SIGNAL_REFRESH,BACKBONE_REROUTE_ATTEMPT,VOICE_PROFILE_REFRESH,GENERATED_CHECK
Outage (OUT-*)
outage_id, service_area, active, service_types[], impact_score, eta_hours, started_at
- active: boolean — only
trueoutages affect service - impact_score: 0.0–1.0 float
- service_types: array of affected service types
Case (CASE-*) — Mobile
case_id, customer_id, line_id, device_id, issue_type, customer_location, summary, opened_at
- issue_type:
NO_SERVICE|MOBILE_DATA|SLOW_DATA|MMS - customer_location:
home|abroad
Line (LINE-*) — Mobile
line_id, customer_id, device_id, phone_number, plan_id, status, suspension_reason,
roaming_enabled, data_used_gb, contract_end_date
- status:
Active|Suspended - suspension_reason:
""|OVERDUE_BILL|CONTRACT_ENDED
Device (DEV-*) — Mobile
device_id, model, sim_status, signal_strength, speed_test, mobile_data_enabled,
airplane_mode, phone_roaming_enabled, wifi_calling_enabled, data_saver_mode,
vpn_connected, network_mode_preference, can_send_mms, mmsc_url_present,
messaging_permissions: { sms, storage }
- sim_status:
active|missing|locked_pin - signal_strength:
none|good|excellent - speed_test:
no_connection|poor|fair|excellent - network_mode_preference:
4g_5g_preferred|3g_only
Plan (PLAN-*) — Mobile
plan_id, name, data_limit_gb, monthly_price_usd, data_refueling_price_per_gb
Bill (BILL-*)
bill_id, customer_id, amount_due_usd, due_date, status
- status:
Paid|Overdue|Issued
Enterprise Account (ENT-*)
enterprise_account_id, name, tier, account_owner, finance_owner
- tier:
Enterprise|Strategic
Enterprise Incident (INC-*)
incident_id, enterprise_account_id, product, severity, status, summary,
account_owner, engineering_owner, received_at
- severity:
Critical|High|Medium - product:
monthly_export|dashboard_refresh|generated_product
Export Run (RUN-*)
run_id, enterprise_account_id, incident_id, run_date, status, exported_record_count, failure_code
- status:
FAILED|SUCCEEDED - failure_code:
""(success) |STALE_CREDENTIAL|STAGING_STORAGE_QUOTA
Enterprise Message (MSG-*)
message_id, author, body, channel, created_at
- channel:
export-alerts-archive|account-escalations|data-platform|support
Enterprise SLA
enterprise_account_id, credit_trigger, monthly_export_credit_percent, executive_contact
Standard Operating Procedures
SOP-1: Triage a Consumer/Business Ticket
1. GET /api/tickets/<ticket_id> → extract account_id, service_area, service_type
2. GET /api/accounts/<account_id> → check status, auth
3. GET /api/outages?service_area=<service_area> → check for active outages covering service_type
4. GET /api/diagnostics/<ticket_id> → get root causes
5. GET /api/troubleshooting/<ticket_id> → get remediation steps
Decision tree:
- Account not found (
BAD-*account_id) → Intake error — ticket references non-existent account - Account
status: "Suspended"→ Account-level issue — billing/account hold - Auth
last_login_status: "FAILURE"oraccount_recovery_status: "FAILURE"→ Authentication failure - Active outage for service_area AND service_type in outage's service_types → Known outage (eta_hours, impact_score provide context)
- Otherwise → Technical issue — root_causes from diagnostics tell the story
SOP-2: Triage a Mobile Case
1. GET /api/cases/<case_id> → extract line_id, device_id, issue_type, customer_location
2. GET /api/lines/<line_id> → check status, roaming, data_used_gb, plan_id
3. GET /api/devices/<device_id> → check all device flags
4. GET /api/plans/<plan_id> → check data_limit_gb
5. If line Suspended: check suspension_reason, check /api/bills for bill status
Decision matrix by issue_type:
| issue_type | Check | Root Cause |
|---|---|---|
NO_SERVICE |
device.sim_status = missing |
SIM missing |
NO_SERVICE |
device.sim_status = locked_pin |
SIM PIN locked |
NO_SERVICE |
device.airplane_mode = true |
Airplane mode on |
NO_SERVICE |
line.status = Suspended, suspension_reason = OVERDUE_BILL |
Overdue bill |
NO_SERVICE |
line.status = Suspended, suspension_reason = CONTRACT_ENDED |
Contract expired |
MOBILE_DATA |
device.mobile_data_enabled = false |
Data toggle off |
MOBILE_DATA |
line.data_used_gb > plan.data_limit_gb |
Data cap reached |
MOBILE_DATA |
customer_location = abroad, device.phone_roaming_enabled = false |
Device roaming off |
MOBILE_DATA |
customer_location = abroad, line.roaming_enabled = false |
Line roaming off |
SLOW_DATA |
device.vpn_connected = true |
VPN throttling |
SLOW_DATA |
device.data_saver_mode = true |
Data saver active |
SLOW_DATA |
device.network_mode_preference = 3g_only |
Forced 3G |
MMS |
device.can_send_mms = false |
MMS capability off |
MMS |
device.messaging_permissions.storage = false |
Storage permission denied |
MMS |
device.mmsc_url_present = false |
MMSC URL missing |
SOP-3: Investigate an Enterprise Incident
1. GET /api/enterprise/incidents/<incident_id> → product, severity, enterprise_account_id
2. GET /api/enterprise/export-runs?incident_id=<incident_id> → failure pattern
3. GET /api/enterprise/messages?query=<keyword> → human context (query by product, failure_code, account name)
4. GET /api/enterprise/sla/<enterprise_account_id> → credit terms
5. GET /api/enterprise/accounts → find account owner/finance owner
Failure code interpretation:
STALE_CREDENTIAL→ Credential rotation happened but scheduler still uses old secret. Fix: update credentials in scheduler.STAGING_STORAGE_QUOTA→ Staging bucket full. Fix: increase quota or clear old data.- Consecutive failures → Check SLA for credit trigger thresholds.
SLA credit patterns:
- Count consecutive failed runs (same failure_code, sequential dates)
- Match against
credit_triggertext andmonthly_export_credit_percent - SLA credits are percentage of monthly bill
Common Pitfalls
Don't stop at the first finding. A ticket/case may have multiple contributing factors — check all related entities. For example, a "no service" case might have both a suspended line AND a missing SIM.
Outages only explain tickets in the same service_area. Always cross-reference
ticket.service_areawithoutage.service_area, and verifyticket.service_typeis inoutage.service_types.Not all outages are active. Only
active: trueoutages affect current service.active: falseoutages are historical.GENERATED_NOISEroot causes are non-deterministic filler. Don't build business logic around them. Focus on the deterministic root causes:CONFIGURATION_DRIFT,FIBER_DROP_DAMAGE,SIGNAL_LOSS,BACKBONE_CAPACITY,VOICE_PROFILE_STALE.GENERATED_CHECKtroubleshooting steps are non-deterministic filler. Same rule — ignore for business logic.Account ID
BAD-*is a real pattern. Tickets can reference non-existent accounts. TheBAD-prefix indicates an intake/registration error where the account was never created. Verify by checking/api/accounts/BAD-5403(returns{"error": "not_found"}).Roaming requires BOTH device AND line. A traveler abroad needs
device.phone_roaming_enabled = trueANDline.roaming_enabled = true. Check both.Data cap is plan.data_limit_gb vs line.data_used_gb. Compare the plan limit with actual usage.
data_used_gb > data_limit_gb= cap reached.Contract expiration is a date comparison.
contract_end_dateisYYYY-MM-DD. If it's before the caseopened_atdate, the contract has ended (and the line should be suspended withCONTRACT_ENDED).MMS failures have 3 distinct root causes. Check
can_send_mms, thenmessaging_permissions.storage, thenmmsc_url_present. They are independent checks.Enterprise tiers matter for SLA.
Strategictier accounts may have higher credit percentages and tighter triggers thanEnterprisetier.Messages are best queried with keywords from the incident. Query by product name (
export,dashboard), failure code (credential,quota), or account name (Asteri,Quanta).
Output Conventions
When producing a diagnosis, structure output as:
## Diagnosis for <ID>
**Root Cause:** <primary cause in plain English>
**Evidence:**
- <entity.field> = <value> → <what this means>
- ...
**Resolution:** <what was done or should be done>
**Metrics Impact:** <before → after for bandwidth/latency if applicable>
For multiple findings, list all with the most actionable/specific first. Distinguish between "this is the cause" vs "this is a contributing factor."
Data Generation Notes
- Some records contain "Generated" in names/summaries (e.g., "Generated Customer 01", "Generated support ticket"). These are synthetic filler records with non-deterministic values.
- Root causes labeled
GENERATED_NOISEand troubleshooting steps labeledGENERATED_CHECKare non-deterministic — do not treat them as meaningful business signals. - Generated incidents/products/incidents exist but the deterministic ones (INC-7301, INC-8301, INC-8402) contain the real business logic patterns.