← BlogVoice agents

Null enrichment is not an error

Northsun · Aug 2026 · 6 min read

Phone enrichment is optional context. A production voice agent must remain useful when person, company, or phone is null, when some fields inside those blocks are absent, or when caller-memory reads return a safe degraded response. Missing enrichment should reduce personalization, not stop the conversation.

Memory and enrichment answer different questions

Caller memory describes what a tenant has observed in prior interactions with a caller record. Enrichment supplies external context that may be available for the number. Neither proves who is holding the phone.

Four valid response states follow:

Prior historyEnrichmentInterpretation
PresentPresentReturning caller record with optional external context.
PresentMissingReturning caller record; use history without guessing external attributes.
MissingPresentNew caller record with optional external context; do not present it as verified identity.
MissingMissingFirst-contact flow. This is a normal state, not a broken call.

Code each state deliberately. Do not use one if (!enrichment) throw branch for all of them.

A safe selection function

The response belongs on your server. Select only fields that are useful for the current workflow:

function openingContext(packet: RecallResponse) {
  return {
    known: packet.known,
    priorSummary: packet.memory?.summary || undefined,
    displayNameHint: packet.enrichment?.person?.name || packet.caller?.name || undefined,
    lineType: packet.enrichment?.phone?.line_type || undefined,
  };
}

The name is a hint, not authorization to greet someone with a sensitive record. Use a neutral opening until identity is established through an appropriate conversational or application mechanism.

Do not expose vendor failure

The caller does not need to hear that an enrichment provider timed out. Your fallback should sound like a normal first contact:

  • Ask for the information required to continue.
  • Avoid implying that a name or company lookup failed.
  • Do not retry optional enrichment indefinitely while the line is silent.
  • Continue to the conversation and submit the completed interaction once.

Trestle and Twilio Lookup are the public enrichment sources Northsun (formerly Mnemix) may name. That does not imply each request calls both providers, each field identifies its source, or any block will be present.

Distinguish empty, degraded, and failed

  • Empty enrichment: authenticated 200; the optional blocks are null or sparse. Continue normally.
  • Degraded caller-memory read: authenticated 200 with safe empty defaults and degraded: true. Continue with a context-free path and retain the trace.
  • Request failure: non-2xx authentication, validation, rate-limit, or service response. Follow the documented retry policy.

Those states produce different operational actions. Treating all three as “no data” hides authentication and availability problems; treating all three as errors makes legitimate first-time callers fail.

Test all four history/enrichment combinations plus a degraded read before production. Continue with Enrichment, Errors and retries, and Production readiness.