Skip to content

Repository files navigation

ATTEST

CI License: MIT Live demo Android APK Python React Expo CALL-E Skill merged upstream

The phone agent that refuses to guess.

The Agent Skill in skills/verify-by-phone was merged into CALL-E's own repository on 2026-08-07 (PR #39), after five maintainer review rounds. Those rounds found real defects in the abstention mechanism and every one is fixed with a regression test that was run against the old code first. The review thread is public, so the claims on this page can be checked against somebody else's reading of the code.

Live demo

Surface Where
Web console https://attest-web-phi.vercel.app
Verify a certificate https://attest-web-phi.vercel.app/verify (paste any attestation; verifies in your browser)
The measured guarantee https://attest-web-phi.vercel.app/calibration
API https://attest-api-o5gm.onrender.com/healthz (free tier; first hit may take a moment to warm. Reports whether the poller is alive and whether this deployment dials the real platform or the mock, so a simulated deployment cannot pass for a real one)
Attestation public key https://attest-api-o5gm.onrender.com/api/attestation-key (also committed at docs/attestation-public-key.pem, which verifies certificates from the deployed API. The local docker compose path signs with a separate, deliberately public demo key served at its own /api/attestation-key, so verify local certificates against that one.)
Android app (APK) https://github.com/StephenSook/attest/releases/latest
iOS app (TestFlight) https://testflight.apple.com/join/XZDXt7jw (open to anyone, no tester limit)
Zero-credential local run docker compose up --build

Why this matters

Half of health-insurance provider directory listings are wrong: a federal audit found roughly 50 percent inaccurate, a congressional secret-shopper study reached a bookable appointment 18 percent of the time, and re-audited listings were still wrong 44.8 percent of the time months later. The record exists. The record lies. The only instrument that establishes current truth is a phone call to the published line.

Attest places one disclosed outbound call through CALL-E, extracts a structured answer where every field cites the verbatim transcript span that supports it, reconciles the answer against the directory record with transparent Fellegi-Sunter match weights, and returns either a calibrated confidence or an explicit abstention backed by a distribution-free coverage guarantee computed on held-out data.

The product speaks to patients. For the separate question of who has the budget to run directory audits at scale, and the public record behind that answer, see docs/WHO-PAYS.md.

The numbers, regenerated by one command

Every figure and number below comes from uv run python -m eval: fixed seed 20260725, six scripted adversarial respondent personas, 300 calibration and 300 held-out test scenarios, disjoint folds. Nothing judge-facing is scripted data presented as real; the console shows real recorded calls, and the harness is labeled as a harness everywhere it appears.

At a 90% coverage target
Empirical coverage on the held-out fold 90.3% (Wilson 95%: 86.5 to 93.2)
Abstention rate 57.7%
Accuracy when answering 96.9%
Error if forced to answer everything 12.3%

Reliability diagram

Risk-coverage curve

Match-weight waterfall

Real-channel transfer: 36 pre-registered scripted calls to a consented line (28 attributable after a documented deviation protocol) scored with the harness-calibrated threshold gave 28 of 28 coverage (Wilson lower bound 87.9 percent; worst-case floor counting every excluded call as a miss, 77.8 percent), 42.9 percent abstention, and no wrong answers. A transfer test of extraction plus calibration across the real telephone channel. Measured against the same gate, the real channel abstained less than the seeded harness (42.9 against 57.7 percent) and still produced no wrong answers. Class-conditional check: the marginal average hid an under-covered class ("no" at 83.2 percent against the 90 percent target); Mondrian per-class thresholds close most of that gap (88.5 percent) and the finding ships in the metrics rather than being averaged away. Coverage holds from calibration folds as small as 50. Ablations (same folds): remove hedge detection and accuracy-when-answering drops to 87.8 percent; remove the dead-end guard and wrong-number chatter gets parsed as answers: accuracy when answering drops to 89.8 percent while abstention falls to 54.3 percent, below the full system's 57.7; remove conformal calibration and the coverage guarantee disappears entirely. The full table is in eval/results/ablation.md.

Where the load-bearing CALL-E call lives

One module, on purpose: backend/app/calle/client.py wraps the official calle-ai SDK for every REST call, and backend/app/calle/webhook.py receives terminal webhooks. Empirical note, dated: when we integrated (2026-07-25) the live API accepted webhook_url and delivered nothing (verified with a tunnel capture on a completed call); the platform changelog dated 2026-07-29 turned delivery on, unsigned. The receiver therefore treats an unsigned delivery as an untrusted hint whose only possible effect is an authenticated GET /v1/calls/{id} re-fetch, the resumable poller in backend/app/calle/poller.py remains the authoritative terminal path, and when a signing secret is configured (the mock server, or any compatible signing layer) the receiver still verifies HMAC over the exact raw bytes with the five-minute replay window the SDK omits.

Run it yourself, zero credentials

docker compose up --build
# console at http://localhost:5173, API at http://localhost:8000
# seeded with a scrubbed real recorded call; live dialing stays off in mock mode

Or natively:

uv sync && uv run pytest          # the full suite, no network, no real calls ever
uv run python -m eval             # regenerates every number and figure above
uv run python scripts/seed_replay.py
uv run uvicorn app.main:app       # backend on :8000
cd frontend && pnpm install && pnpm dev   # console on :5173

What one run looks like

  1. A run is created with the directory record it verifies; the run id doubles as the CALL-E Idempotency-Key, so a retry can never double-dial.
  2. The call opens by stating the AI identity and verification purpose together, announces recording, releases anyone who objects, and never guesses.
  3. The transcript comes back as per-turn text with second offsets and speaker labels. Extraction finds the answer with a cue lexicon, dampens hedges ("I think so") by graded strength, treats dead-end turns (wrong number, refusal) as non-responsive, and pins the exact character span.
  4. Reconciliation adds log2(m/u) bits of evidence per agreeing field on a stated 50/50 audit prior, and the verdict decomposes into a waterfall anyone can audit.
  5. Split conformal calibration decides whether the trust score clears the answering bar; when the prediction set is not a single value, Attest abstains, and the guarantee says how often the truth stays inside the set.

Attest Pocket: the receipt in your pocket

The patient-side companion app (Expo, iOS and Android, mobile/): browse the runs ledger, open a run to see the verdict stamp, evidence spans, transcript, and the receiving-end call audio (tap a turn to hear it), share the signed attestation certificate as a PDF, and check the measured guarantee including the real-telephone transfer panel. Read-only against the same production API as the web console; nothing is baked into the app.

Platform Install
Android Direct APK from the release, or scan the left QR below
iOS TestFlight, build 1.0.0 (3), approved by Apple Beta App Review on 2026-07-27. Open to anyone, no tester limit. Scan the right QR below

QR code for the Android APK

QR code for the iOS TestFlight beta

Attest Pocket runs ledger Attest Pocket run detail with verdict stamp, evidence spans, and audio player

Security posture

Server-authoritative state (the browser never submits verdicts), phone numbers redacted in every API response by test-enforced policy, SSRF resolve-then-pin validation with the full metadata blocklist for any future server-side fetch, raw-byte HMAC webhook verification with replay windows when a signing secret exists, unsigned platform deliveries treated as untrusted hints that can only trigger an authenticated re-fetch and never a write, keyed run creation with constant-time comparison, gitleaks in CI over full history, and no secret ever reaching the client.

Architecture

C4Context
  title Attest, System Context
  Person(patient, "Patient or auditor", "Needs to know whether a directory listing is true today")
  System(attest, "Attest", "Places one disclosed call, cites spans, reconciles, calibrates or abstains")
  System_Ext(calle, "CALL-E", "Outbound voice agent platform")
  System_Ext(practice, "Provider's published line", "The only source of current truth")
  Rel(patient, attest, "Requests a verification, reads the evidence")
  Rel(attest, calle, "Creates one goal-driven call, polls to terminal")
  Rel(calle, practice, "Dials, discloses, asks, transcribes")
  Rel(attest, patient, "Verdict with spans, or an honest abstention, signed")
Loading

Repository map

backend/app/        FastAPI backend; calle/ is the integration seam
  extract.py        span-grounded extraction with hedge dampening
  hedge.py          graded epistemic cue lexicon
  reconcile.py      Fellegi-Sunter reconciliation, documented priors
  security/ssrf.py  resolve-then-pin URL validation
eval/               seeded harness: personas, conformal core, figures, ablations
mock_calle/         standalone CALL-E mock replaying a scrubbed real payload
skills/verify-by-phone/   the self-contained Agent Skill (upstream contribution)
frontend/           the console and the landing experience

Honest status

Working end to end today: real calls through the seam, the full extraction, reconciliation, and calibration pipeline, the seeded evaluation, the live console and landing. Known limitations: platform webhook delivery is young (live only since 2026-07-29 and unsigned, so deliveries act as untrusted hints and the poller stays authoritative), the free-tier database is ephemeral (reseeded on boot), and disclosed verification cannot measure how disclosure itself changes answers, because no undisclosed baseline exists inside this protocol.

License

MIT

About

The phone agent that refuses to guess. One disclosed verification call per healthcare directory listing: every answer cites its verbatim transcript span, reconciliation shows its arithmetic, and a conformal gate abstains rather than guess. CALL-E hackathon, Sep 2026.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages