@agenticmail/core 0.9.22 → 0.9.24
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.
- package/dist/index.cjs +318 -23
- package/dist/index.d.cts +282 -2
- package/dist/index.d.ts +282 -2
- package/dist/index.js +309 -23
- package/dist/skills/built-in/airline-change-or-refund.json +111 -0
- package/dist/skills/built-in/book-medical-appointment.json +99 -0
- package/dist/skills/built-in/book-restaurant-reservation.json +93 -0
- package/dist/skills/built-in/cancel-subscription-graceful.json +101 -0
- package/dist/skills/built-in/court-administrative-checkin.json +99 -0
- package/dist/skills/built-in/dispute-credit-card-charge.json +105 -0
- package/dist/skills/built-in/handle-debt-collector.json +109 -0
- package/dist/skills/built-in/negotiate-bill-reduction.json +116 -0
- package/dist/skills/built-in/schedule-home-service.json +100 -0
- package/package.json +1 -1
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "book-restaurant-reservation",
|
|
3
|
+
"name": "Book a Restaurant Reservation",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"category": "reservations",
|
|
6
|
+
"tags": ["restaurant", "dining", "reservation", "phone-call"],
|
|
7
|
+
"description": "Call a restaurant to book a table at a specific date / time / party size, handle full-availability gracefully, and politely angle for a better table or time when possible.",
|
|
8
|
+
"disclaimer": null,
|
|
9
|
+
"context": {
|
|
10
|
+
"when_to_use": "User wants a table at a specific restaurant for a specific date and time. The restaurant either doesn't take online reservations, the desired slot isn't showing online, or the user wants a specific seating area (window, patio, booth) that the online system doesn't let them request.",
|
|
11
|
+
"preconditions": [
|
|
12
|
+
"User has the date, time, and party size locked in (or a small acceptable window for each).",
|
|
13
|
+
"User has the restaurant's phone number.",
|
|
14
|
+
"User has their name + a callback number to leave for the reservation.",
|
|
15
|
+
"If applicable: any dietary restrictions, allergies, or accessibility needs."
|
|
16
|
+
],
|
|
17
|
+
"estimated_call_duration_minutes": 5
|
|
18
|
+
},
|
|
19
|
+
"principles": [
|
|
20
|
+
"Be brief and warm — a host fielding 50 calls a night appreciates someone who gets to the point.",
|
|
21
|
+
"Lead with the specific ask, not small talk. 'I'd like to book a table for two on Friday at 7:30' before any pleasantry.",
|
|
22
|
+
"If the first slot is full, have a fallback ready BEFORE they ask. Don't make the host scroll through options for you.",
|
|
23
|
+
"Special requests (window seat, anniversary cake) go AT THE END after the booking is confirmed, not as a condition of the booking.",
|
|
24
|
+
"Always thank the host by name before hanging up."
|
|
25
|
+
],
|
|
26
|
+
"phrases": {
|
|
27
|
+
"opener": "Hi, I'd like to book a table for [party_size] on [day] at [time] — is that available?",
|
|
28
|
+
"fallback_offer": "If [time] doesn't work, I'm flexible — anywhere from [earlier_time] to [later_time] would also work.",
|
|
29
|
+
"request_specific_seating": "If you have a [seating preference, e.g. booth, patio, window] available, that would be lovely — but only if it works with what you've got.",
|
|
30
|
+
"occasion_note": "We're celebrating [occasion] — no need to do anything special, just thought you should know.",
|
|
31
|
+
"callback_left": "My name is [name] and the best number is [phone]. Should I confirm anything else?",
|
|
32
|
+
"graceful_close_success": "Thank you so much, [host_name] — we'll see you [day] at [time].",
|
|
33
|
+
"graceful_close_full": "No worries at all, thanks for checking. I'll try [alternate_date] online. Have a great evening!"
|
|
34
|
+
},
|
|
35
|
+
"tactics": [
|
|
36
|
+
{
|
|
37
|
+
"name": "Open with the full ask",
|
|
38
|
+
"when": "First substantive turn.",
|
|
39
|
+
"script": "Use `opener`. Include party size, day, and time in the first sentence — saves the host from extracting them piece by piece.",
|
|
40
|
+
"priority": 1
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "Offer flexibility immediately if asked",
|
|
44
|
+
"when": "Host says the requested time isn't available.",
|
|
45
|
+
"script": "Use `fallback_offer` with the user's pre-stated acceptable window. Don't make the host ask 'what about earlier?' three times.",
|
|
46
|
+
"priority": 2
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"name": "Add the occasion AFTER confirmation",
|
|
50
|
+
"when": "Reservation is confirmed; host is wrapping up.",
|
|
51
|
+
"script": "Mention the occasion with `occasion_note`. Hosts often quietly arrange something small (a sparkler, a window table) when they have a beat of time. Asking before confirmation makes it feel transactional."
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"name": "Get the host's name",
|
|
55
|
+
"when": "Reservation is confirmed.",
|
|
56
|
+
"script": "Casual: 'Sorry, I didn't catch your name?' Then thank them by name on close. Restaurants notice."
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
"boundaries": [
|
|
60
|
+
"Do NOT promise a tip or anything monetary in exchange for a better table.",
|
|
61
|
+
"Do NOT lie about the occasion (e.g. claiming it's a birthday when it isn't) to get free dessert.",
|
|
62
|
+
"Do NOT haggle on minimums or fees — that's for the host's manager, not the host.",
|
|
63
|
+
"Do NOT keep the host on the phone with small talk if they sound rushed."
|
|
64
|
+
],
|
|
65
|
+
"success_signals": [
|
|
66
|
+
"Host confirms the date / time / party size.",
|
|
67
|
+
"Host volunteers seating ('I have a nice booth open')."
|
|
68
|
+
],
|
|
69
|
+
"failure_signals": [
|
|
70
|
+
"Restaurant is closed on the requested day.",
|
|
71
|
+
"Restaurant requires online-only reservations.",
|
|
72
|
+
"Restaurant is fully booked for every slot in the user's window."
|
|
73
|
+
],
|
|
74
|
+
"exit_strategy": {
|
|
75
|
+
"on_success": "Read back the date, time, party size, and the name the reservation is under. Thank the host by name.",
|
|
76
|
+
"on_failure": "Thank the host warmly, mention you'll try the online system or another date, and end the call. Report back so the user can pick an alternative.",
|
|
77
|
+
"follow_ups": [
|
|
78
|
+
"Calendar the reservation in the user's calendar with the restaurant name + party size + reservation name.",
|
|
79
|
+
"If the restaurant takes confirmation calls or texts, note that and watch for them."
|
|
80
|
+
]
|
|
81
|
+
},
|
|
82
|
+
"required_user_info": [
|
|
83
|
+
"Restaurant name + phone number",
|
|
84
|
+
"Party size",
|
|
85
|
+
"Date(s) acceptable",
|
|
86
|
+
"Time(s) acceptable (with a flex window)",
|
|
87
|
+
"Name to put the reservation under",
|
|
88
|
+
"Callback number to leave",
|
|
89
|
+
"Any dietary restrictions or accessibility needs",
|
|
90
|
+
"Occasion (optional)"
|
|
91
|
+
],
|
|
92
|
+
"contributed_by": "AgenticMail core team"
|
|
93
|
+
}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "cancel-subscription-graceful",
|
|
3
|
+
"name": "Cancel a Subscription (and capture any retention offer)",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"category": "subscription",
|
|
6
|
+
"tags": ["cancel", "subscription", "retention", "save-money"],
|
|
7
|
+
"description": "Call a subscription provider to cancel, while also capturing any retention offer the user might want to accept instead of fully cancelling. Common for gyms, software, magazines, streaming, SiriusXM.",
|
|
8
|
+
"disclaimer": null,
|
|
9
|
+
"context": {
|
|
10
|
+
"when_to_use": "User wants to cancel a recurring subscription. They've already decided to cancel; they're open to a retention offer if it's compelling, but the default is to walk away.",
|
|
11
|
+
"preconditions": [
|
|
12
|
+
"User has account info (login email, phone number on file, or account number).",
|
|
13
|
+
"User has clear intent: 'cancel by default, accept only if retention offer drops the price by X% or includes Y'.",
|
|
14
|
+
"User knows when the next billing cycle hits — useful for timing the cancellation."
|
|
15
|
+
],
|
|
16
|
+
"estimated_call_duration_minutes": 15
|
|
17
|
+
},
|
|
18
|
+
"principles": [
|
|
19
|
+
"Be firm about cancellation up front. 'I'd like to cancel' is the first sentence, not the fifth.",
|
|
20
|
+
"When the rep counter-offers, treat it as new information — write it down, don't reject it instantly.",
|
|
21
|
+
"Decisions on whether to ACCEPT a retention offer are not yours; check back with the user (via `ask_operator`) unless the operator pre-authorised a clear acceptance threshold.",
|
|
22
|
+
"Get a cancellation confirmation NUMBER in writing (email). 'Verbally confirmed' has burned operators in the past.",
|
|
23
|
+
"Watch for the 'we'll send you a final invoice' move — that's not a problem unless it's higher than expected. Confirm the FINAL amount."
|
|
24
|
+
],
|
|
25
|
+
"phrases": {
|
|
26
|
+
"opener": "Hi, I'd like to cancel my subscription, please. My account is under [email/account-number].",
|
|
27
|
+
"stall_thinking": "Let me think about that for one second.",
|
|
28
|
+
"stall_research": "Hold on one moment — I want to double-check something before I commit.",
|
|
29
|
+
"decline_retention": "I appreciate the offer, but I'm going to go ahead and cancel today. Could we go through the cancellation process now?",
|
|
30
|
+
"accept_retention_provisional": "That's a better offer than I was expecting. I want to think about it for a few minutes — can I call back if I decide to take it, or do I need to decide right now?",
|
|
31
|
+
"confirm_final_amount": "Just to confirm — what's my final amount, and when will the service stop?",
|
|
32
|
+
"request_confirmation_email": "Can you send a cancellation confirmation to my email on file? I want it in writing.",
|
|
33
|
+
"graceful_close": "Thank you for taking care of this. Have a good rest of your day."
|
|
34
|
+
},
|
|
35
|
+
"tactics": [
|
|
36
|
+
{
|
|
37
|
+
"name": "State cancellation in the first sentence",
|
|
38
|
+
"when": "Immediately after the rep finishes their opening greeting.",
|
|
39
|
+
"script": "Use `opener`. Don't volunteer a reason yet — the rep will ask, and your reason matters less than the fact you've already made a decision.",
|
|
40
|
+
"priority": 1
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "Give a brief, low-emotional reason",
|
|
44
|
+
"when": "Rep asks why you're cancelling.",
|
|
45
|
+
"script": "Pick the simplest true reason. 'I'm not using it enough to justify the cost' is calm and gives the rep nothing to argue with. Don't badmouth the product — that triggers defensive responses."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "Hear out the retention offer once",
|
|
49
|
+
"when": "Rep starts pitching savings.",
|
|
50
|
+
"script": "Let them say their full pitch. Then ask: 'What's the total cost over the next 12 months if I accept this offer?' Specific number = decidable."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "Defer the decision to the operator",
|
|
54
|
+
"when": "Retention offer is in the user's pre-stated acceptance range OR is so good you want to confirm.",
|
|
55
|
+
"script": "Use `accept_retention_provisional`. Then call `ask_operator` with the exact offer + total cost + any new terms. Do NOT accept on the user's behalf without explicit authorisation."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "Stay polite if the rep escalates",
|
|
59
|
+
"when": "Rep says 'are you sure?' / 'let me transfer you to a specialist'.",
|
|
60
|
+
"script": "Two paths: (a) if you have time, accept the transfer — the specialist often has better authority and the call ends faster. (b) if you don't, say: 'I've decided. Could we just process the cancellation now?'"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "Get the confirmation number AND the email",
|
|
64
|
+
"when": "Cancellation is processing.",
|
|
65
|
+
"script": "Use `confirm_final_amount` and `request_confirmation_email`. Repeat both back: 'So my final charge is [amount], the service stops on [date], and you'll send me a confirmation email today — is that right?'"
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"boundaries": [
|
|
69
|
+
"Do NOT accept a retention offer without explicit authorisation from the user. Their pre-stated 'I'd take it if X' is authorisation; ambiguous offers go through `ask_operator`.",
|
|
70
|
+
"Do NOT give in to guilt tactics ('after all these years?'). Stay friendly but on-mission.",
|
|
71
|
+
"Do NOT cancel without confirming the final billing amount. Some providers prorate; some charge a full final cycle.",
|
|
72
|
+
"Do NOT let the rep convert the cancellation into a 'pause' or 'free month' without explicit operator agreement — paused subscriptions often auto-restart.",
|
|
73
|
+
"Do NOT badmouth competitors or the product. Reps are humans; rudeness shortens the call but spoils your goodwill."
|
|
74
|
+
],
|
|
75
|
+
"success_signals": [
|
|
76
|
+
"Rep generates a cancellation confirmation number.",
|
|
77
|
+
"Rep confirms the final amount + service stop date.",
|
|
78
|
+
"Rep agrees to send a confirmation email."
|
|
79
|
+
],
|
|
80
|
+
"failure_signals": [
|
|
81
|
+
"Rep insists cancellation requires a written letter or fax (some gyms / magazines still do this — note it and exit).",
|
|
82
|
+
"Rep won't give a confirmation number or written confirmation.",
|
|
83
|
+
"Rep transfers you in circles without progress."
|
|
84
|
+
],
|
|
85
|
+
"exit_strategy": {
|
|
86
|
+
"on_success": "Read back the cancellation confirmation number, the final billing amount, and the service stop date. Confirm the confirmation email is coming. Thank the rep.",
|
|
87
|
+
"on_failure": "Note the obstacle (e.g. 'requires written notice mailed to corporate'), get the exact address / form requirements, and end the call. The operator can follow up via mail or escalation.",
|
|
88
|
+
"follow_ups": [
|
|
89
|
+
"Email the operator: cancellation confirmation number, stop date, final amount.",
|
|
90
|
+
"Calendar a check at the stop date to confirm no further charges hit the user's card.",
|
|
91
|
+
"If a written-notice path is required, draft the cancellation letter and email it to the operator for review."
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"required_user_info": [
|
|
95
|
+
"Account login email or account number",
|
|
96
|
+
"User's clear intent: cancel-by-default + acceptance threshold for any retention offer",
|
|
97
|
+
"Next billing date",
|
|
98
|
+
"Email address for confirmation"
|
|
99
|
+
],
|
|
100
|
+
"contributed_by": "AgenticMail core team"
|
|
101
|
+
}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "court-administrative-checkin",
|
|
3
|
+
"name": "Court Administrative Check-in (clerk's office, NOT representation)",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"category": "legal-admin",
|
|
6
|
+
"tags": ["court", "clerk", "filing", "case-status", "legal", "administrative"],
|
|
7
|
+
"description": "Call a court clerk's office to check case status, confirm a filing was received, look up the next hearing date, request a copy of a docket entry, or ask about administrative procedures. This is NEVER legal advice or representation.",
|
|
8
|
+
"disclaimer": "I am an AI assistant calling on behalf of [name]. I am not a licensed attorney, and nothing on this call constitutes legal advice or representation. I am only requesting administrative information from the clerk's office.",
|
|
9
|
+
"context": {
|
|
10
|
+
"when_to_use": "User needs administrative information from a court clerk's office: did my filing arrive? What's the next hearing date? Where do I send a payment? How do I request a copy of an order? This skill is STRICTLY for clerk's-office administrative work. ANY substantive legal question — strategy, what to file, whether to plead, how to respond — requires a licensed attorney and is OUTSIDE the scope of this skill.",
|
|
11
|
+
"preconditions": [
|
|
12
|
+
"Case number (case caption + court + docket / case number).",
|
|
13
|
+
"Party name as it appears in the case caption.",
|
|
14
|
+
"User's authorisation to call as their agent for administrative inquiries only.",
|
|
15
|
+
"User has confirmed they are NOT seeking legal advice through this call.",
|
|
16
|
+
"If the case involves an attorney of record, the user has confirmed the attorney is OK with this administrative call (or the user is pro se / self-represented)."
|
|
17
|
+
],
|
|
18
|
+
"estimated_call_duration_minutes": 15
|
|
19
|
+
},
|
|
20
|
+
"principles": [
|
|
21
|
+
"RECITE THE DISCLAIMER at the top of the substantive turn. Always. No exceptions.",
|
|
22
|
+
"If the clerk starts to ask substantive legal questions ('what's your plea?', 'are you contesting?'), redirect: 'I'm only an administrative assistant — the party / their attorney will address that directly.'",
|
|
23
|
+
"Use the case caption exactly. Courts route by case number; getting it wrong wastes time.",
|
|
24
|
+
"Clerks are not lawyers. They will sometimes give procedural advice that turns out to be subtly wrong. Verify anything important with the user (and ideally, an attorney) before acting on it.",
|
|
25
|
+
"Be patient and respectful. Clerk's offices are understaffed; being kind to the clerk often unlocks help that wouldn't otherwise be offered."
|
|
26
|
+
],
|
|
27
|
+
"phrases": {
|
|
28
|
+
"open_disclaimer": "Before we start: I am an AI assistant calling on behalf of [name]. I am not a licensed attorney, and nothing I say is legal advice. I'm only asking the clerk's office for administrative information.",
|
|
29
|
+
"opener_case_status": "I'd like to check the status of case [number] — [party] versus [other party]. Could you tell me the most recent docket entries and the next scheduled hearing date?",
|
|
30
|
+
"opener_filing_confirmation": "I'd like to confirm whether a filing was received and entered for case [number]. The filing was [type] sent on [date].",
|
|
31
|
+
"opener_payment_or_copy": "I need to know how to [request a certified copy of an order / pay a fee / submit a form] for case [number].",
|
|
32
|
+
"redirect_substantive": "I appreciate the question, but I'm not authorised to discuss the substance of the case. The party or their attorney will address that directly. Could we stick to the administrative question?",
|
|
33
|
+
"ask_next_step": "What's the next step from the party's side — anything they need to file, attend, or respond to by a specific date?",
|
|
34
|
+
"request_confirmation_method": "Will the clerk's office mail or email a confirmation, or should the party check the docket online? Is there a website where the docket is published?",
|
|
35
|
+
"graceful_close": "Thank you for your time. To confirm: [recap of what was learned]. I'll relay this to [name]."
|
|
36
|
+
},
|
|
37
|
+
"tactics": [
|
|
38
|
+
{
|
|
39
|
+
"name": "Disclaimer + the specific administrative question",
|
|
40
|
+
"when": "First substantive turn.",
|
|
41
|
+
"script": "Use `open_disclaimer` then the matching opener (`opener_case_status`, `opener_filing_confirmation`, `opener_payment_or_copy`). The opener fits the user's actual question.",
|
|
42
|
+
"priority": 1
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
"name": "Redirect substantive legal questions back to the party",
|
|
46
|
+
"when": "Clerk asks anything beyond administrative info.",
|
|
47
|
+
"script": "Use `redirect_substantive`. Don't give the clerk a substantive answer even if you 'know' it. The party or their attorney owns those answers."
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "Ask for the procedural next step",
|
|
51
|
+
"when": "Administrative info is gathered.",
|
|
52
|
+
"script": "Use `ask_next_step`. Clerks often volunteer 'the next hearing is on X' or 'they need to file Y by Z' — capture those dates accurately."
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
"name": "Confirm the source of truth",
|
|
56
|
+
"when": "Wrapping up.",
|
|
57
|
+
"script": "Use `request_confirmation_method`. Most courts have a docket-online portal; learn the URL so the user can verify what you were told."
|
|
58
|
+
}
|
|
59
|
+
],
|
|
60
|
+
"boundaries": [
|
|
61
|
+
"NEVER give legal advice. Not even small advice. Not even repeating advice the clerk gave. The user must hear it directly from a licensed attorney to rely on it.",
|
|
62
|
+
"NEVER answer substantive questions about the case (plea, position, strategy).",
|
|
63
|
+
"NEVER claim to be an attorney or to represent the party. You are an administrative agent.",
|
|
64
|
+
"NEVER skip the disclaimer.",
|
|
65
|
+
"NEVER cite legal authority. If the clerk asks 'on what basis?' or 'what rule?', say: 'I'm only here for administrative information — the party's attorney would address that.'",
|
|
66
|
+
"NEVER use this skill for substantive litigation tasks: filing a brief, arguing a motion, negotiating a settlement, advising on a plea, requesting a stay. All of those require a licensed attorney."
|
|
67
|
+
],
|
|
68
|
+
"success_signals": [
|
|
69
|
+
"Clerk confirms case status / filing receipt / next hearing.",
|
|
70
|
+
"Clerk provides a docket-portal URL or written confirmation.",
|
|
71
|
+
"Clerk's responses stay administrative (no substantive legal questions came up)."
|
|
72
|
+
],
|
|
73
|
+
"failure_signals": [
|
|
74
|
+
"Clerk refuses to discuss the case (case may be sealed or restricted — note and exit).",
|
|
75
|
+
"Clerk insists on substantive answers the user hasn't authorised the AI to give.",
|
|
76
|
+
"Clerk gives ambiguous or contradictory information (note exactly what was said; the user should confirm via the docket portal or an attorney)."
|
|
77
|
+
],
|
|
78
|
+
"exit_strategy": {
|
|
79
|
+
"on_success": "Read back: docket entries learned, next hearing date, next step required from the party (with deadline), docket-portal URL if available. Thank the clerk.",
|
|
80
|
+
"on_failure": "Note exactly what the clerk said and what was refused. Thank the clerk. Report back so the user can call back themselves or consult an attorney.",
|
|
81
|
+
"follow_ups": [
|
|
82
|
+
"Email the user: case status, next hearing date, any deadlines, docket-portal URL, the clerk's name + extension if given.",
|
|
83
|
+
"Calendar the next hearing date.",
|
|
84
|
+
"Calendar any deadline mentioned (with a 3-day buffer reminder).",
|
|
85
|
+
"STRONGLY recommend the user verify substantive matters with a licensed attorney."
|
|
86
|
+
]
|
|
87
|
+
},
|
|
88
|
+
"required_user_info": [
|
|
89
|
+
"Case number + court + party name as in the caption",
|
|
90
|
+
"User's explicit authorisation for an administrative call ONLY",
|
|
91
|
+
"User's confirmation that they understand this is not legal advice",
|
|
92
|
+
"Whether the case has an attorney of record (and if so, whether they've cleared this administrative call)"
|
|
93
|
+
],
|
|
94
|
+
"contributed_by": "AgenticMail core team",
|
|
95
|
+
"extra": {
|
|
96
|
+
"scope": "STRICTLY administrative. Substantive legal work requires a licensed attorney.",
|
|
97
|
+
"disclaimer_required_reason": "Unauthorised practice of law is a crime in every US jurisdiction. The disclaimer is the user's protection AND the agent's."
|
|
98
|
+
}
|
|
99
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "dispute-credit-card-charge",
|
|
3
|
+
"name": "Dispute a Credit Card Charge",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"category": "finance-admin",
|
|
6
|
+
"tags": ["chargeback", "fraud", "dispute", "billing", "credit-card"],
|
|
7
|
+
"description": "Call a credit card issuer's customer service line to dispute a specific charge (fraudulent, duplicate, service-not-received, billing error). Walk through the issuer's dispute flow and capture a case number.",
|
|
8
|
+
"disclaimer": null,
|
|
9
|
+
"context": {
|
|
10
|
+
"when_to_use": "User has identified a specific charge on their statement they want disputed. This skill is for the FIRST call to the issuer. If the issuer denies the dispute and the user wants to escalate, that's a different skill (escalate-credit-dispute).",
|
|
11
|
+
"preconditions": [
|
|
12
|
+
"Cardholder's name + last 4 digits of the card (issuer rarely needs the full number on a callback).",
|
|
13
|
+
"Specific charge: date, merchant name as shown on statement, exact amount.",
|
|
14
|
+
"Dispute reason in one of these standard categories: fraud / unauthorised, duplicate charge, service not received, item not as described, amount wrong, recurring charge after cancellation.",
|
|
15
|
+
"What the user has already tried (contacted the merchant directly? When? Result?)."
|
|
16
|
+
],
|
|
17
|
+
"estimated_call_duration_minutes": 20
|
|
18
|
+
},
|
|
19
|
+
"principles": [
|
|
20
|
+
"Pick ONE dispute category up front and stick to it. Issuers categorise disputes; switching mid-call resets the form.",
|
|
21
|
+
"Be specific. Vague disputes get denied; specific ones with dates, names, and amounts succeed.",
|
|
22
|
+
"Note merchant contact history. Issuers often ask 'did you try the merchant first?' — for non-fraud disputes, this is sometimes required.",
|
|
23
|
+
"Get a case number BEFORE you hang up. No case number = no traceable dispute.",
|
|
24
|
+
"Provisional credit is the issuer's standard move on fraud disputes — accept it but understand it's reversible if the dispute is later denied.",
|
|
25
|
+
"Stay calm. You're not arguing — you're following a process. The rep didn't make the charge; they're routing your form."
|
|
26
|
+
],
|
|
27
|
+
"phrases": {
|
|
28
|
+
"opener": "Hi, I'd like to dispute a charge on my account. The cardholder's name is [name], last four of the card is [last4]. The charge is [amount] on [date] from [merchant].",
|
|
29
|
+
"category_fraud": "I did not authorise this charge — I don't recognise the merchant and the card was in my possession.",
|
|
30
|
+
"category_duplicate": "This charge appears twice on my statement on the same date for the same amount. Only one transaction should have gone through.",
|
|
31
|
+
"category_service_not_received": "I was billed but never received the service / item. I tried contacting the merchant on [date] and [outcome].",
|
|
32
|
+
"category_recurring_after_cancel": "I cancelled this subscription on [date] but I'm still being billed. I have [confirmation evidence] but I'd like the issuer to stop the charges and refund what was billed after cancellation.",
|
|
33
|
+
"request_case_number": "Can I get a case number or reference for this dispute?",
|
|
34
|
+
"ask_about_provisional": "Will I get a provisional credit while you investigate? If so, when?",
|
|
35
|
+
"ask_about_timeline": "How long does the investigation usually take, and what's the next step from my side — do I need to send documentation?",
|
|
36
|
+
"ask_card_replacement": "Given this might be unauthorised, should we close this card and issue a new number so further charges can't hit it?",
|
|
37
|
+
"graceful_close": "Thank you. To confirm, the case number is [number], the disputed amount is [amount], and you'll [next step]. I'll watch for the email."
|
|
38
|
+
},
|
|
39
|
+
"tactics": [
|
|
40
|
+
{
|
|
41
|
+
"name": "Open with all the facts at once",
|
|
42
|
+
"when": "First substantive turn.",
|
|
43
|
+
"script": "Use `opener`. Save the rep five questions by giving name, last4, amount, date, merchant in one go.",
|
|
44
|
+
"priority": 1
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"name": "State the dispute category cleanly",
|
|
48
|
+
"when": "Rep asks why you're disputing.",
|
|
49
|
+
"script": "Pick the matching `category_*` phrase. Avoid mixing categories — 'fraud AND duplicate' confuses the form."
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
"name": "Volunteer merchant contact history",
|
|
53
|
+
"when": "Non-fraud dispute (service-not-received, billing error).",
|
|
54
|
+
"script": "If the user already contacted the merchant, share: when, who they spoke to, what was promised, what happened. Issuers prefer disputes where the cardholder tried the merchant first."
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
"name": "Ask for a new card on fraud disputes",
|
|
58
|
+
"when": "Dispute category is fraud / unauthorised.",
|
|
59
|
+
"script": "Use `ask_card_replacement`. Even if the rep is on top of it, asking explicitly creates a paper trail. New card number = no further fraudulent charges on the same number."
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
"name": "Capture case number, provisional credit, timeline",
|
|
63
|
+
"when": "Dispute is filed.",
|
|
64
|
+
"script": "Use `request_case_number`, `ask_about_provisional`, `ask_about_timeline`. Read back at close (`graceful_close`)."
|
|
65
|
+
}
|
|
66
|
+
],
|
|
67
|
+
"boundaries": [
|
|
68
|
+
"Do NOT exaggerate the dispute. 'It's fraud!' for a charge the user actually recognises but is unhappy with will get the dispute denied and may flag the user's account.",
|
|
69
|
+
"Do NOT commit to documentation the user can't produce. If the rep asks for a screenshot / receipt / cancellation confirmation, take note but don't pretend you have something you don't.",
|
|
70
|
+
"Do NOT accept a 'merchant credit' as a substitute for a chargeback unless the user has authorised that path — once you accept the merchant credit, the dispute usually closes.",
|
|
71
|
+
"Do NOT share the full card number or CVV — issuers can pull the account by last4 + name + DOB or zip.",
|
|
72
|
+
"Do NOT escalate to a supervisor until the front-line rep has had a fair shot. The first dispute call is form-filing, not negotiation."
|
|
73
|
+
],
|
|
74
|
+
"success_signals": [
|
|
75
|
+
"Rep generates a case / reference number.",
|
|
76
|
+
"Rep mentions provisional credit (for fraud / duplicate / billing error).",
|
|
77
|
+
"Rep agrees to a timeline (e.g. 'investigation completes in 10-14 business days').",
|
|
78
|
+
"Rep offers to close the card and reissue (for fraud)."
|
|
79
|
+
],
|
|
80
|
+
"failure_signals": [
|
|
81
|
+
"Rep denies the dispute on the call (front-line CSRs rarely have this authority — if it happens, ask for the dispute team or a supervisor).",
|
|
82
|
+
"Rep insists you contact the merchant first when the category is fraud (this is non-standard — escalate).",
|
|
83
|
+
"Rep won't give a case number."
|
|
84
|
+
],
|
|
85
|
+
"exit_strategy": {
|
|
86
|
+
"on_success": "Read back: case number, disputed amount, dispute category, provisional credit yes/no + when, expected timeline, any documentation requested from your side. Thank the rep.",
|
|
87
|
+
"on_failure": "Note the obstacle. Thank the rep. Report back so the operator can decide whether to escalate or pursue the merchant directly.",
|
|
88
|
+
"follow_ups": [
|
|
89
|
+
"Email the operator: case number, dispute amount, provisional credit status, timeline, documentation requested.",
|
|
90
|
+
"Calendar a check-in at the end of the timeline window.",
|
|
91
|
+
"If documentation was requested, calendar a same-week reminder to gather + send it."
|
|
92
|
+
]
|
|
93
|
+
},
|
|
94
|
+
"required_user_info": [
|
|
95
|
+
"Cardholder's full name + last 4 of the card",
|
|
96
|
+
"Disputed charge: exact amount, date, merchant name as shown on statement",
|
|
97
|
+
"Dispute category (fraud / duplicate / service-not-received / wrong amount / recurring-after-cancel)",
|
|
98
|
+
"Merchant contact history (for non-fraud)",
|
|
99
|
+
"What the user wants: refund + new card / refund + close subscription / refund only"
|
|
100
|
+
],
|
|
101
|
+
"contributed_by": "AgenticMail core team",
|
|
102
|
+
"extra": {
|
|
103
|
+
"jurisdiction": "US — most major US issuers; EU PSD2 disputes follow a different process and need a separate skill."
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "handle-debt-collector",
|
|
3
|
+
"name": "Handle a Debt Collector Call (US-FDCPA-aware)",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"category": "debt-collection",
|
|
6
|
+
"tags": ["debt", "collection", "FDCPA", "legal", "consumer-protection"],
|
|
7
|
+
"description": "Field a call from a debt collector on the operator's behalf without acknowledging the debt, request written validation per FDCPA, and end the call cleanly. US-specific.",
|
|
8
|
+
"disclaimer": "I am an AI assistant calling on behalf of the account holder. I am not a licensed attorney, and nothing I say constitutes legal advice. Please send any requests in writing to the address on file. The account holder will respond through their own channels.",
|
|
9
|
+
"context": {
|
|
10
|
+
"when_to_use": "A US debt collector calls the operator (or the operator wants the agent to call them back). The Fair Debt Collection Practices Act (FDCPA, 15 U.S.C. §1692) gives the consumer specific rights: validation of debt, restrictions on contact times, the right to dispute. Goal: NOT to negotiate the debt, but to (a) request written validation, (b) document the contact, (c) refuse to admit the debt, and (d) end the call without making payment commitments.",
|
|
11
|
+
"preconditions": [
|
|
12
|
+
"Operator has authorised the agent to field debt-collection calls on their behalf.",
|
|
13
|
+
"Operator's full legal name + an address for written correspondence is on file.",
|
|
14
|
+
"Jurisdiction is the United States. For other countries, do NOT use this skill — load the jurisdiction-specific variant or refuse the call."
|
|
15
|
+
],
|
|
16
|
+
"estimated_call_duration_minutes": 8
|
|
17
|
+
},
|
|
18
|
+
"principles": [
|
|
19
|
+
"Never acknowledge the debt verbally. 'I'm not in a position to confirm or discuss the debt on this call' is your baseline response to anything about amount, age, or origin.",
|
|
20
|
+
"ASK for written validation under FDCPA §1692g — the collector must send it within 5 days of initial contact.",
|
|
21
|
+
"Document the call. Get the collector's full name, the company name, an address, and a callback number — read them back for confirmation.",
|
|
22
|
+
"Never make a payment commitment, partial payment, or 'pay-by-date' on the call. Those statements can restart the statute of limitations.",
|
|
23
|
+
"Stay calm and polite. Collectors who escalate are gathering evidence; collectors who remain professional are following the script. Match their professionalism.",
|
|
24
|
+
"If the collector is abusive, threatens arrest, claims to be law enforcement, or refuses to identify themselves — note it and end the call. Those are FDCPA violations and worth documenting."
|
|
25
|
+
],
|
|
26
|
+
"phrases": {
|
|
27
|
+
"open_disclaimer": "Before we go further: I'm an AI assistant calling on behalf of [legal name]. I'm not an attorney and nothing I say is legal advice. Please continue.",
|
|
28
|
+
"ask_who_you_are": "May I get your full name, the name of the company you're calling from, and a callback number?",
|
|
29
|
+
"request_validation": "Under the Fair Debt Collection Practices Act, I'd like you to send written validation of this debt to the address on file — including the amount, the original creditor, and your authority to collect. Can you confirm you'll send that?",
|
|
30
|
+
"refuse_to_acknowledge": "I'm not in a position to confirm or discuss the debt on this call. Please send the validation in writing.",
|
|
31
|
+
"refuse_payment_request": "I won't be making any payment or payment arrangement on this call. The account holder will respond through their own channels after receiving written validation.",
|
|
32
|
+
"ask_to_stop_calling": "Per FDCPA §1692c(c), please cease further phone contact and use written correspondence only. Can you confirm you'll note the file accordingly?",
|
|
33
|
+
"document_abuse": "I need to note that you just [described behaviour]. I'm ending the call. Please send all future communication in writing.",
|
|
34
|
+
"graceful_close": "Thank you. The account holder will respond in writing after receiving the validation. Have a good day."
|
|
35
|
+
},
|
|
36
|
+
"tactics": [
|
|
37
|
+
{
|
|
38
|
+
"name": "Open with the disclaimer + identity ask",
|
|
39
|
+
"when": "First substantive turn.",
|
|
40
|
+
"script": "Use `open_disclaimer` then `ask_who_you_are`. Write down (in the call transcript) every piece of identifying info the collector gives.",
|
|
41
|
+
"priority": 1
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"name": "Request written validation immediately",
|
|
45
|
+
"when": "After identity is documented.",
|
|
46
|
+
"script": "Use `request_validation`. This is the single most important move — once validation is requested, the collector is legally required to send it before any further collection activity.",
|
|
47
|
+
"priority": 2
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"name": "Refuse to acknowledge the debt",
|
|
51
|
+
"when": "Collector asks about the amount, the original creditor, or any account details.",
|
|
52
|
+
"script": "Use `refuse_to_acknowledge`. Repeat as needed — the collector will often re-ask in different words.",
|
|
53
|
+
"priority": 3
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"name": "Refuse to commit to payment",
|
|
57
|
+
"when": "Collector asks for a payment date, settlement, or partial payment.",
|
|
58
|
+
"script": "Use `refuse_payment_request`. Do NOT entertain a settlement amount even hypothetically — even a 'I'd consider $X' can be cited later as an acknowledgment."
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
"name": "Request cease-of-phone-contact (optional)",
|
|
62
|
+
"when": "The operator has pre-authorised cease-and-desist on phone calls (per FDCPA §1692c(c)).",
|
|
63
|
+
"script": "Use `ask_to_stop_calling`. Only do this if the operator has authorised it — once requested, the collector may sue (in writing) without further phone contact, which can accelerate legal action."
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"name": "Document and exit on abusive behaviour",
|
|
67
|
+
"when": "Collector threatens arrest, jail, wage garnishment without a court order, claims to be law enforcement, uses profanity, or refuses to identify themselves.",
|
|
68
|
+
"script": "Use `document_abuse` and end the call. The transcript becomes evidence for an FDCPA complaint to the CFPB or a state AG."
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
"boundaries": [
|
|
72
|
+
"NEVER acknowledge the debt's amount, age, or validity. Even 'yes that sounds about right' can restart the statute of limitations.",
|
|
73
|
+
"NEVER offer to pay, settle, or arrange payment on the call.",
|
|
74
|
+
"NEVER give the operator's bank account, credit card, or SSN to the collector.",
|
|
75
|
+
"NEVER lie — saying you're an attorney is a federal crime under 18 U.S.C. §912 if it implies you're operating as an attorney.",
|
|
76
|
+
"NEVER use this skill for non-US jurisdictions — FDCPA does not apply outside the US and the script may not match local law.",
|
|
77
|
+
"ALWAYS recite the disclaimer at the top of the substantive turn. This is required, not optional."
|
|
78
|
+
],
|
|
79
|
+
"success_signals": [
|
|
80
|
+
"Collector commits to sending written validation.",
|
|
81
|
+
"Collector accepts the request for written-only contact (if requested).",
|
|
82
|
+
"Call ends with the collector's full identification documented."
|
|
83
|
+
],
|
|
84
|
+
"failure_signals": [
|
|
85
|
+
"Collector refuses to identify themselves.",
|
|
86
|
+
"Collector becomes abusive, threatens arrest, or claims to be law enforcement.",
|
|
87
|
+
"Collector insists on a verbal acknowledgment of the debt before sending validation."
|
|
88
|
+
],
|
|
89
|
+
"exit_strategy": {
|
|
90
|
+
"on_success": "Read back the collector's name, company, callback number, and the written-validation commitment. Thank them. Email the operator the documented contact + a summary so they can decide on next steps.",
|
|
91
|
+
"on_failure": "End the call after documenting the issue (use `document_abuse` if applicable, or just `graceful_close` if it's a benign deadlock). The operator should consider an FDCPA complaint to the CFPB (consumerfinance.gov) or their state AG, and may want to consult an actual attorney.",
|
|
92
|
+
"follow_ups": [
|
|
93
|
+
"Email the operator: collector's name, company, callback number, key statements, and the full call transcript.",
|
|
94
|
+
"If any FDCPA red flags appeared (abuse, threats, false claims), include those prominently and suggest the operator speak to a consumer-protection attorney.",
|
|
95
|
+
"If written validation was promised, calendar a follow-up at day 7 to confirm it arrived."
|
|
96
|
+
]
|
|
97
|
+
},
|
|
98
|
+
"required_user_info": [
|
|
99
|
+
"Operator's full legal name + mailing address (for validation correspondence)",
|
|
100
|
+
"Authorisation for the agent to field debt-collection calls on their behalf",
|
|
101
|
+
"Pre-authorisation (or not) for the FDCPA §1692c(c) cease-phone-contact request"
|
|
102
|
+
],
|
|
103
|
+
"contributed_by": "AgenticMail core team",
|
|
104
|
+
"extra": {
|
|
105
|
+
"jurisdiction": "US",
|
|
106
|
+
"legal_framework": "FDCPA (15 U.S.C. §1692)",
|
|
107
|
+
"disclaimer_required_reason": "The agent is not an attorney; debt collection contains legal traps that demand the disclaimer up front."
|
|
108
|
+
}
|
|
109
|
+
}
|