Call Rehearsal
A CALL-E call returns a structured result, and something downstream acts on it. The dangerous failure is not a call that fails loudly. It is a call that never reached a consenting human whose result still resolves to the branch that ships the order.
That happens because an unestablished field is absent, and absent is falsy. A
rule as ordinary as confirmed != false is true when voicemail picked up and
nothing at all was extracted.
This skill covers finding that before the call, by rehearsing the plan against the ways calls actually end.
When to use it
Use it before the first real call of any workflow whose result triggers a
real-world side effect: dispatching, shipping, charging, cancelling, granting
access, or writing a confirmation into a system of record. Use it again whenever
the task, the result_schema, or the rule that reads the result changes, since
this failure is introduced by editing any one of the three without the others.
Skip it for a call whose result nobody acts on automatically. A call that only produces a note for a human to read has no branch to get wrong.
The procedure
- Name the single decision. Write down the one thing the call exists to establish. If there seem to be several, the call is doing too much and the rehearsal will show the decision field carrying weight it cannot hold.
- Write the call plan. One JSON file with the
task, theresult_schema, thefieldsroles, and thedecision_ruleincluding what each branch does and whether it changes the real world. - Declare the field roles. Map result fields onto
decision,reachability,consent,identityanddeferral. Onlydecisionis required. Do not guess a role: if you cannot say which field carries the decision, ask the person who owns the workflow. - Rehearse. Run the plan and read what the automation does for each ending.
- Gate on the exit code.
0means no ending above the threshold reaches a side effect,20means the plan should not go out as written,30means the plan could not be read.
cd apps/python/call-rehearsal
python3 -m callrehearsal <plan.json> --fail-on high
No call is placed, no credential is read, and nothing connects to the network, so rehearsing is always safe, including in CI on every commit.
Reading the result
Every ending that is not a verified, consenting yes must land on a branch with
side_effect: false. A CRITICAL finding means one did not.
The two fixes that resolve almost every report:
- Record what happened on the line. Add fields for reachability, identity and consent, so voicemail is distinguishable from a refusal and a stranger saying yes is distinguishable from the callee saying yes.
- Require a confirmation, not the absence of a refusal. Replace
confirmed != falsewithconfirmed == true, and conjoin the identity and consent fields.
Read references/examples.md for a worked before-and-after, and
references/safety.md for the rules about what may follow a call.
What this does not do
It reasons about the shape of the result, not the words spoken. It cannot tell
you whether the phrasing is persuasive or whether extraction is reliable on a
live line. Use calle-script-advisor for the task text and schema, and
voice-preflight for what the critical lines sound like when spoken. A clean
rehearsal means the plan survives the endings in the library, which is not a
guarantee about any individual real call.