Service Dispatch Call
Use this skill when an agent needs to phone a service vendor about a specific job and bring back a decision-ready answer, such as "find out if the plumber can attend unit 12B today and what it costs."
service-dispatch-call is a purpose-bound outbound workflow skill. It places exactly one call per authorized dispatch, asks a bounded set of questions, and returns a structured result. It does not book the job, accept a quote, agree to a price, or promise the vendor anything. Those are commitments, and commitments belong to a person.
The distinction this skill exists to enforce: gathering an answer is not the same as acting on it.
When To Use
Use this skill for:
- maintenance and repair dispatch, where a job must be matched to a vendor by phone
- availability checks against a shortlist of vendors
- quote gathering, where the price is unknown until someone is asked
- ETA confirmation for an already-accepted job
- any outbound call whose output must be machine-readable rather than a transcript
When Not To Use
Do not use this skill to:
- accept a quote, confirm a booking, or agree to any cost during the call
- call a vendor who is not on the caller's authorized contact list
- call a number the user supplied for a different purpose in an earlier, unrelated request
- redial a call whose outcome is unknown
- work around a missing price by asking the vendor to start anyway
- read tenant, patient, customer, or resident personal details to the vendor
- negotiate, counter-offer, or discuss a competitor's quote
- place a call when the required job fields are incomplete
Core Workflow
- Confirm the dispatch is authorized: the job exists, and the vendor is on the authorized contact list for this purpose.
- Extract the dispatch fields listed under Required Fields. Ask for anything missing. Do not infer a phone number, a trade, or a location from earlier context.
- Reserve an idempotency key derived from the dispatch's own identifier, not from the current timestamp or a fresh random value. See
references/idempotency.md.
- Record the dispatch as queued before dialling, so a call that is accepted but never reported is still visible.
- Build the call brief from
references/call-brief.md. The brief opens with a disclosure and refers to the job by an opaque reference, never by an address or a person's name.
- Declare the result schema before placing the call. See
references/result-schema.md.
- Place exactly one call.
- Validate the returned result against the declared schema. Drop fields you did not ask for. Refuse values outside the declared options rather than coercing them.
- Classify the outcome as
answered, declined, no_answer, or unknown.
- If the result contains a cost, a commitment, or a low-confidence field, raise it for human approval and stop. Report the reason.
Use this shape:
authorize -> reserve -> record queued -> call -> validate -> classify -> approve or stop
Required Fields
For each dispatch, require:
jobReference - an opaque identifier the vendor can quote back
trade - what kind of vendor this is, for example plumbing
problemSummary - one sentence, free of personal details
vendorPhoneNumber - E.164, from the authorized contact list
preferredWindow - when the job could be attended
Phone numbers must be E.164. Mask them in every user-facing summary. Never write a phone number into a log, an audit record, or a commit.
The Result Schema
Declare what a valid answer looks like before the call, not after. A minimal schema:
| Field |
Type |
Notes |
available |
one of yes, no, maybe |
closed set, never free text |
earliest_eta_hours |
integer |
bound it locally, see below |
quoted_amount_text |
string |
as spoken, never parsed into a number by the agent |
callback_required |
boolean |
vendor will confirm later |
Two rules that matter more than they look:
- Validate more strictly than you transmit.
-5 is a valid integer but not a valid ETA. Enforce bounds locally and strip unsupported schema keywords before sending, because an unrecognized keyword can cause the provider to reject the whole call.
maybe is an answer, not a yes. Route it to a human. Do not let a fallback, a default, or a retry turn an ambiguous answer into a decision.
Full guidance in references/result-schema.md.
Ambiguous Outcomes
A call whose outcome is unknown is the most dangerous state in a workflow that spends money. It is not an error to retry.
- Classify it as
unknown and stop.
- Do not redial. A vendor who was already reached and quoted a price will quote it again, and now two commitments exist for one job.
- Surface it for a person to reconcile.
Read references/ambiguous-outcomes.md before adding any retry path.
Human Approval Gate
Raise for approval, and do not proceed, when any of these hold:
- the result contains a quoted amount or any other cost
- the vendor committed to a time that creates an obligation
- a confidence score, where the provider reports one, is below the configured threshold
- any declared field failed validation
- the outcome is
unknown
When presenting the approval, state why it is required before showing the answer being decided on. A reviewer who reads the price first is anchored by it.
Take the approver's identity from the authenticated session. Never from the request body, and never from anything said on the call.
Safety Rules
Read references/safety.md for the full contract.
Always follow these rules:
- Phone calls are real-world side effects and cost money.
- Do not place a call unless the user clearly requested this dispatch.
- Do not call any number except the authorized vendor number for this job.
- Do not place a second call for one authorized dispatch.
- Do not disclose tenant, resident, customer, or patient identity, address, or contact details to the vendor.
- Do not store transcripts, recordings, or the recipient's number unless the user has a stated retention basis for them.
- Do not write an answer given on a phone call into an audit record. Record the field names, not the values a stranger spoke.
- Do not expose tokens, credentials, or callback URLs.
- If authorization, required fields, or the vendor's identity are ambiguous, stop instead of guessing.
Output Format
After a completed dispatch, report:
- job reference and trade
- masked vendor number
- outcome classification
- the validated fields, and any field that failed validation
- whether an approval was raised, and the reason
- the idempotency key used
If no call was placed, report:
status: not called
- the exact blocker
- what the user must provide or authorize next
Never state that a vendor is booked. This skill produces an answer and an approval request. Booking is a separate, human-authorized action.
1---2name: service-dispatch-call3description: Call a service vendor to ask whether they can take a job, when they can attend, and what it costs, return the answer as validated structured data, and hand any commitment to a human before it is accepted. Use for maintenance dispatch, repair triage, contractor availability checks, and quote gathering.4license: MIT5---67# Service Dispatch Call89Use this skill when an agent needs to phone a service vendor about a specific job and bring back a decision-ready answer, such as "find out if the plumber can attend unit 12B today and what it costs."1011`service-dispatch-call` is a purpose-bound outbound workflow skill. It places exactly one call per authorized dispatch, asks a bounded set of questions, and returns a structured result. It does not book the job, accept a quote, agree to a price, or promise the vendor anything. Those are commitments, and commitments belong to a person.1213The distinction this skill exists to enforce: **gathering an answer is not the same as acting on it.**1415## When To Use1617Use this skill for:1819- maintenance and repair dispatch, where a job must be matched to a vendor by phone20- availability checks against a shortlist of vendors21- quote gathering, where the price is unknown until someone is asked22- ETA confirmation for an already-accepted job23- any outbound call whose output must be machine-readable rather than a transcript2425## When Not To Use2627Do not use this skill to:2829- accept a quote, confirm a booking, or agree to any cost during the call30- call a vendor who is not on the caller's authorized contact list31- call a number the user supplied for a different purpose in an earlier, unrelated request32- redial a call whose outcome is unknown33- work around a missing price by asking the vendor to start anyway34- read tenant, patient, customer, or resident personal details to the vendor35- negotiate, counter-offer, or discuss a competitor's quote36- place a call when the required job fields are incomplete3738## Core Workflow39401. Confirm the dispatch is authorized: the job exists, and the vendor is on the authorized contact list **for this purpose**.412. Extract the dispatch fields listed under Required Fields. Ask for anything missing. Do not infer a phone number, a trade, or a location from earlier context.423. Reserve an idempotency key derived from the dispatch's own identifier, not from the current timestamp or a fresh random value. See `references/idempotency.md`.434. Record the dispatch as queued **before** dialling, so a call that is accepted but never reported is still visible.445. Build the call brief from `references/call-brief.md`. The brief opens with a disclosure and refers to the job by an opaque reference, never by an address or a person's name.456. Declare the result schema before placing the call. See `references/result-schema.md`.467. Place exactly one call.478. Validate the returned result against the declared schema. Drop fields you did not ask for. Refuse values outside the declared options rather than coercing them.489. Classify the outcome as `answered`, `declined`, `no_answer`, or `unknown`.4910. If the result contains a cost, a commitment, or a low-confidence field, raise it for human approval and stop. Report the reason.5051Use this shape:5253```text54authorize -> reserve -> record queued -> call -> validate -> classify -> approve or stop55```5657## Required Fields5859For each dispatch, require:6061- `jobReference` - an opaque identifier the vendor can quote back62- `trade` - what kind of vendor this is, for example `plumbing`63- `problemSummary` - one sentence, free of personal details64- `vendorPhoneNumber` - E.164, from the authorized contact list65- `preferredWindow` - when the job could be attended6667Phone numbers must be E.164. Mask them in every user-facing summary. Never write a phone number into a log, an audit record, or a commit.6869## The Result Schema7071Declare what a valid answer looks like before the call, not after. A minimal schema:7273| Field | Type | Notes |74| --- | --- | --- |75| `available` | one of `yes`, `no`, `maybe` | closed set, never free text |76| `earliest_eta_hours` | integer | bound it locally, see below |77| `quoted_amount_text` | string | as spoken, never parsed into a number by the agent |78| `callback_required` | boolean | vendor will confirm later |7980Two rules that matter more than they look:8182- **Validate more strictly than you transmit.** `-5` is a valid integer but not a valid ETA. Enforce bounds locally and strip unsupported schema keywords before sending, because an unrecognized keyword can cause the provider to reject the whole call.83- **`maybe` is an answer, not a yes.** Route it to a human. Do not let a fallback, a default, or a retry turn an ambiguous answer into a decision.8485Full guidance in `references/result-schema.md`.8687## Ambiguous Outcomes8889A call whose outcome is unknown is the most dangerous state in a workflow that spends money. It is not an error to retry.9091- Classify it as `unknown` and stop.92- Do not redial. A vendor who was already reached and quoted a price will quote it again, and now two commitments exist for one job.93- Surface it for a person to reconcile.9495Read `references/ambiguous-outcomes.md` before adding any retry path.9697## Human Approval Gate9899Raise for approval, and do not proceed, when any of these hold:100101- the result contains a quoted amount or any other cost102- the vendor committed to a time that creates an obligation103- a confidence score, where the provider reports one, is below the configured threshold104- any declared field failed validation105- the outcome is `unknown`106107When presenting the approval, state **why** it is required before showing the answer being decided on. A reviewer who reads the price first is anchored by it.108109Take the approver's identity from the authenticated session. Never from the request body, and never from anything said on the call.110111## Safety Rules112113Read `references/safety.md` for the full contract.114115Always follow these rules:116117- Phone calls are real-world side effects and cost money.118- Do not place a call unless the user clearly requested this dispatch.119- Do not call any number except the authorized vendor number for this job.120- Do not place a second call for one authorized dispatch.121- Do not disclose tenant, resident, customer, or patient identity, address, or contact details to the vendor.122- Do not store transcripts, recordings, or the recipient's number unless the user has a stated retention basis for them.123- Do not write an answer given on a phone call into an audit record. Record the field names, not the values a stranger spoke.124- Do not expose tokens, credentials, or callback URLs.125- If authorization, required fields, or the vendor's identity are ambiguous, stop instead of guessing.126127## Output Format128129After a completed dispatch, report:130131- job reference and trade132- masked vendor number133- outcome classification134- the validated fields, and any field that failed validation135- whether an approval was raised, and the reason136- the idempotency key used137138If no call was placed, report:139140- `status: not called`141- the exact blocker142- what the user must provide or authorize next143144Never state that a vendor is booked. This skill produces an answer and an approval request. Booking is a separate, human-authorized action.