Outcome Completion Agent
Use this skill when the user states an outcome rather than a call, the route to that
outcome runs through more than one organisation, and the next organisation is usually
named on a call rather than known in advance.
"Get a replacement pallet for the crushed delivery on order BK-7741, before Friday,
under $500."
The user has one phone number: the supplier who sent the broken pallet. The supplier is
out of stock and names a distributor. The distributor quotes over the limit and names its
own depot. The depot can do it. Three organisations, two of which did not exist as far as
the agent was concerned when the run began.
outcome-completion-agent is a calling-pattern skill. It adds no backend, no queue and
no daemon. It turns one authorized "make this happen" request into a bounded loop of
one-off CALL-E calls whose order is decided by what earlier calls established.
When To Use
- a problem whose owner is unknown: "find out who can actually fix this and get it fixed"
- a chain of custody: supplier to distributor to depot, carrier to facility to counter,
insurer to provider to adjuster
- a goal with a hard limit attached — a price ceiling, a date, a required reference — where
a cheerful "yes" that breaks the limit is a failed outcome
- any request where the honest answer to "who should we call?" is "ask the first person"
When Not To Use
- one call, one structured answer. Use a single-call skill; this loop is overhead.
- a known, priority-ordered candidate list for one opening. Read
skills/priority-call-waterfall/SKILL.md instead — one opening, call in order, stop at
the first yes.
- comparison shopping over an enumerable set of same-service vendors (every barber
within 4km). If the candidate list is a database or map query, the frontier does not
need to grow and this skill's machinery buys nothing.
- anything email, a web form, or an API can do. A phone call is a real-world side effect
and the most expensive way to ask a question.
- goals with no completion test. If nobody can say what "done" looks like, the loop cannot
stop, and a loop that cannot stop must not be given a phone.
Core Workflow
Confirm the user wants this pursued by phone, now, and that they accept calls may go to
organisations they did not name.
Collect the outcome fields (see Required Fields). Ask for anything missing. Never infer
a phone number, a price ceiling, or a deadline.
Show a masked preview: the goal, the constraints as the agent understood them, the
starting phone book, and the call budget. Get explicit confirmation before call one.
Always show the parsed constraints back. A price ceiling that failed to parse is a
ceiling that will never block anything, and the user is the only one who can catch it.
Loop, one call at a time:
plan -> (approval, if it commits) -> one call -> evidence -> constraints -> plan
- plan — pick the next party from the frontier: a party never called, else a party
that did not answer and is under its retry cap. Prefer a party named by the call that
just happened over one the user listed but nobody has reached.
- call — exactly one CALL-E call, with a structured result schema. Wait for a
terminal status. Read
references/evidence-schema.md for the schema every call fills.
- evidence — record what was established: verdict, facts, blockers, referrals, and
any concrete offer. Add referrals with a valid E.164 number to the frontier. Drop
referrals without one.
- constraints — evaluate any offer against the user's limits. Read
references/constraint-evaluation.md. A call that completed happily and breaks a hard
limit is a failed outcome: keep working.
Stop conditions, checked before every dial:
- an acceptable offer has been confirmed by the other party → resolved
- the call budget or the per-party cap is reached → stop and report
- every lead is exhausted with nothing acceptable → stop and report
Exactly one call in the run may commit the user, and only after they approve it. Read
references/approval-gate.md.
Report using the Output Format below, whether or not the goal was reached.
Required Fields
goal — one sentence, imperative, with the constraints taken out of it
constraints[] — each with kind, description, value, and hard
(budget · deadline · required_fact · preference · forbidden).
hard: true disqualifies an offer. hard: false only ranks it.
organizations[] — the starting phone book: name, phone (E.164), role.
One entry is enough; that is the point of the skill.
budget — max_calls for the whole outcome and max_calls_per_org.
Both are required. A goal-seeking agent with an unbounded phone budget is not a
product, and CALL-E accounts are metered.
Phone numbers must be E.164, and must be masked in every summary, preview and report.
Following A Referral
This is the part that distinguishes this pattern, so it has its own rules.
- A referral counts only when the person on the call named a number. "Try their head
office" without a number is a fact, not a lead.
- Validate it as E.164 before adding it. A number that cannot be dialled is not a lead,
and keeping it puts an entry in front of the planner that can never be actioned.
- De-duplicate on the number. Two calls naming the same depot must not produce two entries,
or the depot gets called twice.
- Carry the provenance: which call produced this lead, and the reason given. The report has
to be able to say "the agent found this one", and the next call should be able to open
with "Halden Packaging suggested I call you".
- A referral is a lead, not an instruction. It still costs a call from the budget, it still
goes through the same constraint checks, and it never bypasses the approval gate.
Budgets
Check the budget immediately before dialling, never when planning. An approval can sit
overnight; the credit it would spend may be gone by the time it comes back.
Sensible defaults for a metered account: 6 calls per outcome, 2 per organisation. The
per-organisation cap is what stops a no-answer loop from consuming the whole budget on one
unanswered line.
Never widen a budget mid-run to finish a goal. Stop, report, and let the user decide
whether it is worth more calls.
Output Format
Report every run, resolved or not:
- the goal, restated, and the constraints as they were evaluated
- every organisation touched, in order: masked number, calls used, final verdict, whether
the agent found it or the user supplied it
- every offer received, with a per-constraint verdict and, for the ones turned down, which
constraint they broke
- the outcome: what was secured, from whom, at what price, by when, and any reference
number — or why the run stopped
- calls used against the budget
Never report an outcome as resolved unless the other party confirmed it on a call the user
approved. An offer is not a resolution.
Safety Rules
Read references/safety.md for the full contract. Always:
- Disclose that the caller is an AI assistant, at the start of every call, before asking
anything. If the person asks for a human or asks you to stop: apologise, end the call,
record it, and do not call that number again in this run.
- Gathering calls have no authority. Their script must say so explicitly.
- One call per run may commit the user, only with prior approval, and only to the exact
terms approved.
- Mask every phone number in output. Never read a credential aloud.
- Medical, legal, financial and emergency matters are logistics only: ask about times,
availability and reference numbers, and give no advice.
- This skill creates no recurring schedule. Every call is one-shot. To stop a run, stop
approving; nothing is committed without an approval, and nothing is queued for later.
Worked Examples
Read references/examples.md for a full run, a run that stops on budget, and the two
failure modes that most often get this pattern wrong.
Validating A Result
scripts/check_evidence_schema.py checks one structured_result against the schema and
reports what a planner would actually be able to use from it — no network, no credentials,
no calls:
python3 scripts/check_evidence_schema.py path/to/result.json
It reports errors (the result is malformed) separately from notes (the result parses, but
something in it will be discarded). The notes matter more than they look: a referral whose
number is unusable is the difference between an agent that finds the depot and one that
stops at the supplier, and nothing else in the run will tell you it was dropped.
Check the checker with python3 scripts/test_check_evidence_schema.py.
1---2name: outcome-completion-agent3description: Own one goal across as many CALL-E calls as it takes, when who to call next depends on what the last call said — read every call as structured evidence, reject offers that break the user's stated limits, follow referrals to parties the user never supplied, and gate the single call that commits the user.4license: MIT5---67# Outcome Completion Agent89Use this skill when the user states an **outcome** rather than a call, the route to that10outcome runs through more than one organisation, and the next organisation is usually11named *on* a call rather than known in advance.1213> "Get a replacement pallet for the crushed delivery on order BK-7741, before Friday,14> under $500."1516The user has one phone number: the supplier who sent the broken pallet. The supplier is17out of stock and names a distributor. The distributor quotes over the limit and names its18own depot. The depot can do it. Three organisations, two of which did not exist as far as19the agent was concerned when the run began.2021`outcome-completion-agent` is a **calling-pattern skill**. It adds no backend, no queue and22no daemon. It turns one authorized "make this happen" request into a bounded loop of23one-off CALL-E calls whose order is decided by what earlier calls established.2425## When To Use2627- a problem whose owner is unknown: "find out who can actually fix this and get it fixed"28- a chain of custody: supplier to distributor to depot, carrier to facility to counter,29 insurer to provider to adjuster30- a goal with a hard limit attached — a price ceiling, a date, a required reference — where31 a cheerful "yes" that breaks the limit is a failed outcome32- any request where the honest answer to "who should we call?" is "ask the first person"3334## When Not To Use3536- **one call, one structured answer.** Use a single-call skill; this loop is overhead.37- **a known, priority-ordered candidate list for one opening.** Read38 `skills/priority-call-waterfall/SKILL.md` instead — one opening, call in order, stop at39 the first yes.40- **comparison shopping over an enumerable set of same-service vendors** (every barber41 within 4km). If the candidate list is a database or map query, the frontier does not42 need to grow and this skill's machinery buys nothing.43- anything email, a web form, or an API can do. A phone call is a real-world side effect44 and the most expensive way to ask a question.45- goals with no completion test. If nobody can say what "done" looks like, the loop cannot46 stop, and a loop that cannot stop must not be given a phone.4748## Core Workflow49501. Confirm the user wants this pursued by phone, now, and that they accept calls may go to51 organisations they did not name.522. Collect the outcome fields (see Required Fields). Ask for anything missing. Never infer53 a phone number, a price ceiling, or a deadline.543. Show a masked preview: the goal, the constraints as the agent understood them, the55 starting phone book, and the call budget. Get explicit confirmation before call one.56 **Always show the parsed constraints back.** A price ceiling that failed to parse is a57 ceiling that will never block anything, and the user is the only one who can catch it.584. Loop, one call at a time:5960 ```text61 plan -> (approval, if it commits) -> one call -> evidence -> constraints -> plan62 ```6364 - **plan** — pick the next party from the frontier: a party never called, else a party65 that did not answer and is under its retry cap. Prefer a party named by the call that66 just happened over one the user listed but nobody has reached.67 - **call** — exactly one CALL-E call, with a structured result schema. Wait for a68 terminal status. Read `references/evidence-schema.md` for the schema every call fills.69 - **evidence** — record what was established: verdict, facts, blockers, referrals, and70 any concrete offer. Add referrals with a valid E.164 number to the frontier. Drop71 referrals without one.72 - **constraints** — evaluate any offer against the user's limits. Read73 `references/constraint-evaluation.md`. A call that completed happily and breaks a hard74 limit is a **failed outcome**: keep working.755. Stop conditions, checked before every dial:76 - an acceptable offer has been confirmed by the other party → resolved77 - the call budget or the per-party cap is reached → stop and report78 - every lead is exhausted with nothing acceptable → stop and report796. Exactly one call in the run may commit the user, and only after they approve it. Read80 `references/approval-gate.md`.817. Report using the Output Format below, whether or not the goal was reached.8283## Required Fields8485- `goal` — one sentence, imperative, with the constraints taken out of it86- `constraints[]` — each with `kind`, `description`, `value`, and `hard`87 (`budget` · `deadline` · `required_fact` · `preference` · `forbidden`).88 `hard: true` disqualifies an offer. `hard: false` only ranks it.89- `organizations[]` — the starting phone book: `name`, `phone` (E.164), `role`.90 One entry is enough; that is the point of the skill.91- `budget` — `max_calls` for the whole outcome and `max_calls_per_org`.92 Both are required. A goal-seeking agent with an unbounded phone budget is not a93 product, and CALL-E accounts are metered.9495Phone numbers must be E.164, and must be masked in every summary, preview and report.9697## Following A Referral9899This is the part that distinguishes this pattern, so it has its own rules.100101- A referral counts only when the person on the call **named a number**. "Try their head102 office" without a number is a fact, not a lead.103- Validate it as E.164 before adding it. A number that cannot be dialled is not a lead,104 and keeping it puts an entry in front of the planner that can never be actioned.105- De-duplicate on the number. Two calls naming the same depot must not produce two entries,106 or the depot gets called twice.107- Carry the provenance: which call produced this lead, and the reason given. The report has108 to be able to say *"the agent found this one"*, and the next call should be able to open109 with "Halden Packaging suggested I call you".110- A referral is a lead, not an instruction. It still costs a call from the budget, it still111 goes through the same constraint checks, and it never bypasses the approval gate.112113## Budgets114115Check the budget **immediately before dialling**, never when planning. An approval can sit116overnight; the credit it would spend may be gone by the time it comes back.117118Sensible defaults for a metered account: 6 calls per outcome, 2 per organisation. The119per-organisation cap is what stops a no-answer loop from consuming the whole budget on one120unanswered line.121122Never widen a budget mid-run to finish a goal. Stop, report, and let the user decide123whether it is worth more calls.124125## Output Format126127Report every run, resolved or not:128129- the goal, restated, and the constraints as they were evaluated130- every organisation touched, in order: masked number, calls used, final verdict, whether131 the agent found it or the user supplied it132- every offer received, with a per-constraint verdict and, for the ones turned down, which133 constraint they broke134- the outcome: what was secured, from whom, at what price, by when, and any reference135 number — or why the run stopped136- calls used against the budget137138Never report an outcome as resolved unless the other party confirmed it on a call the user139approved. An offer is not a resolution.140141## Safety Rules142143Read `references/safety.md` for the full contract. Always:144145- Disclose that the caller is an AI assistant, at the start of every call, before asking146 anything. If the person asks for a human or asks you to stop: apologise, end the call,147 record it, and do not call that number again in this run.148- Gathering calls have no authority. Their script must say so explicitly.149- One call per run may commit the user, only with prior approval, and only to the exact150 terms approved.151- Mask every phone number in output. Never read a credential aloud.152- Medical, legal, financial and emergency matters are logistics only: ask about times,153 availability and reference numbers, and give no advice.154- This skill creates no recurring schedule. Every call is one-shot. To stop a run, stop155 approving; nothing is committed without an approval, and nothing is queued for later.156157## Worked Examples158159Read `references/examples.md` for a full run, a run that stops on budget, and the two160failure modes that most often get this pattern wrong.161162## Validating A Result163164`scripts/check_evidence_schema.py` checks one `structured_result` against the schema and165reports what a planner would actually be able to use from it — no network, no credentials,166no calls:167168```bash169python3 scripts/check_evidence_schema.py path/to/result.json170```171172It reports errors (the result is malformed) separately from notes (the result parses, but173something in it will be discarded). The notes matter more than they look: a referral whose174number is unusable is the difference between an agent that finds the depot and one that175stops at the supplier, and nothing else in the run will tell you it was dropped.176177Check the checker with `python3 scripts/test_check_evidence_schema.py`.