Worked example Native substrate Govern voice & CX agents →

Govern a Retell voice agent with GOVENANT

Use GOVENANT and Retell AI together — govern the voice & CX agents, not the framework. Every call verified. Misses included.

The use case

A support org routes 40,000 calls a month through a voice agent. The platform reports a 82% resolution rate; the CFO wants to expand the deployment.

The challenge

“Resolution” is the platform grading itself: a call that ends without a transfer is scored resolved. Nobody is checking how many “resolved” customers called back within 48 hours about the same issue — the exact gap between answered and resolved.

What the record reveals

With resolution keyed to the record and reopens logged by an independent watchdog, verified resolution lands at 63%, with a reopen cluster in billing. The honest number is lower — and it’s the first number the CFO trusts enough to actually expand on.

How it maps

The substrate: The conversation record: transcripts, end reasons, and a verified outcome row per call — resolution, not mere completion.

The path — Native substrate: The platform already produces records that map to the standard — the sweep reads what it already keeps.

GOVENANT shapeRetell AI source
Duty-runOne per call — Retell’s call object (call_id, timestamps, transcript reference)
Verified outcomecall_analysis resolution flag AND no reopen/callback within 48h — resolution, not “call ended”
Validation gateYour resolution criteria, decided in advance, checked against the record
Miss logMissed, failed, abandoned, and reopened conversations — written independently of the platform’s CSAT
retell-webhook.js — on call_analyzed (excerpt)
// Retell posts a webhook when a call is analyzed. Write ONE outcome row per
// call, keyed to verified resolution — the watchdog checks reopens. Aggregate only.
export async function onRetellWebhook(req, ledger) {
  if (req.body.event !== 'call_analyzed') return;
  const c = req.body.call;
  const resolved =
    c.call_analysis?.custom_analysis_data?.resolved === true &&
    !(await reopenedWithin(c.metadata?.customer_id, '48h'));   // verified, not asserted
  await ledger.writeDutyRun({
    duty: 'resolve_inbound_call',
    subject_ref: c.call_id,
    ran_at: c.start_timestamp,
    delivered: resolved,
  });
}

Run it

  1. Point Retell’s call_analyzed webhook at the handler (or replay analytics into the ledger).
  2. Define your resolution criteria and a reopenedWithin() check over your ticket/CRM store.
  3. Write one duty-run per call; delivered only when resolved and not reopened.
  4. Sweep read-only; review verified resolution vs. the platform’s reported rate.

The substrate shapes and acceptance tests are open (CC BY 4.0): developer integration · the portable schema.

What you can claim

A real integration can wear the Built-on GOVENANT badge under its four rules, and publish level claims to the registry with probe logs — self-assessed, open to challenge, never “certified.” For CX buyers, a public delivery record with the misses included is the strongest trust asset there is, because it is the one thing a vendor cannot fake comfortably.

Status — kept honest

This example is a worked mapping with read-only code — adapt the object/field names to your environment. It will never say “supported” or “certified” before a working example lands and its record is public — progress lives in the GitHub issue. Holding our own examples to the standard’s claims discipline is the product.

All sample projects · Govern voice & CX agents · All integrations · Run the audit