Inspiration
Taiwan's National Health Insurance open data for 2024 records 5,852 people who became long-term ventilator-dependent (at least 64 continuous days). That figure counts inpatient claims only — the number living on one at home is not published, and is larger. When a typhoon takes down a district's power, someone has to find out who is still safe.
We had proposed a map showing where those households are — a competition proposal, not a built system. Then the gap showed up anyway: knowing who is at risk does not tell you who needs help right now. A map cannot ask "do you have battery left, and do you need a generator?" Only a phone call can. And a phone tree called in list order gives the most urgent household no way to be reached first.
What it does
PowerBack CALL-E turns a paper phone tree into a triaged, auditable call queue.
- Ranks by urgency: equipment criticality times battery urgency, so the ventilator with two hours left is called first, not eightieth. Unknown equipment and unknown battery both rank as most urgent — fail-closed.
- Shows the operator the script before dialling. The agent's first sentence is always its own AI disclosure, and the phone number is masked in the preview.
- Constrains what the agent is told it may say — a per-call allowlist (caller identity, nearest shelter, emergency hotline) that the code enumerates into the task text. This is a prompt constraint, not a filter: we can prove what we sent, not what was said.
- Refuses to guess. Below 0.6 confidence it emits no structured result at all and escalates to a human with a bounded context.
- Sorts every outcome into five buckets — needs help, human follow-up, retry, confirmed safe, do-not-disturb — instead of dumping transcripts. A refusal to talk is its own terminal state and is never counted as evidence of anything.
How we built it
Python, no framework. Two JSON Schemas (call input, call result) validated at both ends.
Adapter pattern: FakeAdapter covers nine outcomes entirely offline — including the awkward
ones: refusal, wrong person, voicemail, mid-call drop, escalation request, and a family member
answering as proxy. RealAdapter wraps the CALL-E SDK and refuses to dial unless an API key is
present and live mode is explicitly requested and a human has confirmed the preview.
Nine safety behaviours are code paths the model cannot route around — consent-first, dry-run default, fail-closed on unknown states, a confidence gate, distinct terminal codes for refusal / wrong person / voicemail, and a bounded human handoff. Two more are prompt constraints, and we keep them separate on purpose: the AI self-disclosure and the disclosure allowlist are deterministically built into the task text, but they are instructions the model follows — not filters on its output. Closing that gap needs a transcript-side check, which we have not built.
Verification: 56 tests across three suites (26 safety gates, 17 batch loop, 13 reliability), with a 10-scenario table scoring 10/10 against an 8/10 bar — all against the fake adapter, so they test the state machine, not model behaviour. Separately, one real call to the developer's own number showed the API path worked on 2026-09-02.
Challenges we ran into
The hard problem was not making the agent talk. It was deciding what the agent is not allowed to conclude. The failure mode we designed against: let a model summarise a call freely, and a noisy or evasive call can still produce a clean-looking "this person is fine." For a welfare check, that is worse than never calling — it removes the household from the follow-up list.
So the result is gated rather than summarised: a structured result exists only when confidence clears a threshold, and every ambiguous outcome — thin data, wrong person, voicemail, refusal — gets its own terminal code that routes to a human instead of into a statistic.
The second challenge was scope discipline under a hard deadline. The CALL-E Taiwan line is English-only, which rules out the Taiwanese-speaking elderly who are arguably the core user. We chose to state that limit plainly rather than demo around it.
Accomplishments that we're proud of
A refusal is not evidence. Low confidence produces no answer instead of a wrong one. The system is built to be unsure out loud — and we think that is the right default for any agent that calls a stranger to ask whether they are still safe.
What we learned
Voice agents in a safety context are mostly a state machine problem, not a prompting problem. Every interesting decision — when to stop, when to escalate, what may be said — belongs in code where it can be tested, not in an instruction the model may or may not follow.
Honest limits
- Not deployed. No real users. No agreement with any authority. This is a prototype.
- The disclosure opening and the allowlist are prompt constraints, not filters.
- The 10/10 scenario score is a measure of the state machine, not of real-world call reliability.
- Every roster record is synthetic. No real personal data was used, stored, or transmitted.
- Full transcripts are not retained by default.
What's next for PowerBack CALL-E
Taiwanese/Hokkien support once the platform allows it; field validation with a district office using opt-in participants; and wiring an outage map directly to the call queue, so a power outage polygon seeds a call batch automatically.
Built With
- call-e
- json-schema
- python

Log in or sign up for Devpost to join the conversation.