Western Slope emergency line — handoff and vision

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)

1. TL;DR

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

2. Current state, as built tonight

The ring works. Most things around it broke tonight.
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.

Read-only study of Western Slope's AppFolio, on assignment:
  • "Accept" is only a history line: 1 of 38 accepts set the assignee.
  • The office (Bev) assigns the next morning.
  • Writing "assigned to" needs four missing pieces: a robot action, a people → AppFolio-user map, our own assigned-to field, and a fix for two robots that send it blank.
  • Clara's work orders never trigger AppFolio's own alerts (filed "internal", no issue type), so Clara's chain is the only pager.

3. What Western Slope described

Their AppFolio robot today: accept-to-stop, 5 minutes each.
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.

4. Gap table

11 topics: 5 gaps, 1 partial, 3 not said, 2 match.
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.

TopicWhat Western Slope said (verbatim)Our build tonightVerdict
Order of peopleMaintenance 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-maintenancestart 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, JonathanGAP Kat missing
Wait per personwe have it set to 5 minutes before it moves on to the next one. (ts …443792459)20-second ring, then the next person at onceGAP
How a person stops the chainto 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 on5 minutes before it moves on to the next one (ts …443792459)20-second ringGAP
Text and email on top of the callas soon as the phone call hits my phone, I get a text, and I get an email. (ts …443387939)Call + text, + email when on fileMATCH
When nobody answerskeeps sending it until somebody acknowledges it (ts …443792459)One pass, then inbox note + SlackGAP unclear
What the tenant is toldNothing 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 fireNOT SAID
Office / leasing alertNothing 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 chainNOT SAID
What counts as an emergencyit'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 ACPARTIAL
Day vs after hoursif 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 buildNOT SAID

5. Proposed state — Fede's vision

Clara calls each person; the conversation is the acknowledgement.

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.

What exists today. The Emergency Relay outbound agent already talks in natural language and answers the on-call person's questions, but it only calls the property's one emergency line after a resident reports a life-safety emergency and hangs up. It does not walk the on-call list, accept, or assign the work order.

6. Bug ledger tonight

11 bugs: 4 merged, 2 building, 1 queued, 2 decisions, 2 no change or superseded.
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
#BugEvidenceFix and state
1Clara live-transfers the caller to hop 1 while the chain also ringsWillows CAe6d48462d7 child leg; prompt line 177#18402 merged 7:30s PM
2Chain starts mid-call for a ceiling leak, before the unknown caller's address; alert says "unit unknown"WS conv_9601m4hm…, escalate at 29 sCause: #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
3Office "page the manager" email fires at escalation, no name or unit, to leasing@WS email 00:53:04 UTCCause: old "get a human" behaviour, left in place by #18361. Fix: office email after the chain, with address + outcome building
4On-call entry not linked to a profile, so the email leg is skipped ("no_person")Ryan's on-call entryno change Fede: no emails for Ryan or Jonathan for now; email only when an address is on file
5Work order never reaches AppFolio when the call came in on the front-door lineEMCR-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
6Inbound email: sender matching a property's stored email picks the building over the threadRecord 8f39ee26…, Yale 25 Station#18405 merged [urgent]: sender match only for data emails; Yale's property email cleared tonight
7Emergency emails carry no reply key; replies file by guesswork (a Western Slope reply became a staff meeting note)Records 474cd853, 2c6f5b70decision D7, nothing built
8Unverified caller's work order names the unit's tenant as reporterEMCR-000001Caller is the reporter, unit tenant noted queued
9Voicemail graded "human" by Twilio ends the chainWillows CA45624de2cfsuperseded by the vision: voicemail cannot accept (D1)
10"No heat" paged high, not emergency tierPromptdecision depends on the customer's list
11A 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 filedWillows 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
Where bugs 2 and 3 came from (Smith, bridge thread, 7:27 PM). Gera's approved tree, quoted in #18361 (opened from Gera's account): "Police, fire, gas → ring on-call people until someone answers". The building session added "water actively flooding" on its own, so a leak rang mid-call. The office email is the old "get a human" step; #18361 left it on for every life-safety tier.

First harness run, Willows, pre-fix build:

BugResult
1reproduced also on the gas call
2, 3, 8reproduced *
4reproduced
5not exercised no test property writes work orders to a PMS
6not exercised no non-staff mailbox reachable
7reproduced code check
9documented
11found two emergency calls filed no work order
Gas 911 line + mid-call start; routine repair, nobody rungas specified

* Graded on a caller number with old test history. Willows on-call list: two fleet lines for the night.

7. Decisions for Fede

Seven calls, one line each, with a recommendation.
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
#QuestionOptionsRecommend
D1What 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
D2How long per person?(a) 5-minute default, tunable per company · (b) keep 20 seconds(a) yes
D3Does calling Clara back inside the window count?(a) yes, it accepts · (b) no(a) yes
D4Who is called for police and gas?(a) add Kat to that path · (b) same chain as maintenance(a). Jay named Kat.
D5Which AC problems count?(a) any AC problem · (b) AC only in heat(a). Jay: "it's air conditioner".
D6What happens during the day?(a) same chain, day and night · (b) after hours only(a). Jay said it still calls them during the day.
D7What 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.

8. New testing rung

Test the customer's real shape before any customer test.
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.

PropFlow Docs