Agent skill

Exception Resolution Calls

by CALLE-AI in CALLE-AI/awesome-phone-call-agents

A skill your agent uses when a business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order, an unconfirmed delivery window, a job a technician has not…

MITAuto-check passedDocuments & Office

Install Exception Resolution Calls

skills CLI
$ npx skills add CALLE-AI/awesome-phone-call-agents --skill exception-resolution-calls -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install CALLE-AI/awesome-phone-call-agents exception-resolution-calls --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/CALLE-AI/awesome-phone-call-agents.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/exception-resolution-calls .claude/skills/exception-resolution-calls && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
exception-resolution-calls
GitHub stars
107
Token cost
~3.3k tokens
SKILL.md length
1,371 words
Files
6 (incl. scripts, references)
Skills in repo
101
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when a business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order, an unconfirmed delivery window, a job a technician has not…

  • Works in 7 steps: Model uncertainty before you model success → Bound the call before you place it → Batch recipients, keep outcomes separate → …
  • A business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order
  • SKILL.md covers When to use this, The shape of the problem, Build it in this order and Failure modes worth designing…, plus 3 more sections
  • Runs Python scripts from its folder

What it does

Exception Resolution Calls is an agent skill from CALLE-AI/awesome-phone-call-agents. Use when a business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order, an unconfirmed delivery window, a job a technician has not accepted — and the answer must update system state. Turns one CALL-E call task into per-recipient structured evidence, then advances the workflow with deterministic policy instead of letting a model decide.

Its SKILL.md is about 3.3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 7 other files, including scripts and reference files (for example `references/decision-table.md`, `references/examples.md` and `references/result-schema.json`).

It sits in Documents & Office, covering Forms and invoices. The repository describes itself as: Portable phone-call Agent Skills, apps, examples, adapters, and scheduler recipes for AI agents. The licence is MIT.

When your agent uses it

  • A business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order
  • An unconfirmed delivery window
  • A job a technician has not accepted — and the answer must update system state

Example prompts

  • “/exception-resolution-calls”

Requirements

  • Python 3

Workflow steps

7 steps, taken from the step headings in SKILL.md.

  1. Model uncertainty before you model success
  2. Bound the call before you place it
  3. Batch recipients, keep outcomes separate
  4. Derive the idempotency key from content, never from a clock
  5. Let policy decide, in a pure function
  6. Say who you are before you ask anything
  7. Treat the webhook as a notification, not an answer

What it can do on your machine

Read from SKILL.md and the folder at commit 38d4118. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Ships 1 file in scripts/ (Python), which the agent can run.

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Exception Resolution Calls loads about 3.3k tokens when it runs, and up to ~11k if it reads all its reference files. Until then it costs about 102 tokens; SKILL.md has 1,371 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~102
When it runs · the whole SKILL.md, loaded when a task matches
~3.3k
With references · SKILL.md plus every file in references/, read only if the agent opens them
~11k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); the scripts in this folder are not scanned.

SKILL.md

The full file from CALLE-AI/awesome-phone-call-agents at commit 38d4118, republished under its MIT licence (© CALLE-AI). 1,371 words, ~3,340 tokens.

Download SKILL.mdSave it as .claude/skills/exception-resolution-calls/SKILL.md (or your agent's skills folder). This skill also uses 5 other files; get the full folder from GitHub.
name
exception-resolution-calls
description
Use when a business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order, an unconfirmed delivery window, a job a technician has not accepted — and the answer must update system state. Turns one CALL-E call task into per-recipient structured evidence, then advances the workflow with deterministic policy instead of letting a model decide.

Resolving blocked workflows by phone

When to use this

Use it when three things are true at once:

  1. a workflow is stuck on a fact only a person has ("did you get the order?", "will it ship Friday?", "can you take this job?");
  2. the answer has to change system state, not just get logged;
  3. a wrong answer has a real cost, so "we think they said yes" is not good enough.

Do not use it for open-ended conversations, for anything where the caller must negotiate or commit the business to something, or where no bounded set of questions exists. Those are not exception resolution; they are sales, and they need a human.

The shape of the problem

The tempting design is: call, ask the model what happened, update the record. That design fails in production for a reason worth stating plainly.

Extraction and authority are different jobs. A model is good at turning a messy conversation into structured fields. It is not the right thing to decide whether a purchase order may be closed, because when the evidence is thin it will still return something, and that something becomes a business fact nobody chose.

So split them:

CALL-E                          Your policy code
──────                          ────────────────
holds the conversation          decides what the answer means
extracts strict JSON            re-validates the JSON
reports confidence              can refuse to act on low confidence
never touches state             owns every state transition

Build it in this order

1. Model uncertainty before you model success

Write the result schema first, and give every judgment field an unknown value. This is the single highest-leverage decision in the whole design.

json
{
  "type": "object",
  "additionalProperties": false,
  "required": ["received", "po_status", "needs_human"],
  "properties": {
    "received": {
      "type": "string",
      "enum": ["yes", "no", "unknown"],
      "description": "Use yes ONLY when they clearly confirm receipt. Use unknown when the answer was hedged, second-hand or unclear — for example 'I think someone in logistics has it'."
    },
    "po_status": {
      "type": "string",
      "enum": ["on_time", "delayed", "blocked", "unknown"],
      "description": "Never infer a status from tone or from a polite acknowledgement."
    },
    "needs_human": {
      "type": "string",
      "enum": ["yes", "no", "unknown"],
      "description": "Use yes when they ask for a person, dispute the record, or raise pricing, payment terms or contract changes."
    }
  }
}

Three rules that are easy to get wrong:

  • Enums, not booleans, for anything a call might not settle. A boolean forces a guess; an enum lets the call say "I don't know", which is usually the true answer.
  • additionalProperties: false, and no $ref, oneOf, anyOf, allOf or recursion — CALL-E does not support them. A generated schema from a typed model will emit $ref and silently return null results forever.
  • Do not name a recipient field status, summary, transcript or call_id. Those are reserved on recipient results. The collision does not error; it just returns null. Rename yours (po_status, customer_summary).
2. Bound the call before you place it

The task text is a contract with the person who answers. State what may be disclosed, what may be asked, and what ends the call.

YOU MAY DISCLOSE ONLY
- the supplier company name;
- the purchase order number.

TRUTHFULNESS
- Never guess a date, quantity, status or commitment.
- If unclear, ask one clarification question, then report unknown.
- Do not convert a polite acknowledgement into a business commitment.

SCOPE
- Do not negotiate price, discounts, payment terms or contract terms.
- Do not collect passwords, card data or bank credentials.
- If the recipient asks for a human, stop and report needs_human = yes.

Scan the operator-supplied values, not the rendered task. This bites everyone once: the task above contains the words "password", "credentials", "negotiate" and "price", so a scanner pointed at the rendered text flags the task's own safety rules and blocks every call you try to make. Scan the untrusted surface — the interpolated names, ids and numbers — and leave the template alone.

3. Batch recipients, keep outcomes separate

recipients[] plus recipient_result_schema means one call task can cover many people, each with an independent result. It is cheaper and it demos far better than a loop of single calls.

python
call = client.calls.create(
    task=task_text,                                  # says "ask each about THEIR order only"
    recipients=[{"phones": [p], "region": "US"} for p in phones],
    recipient_result_schema=RECIPIENT_SCHEMA,        # per person
    result_schema=ROLLUP_SCHEMA,                     # whole batch
    metadata={"workflow_run_id": run_id},
    idempotency_key=batch_key,                       # header
)

Two things to get right:

  • The task must explicitly forbid cross-disclosure ("never mention another supplier's order to anyone"), or a batch call leaks one customer's business to another.
  • Correlate results back by recipients[i].id. If you cannot match a result to a workflow, record it as unattributed and decide nothing — guessing which record a phone answer belongs to is worse than leaving it.
4. Derive the idempotency key from content, never from a clock

A create that times out may already have started a phone call. Retrying with a fresh key calls a real person twice.

python
key = "wf:batch:" + sha256("|".join(sorted(f"{run}:{attempt}" for ...))).hexdigest()[:32]

Same logical batch → byte-identical key → CALL-E returns the original call. Persist the key before you dispatch, so a crash mid-flight is recoverable.

5. Let policy decide, in a pure function
python
def decide(workflow, call, recipient, settings) -> Decision:
    if workflow.is_terminal:            return NOOP          # late results never overwrite
    if call.status != "completed":     return RECONCILE      # stop ambiguous/in-flight dispatch
    if recipient.status != "completed": return RECONCILE      # never infer no call occurred
    if recipient.structured_result is None:
                                        return RECONCILE      # null is never success
    ev = revalidate(recipient.structured_result)              # check enums again yourself

    if ev.escalation_reason == "asked_not_to_be_called":
                                        suppress(recipient); return HUMAN_REVIEW
    if ev.escalation_reason in ("disputes_po", "commercial_change", "wants_human"):
                                        return HUMAN_REVIEW   # distinct reasons, not one flag
    if ev.needs_human == "yes":         return HUMAN_REVIEW   # outranks any positive answer

    could_close = ev.received == "yes" and ev.po_status in ("on_time", "delayed")
    if could_close and ev.spoke_with not in ("intended_contact", "authorized_representative"):
                                        return HUMAN_REVIEW   # right number, wrong/unknown person
    if could_close and not confident_enough(call, settings):
                                        return HUMAN_REVIEW   # dampener, see below

    if ev.received == "yes" and ev.po_status == "on_time":
                                        return RESOLVE
    return HUMAN_REVIEW                                       # ambiguity is never resolved

Record who you actually reached, and why a human is needed, as fields -- not as one flag and a hope. Two gaps bite in roughly this order:

  • An authorized destination number is not the same thing as an authorized person. A clean "yes, on time" from whoever happens to pick up is not evidence, if that person was never the contact. Add a spoke_with field (self-reported, not authenticated) and gate any outcome that would close the workflow on it. See references/decision-table.md for the full precedence.
  • A single needs_human boolean cannot tell an operator whether the recipient asked for a person, disputed the record, tried to renegotiate, or asked never to be called again. The last one has a consequence beyond this call: it must suppress future attempts to this contact, not just get logged. Differentiate the reason (escalation_reason), and act on the ones that need acting on.

Use confidence as a dampener, in one direction only. task_completed and completion_confidence are reported for the whole call task, not per recipient. Low confidence may withhold an automatic resolution; high confidence must never rescue a recipient whose own result is missing or ambiguous. Getting this backwards is how a confident-sounding batch closes an order nobody confirmed.

Never branch on failure_code. The API documents it as having no published enum. Store it, show it to a human, and drive retry from status instead.

Show full SKILL.md (554 more words)Show less
6. Say who you are before you ask anything

The recipient did not opt into this call. Before discussing the order:

  • state plainly that you are an AI assistant, not a person;
  • name the real company you are calling for -- never a placeholder, and never the name of your own agent/product;
  • confirm you are speaking to the right person before disclosing order details, not after.

Refuse to dispatch a live call if you cannot fill in a truthful company name. A placeholder would be spoken aloud to a real person.

7. Treat the webhook as a notification, not an answer
POST /webhooks/...
  → validate shape
  → dedupe on the event id (a UNIQUE column, not a SELECT)
  → enqueue reconciliation
  → return 200

Then fetch the call and decide there. Three properties fall out for free: a duplicate delivery is a no-op; a lost delivery is only a delay, because a sweep reconciles anything that has been running too long; and you can develop with no public URL at all.

Failure modes worth designing for

FailureCorrect behaviour
Create times outStop automatic dispatch; reconcile the original call, then ask a human if still unknown. Any explicitly supported manual replay retains the same payload/key
Webhook delivered twiceSecond is a no-op
Webhook never arrivesReconciliation sweep finishes the call
structured_result: nullReconcile, then escalate — never resolve or automatically redial
Recipient never answeredNo evidence exists, whatever the result object says
Right number, wrong person answersEscalate even on a clean "yes" -- identity was never established
Someone resolved it by hand mid-callKeep the result as history; do not overwrite
Attempts exhaustedEscalate to a person, do not keep dialling
Caller asks to renegotiateEscalate; the agent has no authority
Caller asks not to be called againEscalate and suppress this workflow record; decide deliberately whether that should also cover other open records for the same number, or it silently won't

Cancellation and side effects

A call is a side effect you cannot take back — someone's phone rings. So:

  • Nothing dials without passing an eligibility check and an attempt budget.
  • Gate live calling behind an explicit flag plus a key, so no single stray environment variable starts calling people.
  • Keep an allowlist of numbers during development; a batch containing an unlisted number should fall back to a simulator rather than dial.
  • Bound attempts (3 is a reasonable default) with a backoff between them, and escalate when the budget is gone.
  • Distinguish "not due yet" and "quiet hours" from real refusals. Those fix themselves, so they must not be escalated — a false alarm on someone's queue is how they learn to ignore the queue.

Where to look next

  • Read references/safety.md for the boundaries this pattern assumes: phone-number handling, consent, credentials, cancellation, and the conversations that must escalate rather than continue.
  • Read references/examples.md for runnable request and response shapes, including batch calls and the terminal webhook.
  • Consult references/decision-table.md for the full branch precedence and the retry-versus-escalate rule.
  • Use references/result-schema.json as a starting point for your own strict result schema.
  • Run scripts/idempotency_key.py to see the content-derived key, and to confirm it is stable under reordering.

Reference implementation

Resolve-E implements all of the above for supplier purchase-order acknowledgements: one CALL-E call task resolves eight purchase orders into their distinct outcomes -- including the identity-gate and escalation-differentiation cases this file just described -- each with its own policy decision and audit trail, and the failure table above is a test suite rather than a promise.

© CALLE-AI, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 5 other files (scripts, references) in skills/exception-resolution-calls of CALLE-AI/awesome-phone-call-agents.

  • SKILL.md
  • references/decision-table.md
  • references/examples.md
  • references/result-schema.json
  • references/safety.md
  • scripts/idempotency_key.py

Open the folder on GitHubat commit 38d4118

Compare with similar skills

Exception Resolution Calls next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Exception Resolution Calls compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Exception Resolution Calls this skillCALLE-AI/awesome-phone-call-agents107—~3.3kAutomated safety check: PassMIT
PDFzai-org/ZCode7.7k—~18kAutomated safety check: NotesProprietary
Form Fillingplatonai/Browser41.2k—~1.1kAutomated safety check: PassApache-2.0
Code2mediatsingliuwin/autoclaw283—~985Automated safety check: PassMIT
Token ReceiptHchen1218/token-receipt126—~2.1kAutomated safety check: PassNone
Invoice Makertsingliuwin/autoclaw283—~619Automated safety check: PassMIT

Similar skills

  • PDF

    zai-org/ZCode

    Professional PDF toolkit covering four production workflows: reports, creative visuals, academic LaTeX, and existing PDF processing.

    7.7k GitHub stars~18k tokensUpdated today
    Documents & OfficeAuto-check: notes
  • Form Filling

    platonai/Browser4

    Automatically fills web forms using provided field data and can optionally submit the form.

    1.2k GitHub stars~1.1k tokensUpdated yesterday
    Documents & OfficeAuto-check passed
  • Code2media

    tsingliuwin/autoclaw

    Universal media renderer with no fixed template — any custom layout, size or style becomes pixel-perfect images (PNG/JPEG/WebP), vector SVG, paged PDFs or animations (WebP/GIF).

    283 GitHub stars~985 tokensUpdated today
    Documents & OfficeAuto-check passed
  • Token Receipt

    Hchen1218/token-receipt

    A skill your agent uses when the user wants to view AI conversation token usage as a receipt, invoice, checkout slip, token bill, usage receipt, cost snapshot, or creative monospace thermal-paper…

    126 GitHub stars~2.1k tokensUpdated 4 mo ago
    Documents & OfficeAuto-check passed
  • Invoice Maker

    tsingliuwin/autoclaw

    开发票/生成发票/报价单/收据/采购单/对账单/账单/付款通知 — formal business documents as paged PDFs with proper tables, right-aligned amounts, tax lines, repeating headers and page-number footers.

    283 GitHub stars~619 tokensUpdated today
    Documents & OfficeAuto-check passed
  • Invoice Generator

    luzhenqian/ai-coding-lab

    从 Excel 时间表或手动输入生成专业发票。当用户提到生成发票、创建账单、invoice、billing、开发票、时间表转发票、账单生成时使用此技能。

    153 GitHub stars~955 tokensUpdated 4 mo ago
    Documents & OfficeAuto-check passed

More from CALLE-AI/awesome-phone-call-agents

All 101 skills in this repo
  • Accessible Outing Verifier

    CALLE-AI/awesome-phone-call-agents

    Demonstrates advisory accessibility-planning checks with offline fixtures and a proposed bounded CALL-E workflow; use for exploring unknown or qualified venue claims without making calls.

    107 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed
  • Ground Truth Gate

    CALLE-AI/awesome-phone-call-agents

    A skill your agent uses when an agent holds some evidence for a physical-world claim but the evidence is broader, narrower, or older than the exact question asked, and it must first decide whether a…

    107 GitHub stars~3.3k tokensUpdated yesterday
    Auto-check passed
  • Is It Accessible

    CALLE-AI/awesome-phone-call-agents

    Call a venue and ask the accessibility questions that matter to one specific person — step-free entry, hearing loop, guide dogs, quiet hours, changing places — then return a per-need verdict backed…

    107 GitHub stars~4.3k tokensUpdated yesterday
    Auto-check passed
  • Landmark Navigation Assist

    CALLE-AI/awesome-phone-call-agents

    Turns a pre-written, building-level location config into a CALL-E outbound phone-call task that guides a delivery driver through the last few hundred metres to a specific building using landmarks…

    107 GitHub stars~1.6k tokensUpdated yesterday
    Auto-check passed
  • Research Gap Call Verifier

    CALLE-AI/awesome-phone-call-agents

    Turn cited business research into a bounded, approval-gated phone-call plan that asks only unresolved factual questions, then reconcile CALL-E-compatible results without treating voicemail, refusal…

    107 GitHub stars~1.7k tokensUpdated yesterday
    Auto-check passed
  • Structured Outcome Followup Call

    CALLE-AI/awesome-phone-call-agents

    Place a goal-driven CALL-E call that collects specific structured answers, score those answers against a deterministic rubric you supply, and conditionally trigger a follow-up action — all runnable…

    107 GitHub stars~1.4k tokensUpdated yesterday
    Auto-check passed

Questions about Exception Resolution Calls

What does Exception Resolution Calls do?

A skill your agent uses when a business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order, an unconfirmed delivery window, a job a technician has not…. Exception Resolution Calls is an agent skill from CALLE-AI/awesome-phone-call-agents. Use when a business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order, an unconfirmed delivery window, a job a technician has not accepted — and the answer must update system state.

When should I use Exception Resolution Calls?

Exception Resolution Calls fits situations like: A business workflow is blocked waiting on a person to answer a question by phone — a stale purchase order; an unconfirmed delivery window; A job a technician has not accepted — and the answer must update system state.

How do I install Exception Resolution Calls in Claude Code?

Run `npx skills add CALLE-AI/awesome-phone-call-agents --skill exception-resolution-calls -a claude-code`. Or copy the skill folder (skills/exception-resolution-calls in CALLE-AI/awesome-phone-call-agents) into .claude/skills/exception-resolution-calls in your project. Claude Code loads it when a task matches its description.

How do I install Exception Resolution Calls in Codex?

Run `npx skills add CALLE-AI/awesome-phone-call-agents --skill exception-resolution-calls -a codex`. Or copy the skill folder (skills/exception-resolution-calls in CALLE-AI/awesome-phone-call-agents) into .agents/skills/exception-resolution-calls in your project. Codex loads it when a task matches its description.

Can I use Exception Resolution Calls in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add CALLE-AI/awesome-phone-call-agents --skill exception-resolution-calls -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/exception-resolution-calls, .gemini/skills/exception-resolution-calls, .github/skills/exception-resolution-calls and .opencode/skills/exception-resolution-calls in your project.

What does Exception Resolution Calls need to run?

Going by SKILL.md and its folder, Exception Resolution Calls needs Python for the scripts in its folder. Our summary lists: Python 3.

Does Exception Resolution Calls access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Exception Resolution Calls safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. The check reads SKILL.md only: the scripts in the folder are not scanned, so read them before running anything.

What licence does Exception Resolution Calls use?

Exception Resolution Calls is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Exception Resolution Calls use?

About 3.3k tokens (SKILL.md is roughly 13k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full. Its references folder adds about 7.2k tokens, read only when the agent opens those files.

What are the alternatives to Exception Resolution Calls?

Skills that share tags, products or a category with Exception Resolution Calls: PDF (zai-org/ZCode, 7.7k stars), Form Filling (platonai/Browser4, 1.2k stars), Code2media (tsingliuwin/autoclaw, 283 stars) and Token Receipt (Hchen1218/token-receipt, 126 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Exception Resolution Calls?

CALLE-AI (a GitHub organization) maintains it in CALLE-AI/awesome-phone-call-agents, which has 107 GitHub stars. The repository holds 101 skills in this directory. The repository was last updated on October 10, 2026.

Source: CALLE-AI/awesome-phone-call-agents on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.