Inspiration
Cross-border pet journeys depend on several organizations. An airline may require advance notice, a destination desk may require an appointment, and a veterinary service may have a different document lead time. A disagreement discovered late can break the journey.
We wanted phone calls to help people identify those gaps while keeping the final decision with a human. PawPassage treats each call as a small, reviewable piece of evidence.
What it does
PawPassage is a local Python application for checking exactly three written-source propositions with one service desk. The operator reviews a masked preview containing the source, recipient, questions, disclosure and prohibited actions. Approval is bound to the exact request; changing its content invalidates that approval.
The app then reserves the intent in SQLite before using CALL-E. Returned results must match the approved recipient and task and pass strict local validation. The report separates confirmed answers, contradictions, missing evidence and requests that need reconciliation. It masks phone numbers and leaves bookings, payments, health decisions and travel clearance to a human.
How we built it and use CALL-E
The application uses the official pinned calle-ai==0.7.0 Python SDK. Its adapter calls client.calls.create with one recipient, the approved task, a closed structured-result schema, binding metadata and a durable idempotency key. Once a call ID is recorded, it uses wait_for_result; explicit reconciliation reads the existing call with get.
The credential-free demo runs that adapter against a loopback fake server. It exercises the actual SDK request and response path, approval checks, durable ledger, result validation and report generation without placing a real call.
A SQLite reservation prevents duplicate submissions. If a create request times out or returns an ambiguous provider error, the app records SUBMISSION_UNKNOWN and does not automatically redial. Unknown acceptance is preserved for human reconciliation.
Demonstration and verification
The fictional offline demo produces three different outcomes:
- The airline checkpoint confirms all three propositions and offers a written reference:
EVIDENCE_PACKET_READY. - The destination checkpoint contradicts the first proposition:
GAPS_FOUND, with reasonP1_CONTRADICTED. - A simulated veterinary-service creation error leaves the ledger in
SUBMISSION_UNKNOWNand the report inNEEDS_HUMAN_RECONCILIATION.
Repeating the successful and uncertain requests is blocked locally. The resulting counters are three SDK create requests, two unique fake calls, two blocked duplicates and zero real calls.
Fifty-eight offline tests passed against a clean, non-editable installation of the built package. They cover approval binding, closed contracts, SDK request and response binding, recovery, duplicate prevention and privacy checks. The English video is under three minutes.
The report interface shown in the video is an explicitly labeled September 4 capture. Its visible offline outcomes and counters were reverified against the September 13 generated report; it is not presented as fresh browser footage.
Separate production validation
On September 13, 2026, the same workflow made one authorized English call attempt to the organizer's official US test hotline. The production API reported a completed 83-second attempt. The provider summary said the live respondent did not confirm consent for the synthetic checklist test, so the voice agent ended the call.
PawPassage verified the returned binding and recorded DO_NOT_CONTACT. All three propositions remained NOT_ESTABLISHED, and no redial was made. This verifies the production create/read/result path and stopping when consent is not confirmed. It does not establish successful checklist answers, an actual pet-service workflow or Mandarin call quality.
An earlier Malaysia/Mandarin request was rejected before dialing. We preserved that restriction and used the separately authorized official US hotline; we did not relabel the Malaysian destination or the caller's identity.
Challenges and accomplishments
The hardest failure is an uncertain submission: the provider may have accepted a call even when the client cannot see its result. Reserving the intent before the network request lets the application preserve that uncertainty without calling twice.
Structured output also requires more than valid JSON. An unreached or wrong-role contact must not supply factual answers; mismatched recipients, extra fields, contradictory outcomes and multiple attempts are rejected. A completed provider status does not automatically mean the underlying checklist succeeded.
We have a reproducible no-account demo, 58 passing installed-package tests, and a separate production result that follows the same approval and validation path. Reports omit full contacts, credentials, recordings and transcripts.
What we learned
A useful phone agent needs explicit limits around both actions and claims. An uncertain result must remain uncertain, a refusal must stop the workflow, and even a confirmed answer remains evidence for human review.
What's next
Further validation should cover fully consented checklist conversations and practical service-desk workflows when the relevant provider route is available. We would then add accessibility improvements and reviewed multilingual tests while keeping the three-question limit and exact human approval. These future outcomes are not claimed by the current demonstration.
Try the project
Public contribution PR ยท Installable source and setup
Requires Python 3.11 or newer. In a fresh virtual environment, open apps/python/pawpassage, run python -m pip install ., then python -m pawpassage demo and python -m unittest discover -s tests -v. Open artifacts/pawpassage-demo-report.html. Installation downloads public dependencies; the default demo and tests need no account, API key, payment or real call. Do not run execute-live for this evaluation.
Log in or sign up for Devpost to join the conversation.