@agenticmail/core 0.9.31 → 0.9.33

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (165) hide show
  1. package/dist/index.cjs +1 -1
  2. package/dist/index.d.cts +3 -3
  3. package/dist/index.d.ts +3 -3
  4. package/dist/index.js +1 -1
  5. package/dist/skills/built-in/accommodation-intake.json +132 -0
  6. package/dist/skills/built-in/add-driver-vehicle-household.json +133 -0
  7. package/dist/skills/built-in/admissions-waitlist-followup.json +129 -0
  8. package/dist/skills/built-in/anchor-and-counter-anchor.json +161 -0
  9. package/dist/skills/built-in/anti-social-engineering.json +153 -0
  10. package/dist/skills/built-in/anything-else-sweep.json +120 -0
  11. package/dist/skills/built-in/apologise-correctly.json +126 -0
  12. package/dist/skills/built-in/ask-for-in-person-meeting.json +114 -0
  13. package/dist/skills/built-in/attorney-new-client-intake.json +133 -0
  14. package/dist/skills/built-in/bant-discovery-call.json +125 -0
  15. package/dist/skills/built-in/book-new-patient-appointment.json +131 -0
  16. package/dist/skills/built-in/bookmark-close.json +113 -0
  17. package/dist/skills/built-in/bypass-i-am-the-supervisor.json +130 -0
  18. package/dist/skills/built-in/bypass-scripted-rep.json +142 -0
  19. package/dist/skills/built-in/calibrated-questions.json +155 -0
  20. package/dist/skills/built-in/call-911-fire.json +118 -0
  21. package/dist/skills/built-in/call-911-medical-emergency.json +126 -0
  22. package/dist/skills/built-in/call-911-violent-crime-in-progress.json +133 -0
  23. package/dist/skills/built-in/call-988-crisis-line.json +106 -0
  24. package/dist/skills/built-in/call-poison-control.json +115 -0
  25. package/dist/skills/built-in/call-police-non-emergency.json +114 -0
  26. package/dist/skills/built-in/call-with-person-in-distress.json +133 -0
  27. package/dist/skills/built-in/cancel-cable-fiber-no-retention-loop.json +156 -0
  28. package/dist/skills/built-in/cancel-policy-clean.json +130 -0
  29. package/dist/skills/built-in/capture-rep-identity.json +113 -0
  30. package/dist/skills/built-in/childcare-provider-intake.json +157 -0
  31. package/dist/skills/built-in/close-account-no-residual-fees.json +127 -0
  32. package/dist/skills/built-in/close-on-concrete-next-step.json +116 -0
  33. package/dist/skills/built-in/confirm-agreement-readback.json +134 -0
  34. package/dist/skills/built-in/confirm-next-step-ownership.json +113 -0
  35. package/dist/skills/built-in/contractor-estimate-request.json +142 -0
  36. package/dist/skills/built-in/court-clerk-administrative-inquiry.json +119 -0
  37. package/dist/skills/built-in/cpa-intake-call.json +134 -0
  38. package/dist/skills/built-in/day-of-flight-cancellation.json +127 -0
  39. package/dist/skills/built-in/de-escalate-angry-rep.json +114 -0
  40. package/dist/skills/built-in/decline-unsolicited-pitch.json +110 -0
  41. package/dist/skills/built-in/deliver-difficult-news.json +122 -0
  42. package/dist/skills/built-in/detect-fake-escalation-loops.json +140 -0
  43. package/dist/skills/built-in/detect-lies-and-contradictions.json +139 -0
  44. package/dist/skills/built-in/dispute-billing-code-eob.json +147 -0
  45. package/dist/skills/built-in/dispute-charge-reg-e-reg-z.json +131 -0
  46. package/dist/skills/built-in/dispute-credit-report-via-bank.json +128 -0
  47. package/dist/skills/built-in/dispute-denied-claim.json +143 -0
  48. package/dist/skills/built-in/dispute-security-deposit.json +130 -0
  49. package/dist/skills/built-in/dispute-usage-spike-meter-reread.json +120 -0
  50. package/dist/skills/built-in/dmv-vehicle-registration-renewal.json +120 -0
  51. package/dist/skills/built-in/document-call-promises.json +145 -0
  52. package/dist/skills/built-in/early-lease-termination.json +126 -0
  53. package/dist/skills/built-in/elite-line-escalation.json +107 -0
  54. package/dist/skills/built-in/equipment-swap-cable-router-modem.json +126 -0
  55. package/dist/skills/built-in/eu261-uk261-dot-compensation.json +113 -0
  56. package/dist/skills/built-in/file-fnol-auto-claim.json +130 -0
  57. package/dist/skills/built-in/file-habitability-complaint.json +115 -0
  58. package/dist/skills/built-in/financial-aid-appeal.json +128 -0
  59. package/dist/skills/built-in/follow-up-stalled-claim.json +118 -0
  60. package/dist/skills/built-in/get-past-gatekeeper.json +115 -0
  61. package/dist/skills/built-in/get-past-tier-1-script.json +130 -0
  62. package/dist/skills/built-in/handle-callback-stall.json +120 -0
  63. package/dist/skills/built-in/handle-outsourced-no-escalation.json +138 -0
  64. package/dist/skills/built-in/handle-send-me-an-email-deflection.json +112 -0
  65. package/dist/skills/built-in/handle-time-pressure.json +159 -0
  66. package/dist/skills/built-in/health-prior-auth-appeal.json +131 -0
  67. package/dist/skills/built-in/hoa-dispute.json +123 -0
  68. package/dist/skills/built-in/hold-time-strategy.json +137 -0
  69. package/dist/skills/built-in/hold-warmth-cold-rep.json +114 -0
  70. package/dist/skills/built-in/hotel-walk-over-recovery.json +114 -0
  71. package/dist/skills/built-in/humour-when-it-lands.json +127 -0
  72. package/dist/skills/built-in/i20-visa-dso.json +134 -0
  73. package/dist/skills/built-in/invoke-regulator-firmly.json +137 -0
  74. package/dist/skills/built-in/irrops-waiver-awareness.json +103 -0
  75. package/dist/skills/built-in/irs-payment-plan-setup.json +134 -0
  76. package/dist/skills/built-in/k12-iep-504-enrollment.json +134 -0
  77. package/dist/skills/built-in/late-add-petition.json +128 -0
  78. package/dist/skills/built-in/leave-of-absence-deferral.json +130 -0
  79. package/dist/skills/built-in/lock-in-terms-verbally.json +127 -0
  80. package/dist/skills/built-in/match-energy-keep-goal.json +120 -0
  81. package/dist/skills/built-in/medical-records-transfer.json +138 -0
  82. package/dist/skills/built-in/medical-withdrawal.json +131 -0
  83. package/dist/skills/built-in/mid-call-evidence-collection.json +159 -0
  84. package/dist/skills/built-in/mirror-technique.json +145 -0
  85. package/dist/skills/built-in/missed-connection-distressed-passenger.json +111 -0
  86. package/dist/skills/built-in/mortgage-loan-hardship.json +130 -0
  87. package/dist/skills/built-in/move-out-walkthrough.json +114 -0
  88. package/dist/skills/built-in/multi-channel-escalation.json +141 -0
  89. package/dist/skills/built-in/multi-issue-tradeoffs.json +155 -0
  90. package/dist/skills/built-in/negotiate-rent-renewal.json +123 -0
  91. package/dist/skills/built-in/no-as-opening.json +154 -0
  92. package/dist/skills/built-in/not-sound-like-spam-dialer.json +118 -0
  93. package/dist/skills/built-in/outage-credit-applied.json +127 -0
  94. package/dist/skills/built-in/passport-expedite-or-appointment.json +123 -0
  95. package/dist/skills/built-in/pediatric-school-forms.json +141 -0
  96. package/dist/skills/built-in/personal-trainer-discovery.json +138 -0
  97. package/dist/skills/built-in/pharmacy-callback.json +134 -0
  98. package/dist/skills/built-in/pivot-mid-call.json +141 -0
  99. package/dist/skills/built-in/port-mobile-number-survive-retention.json +127 -0
  100. package/dist/skills/built-in/prescription-refill-followup.json +132 -0
  101. package/dist/skills/built-in/push-past-invented-policy.json +159 -0
  102. package/dist/skills/built-in/rapport-opening-30-seconds.json +130 -0
  103. package/dist/skills/built-in/reach-executive-office.json +137 -0
  104. package/dist/skills/built-in/read-vocal-cues.json +139 -0
  105. package/dist/skills/built-in/read-vocal-tone.json +159 -0
  106. package/dist/skills/built-in/realestate-agent-vetting.json +144 -0
  107. package/dist/skills/built-in/receive-difficult-news.json +115 -0
  108. package/dist/skills/built-in/recording-claim-conversation-legally.json +121 -0
  109. package/dist/skills/built-in/recover-summary-refusal.json +121 -0
  110. package/dist/skills/built-in/reengage-ghosted-lead.json +115 -0
  111. package/dist/skills/built-in/referral-followup-without-burning.json +116 -0
  112. package/dist/skills/built-in/referral-prior-authorization.json +130 -0
  113. package/dist/skills/built-in/refuse-the-split.json +142 -0
  114. package/dist/skills/built-in/refuse-upsell-at-close.json +114 -0
  115. package/dist/skills/built-in/rental-car-counter-defense.json +116 -0
  116. package/dist/skills/built-in/rental-scam-report.json +125 -0
  117. package/dist/skills/built-in/replace-lost-stolen-card-expedited.json +139 -0
  118. package/dist/skills/built-in/report-downed-line-gas-smell-911-triage.json +130 -0
  119. package/dist/skills/built-in/report-elder-or-child-abuse.json +117 -0
  120. package/dist/skills/built-in/report-fbi-tip.json +109 -0
  121. package/dist/skills/built-in/report-fraud-ic3-or-ftc.json +117 -0
  122. package/dist/skills/built-in/report-fraudulent-transaction.json +126 -0
  123. package/dist/skills/built-in/report-power-outage-get-etr.json +116 -0
  124. package/dist/skills/built-in/report-urgent-maintenance.json +123 -0
  125. package/dist/skills/built-in/request-credit-limit-increase.json +126 -0
  126. package/dist/skills/built-in/request-supervisor-gracefully.json +129 -0
  127. package/dist/skills/built-in/request-welfare-check.json +127 -0
  128. package/dist/skills/built-in/request-written-confirmation.json +113 -0
  129. package/dist/skills/built-in/reschedule-appointment.json +121 -0
  130. package/dist/skills/built-in/reset-by-callback.json +143 -0
  131. package/dist/skills/built-in/resist-urgency-manipulation.json +152 -0
  132. package/dist/skills/built-in/revisit-totaling-decision.json +125 -0
  133. package/dist/skills/built-in/roadside-assistance-dispatch.json +132 -0
  134. package/dist/skills/built-in/roommate-replacement.json +121 -0
  135. package/dist/skills/built-in/same-day-urgent-appointment.json +130 -0
  136. package/dist/skills/built-in/schedule-rental-viewing.json +111 -0
  137. package/dist/skills/built-in/service-move-shutoff-start-no-overlap.json +129 -0
  138. package/dist/skills/built-in/social-security-replacement-card.json +122 -0
  139. package/dist/skills/built-in/specialist-doctor-booking.json +136 -0
  140. package/dist/skills/built-in/spot-bait-and-switch.json +155 -0
  141. package/dist/skills/built-in/stop-recurring-ach.json +127 -0
  142. package/dist/skills/built-in/switch-postpaid-to-prepaid-mid-cycle.json +130 -0
  143. package/dist/skills/built-in/tactical-empathy-labeling.json +147 -0
  144. package/dist/skills/built-in/therapist-intake-call.json +133 -0
  145. package/dist/skills/built-in/train-cancellation-refund-rebook.json +104 -0
  146. package/dist/skills/built-in/transcript-request.json +128 -0
  147. package/dist/skills/built-in/travel-insurance-claim-on-the-road.json +114 -0
  148. package/dist/skills/built-in/travel-notice-unlock-card.json +119 -0
  149. package/dist/skills/built-in/unemployment-claim-status-and-appeal.json +123 -0
  150. package/dist/skills/built-in/uscis-case-status-and-biometrics.json +125 -0
  151. package/dist/skills/built-in/utility-deposit-waiver.json +122 -0
  152. package/dist/skills/built-in/utility-payment-plan-avoid-disconnect.json +122 -0
  153. package/dist/skills/built-in/verify-insurance-coverage-pre-procedure.json +140 -0
  154. package/dist/skills/built-in/verify-out-of-network-coverage.json +129 -0
  155. package/dist/skills/built-in/veteran-benefits-community-college.json +134 -0
  156. package/dist/skills/built-in/veterinary-new-patient-intake.json +135 -0
  157. package/dist/skills/built-in/visa-boarding-denial-recovery.json +115 -0
  158. package/dist/skills/built-in/vital-records-certificate-copy.json +120 -0
  159. package/dist/skills/built-in/voicemail-that-gets-called-back.json +114 -0
  160. package/dist/skills/built-in/voter-registration-and-ballot.json +124 -0
  161. package/dist/skills/built-in/walkaway-threats.json +159 -0
  162. package/dist/skills/built-in/wedding-vendor-intake.json +149 -0
  163. package/dist/skills/built-in/when-to-stop-being-polite.json +161 -0
  164. package/dist/skills/built-in/wire-funds-safely.json +129 -0
  165. package/package.json +1 -1
@@ -0,0 +1,127 @@
1
+ {
2
+ "id": "day-of-flight-cancellation",
3
+ "name": "Day-of Flight Cancellation — Get Onto the Next Workable Itinerary",
4
+ "version": "1.0.2",
5
+ "category": "travel",
6
+ "tags": ["airline", "irrops", "rebooking", "interline", "phone-call", "elite-line"],
7
+ "description": "Your flight just cancelled. Call the airline (or work the app + counter in parallel) to secure the next workable itinerary — including partner-airline and interline rebooks the front-line agent won't volunteer.",
8
+ "disclaimer": null,
9
+ "context": {
10
+ "when_to_use": "The user's flight has been cancelled or is delayed beyond a usable window (typically >3-4 hours), they are at the airport or near it, and they need to be at their destination on a specific date. Works for any commercial airline. If the cancellation is due to a published travel waiver, also load `irrops-waiver-awareness`.",
11
+ "preconditions": [
12
+ "User has the cancelled flight's record locator (PNR / confirmation code) and ticket number (13-digit, starts with airline's 3-digit code e.g. 016 for UA, 001 for AA, 006 for DL).",
13
+ "User has the airline's elite/status phone number if they have status, or the general line.",
14
+ "User knows their hard constraints: must arrive by [date/time], acceptable connection points, willingness to fly into a nearby alt airport (e.g. EWR vs JFK vs LGA).",
15
+ "Phone in hand AND a spot in the gate-agent line — work both queues in parallel."
16
+ ],
17
+ "estimated_call_duration_minutes": 25
18
+ },
19
+ "principles": [
20
+ "Two queues at once: stand in the gate-agent line while you call. Whoever gets you first wins. Hang up the call if the counter solves it; release the spot in line if the call solves it.",
21
+ "Involuntary rebooking ('INVOL') unlocks options that voluntary changes do not — including other-airline (OAL) rebooks. Use the word 'involuntary' on the call.",
22
+ "Specific itineraries beat open questions. 'Can you put me on UA 718 SFO–EWR tonight, or AA 84 if that's full?' lands faster than 'what are my options?'.",
23
+ "Pre-shop the inventory yourself before calling. Use Google Flights, ExpertFlyer, or the airline's own search — know which flights have seats. Agents move faster when you hand them the answer.",
24
+ "HUACA — Hang Up And Call Again. If the first agent is unhelpful or insists nothing is available, politely end the call and redial. Different agent, different tools used, different result.",
25
+ "Foreign sales offices are open when US lines are jammed. UA Manila, DL India, AA Sydney, BA Newcastle all take US-itinerary calls and the queue is often 5 minutes vs. 90."
26
+ ],
27
+ "phrases": {
28
+ "opener": "Hi — my flight [flight number] on [date] was just cancelled. Record locator [PNR]. I need to be in [destination] by [time]. I've already looked at the schedule and I see [specific flight] has open seats — can you involuntarily rebook me onto that one?",
29
+ "invoke_invol": "This is an involuntary rebook because the airline cancelled the flight. I'd like to use all involuntary options, including partner and interline carriers.",
30
+ "ask_oal": "Since this is an INVOL, can you check OAL availability? On this route [carrier A] and [carrier B] both operate it and we have an interline agreement.",
31
+ "stall_research": "Give me ten seconds to read out the flight numbers I'm comparing — I want to make sure we're looking at the same options.",
32
+ "elite_pivot": "I'm a [status tier]. Can you transfer me to the [1K Voice / ConciergeKey / Diamond / 360] desk? They sometimes see inventory the main line doesn't.",
33
+ "huaca_close": "Thanks for checking. Let me look at my schedule and call back. Have a good one.",
34
+ "graceful_close_success": "Perfect. Can you read back the new flight numbers, seat assignments if any, the new record locator, and email the updated itinerary? Confirmation number for the rebook?",
35
+ "graceful_close_failure": "Okay. Can you note on my PNR that I called and requested INVOL rebooking to [target flight], and that we couldn't reach it? I may pursue this further."
36
+ },
37
+ "tactics": [
38
+ {
39
+ "name": "Pre-shop inventory before opening the call",
40
+ "when": "Before dialling.",
41
+ "script": "Search Google Flights or the airline app for the same route over the next 24-48 hours. Note flight numbers, times, and which alliance/partner operates them. Have 3 acceptable options ranked.",
42
+ "priority": 1
43
+ },
44
+ {
45
+ "name": "Use the word 'involuntary'",
46
+ "when": "First turn after pleasantries.",
47
+ "script": "Drop 'involuntary rebook' or 'INVOL' explicitly — it signals to the agent that change-fee waivers and OAL rebooking are on the table.",
48
+ "priority": 2
49
+ },
50
+ {
51
+ "name": "Ask for OAL / partner / interline by name",
52
+ "when": "Same-airline options don't work.",
53
+ "script": "Name the alliance partner: 'United–Lufthansa' (Star), 'AA–BA' or 'AA–AS' (oneworld since 2024), 'DL–AF/KL/VS' (SkyTeam), 'AS–AA' (interline). Front-line agents often forget OAL rebooks exist until prompted.",
54
+ "priority": 3
55
+ },
56
+ {
57
+ "name": "Work two queues",
58
+ "when": "At the airport when cancellation hits.",
59
+ "script": "Get in the gate-agent line AND call simultaneously. The first one who solves it wins. Apologise and step out of whichever queue lost.",
60
+ "priority": 4
61
+ },
62
+ {
63
+ "name": "Escalate to elite / status desk",
64
+ "when": "User has status and the main line stalls.",
65
+ "script": "Ask for the dedicated tier line (1K Voice, ConciergeKey, Diamond Medallion, 360, AS 100K). They have wider discretion and shorter holds.",
66
+ "priority": 5
67
+ },
68
+ {
69
+ "name": "HUACA",
70
+ "when": "Current agent says nothing's available and you have a known seat.",
71
+ "script": "End the call politely. Wait 60 seconds. Redial. Different agent, often a different answer. Two HUACAs is fine; three is the limit before you switch tactics.",
72
+ "priority": 6
73
+ },
74
+ {
75
+ "name": "Foreign sales office",
76
+ "when": "US hold times are >30 minutes.",
77
+ "script": "Call the airline's office in Manila / Sydney / Mumbai / Newcastle — they handle the same PNRs. Hold time is often single-digit minutes. Numbers are public on each carrier's site.",
78
+ "priority": 7
79
+ },
80
+ {
81
+ "name": "Accept a creative routing",
82
+ "when": "Direct option exhausted.",
83
+ "script": "Ask about: nearby airports (EWR ↔ JFK ↔ LGA, SFO ↔ OAK ↔ SJC, IAD ↔ DCA ↔ BWI), positioning flights (different connection hub), or split tickets the airline issues together."
84
+ }
85
+ ],
86
+ "boundaries": [
87
+ "Do NOT accept a 'voluntary' change ticket where you pay fare difference — this is an INVOL rebook.",
88
+ "Do NOT cancel your existing ticket for a refund before securing a confirmed seat on the alternative. The original ticket is leverage.",
89
+ "Do NOT lie about status. Status is checked in real-time.",
90
+ "Do NOT book a separate ticket on a different carrier yourself without getting the airline to do an interline ticket — separate tickets break baggage protection and standby.",
91
+ "Do NOT accept an agent's 'this is the only option, you have to decide now' framing when your own inventory search shows seats elsewhere — say 'I'm looking at [specific flight] right now, can you check that one?' Agent inventory views differ from public search; the seat you see often is bookable.",
92
+ "Do NOT accept 'you'll forfeit your protections if you don't take this' as pressure. EU261 / UK261 / DOT 3-hour rule / contract-of-carriage rights attach to the cancellation event, not to your acceptance of a re-route. The protections survive a 'no thanks' to a bad re-route."
93
+ ],
94
+ "success_signals": [
95
+ "Agent issues a new e-ticket and record locator on the spot.",
96
+ "Agent volunteers to check OAL inventory without being asked.",
97
+ "Agent offers seat assignment proactively.",
98
+ "Agent mentions 'distressed passenger' or 'distressed pax fares' — that's the INVOL toolset opening up.",
99
+ "You're transferred to the elite desk."
100
+ ],
101
+ "failure_signals": [
102
+ "Agent insists the only option is 'tomorrow's flight, same time' when other carriers clearly have seats.",
103
+ "Agent quotes a change fee or fare difference for an airline-caused cancellation.",
104
+ "Hold times exceed 60 minutes with no callback option.",
105
+ "Agent refuses to consider OAL despite a published interline agreement.",
106
+ "Agent pressures with 'this is the only option, decide now' while you can independently see other seats — manufactured-scarcity tell, HUACA or counter with the specific flight you found.",
107
+ "Agent claims accepting the bad re-route is required to preserve EU261/UK261/DOT compensation — false; compensation attaches to the cancellation, not to your re-route acceptance."
108
+ ],
109
+ "exit_strategy": {
110
+ "on_success": "Confirm new flight numbers, new PNR, seat assignments, baggage tag re-routing, and an emailed itinerary. If you've checked bags, confirm baggage rebooking out loud.",
111
+ "on_failure": "Note the PNR with the requested options. Pursue compensation separately (load `eu261-uk261-dot-compensation` skill). Consider buying a one-way on a third carrier and disputing later.",
112
+ "follow_ups": [
113
+ "If the cancellation was carrier-controllable, file for hotel/meal vouchers (see `missed-connection-distressed-passenger`).",
114
+ "If EU/UK/Three-Hour Rule applies, file the cash compensation claim within 7 days while details are fresh.",
115
+ "Save boarding passes — required for both insurance and EU261 claims."
116
+ ]
117
+ },
118
+ "required_user_info": [
119
+ "Cancelled flight number, date, and record locator (PNR)",
120
+ "Ticket number (13-digit)",
121
+ "Frequent flyer number and status tier (if any)",
122
+ "Hard arrival deadline at destination",
123
+ "Acceptable alternate airports and connection points",
124
+ "Whether checked baggage is involved"
125
+ ],
126
+ "contributed_by": "travel-rebooking agent (v0.9.87 community drop)"
127
+ }
@@ -0,0 +1,114 @@
1
+ {
2
+ "id": "de-escalate-angry-rep",
3
+ "name": "De-escalate an Angry Rep (Without Absorbing the Anger)",
4
+ "version": "1.0.0",
5
+ "category": "other",
6
+ "tags": [
7
+ "de-escalation",
8
+ "anger",
9
+ "tone",
10
+ "phone-call",
11
+ "boundaries",
12
+ "regulation",
13
+ "emotional-intelligence"
14
+ ],
15
+ "description": "Bring a hot, hostile, or frustrated rep back to a working baseline without becoming a mirror for their emotion. The goal is not to win the moment — it is to make the next 10 minutes useful.",
16
+ "disclaimer": null,
17
+ "context": {
18
+ "when_to_use": "The rep is sharp, sarcastic, raising their voice, talking over you, sighing audibly, slamming keys, or punishing you with curt one-word answers. Use BEFORE the call becomes unworkable. If the rep is already abusive (slurs, threats, personal attacks), escalate to a supervisor instead — this skill is for hot, not toxic.",
19
+ "preconditions": [
20
+ "You have heard at least one full sentence from the rep — do not pre-empt anger that isn't there.",
21
+ "You know the operator's actual goal so you can hold it through the noise.",
22
+ "You have ~5 extra minutes of patience budget — de-escalation takes time."
23
+ ],
24
+ "estimated_call_duration_minutes": 4
25
+ },
26
+ "principles": [
27
+ "Anger is almost always about the LAST thing the rep handled, not you. Assume a queue of 30 difficult callers before you.",
28
+ "Lower your pitch and slow your tempo by ~15%. Two regulated voices cannot stay escalated for long; one will follow the other, and you go first.",
29
+ "Validate the feeling, not the framing. 'That sounds frustrating' is true; 'You're right, this company is awful' makes you a fellow complainer and forfeits your leverage.",
30
+ "Do not match volume. Matching volume teaches the rep that volume is how they get heard by you — the call gets louder, not clearer.",
31
+ "Name one concrete thing you appreciate about what they've already done. Specific gratitude resets the social contract.",
32
+ "If you absorb the anger, you become useless to the operator. Stay porous to information, opaque to affect."
33
+ ],
34
+ "phrases": {
35
+ "first_acknowledgement": "I can hear this has already been a long one for you — I'm not here to make it harder. Can we take it from the top together?",
36
+ "validate_without_agreeing": "That sounds genuinely frustrating. I'd be annoyed too if I were on your side of the desk right now.",
37
+ "name_the_dynamic": "I think we got off on a tense foot — that's on me as much as anyone. Mind if we reset for 30 seconds?",
38
+ "redirect_to_task": "I want to make this short for you. If we can solve [specific thing], I'll be out of your hair in five minutes.",
39
+ "stall_to_regulate": "Give me one second — I want to make sure I'm asking you the right question.",
40
+ "boundary_if_personal": "I get that you're frustrated. I'd just ask we keep it about the account — I'll do the same."
41
+ },
42
+ "tactics": [
43
+ {
44
+ "name": "Drop your voice first",
45
+ "when": "Within the first three seconds of detecting heat.",
46
+ "script": "Consciously drop pitch ~10-15%, slow tempo, lengthen pauses to ~1s. Do not comment on their tone. Behavior modelling beats correction.",
47
+ "priority": 1
48
+ },
49
+ {
50
+ "name": "Validate the feeling once, fully, then move",
51
+ "when": "Immediately after they vent.",
52
+ "script": "Use the `validate_without_agreeing` phrase. Validate ONCE — repeated validation reads as patronising. Then redirect to the task.",
53
+ "priority": 2
54
+ },
55
+ {
56
+ "name": "Concrete appreciation",
57
+ "when": "After the first piece of useful information they give you, even small.",
58
+ "script": "'Thank you — that's exactly what I needed' or 'That helps a lot, I appreciate it.' Specific, not generic. This rebuilds the contract.",
59
+ "priority": 3
60
+ },
61
+ {
62
+ "name": "Tone-shift detector — RECALIBRATE",
63
+ "when": "Rep softens (slower speech, longer answers, an 'okay so…' opener, you hear them type instead of sigh).",
64
+ "script": "DO NOT celebrate or comment on the shift. Match their new baseline immediately — slightly warmer but still calm. Commenting on the de-escalation re-escalates it.",
65
+ "priority": 4
66
+ },
67
+ {
68
+ "name": "Tone-shift detector — RE-HEATING",
69
+ "when": "Voice rises again, interrupts return, or sarcasm reappears mid-call.",
70
+ "script": "Pause for a full beat. Lower your voice again. Use `stall_to_regulate`. Do not chase the conversation up the heat ladder.",
71
+ "priority": 5
72
+ },
73
+ {
74
+ "name": "Soft boundary if it gets personal",
75
+ "when": "Rep makes it about you (your accent, your competence, your gender).",
76
+ "script": "Use `boundary_if_personal` once, calmly, no apology. If it continues, ask for a different rep or supervisor — note the time and the language."
77
+ }
78
+ ],
79
+ "boundaries": [
80
+ "Do NOT apologise for asking a legitimate question. Apologising under heat trains the rep to use heat.",
81
+ "Do NOT agree the company is bad just to bond. You'll need that company's cooperation in three minutes.",
82
+ "Do NOT explain de-escalation tactics to the rep ('I can tell you're upset, let's both take a breath'). It reads as condescending and re-ignites.",
83
+ "Do NOT mirror sarcasm. Once.",
84
+ "Do NOT carry the residue into the next call segment — when the rep softens, you soften with them, fully."
85
+ ],
86
+ "success_signals": [
87
+ "Rep takes a deeper breath you can hear.",
88
+ "Sentences get longer and more declarative ('okay so what I can do is…').",
89
+ "Rep uses your name or 'sir/ma'am' (re-personalising).",
90
+ "Typing sounds replace sighing.",
91
+ "Rep volunteers information you didn't ask for."
92
+ ],
93
+ "failure_signals": [
94
+ "Three validation attempts and no softening.",
95
+ "Rep becomes personal, profane, or threatening.",
96
+ "Rep hangs up or transfers you without warning.",
97
+ "You notice YOUR voice tightening — you've started absorbing it."
98
+ ],
99
+ "exit_strategy": {
100
+ "on_success": "Once the call is workable, do NOT linger on the reset — get to the task crisply so the rep is rewarded for the shift with progress. Close warmly: 'Genuinely, thank you for sticking with me on this.'",
101
+ "on_failure": "Politely end and call back: 'I can tell we're both having a tough one — I'm going to call back in a bit, no hard feelings.' A new rep is often the entire fix.",
102
+ "follow_ups": [
103
+ "If the rep was abusive, note time, employee ID if given, and language used — report to operator.",
104
+ "Self-debrief: was there a phrase YOU used that triggered the heat? Log it for next call."
105
+ ]
106
+ },
107
+ "required_user_info": [
108
+ "The actual task — you need the goal to hold through the storm.",
109
+ "Operator's tolerance for callback (some can't wait, in which case push through).",
110
+ "Whether this is a regulated industry (medical, legal) where rep behavior should be reported."
111
+ ],
112
+ "contributed_by": "emotional-intel agent (v0.9.87 community drop)",
113
+ "updated_at": "2026-05-20T06:09:47Z"
114
+ }
@@ -0,0 +1,110 @@
1
+ {
2
+ "id": "decline-unsolicited-pitch",
3
+ "name": "Politely Decline an Unsolicited Sales Pitch",
4
+ "version": "1.0.1",
5
+ "category": "other",
6
+ "tags": [
7
+ "inbound",
8
+ "self-defense",
9
+ "boundary",
10
+ "phone-call",
11
+ "respect",
12
+ "outreach-sales"
13
+ ],
14
+ "description": "When the agent — on its own dedicated line — receives an unsolicited inbound sales / cold call, decline cleanly, professionally, and in a way that protects future relationships without wasting either party's time.",
15
+ "disclaimer": "Skills assume the call is solicited by the operator. NEVER use these to power a mass-cold-call campaign without the operator's explicit per-prospect authorisation.",
16
+ "context": {
17
+ "when_to_use": "The agent's own outbound line, voice number, or contact details have been used by an external party to pitch to the agent or operator. The pitch is unsolicited and not connected to a known operator-initiated thread.",
18
+ "preconditions": [
19
+ "Caller has identified themselves and stated a sales / partnership / introduction intent.",
20
+ "Agent has confirmed there is no prior authorised relationship with this caller in operator records.",
21
+ "Operator has not pre-flagged this caller / company as a wanted inbound."
22
+ ],
23
+ "estimated_call_duration_minutes": 2
24
+ },
25
+ "principles": [
26
+ "The salesperson is doing their job. Be respectful — you may end up working with them or someone they know.",
27
+ "A clean 'no thank you' beats a soft 'maybe later'. Maybes generate follow-up calls; clean nos do not.",
28
+ "Brevity is kindness. Letting them keep pitching when you know it's a no wastes their time and yours.",
29
+ "Never lie about why you're declining ('we already have one', 'we're in a contract') unless it is true. Lies invite 'when does the contract end?' follow-ups.",
30
+ "If you're not the decision-maker, say so plainly — and do NOT volunteer the decision-maker's direct contact.",
31
+ "Treat the call the way you'd want your own outreach calls treated."
32
+ ],
33
+ "phrases": {
34
+ "early_intercept": "Thanks for the call — before you go further, I'm going to stop you because we don't take unsolicited sales pitches on this line. Could I ask you to send any information by email instead?",
35
+ "polite_no": "Thanks for the call, but it's a no from me on this — and that's a real no, not a 'try again next quarter'. Please take us off your call list.",
36
+ "not_the_dm": "I'm not the decision-maker for that, and I don't pass along contact details for unsolicited outreach. You're welcome to email [generic inbox] and the right person will pick it up if it's relevant.",
37
+ "remove_request": "Could you please remove this number from your dialer? I'd appreciate it.",
38
+ "respectful_close": "Thanks again for your time — best of luck with your outreach. Goodbye."
39
+ },
40
+ "tactics": [
41
+ {
42
+ "name": "Intercept early — within 15 seconds",
43
+ "when": "Caller has identified themselves and their employer and is about to launch into the pitch.",
44
+ "script": "Use `early_intercept`. Letting the pitch run for two minutes before declining is a courtesy that costs both sides time and makes the no feel harsher.",
45
+ "priority": 1
46
+ },
47
+ {
48
+ "name": "Give one reason, not five",
49
+ "when": "Caller asks 'can I ask why?'.",
50
+ "script": "Pick the one truest reason — 'no budget for this category', 'we have a vendor we're happy with', 'not a priority this year' — and stop. Multiple reasons invite multiple counters.",
51
+ "priority": 2
52
+ },
53
+ {
54
+ "name": "Convert to written channel only if genuinely useful",
55
+ "when": "Caller asks for an email address or to send materials.",
56
+ "script": "Offer a generic inbox if the operator has one and you suspect occasional inbound is wanted. Do NOT give a personal email or direct dial just to end the call — that creates worse follow-up.",
57
+ "priority": 3
58
+ },
59
+ {
60
+ "name": "Protect the decision-maker",
61
+ "when": "Caller asks 'who is the right person?'.",
62
+ "script": "Use `not_the_dm`. Do not give names, direct lines, or routing tips that bypass the operator's own gatekeeping.",
63
+ "priority": 4
64
+ },
65
+ {
66
+ "name": "Ask to be removed from the list",
67
+ "when": "This is the second or third call from the same company.",
68
+ "script": "Use `remove_request`. In many jurisdictions this triggers a legal do-not-call obligation. Document the date and the caller's name for the operator's records.",
69
+ "priority": 5
70
+ },
71
+ {
72
+ "name": "Exit warmly",
73
+ "when": "After saying no.",
74
+ "script": "Use `respectful_close`. A warm exit is cheap and pays off if this person ends up at a company you actually want to talk to later."
75
+ }
76
+ ],
77
+ "boundaries": [
78
+ "Do NOT give out the operator's direct phone, personal email, or calendar link to unsolicited callers.",
79
+ "Do NOT name a specific competitor as the reason ('we use X'). That gives the caller their next call script.",
80
+ "Do NOT promise follow-up you don't intend to deliver ('email me, I'll bring it up internally') unless you really will.",
81
+ "Do NOT escalate or get sarcastic, even if the caller is pushy. A clean cold no is more powerful than annoyance.",
82
+ "Do NOT hang up mid-sentence on the caller unless they have crossed into hostility — give the polite close."
83
+ ],
84
+ "success_signals": [
85
+ "Caller acknowledges the no, removes the number on request, and ends the call.",
86
+ "Caller redirects to email — agent provides only the public inbox.",
87
+ "Caller thanks you for the directness."
88
+ ],
89
+ "failure_signals": [
90
+ "Caller continues to pitch after a clear no.",
91
+ "Caller becomes argumentative or attempts manipulation ('just five minutes', 'your boss would want to hear this').",
92
+ "Same company calls again within 30 days despite a removal request."
93
+ ],
94
+ "exit_strategy": {
95
+ "on_success": "Log the call in the operator's inbound-pitch log: company, caller name, what they pitched, removal requested y/n. This becomes useful market intel.",
96
+ "on_failure": "If the caller refuses to disengage, repeat the no once, then end the call. Add the company to a blocked-caller list if the operator maintains one.",
97
+ "follow_ups": [
98
+ "Add a one-line entry to the operator's inbound log so repeat callers are recognised.",
99
+ "If a removal was requested, mark the date — a return call inside the do-not-call window is the operator's choice whether to escalate."
100
+ ]
101
+ },
102
+ "required_user_info": [
103
+ "Whether the operator has a generic inbox for unsolicited inbound",
104
+ "Whether the operator maintains a blocked-caller list",
105
+ "Operator's standing policy on inbound (e.g. 'always decline politely', or 'flag X categories for review')",
106
+ "Whether to log inbound pitches for later review"
107
+ ],
108
+ "contributed_by": "sales-outbound agent (v0.9.87 community drop)",
109
+ "updated_at": "2026-05-20T06:09:47Z"
110
+ }
@@ -0,0 +1,122 @@
1
+ {
2
+ "id": "deliver-difficult-news",
3
+ "name": "Deliver Difficult News (a No, a Cancellation, a Regret)",
4
+ "version": "1.0.0",
5
+ "category": "other",
6
+ "tags": [
7
+ "bad-news",
8
+ "no",
9
+ "cancellation",
10
+ "delivery",
11
+ "phone-call",
12
+ "kindness",
13
+ "clarity",
14
+ "emotional-intelligence"
15
+ ],
16
+ "description": "Tell someone something they will not want to hear — a cancellation, a refusal, a withdrawal, a decision against them — in a way that is clear, kind, and short. Vague kindness is cruelty; clarity without kindness is brutality. The skill is both.",
17
+ "disclaimer": null,
18
+ "context": {
19
+ "when_to_use": "You are calling on the operator's behalf to deliver a NO: cancelling a service, declining an invitation, withdrawing from a commitment, denying a request, ending an arrangement. Use also when softening news the operator has already decided on — you are not here to re-litigate the decision, just to deliver it well.",
20
+ "preconditions": [
21
+ "Operator has finalised the decision — you are NOT here to negotiate it on their behalf.",
22
+ "You have the reason in operator-approved language (some reasons are shareable, some aren't).",
23
+ "You know what (if anything) is on the table — partial offer, alternative, future date."
24
+ ],
25
+ "estimated_call_duration_minutes": 6
26
+ },
27
+ "principles": [
28
+ "Lead with the headline within the first 15 seconds. Burying the news to soften the blow makes it worse — the recipient hears the dread coming and has to live it twice.",
29
+ "Use the word 'no' or the actual verb. 'We're going in a different direction' is cowardice; 'we've decided not to move forward' is kindness with a spine.",
30
+ "Give the reason in one sentence — not three, not a paragraph. Long reasons sound like you're convincing yourself.",
31
+ "Do not over-apologise. One genuine 'I'm sorry' is more powerful than five.",
32
+ "Make space for their reaction. After the news, stop talking. Let them have the silence or the question.",
33
+ "Do not offer to 'stay in touch' or 'maybe later' unless it is genuinely on the table. False futures are crueller than a clean ending."
34
+ ],
35
+ "phrases": {
36
+ "headline_first": "I'm calling with news I'd rather not have to share — [operator's decision in one clear sentence]. I wanted to tell you directly.",
37
+ "single_reason": "The reason is [one sentence]. I know that may not be the answer you were hoping for.",
38
+ "make_space": "Take a moment if you need one — I'm here.",
39
+ "acknowledge_their_feeling": "I hear you. That's a fair reaction.",
40
+ "boundary_if_pressed": "I want to be respectful and straight with you — the decision is final. I'm not the right person to re-open it.",
41
+ "clean_close_warm": "Thank you for hearing me out. I genuinely wish you well."
42
+ },
43
+ "tactics": [
44
+ {
45
+ "name": "Headline in the first 15 seconds",
46
+ "when": "Immediately after the initial 'hi, is now okay?' pleasantry.",
47
+ "script": "Use `headline_first`. Resist the urge to lay groundwork. The kindest thing is the cleanest landing.",
48
+ "priority": 1
49
+ },
50
+ {
51
+ "name": "Reason in one sentence",
52
+ "when": "Right after the headline.",
53
+ "script": "Use `single_reason`. Do not expand unless asked. If they ask for more, give one more sentence, not five.",
54
+ "priority": 2
55
+ },
56
+ {
57
+ "name": "Stop talking",
58
+ "when": "After the reason.",
59
+ "script": "Pause 5-10 seconds. Let them feel it. Filling the silence is for your comfort, not theirs.",
60
+ "priority": 3
61
+ },
62
+ {
63
+ "name": "Tone-shift detector — RECIPIENT GOES QUIET",
64
+ "when": "Long pause, breathing changes, voice tightens.",
65
+ "script": "Do not rush to fill it. Use `make_space` once, softly. Do not move to logistics until they re-enter the conversation.",
66
+ "priority": 4
67
+ },
68
+ {
69
+ "name": "Tone-shift detector — RECIPIENT GETS ANGRY",
70
+ "when": "Voice rises, accusations begin, 'after everything I did' framings.",
71
+ "script": "Do not defend. Use `acknowledge_their_feeling`. Do not justify the operator's decision a second time — repeating reasons reads as fighting back. Hold the line with `boundary_if_pressed` if they push to re-open.",
72
+ "priority": 5
73
+ },
74
+ {
75
+ "name": "Tone-shift detector — RECIPIENT GETS GRACIOUS",
76
+ "when": "They thank you for the call, say they understand.",
77
+ "script": "Receive it. Do not over-thank them in return — that can feel like you're rewarding compliance. A simple 'thank you for taking it well, I know it's hard' is enough.",
78
+ "priority": 6
79
+ },
80
+ {
81
+ "name": "Close clean, leave nothing dangling",
82
+ "when": "Last 30 seconds.",
83
+ "script": "Use `clean_close_warm`. Do not offer future possibilities you don't mean. If there IS a real next step (refund, paperwork, alternative date), state it crisply and end."
84
+ }
85
+ ],
86
+ "boundaries": [
87
+ "Do NOT soften with euphemism. 'We're pausing' when you mean 'we're ending' is dishonest and the person can tell.",
88
+ "Do NOT re-open the decision under emotional pressure. Your job is delivery, not re-litigation.",
89
+ "Do NOT promise things the operator hasn't approved (refunds, references, future opportunities).",
90
+ "Do NOT make it about the operator's difficulty ('this was so hard for them to decide'). The recipient does not owe the operator sympathy.",
91
+ "Do NOT cry, performatively or otherwise. If you are too emotionally involved to deliver cleanly, the operator should make the call themselves."
92
+ ],
93
+ "success_signals": [
94
+ "Recipient hears the news clearly within the first minute.",
95
+ "Recipient asks one or two follow-up questions and you answer them in single sentences.",
96
+ "Call lasts under 10 minutes.",
97
+ "You leave the call without having promised anything you can't deliver."
98
+ ],
99
+ "failure_signals": [
100
+ "You're 5 minutes in and haven't said the actual news yet.",
101
+ "You hear yourself justifying the decision repeatedly.",
102
+ "You offered a 'maybe later' you don't mean.",
103
+ "The call ends with the recipient still believing they can change the outcome."
104
+ ],
105
+ "exit_strategy": {
106
+ "on_success": "Close with `clean_close_warm`. Send the operator a one-line confirmation: 'Delivered. They [reaction]. No further action needed / [one next step].'",
107
+ "on_failure": "If the recipient is genuinely escalating beyond what you can hold, end politely and tell them the operator will be in touch in writing. Do not try to win the call.",
108
+ "follow_ups": [
109
+ "Send written confirmation (email/letter) if appropriate — anchors the verbal call.",
110
+ "Flag the operator if the recipient threatened action (legal, public, etc.).",
111
+ "Log how the call went so the operator has a record for any future interaction."
112
+ ]
113
+ },
114
+ "required_user_info": [
115
+ "The exact news in one sentence — operator-approved wording.",
116
+ "The reason in operator-approved wording — and what is NOT to be shared.",
117
+ "What, if anything, is genuinely on offer (partial refund, alternative, future contact).",
118
+ "How to escalate if the call goes badly (operator's contact for follow-up)."
119
+ ],
120
+ "contributed_by": "emotional-intel agent (v0.9.87 community drop)",
121
+ "updated_at": "2026-05-20T06:09:47Z"
122
+ }
@@ -0,0 +1,140 @@
1
+ {
2
+ "id": "detect-fake-escalation-loops",
3
+ "name": "Detect and Bypass Fake Escalation Loops",
4
+ "version": "1.0.1",
5
+ "category": "customer-service",
6
+ "tags": [
7
+ "escalation",
8
+ "anti-pattern",
9
+ "phone-call",
10
+ "transfer-loops",
11
+ "ghost-callbacks",
12
+ "stall-detection",
13
+ "customer-support"
14
+ ],
15
+ "description": "Spot the patterns that tell you you're not actually being escalated — transfers that loop you back to the same queue, callbacks that never come, 'tickets' that don't exist in any system. Then bypass them rather than burn another hour in the same maze.",
16
+ "disclaimer": null,
17
+ "context": {
18
+ "when_to_use": "You're on call #2 or #3 about the same issue, OR you've been transferred more than twice in one call, OR a promised callback hasn't materialized. This skill is about detecting the stall pattern and choosing the right counter-move, not about being paranoid on a first-time call.",
19
+ "preconditions": [
20
+ "User has at least one prior interaction (call, chat, or email) about the same issue.",
21
+ "User has tracked basic details: case numbers (if given), names of reps, dates, and what was promised.",
22
+ "User is willing to invest energy in pattern-detection rather than just plowing forward — this skill is slower upfront but saves hours."
23
+ ],
24
+ "estimated_call_duration_minutes": 20
25
+ },
26
+ "principles": [
27
+ "Loops are designed to wear you down without leaving an audit trail. The defense is the audit trail — name dates, case numbers, and prior promises explicitly on every call. Loops can't survive contact with documented history.",
28
+ "The five common stalls: (1) Hot-potato transfer — sent to another queue that sends you back. (2) Ghost callback — promise of return call that never happens. (3) Phantom ticket — case number that doesn't exist when you reference it next time, OR exists but with no notes. (4) Sympathy stall — long empathetic conversation that ends with no action. (5) Hold-out — repeated hold-and-check that runs your clock down.",
29
+ "Each stall has a tell. Hot-potato: rep can't articulate WHY this transfer is different from the last one. Ghost callback: rep won't give a specific time, just 'within 24-72 hours'. Phantom ticket: rep can't read back details. Sympathy stall: lots of 'I totally understand' but no 'here's what I can do'. Hold-out: hold durations escalating without new information.",
30
+ "When you detect a stall, the move is NOT to argue with the rep — it's to change your method. Same input, same output. You need different input: different channel, different rep, different framing, or different evidence.",
31
+ "Case numbers are the single best stall-defense. Always ask for one. Reference prior ones. A call that starts with 'I have case number XYZ from [date]' is harder to put into a loop than one that starts cold.",
32
+ "Decision point — every 10 minutes, ask yourself: 'In the last 10 minutes, has anything CHANGED — a new fact, a real escalation, a specific commitment with a date?' If no, you're in a loop. Exit the loop.",
33
+ "Some loops are unconscious — the company isn't deliberately stalling, the systems are just bad. Doesn't matter. The counter is the same."
34
+ ],
35
+ "phrases": {
36
+ "case_number_check": "Before we start, I want to give you context — case number [X] from [date] with [rep name]. Could you pull that up and read back what's noted?",
37
+ "test_the_transfer": "Before you transfer me — can you confirm exactly which team you're sending me to, and that they have authority to [specific action]? I've been bounced before and I want to make sure this is a real escalation, not another queue.",
38
+ "lock_the_callback": "If you can't help now, I need a SPECIFIC callback time — not a window. What hour, on what day, and from what number? And can you put your name and ID on the callback note?",
39
+ "verify_the_ticket": "Could you read me the case number you just opened, AND read back the first two lines of what's noted? I want to make sure my issue is captured before we hang up.",
40
+ "name_the_loop": "I want to flag something carefully — I've been transferred three times today and twice last week, all on the same issue, with no resolution and no callback. I'm not blaming you, but I need help breaking that pattern. Who in your org owns 'cases that have been escalated multiple times without resolution'?",
41
+ "stop_the_hold_loop": "Before you put me on hold again — let's confirm what you're going to check this time that's different from what you checked last time. If it's the same thing, the answer will be the same. Let's not waste either of our time.",
42
+ "the_evidence_close": "I'm going to stay on this call until we have either a resolution or a specific written commitment with a date. I know that's not fun for either of us — but I can't accept another 'we'll get back to you' without a name, a time, and a number.",
43
+ "channel_switch_signal": "I'm going to end this call and pursue this through a different channel. Could you confirm: your name, your ID, the case number, and your manager's name for my records?"
44
+ },
45
+ "tactics": [
46
+ {
47
+ "name": "Open with prior-case context",
48
+ "when": "First minute of every follow-up call about the same issue.",
49
+ "script": "Use `case_number_check`. Pre-loaded context disrupts the loop — reps can't pretend it's a fresh issue and start the script over. If they can't pull the case or claim it's not in the system, that's data point #1.",
50
+ "priority": 1,
51
+ "decision_point": "If the rep claims they can't find your prior case number — pause. Either (a) ask them to search by your phone or account, OR (b) treat the missing case as evidence of a phantom-ticket stall and ask explicitly: 'is this case in your system or not?' Don't just plow forward and let them open a new case — that resets your timeline."
52
+ },
53
+ {
54
+ "name": "Test the transfer before accepting it",
55
+ "when": "Rep offers a transfer.",
56
+ "script": "Use `test_the_transfer`. Reps doing a real transfer can name the team and confirm authority. Reps doing a hot-potato transfer waffle.",
57
+ "priority": 2,
58
+ "decision_point": "If the rep can't name the team or authority — REFUSE the transfer. Say: 'I'd rather not be transferred until we know that's the right place. Let me speak with your supervisor here first.' Refusing a transfer is a legitimate move; you don't have to accept every hold."
59
+ },
60
+ {
61
+ "name": "Lock down callback specifics",
62
+ "when": "Rep offers a callback instead of in-call resolution.",
63
+ "script": "Use `lock_the_callback`. Vague callback windows ('within 72 hours') are stall-friendly. Specific commitments ('Tuesday between 10-11am from 800-555-0143') are harder to silently drop.",
64
+ "priority": 3,
65
+ "decision_point": "If the rep refuses to give a specific time/number — that's a strong signal of a ghost-callback stall. Either insist on specifics or escalate. Don't accept the vague window — it's designed to make the missed callback unprovable."
66
+ },
67
+ {
68
+ "name": "Verify the ticket while still on the line",
69
+ "when": "Rep opens a new case or claims one is already open.",
70
+ "script": "Use `verify_the_ticket`. Phantom tickets exist (typo'd, opened under the wrong account, opened without notes). Catching it before you hang up saves 30 minutes on the next call.",
71
+ "priority": 4
72
+ },
73
+ {
74
+ "name": "Stop the hold-and-check loop",
75
+ "when": "Rep is going on hold for the second time on the same question.",
76
+ "script": "Use `stop_the_hold_loop`. The script says 'let me check'. Forcing the rep to articulate what they're checking — and how it differs from last time — collapses the stall.",
77
+ "priority": 5
78
+ },
79
+ {
80
+ "name": "Name the loop without accusation",
81
+ "when": "You've confirmed (via your own count) that you're in a documented pattern of unresolved escalations.",
82
+ "script": "Use `name_the_loop`. Most companies have a 'cases stuck in escalation' workflow or supervisor responsible for it — you just have to ask for it by function. The framing ('I'm not blaming you') keeps the rep on your side.",
83
+ "priority": 6,
84
+ "decision_point": "If the rep responds 'we don't have anyone who handles that' or 'that's not really a thing' — your suspicion is confirmed: this org has no exit ramp for loops. Time to switch channels (`multi-channel-escalation`) or go above (`reach-executive-office`)."
85
+ },
86
+ {
87
+ "name": "Refuse to disengage without commitment",
88
+ "when": "Rep tries to close the call with no resolution and no specifics.",
89
+ "script": "Use `the_evidence_close`. Saying it out loud — calmly — often produces a sudden escalation that 'wasn't available' five minutes earlier.",
90
+ "priority": 7
91
+ },
92
+ {
93
+ "name": "Signal the channel switch",
94
+ "when": "You've decided to exit this call.",
95
+ "script": "Use `channel_switch_signal`. Don't reveal which channel — just signal that the next contact will be elsewhere. This often produces a last-minute escalation as the rep realizes the case is escaping their queue.",
96
+ "priority": 8
97
+ }
98
+ ],
99
+ "boundaries": [
100
+ "Do NOT accuse the rep of lying. Even when they are stalling, calling it out destroys the recording's value to you.",
101
+ "Do NOT chain more than 2 transfers in one call. If you've been transferred twice and still not resolved, hang up and document — the third transfer is the loop confirming itself.",
102
+ "Do NOT accept callbacks without specific time, number, and a named person responsible. Generic callbacks ('someone will reach out') are designed to be undeliverable.",
103
+ "Do NOT skip taking notes during the call to 'save time'. The notes are the only thing that breaks the next loop. If you can't take notes, record (where legally permitted) — see `document-call-promises`.",
104
+ "Do NOT keep calling back to the same queue every day. Three calls without movement = wrong queue. Switch channels.",
105
+ "Do NOT bluff a deadline ('if you don't call me back by 5pm I'm filing a complaint') unless you'll actually follow through. Empty deadlines train the loop to ignore you."
106
+ ],
107
+ "success_signals": [
108
+ "Rep pulls up prior case + reads back accurate notes — case is real, history is intact.",
109
+ "Rep declines to do a transfer when challenged — and instead handles it themselves.",
110
+ "Rep gives a specific callback time + direct number + their personal name + ID.",
111
+ "Rep names a function ('our re-escalation supervisor') in response to the loop call-out.",
112
+ "Different sound profile (different hold music, no hold music, direct dial) — you've left the standard queue."
113
+ ],
114
+ "failure_signals": [
115
+ "Rep can't find your case number, OR finds it but can't read back notes.",
116
+ "Rep won't commit to specific callback time, OR keeps offering windows like 'within 24-72 business hours'.",
117
+ "More than two transfers in one call without escalation.",
118
+ "Rep deflects the 'who handles cases stuck in escalation' question.",
119
+ "Hold durations escalating (1min → 5min → 12min) without new information at the end of each hold.",
120
+ "Rep starts using closing scripts ('is there anything else…') as a soft hangup."
121
+ ],
122
+ "exit_strategy": {
123
+ "on_success": "Document precisely: time of resolution, rep name + ID, case number, specific commitment + date, written confirmation channel. Confirm in writing within 24h.",
124
+ "on_failure": "End the call with name + ID + case number captured. Switch channels immediately — do NOT call the same queue again. Use `multi-channel-escalation` (email + executive office + social) or `invoke-regulator-firmly` if the issue is regulator-eligible.",
125
+ "follow_ups": [
126
+ "Build a one-page timeline: every contact, date, rep, what was promised, what happened. This document is your weapon for the next escalation tier.",
127
+ "If callback window passed without contact: do NOT just call back to the queue. Use the timeline to escalate to executive office, social media, or regulator.",
128
+ "Note: many companies have a 'cases over 30 days' escalation flag. Reference the AGE of the issue in your next contact — 'this case has been open 47 days across 6 contacts' is significantly more powerful than 'I'm frustrated'."
129
+ ]
130
+ },
131
+ "required_user_info": [
132
+ "Complete history of prior contacts: dates, rep names, case numbers, what was promised",
133
+ "Original issue stated in one sentence",
134
+ "All callback promises that were missed (with dates)",
135
+ "Account identifier",
136
+ "Note-taking method ready (or recording where legally permitted)"
137
+ ],
138
+ "contributed_by": "support-escalator agent (v0.9.87 community drop)",
139
+ "updated_at": "2026-05-20T06:09:47Z"
140
+ }