@agenticmail/core 0.9.23 → 0.9.25

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.
@@ -0,0 +1,111 @@
1
+ {
2
+ "id": "airline-change-or-refund",
3
+ "name": "Change or Refund an Airline Reservation",
4
+ "version": "1.0.0",
5
+ "category": "travel",
6
+ "tags": ["airline", "flight", "refund", "rebook", "travel-disruption"],
7
+ "description": "Call an airline to change a booking, request a refund, or rebook around a cancelled / delayed flight. Surface fare rules, fee waivers, and travel credits that don't show in the app.",
8
+ "disclaimer": null,
9
+ "context": {
10
+ "when_to_use": "User needs to change a flight, get refunded for a cancelled flight, or rebook after a disruption. Use this when the airline's app / website doesn't expose the option the user needs, or when a fee waiver is plausible (weather, schedule change > 1 hour, illness with documentation, bereavement).",
11
+ "preconditions": [
12
+ "Confirmation number / record locator (6 letters and numbers).",
13
+ "Passenger's full name as shown on the ticket (matches photo ID).",
14
+ "Loyalty number, if any.",
15
+ "Original itinerary + the desired new itinerary (date / time / cities).",
16
+ "Reason for the change (schedule change, weather, personal — affects which waivers apply).",
17
+ "Whether the user wants a refund, travel credit, or a rebooked itinerary."
18
+ ],
19
+ "estimated_call_duration_minutes": 30
20
+ },
21
+ "principles": [
22
+ "Loyalty status matters. Lead with the elite number (Platinum, 1K, etc) if the user has one — different reps, different rules.",
23
+ "If the AIRLINE caused the disruption (cancellation, schedule change > 1 hour, equipment swap), the rules are MUCH more in the user's favour. Lead with the disruption fact.",
24
+ "Travel credits and refunds are different. A 'refund' goes back to the original payment; a 'travel credit' is airline-only money with an expiry. Be explicit about which you're asking for.",
25
+ "Fee waivers are sometimes discretionary — a calm, polite request from a long-tenured customer gets them more often than a demanding one.",
26
+ "Schedule change protections (DOT rules for US flights with significant schedule changes) often entitle a refund EVEN ON A NON-REFUNDABLE FARE. Don't accept 'non-refundable' as final.",
27
+ "If the first rep can't help, hold for a supervisor or call back later (different rep, different mood, sometimes different answer)."
28
+ ],
29
+ "phrases": {
30
+ "opener_with_status": "Hi, I'm calling about confirmation [PNR] for [passenger name]. I'm a [status] member — number [loyalty]. I need to [change / refund / rebook] this trip.",
31
+ "opener_without_status": "Hi, I'm calling about confirmation [PNR] for [passenger name]. I need to [change / refund / rebook] this trip.",
32
+ "lead_with_disruption": "Before we look at fees — this is because of [airline's schedule change / cancellation / equipment swap / weather waiver]. Can we look at change-fee or refund options under that policy first?",
33
+ "request_specific_rebook": "I'd like to move to [airline] flight [number] on [date] departing [time] — same routing. What's the difference in fare?",
34
+ "request_refund": "Given [reason], I'd like to refund the unused portion to the original form of payment. What's the refund amount and the processing time?",
35
+ "ask_credit_alternative": "If a refund isn't possible, what's the travel-credit option — value, expiry date, transferable?",
36
+ "ask_fee_waiver": "Is there any way to waive the change fee? I'm a long-time customer and this trip is for [brief reason].",
37
+ "stall_thinking": "Let me think about that for one second.",
38
+ "stall_research": "Hold on, I want to confirm something with the passenger before I commit.",
39
+ "graceful_close": "Thank you. To confirm: [new itinerary], confirmation [number], total [amount] charged or refund of [amount] to [method] arriving in [days]. I'll watch for the email."
40
+ },
41
+ "tactics": [
42
+ {
43
+ "name": "Lead with PNR + loyalty status",
44
+ "when": "First substantive turn.",
45
+ "script": "Use `opener_with_status` if the user has any elite status (even bronze). Status changes the rep's screen colour — they treat the call differently.",
46
+ "priority": 1
47
+ },
48
+ {
49
+ "name": "Frame the call as a disruption claim, not a customer change",
50
+ "when": "The airline caused (or contributed to) the change.",
51
+ "script": "Use `lead_with_disruption`. Cancellations, schedule changes > 60 min (for US carriers), equipment swaps that affect seat assignments, all unlock different waivers."
52
+ },
53
+ {
54
+ "name": "Ask for refund first, accept credit as fallback",
55
+ "when": "User has a clear preference for refund.",
56
+ "script": "Use `request_refund` first. If denied, use `ask_credit_alternative`. Credits should be accepted only if the user pre-authorised credits-OK."
57
+ },
58
+ {
59
+ "name": "Politely ask for a fee waiver",
60
+ "when": "A change fee is being quoted on a personal change (not a disruption).",
61
+ "script": "Use `ask_fee_waiver`. Don't make it a demand — make it a question with a tone of 'help me out if you can'."
62
+ },
63
+ {
64
+ "name": "Escalate to a supervisor",
65
+ "when": "Front-line rep says no on something a supervisor might say yes to (fee waiver, fare-difference reduction, specific seat reassignment).",
66
+ "script": "Polite: 'I appreciate you checking. Could we get a supervisor's read on this? Not because you've done anything wrong — I just want to make sure we've explored the policies before I commit.'"
67
+ },
68
+ {
69
+ "name": "Hang up and call back",
70
+ "when": "Call has gone in circles and the supervisor also said no.",
71
+ "script": "End politely, wait an hour, call back. Different rep, sometimes different answer. This is a known industry quirk; don't rage about it, just try again."
72
+ }
73
+ ],
74
+ "boundaries": [
75
+ "Do NOT commit to a fare difference > $X without explicit user authorisation. Use `ask_operator` for big numbers.",
76
+ "Do NOT accept a travel credit instead of a refund unless the user pre-authorised credit-OK.",
77
+ "Do NOT agree to non-refundable rules being final on a disruption-caused change — push back politely.",
78
+ "Do NOT share the user's full credit card on a recorded line if avoidable; the airline usually has the card on file.",
79
+ "Do NOT make up reasons to claim a waiver (bereavement, illness) — if the user doesn't have actual documentation, don't use those framings."
80
+ ],
81
+ "success_signals": [
82
+ "Rep waives a change fee.",
83
+ "Rep offers a refund to the original payment method.",
84
+ "Rep finds a flight in the user's preferred window.",
85
+ "Rep notes elite-status protections that exceed the base fare's rules."
86
+ ],
87
+ "failure_signals": [
88
+ "Rep + supervisor both decline waiver requests on a disruption-caused change (try calling back).",
89
+ "Rep can find no flight in the user's window for any price the user pre-authorised.",
90
+ "Refund processing time quoted at > 60 days (probably wrong — escalate)."
91
+ ],
92
+ "exit_strategy": {
93
+ "on_success": "Read back: new itinerary (flight numbers, dates, times, routing), confirmation number, total charged or refund amount + method + processing time. Thank the rep. Confirm email is coming.",
94
+ "on_failure": "Note exactly what was offered and what was refused. Thank the rep. Report back so the user can decide to call back, file a DOT complaint (US), or accept the loss.",
95
+ "follow_ups": [
96
+ "Email the user: new itinerary, confirmation number, refund / credit details, processing time.",
97
+ "Add the new flights to the user's calendar.",
98
+ "If a credit was issued, calendar the expiry date.",
99
+ "If a refund was promised, calendar a 14-day check that it actually arrived."
100
+ ]
101
+ },
102
+ "required_user_info": [
103
+ "Confirmation number (PNR) + passenger name as on the ticket",
104
+ "Loyalty number + status, if any",
105
+ "Original itinerary + desired new itinerary",
106
+ "Reason for the change (disruption, personal, etc)",
107
+ "Outcome preference: refund / credit / rebook (with max fare-difference if rebook)",
108
+ "Max fare difference the user will authorise without callback"
109
+ ],
110
+ "contributed_by": "AgenticMail core team"
111
+ }
@@ -0,0 +1,99 @@
1
+ {
2
+ "id": "book-medical-appointment",
3
+ "name": "Book a Medical / Dental Appointment",
4
+ "version": "1.0.0",
5
+ "category": "medical-admin",
6
+ "tags": ["doctor", "dentist", "appointment", "scheduling", "insurance"],
7
+ "description": "Call a medical or dental office to book an appointment, verify they take the operator's insurance, capture the prep instructions, and confirm the time + location.",
8
+ "disclaimer": "I'm an AI assistant calling on behalf of [patient name]. I'm not a medical professional and cannot answer clinical questions — those will be addressed by the patient directly at the appointment.",
9
+ "context": {
10
+ "when_to_use": "User needs to book a routine appointment (cleaning, annual physical, follow-up visit, vaccination, etc). Not for symptom triage or emergencies — for those, the user should call directly or use the office's nurse line.",
11
+ "preconditions": [
12
+ "Patient's full name, date of birth, and insurance information (carrier + member ID + group number).",
13
+ "Reason for visit in plain language ('annual cleaning', 'follow-up on lab results', 'new-patient visit').",
14
+ "Date / time preferences with a flex window.",
15
+ "Existing patient or new patient? (Affects intake time required.)"
16
+ ],
17
+ "estimated_call_duration_minutes": 10
18
+ },
19
+ "principles": [
20
+ "Lead with the reason for visit and the patient's status (existing vs new). Front-desk staff route the call entirely based on those two facts.",
21
+ "Verify insurance BEFORE confirming the appointment. 'Do you take [carrier]?' is a free question; finding out at the appointment that they don't is expensive.",
22
+ "Get every detail in writing if possible — confirmation email, text message, or patient portal entry. Verbal-only confirmations are forgotten by reception.",
23
+ "Ask for prep instructions (fasting, paperwork, ID, insurance card) — these are easy to forget and embarrassing to discover at check-in.",
24
+ "Do NOT discuss symptoms or clinical details. You're an AI; the patient will discuss medical specifics at the appointment."
25
+ ],
26
+ "phrases": {
27
+ "open_disclaimer": "I'm an AI assistant calling on behalf of [patient name]. I'm not a medical professional, so I won't be able to discuss symptoms or clinical details — but I can handle scheduling.",
28
+ "opener_existing": "I'd like to book an appointment for [patient name] for [reason]. The date of birth on file is [DOB]. Existing patient.",
29
+ "opener_new": "I'd like to book a new-patient appointment for [patient name] for [reason]. They've never been seen at this practice.",
30
+ "verify_insurance": "Before we lock anything in — can you confirm you accept [insurance carrier], plan name [plan]? Member ID is [ID].",
31
+ "ask_prep": "What should the patient bring or do to prepare? Anything to bring (ID, insurance card, prior records)? Any fasting or medication restrictions?",
32
+ "ask_confirmation_method": "Will you send a text or email confirmation? What's the best way to confirm we're on the schedule?",
33
+ "request_callback_number": "And the best number to reach the patient if anything changes is [phone]. Could you note that on the file?",
34
+ "graceful_close_success": "Thank you so much. So we're set for [day] at [time] at [location] — and [prep summary]. Have a good day.",
35
+ "graceful_close_no_availability": "I understand. I'll talk to [patient name] and call back to look at later dates. Thanks for checking."
36
+ },
37
+ "tactics": [
38
+ {
39
+ "name": "Disclaimer + reason for visit + patient status",
40
+ "when": "First substantive turn.",
41
+ "script": "Lead with the disclaimer (`open_disclaimer`), then immediately give reason + existing/new status (`opener_existing` or `opener_new`). Saves the receptionist from extracting it.",
42
+ "priority": 1
43
+ },
44
+ {
45
+ "name": "Verify insurance before booking",
46
+ "when": "Receptionist offers a time slot.",
47
+ "script": "Use `verify_insurance` BEFORE accepting the slot. If they don't take the insurance, ask if they're in-network with any other carriers the patient might have, then exit politely if not."
48
+ },
49
+ {
50
+ "name": "Get prep instructions before hanging up",
51
+ "when": "Appointment is confirmed.",
52
+ "script": "Use `ask_prep`. Common items: photo ID, insurance card, list of medications, fasting (lab work), arrive 15 min early for paperwork (new patient)."
53
+ },
54
+ {
55
+ "name": "Get the confirmation method in writing",
56
+ "when": "Receptionist is wrapping up.",
57
+ "script": "Use `ask_confirmation_method`. Some offices use a portal, some text, some don't confirm at all (in which case set a reminder yourself)."
58
+ },
59
+ {
60
+ "name": "Read back the full appointment details",
61
+ "when": "Before ending the call.",
62
+ "script": "Patient's name + date + time + location + provider name + prep summary. Receptionists appreciate this — it catches their typos, not yours."
63
+ }
64
+ ],
65
+ "boundaries": [
66
+ "Do NOT discuss the patient's symptoms, medical history, or any clinical information. You're a scheduler, not a clinician.",
67
+ "Do NOT share the patient's full SSN, even if asked — DOB + insurance ID is enough for routine scheduling.",
68
+ "Do NOT commit to an appointment without verifying insurance (unless the patient is paying cash and the office is informed).",
69
+ "Do NOT book without explicit slot acceptance — if multiple slots are offered, pick the user-pre-stated preferred one; if none match, ask the user via `ask_operator`."
70
+ ],
71
+ "success_signals": [
72
+ "Office confirms insurance acceptance.",
73
+ "Office confirms appointment with a date, time, location, and provider name.",
74
+ "Office confirms a method for written confirmation."
75
+ ],
76
+ "failure_signals": [
77
+ "Office doesn't take the insurance.",
78
+ "Office has no availability in the user's window.",
79
+ "Office requires a referral the patient doesn't have."
80
+ ],
81
+ "exit_strategy": {
82
+ "on_success": "Read back date / time / location / provider / prep. Thank the receptionist. Set a calendar event for the patient.",
83
+ "on_failure": "Note the obstacle (no in-network, no availability, referral required). Thank the receptionist. Report back so the operator can pick a different provider or get the referral first.",
84
+ "follow_ups": [
85
+ "Email or message the operator: date, time, location, provider, prep list, confirmation number / portal entry.",
86
+ "Calendar the appointment.",
87
+ "Calendar a 24-hour reminder."
88
+ ]
89
+ },
90
+ "required_user_info": [
91
+ "Patient's full name + date of birth",
92
+ "Insurance carrier, member ID, group number, plan name",
93
+ "Reason for visit (plain language)",
94
+ "Existing patient or new patient",
95
+ "Date / time preferences + flex window",
96
+ "Best callback phone number for the patient"
97
+ ],
98
+ "contributed_by": "AgenticMail core team"
99
+ }
@@ -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
+ }