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 history | Enrichment | Interpretation |
|---|---|---|
| Present | Present | Returning caller record with optional external context. |
| Present | Missing | Returning caller record; use history without guessing external attributes. |
| Missing | Present | New caller record with optional external context; do not present it as verified identity. |
| Missing | Missing | First-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
200with safe empty defaults anddegraded: 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.