For Gera: what the emergency line does tonight, what Western Slope's AppFolio robot does today, the gaps, Fede's vision for the chain, and the calls Fede needs to make.
2026-10-09 evening MDT · Western Slope · Proposed — pending review (Fede, Gera)
flowchart LR A["5:36 PM
Line live with
the real on-call list"] --> B["6:52 PM
First real call
ring worked"] B --> C["Tonight's calls + Willows harness
exposed 11 bugs"] C --> D["Gap check vs
what Western Slope said"] D --> E["Fede's vision
+ 7 decisions"] classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420 classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 class A,B live class C,D gap class E soon
flowchart TD A(["Caller dials the front-door line"]) --> B["Picks maintenance"] B --> C["Unknown-caller intake
name + street address with unit"] C --> D{"Emergency?"} D -->|"yes"| E["Mid-call page
active tier"] E --> F["Chain: Ryan, then Jay, then Jonathan
20 s each
call + text, + email if on file"] F -->|"pickup"| G["Chain ends"] F -->|"nobody picks up"| H["Inbox note + Slack post"] E -.->|"bug 1"| X1["Clara ALSO live-transfers
the caller to hop 1"] E -.->|"bug 2"| X2["Page fires before the address
alert says unit unknown"] E -.->|"bug 3"| X3["Office email to leasing@
at escalation, no name or unit"] F -.->|"bug 4"| X4["Email leg skipped
entry not linked to a profile"] G -.->|"bug 9"| X9["Voicemail graded human
ends the chain"] C --> W["After the call:
work order written"] W -.->|"bug 5"| X5["Never reaches AppFolio
no writer for the front-door line"] W -.->|"bug 8"| X8["Reporter = unit's tenant,
not the caller"] R["Western Slope replies
to an emergency email"] -.->|"bugs 6, 7"| X6["Reply filed on the wrong thread
became a staff meeting note"] classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420 classDef neutral fill:#eef1ee,stroke:#8a958f,color:#1d2420 class A,B,C,D,E,F,G,H,W,R live class X1,X2,X3,X4,X5,X6,X8,X9 gap
Green = built and working. Red = broke tonight; numbers match the bug ledger in section 6.
flowchart TD A(["Work order with an emergency issue type
any AC problem counts, day or night"]) --> P1 P1["Ryan, maintenance manager
the quarterback
call + text + email at once"] --> K1{"Press 1 accept
Press 2 skip"} K1 -->|"1"| ACC["Work order assigned to that person
tree stops"] K1 -->|"2, or 5 minutes pass"| P2["Jay
call + text + email"] P2 --> K2{"1 or 2?"} K2 -->|"1"| ACC K2 -->|"2, or 5 minutes pass"| P3["Technician
call + text + email"] P3 --> K3{"1 or 2?"} K3 -->|"1"| ACC K3 -->|"2, or 5 minutes pass"| LOOP["Keeps sending it
until somebody acknowledges
(their wording; end state not described)"] LOOP -.-> P1 POL(["Police, gas, non-maintenance"]) --> KAT["Call Kat, Jay, Ryan
until someone is reached"] classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 classDef outside fill:#f3f3f3,stroke:#9a9a9a,stroke-dasharray:4 3,color:#4a4a4a class A,P1,P2,P3,ACC live class K1,K2,K3 soon class LOOP,POL,KAT outside
What Western Slope has today, as Jay walked us through it on Oct 7. Shown for contrast; we are not copying it (section 5). Picking up is not enough: the person must press 1, which assigns the work order. Pressing 2 skips the 5-minute wait.
flowchart LR G["GAP: 5
Kat, wait, acknowledge,
move-on time, cycling"] P["PARTIAL: 1
what counts"] N["NOT SAID: 3
tenant, office, daytime"] M["MATCH: 2
order, text + email"] classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420 classDef neutral fill:#eef1ee,stroke:#8a958f,color:#1d2420 class G gap class P soon class N neutral class M live
Source: Oct 7 customer call, raw transcript in #transcripts, thread 1791412441.103039. "ts …443792459" is short for chunk ts 1791412443.792459. Sep 30 quotes are from thread 1790810029.066889. The test-address row from the analysis is left off this page because it carries a home address.
| Topic | What Western Slope said (verbatim) | Our build tonight | Verdict |
|---|---|---|---|
| Order of people | Maintenance manager, then me, then maintenance technician, um, with the hope that none of them make it to him, because I want Ryan to be quarterback in these.(ts …443387939). Ryan is our maintenance manager.(ts …442760009) | Ryan, then Jay, then Jonathan. The transcript never names the technician; "Jonathan" is from our side. | MATCH |
| Police, gas, non-maintenance | start calling Kat and Jay and Ryan and, like, until you get a hold of somebody, or, you know, ping us some other way(ts …441890789) | Same chain: Ryan, Jay, Jonathan | GAP Kat missing |
| Wait per person | we have it set to 5 minutes before it moves on to the next one.(ts …443792459) | 20-second ring, then the next person at once | GAP |
| How a person stops the chain | to accept the work order and assign it to yourself, press 1. Otherwise, press 2, and it will move on to the next person.Fede: Oh, so they have to accept it.Jay: That's what stops the tree.(ts …443792459) | Any pickup Twilio grades as human ends the chain. No assignment. | GAP no acknowledgement step. Pressing 1 is their mechanism, not the target. |
| How long before moving on | 5 minutes before it moves on to the next one(ts …443792459) | 20-second ring | GAP |
| Text and email on top of the call | as soon as the phone call hits my phone, I get a text, and I get an email.(ts …443387939) | Call + text, + email when on file | MATCH |
| When nobody answers | keeps sending it until somebody acknowledges it(ts …443792459) | One pass, then inbox note + Slack | GAP unclear |
| What the tenant is told | Nothing on Oct 7. Sep 30, Jason: there could be some protocol, like, where, if this is an emergency, call 911. Like, we're not the police. | Spoken 911 line for gas and fire | NOT SAID |
| Office / leasing alert | Nothing for emergencies. Next-morning habit: Bev, our VA, at 8.09 AM … is assigning it to our maintenance technician(ts …443792459) | Office email at escalation; moving to after the chain | NOT SAID |
| What counts as an emergency | it's not just air conditioner leak now that triggers an emergency, it's air conditioner(ts …443387939). Tenant claims off the list: I'd rather have it come to me(ts …443990029) | Their list, but "AC in heat", not any AC | PARTIAL |
| Day vs after hours | if it's one of the categories that's listed as an emergency, it's still gonna call us during the day.(ts …443588549) | Not stated in our build | NOT SAID |
Fede: "Clara raises a work order and wraps up with the tenant. Then there's an offline process that creates the work order. And then Clara, as an outbound ElevenLabs agent, calls each person and describes in natural language what the issue is briefly, but then it's a conversation: they can ask questions about the work order and she has all the details. That's the acknowledgement."
flowchart TD A(["Clara raises the work order
and wraps up with the tenant"]) --> B["Offline: work order created
building, unit, reporter = caller, category"] B --> C{"Category on the company's list,
or caller says emergency?"} C -->|"no"| N["Normal work order flow"] C -->|"yes, day or night"| P["Clara outbound voice agent calls the next person
text + email at the same moment"] P --> T["Clara explains the issue briefly
answers questions from the work order"] T -->|"I've got it"| ACC["Accept: assign the work order
stop the chain"] T -->|"send it to the next person"| M{"More people?"} P -->|"no answer or voicemail"| W["Wait the window
default 5 min, tunable"] W -->|"they call Clara back
inside the window"| ACC W -->|"window ends"| M M -->|"yes"| P M -->|"no"| CY["Start the list again
cycle until accepted"] CY --> P ACC --> O["Office / leasing summary email
AFTER the outcome"] G(["Gas, fire, police
during the call"]) --> G1["Spoken 911 line"] G1 --> G2["Chain starts mid-call"] G2 --> P NT["Never a live transfer of the tenant"] classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420 class A,B,C,N,M,O,G,G1,G2 live class P,T,ACC,W,CY soon class NT gap
Amber = new behaviour, waiting on decisions D1 to D3.
flowchart LR MG["Merged
bugs 1, 2, 5, 6"] BU["Building
bugs 3, 11"] QU["Queued
bug 8"] DE["Decision
bugs 7, 10"] OT["No change / superseded
bugs 4, 9"] classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 classDef gap fill:#f8e2dd,stroke:#b8432f,color:#1d2420 classDef neutral fill:#eef1ee,stroke:#8a958f,color:#1d2420 class MG live class BU soon class QU,OT neutral class DE gap
| # | Bug | Evidence | Fix and state |
|---|---|---|---|
| 1 | Clara live-transfers the caller to hop 1 while the chain also rings | Willows CAe6d48462d7 child leg; prompt line 177 | #18402 merged 7:30s PM |
| 2 | Chain starts mid-call for a ceiling leak, before the unknown caller's address; alert says "unit unknown" | WS conv_9601m4hm…, escalate at 29 s | Cause: #18361 (merged 4:54 PM MT) added "water actively flooding" to the mid-call tier. Fix: #18403 merged: chain from the work order, address before the page |
| 3 | Office "page the manager" email fires at escalation, no name or unit, to leasing@ | WS email 00:53:04 UTC | Cause: old "get a human" behaviour, left in place by #18361. Fix: office email after the chain, with address + outcome building |
| 4 | On-call entry not linked to a profile, so the email leg is skipped ("no_person") | Ryan's on-call entry | no change Fede: no emails for Ryan or Jonathan for now; email only when an address is on file |
| 5 | Work order never reaches AppFolio when the call came in on the front-door line | EMCR-000001, workflow maintenance-conv_voice_614cf4d5… | #18404 merged: AppFolio writer from the work order's property; on the release train. No re-drive. Fede: "we don't want to create a work order on the test I made", so the test work order is fenced off on our side instead |
| 6 | Inbound email: sender matching a property's stored email picks the building over the thread | Record 8f39ee26…, Yale 25 Station | #18405 merged [urgent]: sender match only for data emails; Yale's property email cleared tonight |
| 7 | Emergency emails carry no reply key; replies file by guesswork (a Western Slope reply became a staff meeting note) | Records 474cd853, 2c6f5b70 | decision D7, nothing built |
| 8 | Unverified caller's work order names the unit's tenant as reporter | EMCR-000001 | Caller is the reporter, unit tenant noted queued |
| 9 | Voicemail graded "human" by Twilio ends the chain | Willows CA45624de2cf | superseded by the vision: voicemail cannot accept (D1) |
| 10 | "No heat" paged high, not emergency tier | Prompt | decision depends on the customer's list |
| 11 | A caller whose number has past conversations but no person or unit record is greeted by name, never asked for the address, and no work order is filed | Willows harness calls b and c: conv_voice_39bd8845…, conv_voice_e100abb0… | Found by the harness at the Willows. Fix: ask the address whenever no unit is resolved; file the work order even with the unit unknown building |
First harness run, Willows, pre-fix build:
| Bug | Result |
|---|---|
| 1 | reproduced also on the gas call |
| 2, 3, 8 | reproduced * |
| 4 | reproduced |
| 5 | not exercised no test property writes work orders to a PMS |
| 6 | not exercised no non-staff mailbox reachable |
| 7 | reproduced code check |
| 9 | documented |
| 11 | found two emergency calls filed no work order |
| Gas 911 line + mid-call start; routine repair, nobody rung | as specified |
* Graded on a caller number with old test history. Willows on-call list: two fleet lines for the night.
flowchart LR D1["D1 natural-language
outbound agent"] --> G1["Acknowledgement step
+ assign + retires bug 9"] D2["D2 5-min window"] --> G2["Closes the wait gap"] D3["D3 callback = accept"] --> G1 D4["D4 Kat on police / gas"] --> G3["Closes the police gap"] D5["D5 any AC counts"] --> G4["Closes the AC part of PARTIAL"] D6["D6 same chain by day"] --> G5["Matches their 24/7 rule"] D7["D7 reply tag on emails"] --> G6["Fixes bug 7"] classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 class D1,D2,D3,D4,D5,D6,D7 soon class G1,G2,G3,G4,G5,G6 live
| # | Question | Options | Recommend |
|---|---|---|---|
| D1 | What is the chain's call leg? | (a) Clara's natural-language outbound voice agent; the conversation is the acknowledgement · (b) keep today's ring, pickup ends it | (a) yes |
| D2 | How long per person? | (a) 5-minute default, tunable per company · (b) keep 20 seconds | (a) yes |
| D3 | Does calling Clara back inside the window count? | (a) yes, it accepts · (b) no | (a) yes |
| D4 | Who is called for police and gas? | (a) add Kat to that path · (b) same chain as maintenance | (a). Jay named Kat. |
| D5 | Which AC problems count? | (a) any AC problem · (b) AC only in heat | (a). Jay: "it's air conditioner". |
| D6 | What happens during the day? | (a) same chain, day and night · (b) after hours only | (a). Jay said it still calls them during the day. |
| D7 | What does a staff reply to an emergency email do? | (a) emails carry a reply tag saved with the conversation and company; a reply is matched and logged, nothing relayed to the resident, a person is alerted when nothing matches · (b) team notice: replies relayed to the resident · (c) escalation record: a reply settles it and is relayed to the resident | (a). Today a reply files by guesswork. |
flowchart LR A["Unknown number
no person record"] --> B["The customer's
exact on-call list"] B --> C["Dial the
front-door line"] C --> D["Real AppFolio
behind the unit"] D --> E["Reply to every
email it sends"] E --> F(["Only then:
customer test"]) classDef live fill:#e3f2ea,stroke:#2f7d5b,color:#1d2420 classDef soon fill:#fbf0dc,stroke:#b7791f,color:#1d2420 class A,B,C,D,E soon class F live
Tonight's bugs hid in the gap between our test property and the real setup. New rung on the testing playbook, before any customer test: an unknown number, the customer's exact list shape, the front-door line, real AppFolio behind the unit, and a reply to every email to see where it files. Ring only numbers we own.