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
{{triage_greeting}}; its Spanish preset has no text. No phone menu is involved.| Company | Why it offers | Calls | Heard it | Spanish calls |
|---|---|---|---|---|
| Western Slope | its company-wide line (its building lines do not) | 221 | 139 | 1 real ("Español", whole call Spanish, remembered), 1 mixed, 2 just "Sí" then English |
| Situs | setting: second language Spanish, every line | 17 (6 phones, mostly our tests) | 14 | 0 real (1 bench test) |
| JP&Co (Camellia, Yale 25) | never | 105 | 0 | 0 clear |
| On record today | People | Spanish | English |
|---|---|---|---|
| Situs | 3,650 | 0 | 4 |
| Western Slope | 2,571 | 2 | 83 |
| JP&Co | 6,411 | 5 | 64 |
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).
| Channel | Detect | Remember | Reply language | Reminders | Host routing | Customers |
|---|---|---|---|---|---|---|
| Call | yes. 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 stored | greeting and voice follow the record (personalization/route.ts:3166-3254, triage-greeting.ts:393-530) | stored | not built | WS, Situs (offer); JP&Co (none) |
| Clara's text line | yes, word list (conversation-manager.ts:10514-10528) | yes, if they ask or the detector is sure (:10540-10552) | yes (:12091, clara-unified.ts:2032) | stored | not built | every company with a Clara number |
| AppFolio text line | only when the mirror hands the text to Clara (pms-mirror-reply-wake.ts:24-60); filing never checks | same; 0 of 12 Situs Spanish texters | only then | English | not built | Situs |
no (conversation-manager.ts:10514-10517) | no | the model writes back in their language (clara-unified.ts:2032) | English | not built | all | |
| Guest card | no | no | first email in their language; the text a minute later is English (first-reply-text.ts:230) | English | not built | WS, Situs, JP&Co |
| Website form | only the form's locale (website-inquiry.ts:155-164) | Spanish only (process-tour.ts:1436) | in their language | stored | not built | where 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).
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).
| Caller | Company that named Spanish (Situs) | Company-wide line, no setting (WS front door) | Building line, no setting (WS buildings, Camellia, Yale 25, Willows) |
|---|---|---|---|
| Unknown | English, then "Para español, diga 'español'" (today) | same today (D2) | English, no offer |
| On record as English | English, no offer (since Oct 29) | same | same |
| On record as Spanish | Spanish greeting and voice, then "For English, just say 'English'". Proposed: drop that line (D1) | same | same |
| Customer | Effect of PR 1 | Replay (read-only, done) |
|---|---|---|
| JP&Co, Willows | none: their lines never offer, so the rule never runs | 0 of 105 JP&Co calls change; 0 of 141 Willows calls had the offer |
| Western Slope | 40 callers remembered as English | 10 of 221 calls lose the offer; 0 Spanish callers touched |
| Situs | 1 test caller | 0 of 17 change |
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:
Scripts, outputs and prototype findings: (local analysis, session 003).