Language, one model: detect, remember, use

How Clara learns a renter's language once and uses it on every channel.

2026-10-30 · read-only: no production writes, no sends · data: every inbound call Sep 30 to Oct 30 and every person profile

Contents: The answer first · Who hears the offer · Channels today · The one model · Never break · First PR · Decisions

The answer first

Full analysis: who hears the offer, channels, the one model, first PR, decisions

Who hears the offer (inbound calls, Sep 30 to Oct 30)

CompanyWhy it offersCallsHeard itSpanish calls
Western Slopeits company-wide line (its building lines do not)2211391 real ("Español", whole call Spanish, remembered), 1 mixed, 2 just "Sí" then English
Situssetting: second language Spanish, every line17 (6 phones, mostly our tests)140 real (1 bench test)
JP&Co (Camellia, Yale 25)never10500 clear
On record todayPeopleSpanishEnglish
Situs3,65004
Western Slope2,571283
JP&Co6,411564

org_western_slope (18 people) is a legacy test org. At Situs, Spanish arrives by text: 12 Spanish texters, none remembered (local analysis, session 003).

Language across channels today

ChannelDetectRememberReply languageRemindersHost routingCustomers
Callyes. In the call: the word "español" or a whole Spanish sentence (triage.ts:247-259). After it: a switch, or 2 sure sentences (detect-call-language.ts:149-207)yes (call-ended/route.ts:2466-2541, guard resolve-language.ts:246-262), but 69 of 122 WS callers have nothing storedgreeting and voice follow the record (personalization/route.ts:3166-3254, triage-greeting.ts:393-530)storednot builtWS, Situs (offer); JP&Co (none)
Clara's text lineyes, word list (conversation-manager.ts:10514-10528)yes, if they ask or the detector is sure (:10540-10552)yes (:12091, clara-unified.ts:2032)storednot builtevery company with a Clara number
AppFolio text lineonly when the mirror hands the text to Clara (pms-mirror-reply-wake.ts:24-60); filing never checkssame; 0 of 12 Situs Spanish textersonly thenEnglishnot builtSitus
Emailno (conversation-manager.ts:10514-10517)nothe model writes back in their language (clara-unified.ts:2032)Englishnot builtall
Guest cardnonofirst email in their language; the text a minute later is English (first-reply-text.ts:230)Englishnot builtWS, Situs, JP&Co
Website formonly the form's locale (website-inquiry.ts:155-164)Spanish only (process-tour.ts:1436)in their languagestorednot builtwhere used

Reminders on every channel use resolveRecipientLanguage (resolve-recipient-language.ts:102-133): Spanish only when Spanish is on record. Host routing is a local prototype only (local analysis, session 003).

The one model

call · text · AppFolio text · email · guest card · form
   │  detect from the renter's own words (word list, then the fast model)
   ▼
Person.language = es | en, plus how sure: asked > heard > assumed
   ├─ call greeting: which language to open in, offer or not
   ├─ replies and reminders
   └─ tour slots from hosts who speak it (prototype)

"Assumed English" means they heard the offer and kept talking in English. It only stops the offer, and any Spanish sentence or text replaces it. Each company sets its languages (General › How Clara talks, exists today) and its hosts' languages (prototype).

CallerCompany that named Spanish (Situs)Company-wide line, no setting (WS front door)Building line, no setting (WS buildings, Camellia, Yale 25, Willows)
UnknownEnglish, then "Para español, diga 'español'" (today)same today (D2)English, no offer
On record as EnglishEnglish, no offer (since Oct 29)samesame
On record as SpanishSpanish greeting and voice, then "For English, just say 'English'". Proposed: drop that line (D1)samesame

Never break

CustomerEffect of PR 1Replay (read-only, done)
JP&Co, Willowsnone: their lines never offer, so the rule never runs0 of 105 JP&Co calls change; 0 of 141 Willows calls had the offer
Western Slope40 callers remembered as English10 of 221 calls lose the offer; 0 Spanish callers touched
Situs1 test caller0 of 17 change

First PR: a caller who heard the offer and kept talking in English is not asked again

Rule. When a call ends, store en as "assumed" if all of these hold:

"Assumed" is never a known language. It does not trigger the two-sentence switch rule, does not block learning Spanish from texts, and anything replaces it.

Code. The rule goes in detect-call-language.ts and the write in call-ended/route.ts. personalization/route.ts gets a language_offered variable, and language_known ignores "assumed". resolve-language.ts and conversation-manager.ts treat "assumed" as nothing stored. The "how sure" field goes in types.ts and persons.ts.

Size and rollout. About 60 lines plus tests. It is a fix: no switch, live everywhere.

Owner. Gera's team owns these files (#23355 and #23410 this week); hand it over on the bridge.

Proof. The replay above, then a test phone with no Fairhaven record calls the Fairhaven test company's line twice. (Fairhaven's usual test phones are already on record as English, so a new phone is needed, or that test person's language is cleared first, as a logged sandbox write.) That line offers Spanish, like WS. The second call must open without the offer. Never Fede's phone, never WS people.

Next PRs:

  1. Remember Spanish from texts, AppFolio texts and guest cards (prototype PR 4).
  2. Drop the English line for callers on record as Spanish (after D1, about 5 lines).
  3. Host routing (prototype PRs 1 to 3), with calls passing the language being spoken right now.

Scripts, outputs and prototype findings: (local analysis, session 003).

Decisions for Fede

1. A returning caller on record as Spanish hears

2. What decides whether a new caller hears the offer

3. How much English before we stop offering

PropFlow Docs