What the switch really does, what is proven at the Willows, what is not, and what has to happen before Western Slope's leasing texts move into AppFolio. One switch for the whole company, as Fede ruled on Oct 19; the flip itself stays his call.
2026-10-19, evening MT · Proposed — pending Fede's review · code read at origin/main 866fb1c9f · production reads only, nothing turned on · source: inspection I1 (session 002), the Oct 19 Willows battle test, the proof table and the shared-inbox design
On this page
Short version: the reply loop inside an existing AppFolio thread is proven at the Willows; the new-lead thread start was proven at the Willows on Oct 20; the daily request budget and mid-conversation number jumps can bite on day one; every tenant and prospect reply does not yet wake Clara. Recommendation: run the eight legs in section 7 and take the six calls in section 8 before any flip.
Not ready for Western Slope tomorrow. The reply loop inside an existing AppFolio thread is proven, and so is the path Western Slope hits most: a brand-new lead whose first text from Clara starts an AppFolio thread (Willows, Oct 20 16:58Z, run L3, about 27 robot requests, 99 s reply round trip, no false alert). Two things can still bite on day one regardless of testing: the daily AppFolio request budget, and conversations that jump to a second phone number mid-thread.
| # | What | State | Why |
|---|---|---|---|
| 1 | Prospect texts AppFolio, Clara wakes, replies through AppFolio | GREEN | Willows, Oct 19 11:01Z: 59 s text-to-phone, nothing from Clara's line |
| 2 | Two texts seconds apart get one reply | GREEN | Willows, Oct 19 11:05Z |
| 3 | A conversation on Clara's own number stays there when the person texts her | GREEN | Willows, Oct 19 05:53Z |
| 4 | STOP and START typed on the AppFolio line are recorded, with and without a guest card | GREEN | Willows, Oct 19, two runs |
| 5 | A text to Clara's own number after the flip is still answered | GREEN | the inbound path never reads the switch |
| 6 | New guest card → Clara's first text starts the AppFolio thread | GREEN | Willows, Oct 20 16:58Z (run L3): Clara's first text from guest card 311 started the AppFolio thread (AppFolio message 1166642348) and reached the test phone about 18 s after the reset, for 20 robot requests. The lead's reply mirrored (1166644184) and woke Clara; her answer went back into the same thread (1166645956), 99 s from the lead's text to her answer on the phone, about 7 requests. No "door down" alert, nothing from Clara's own line. About 27 requests in all, against 171 on Oct 16. The earlier refusal (number missing from the phone registry) is fixed by #21452. The only defect seen is a Clara reply bug, tracked separately and not a door defect: she offered a tour slot that had already passed. Side findings still open: #21453, #21454, #21455 |
| 7 | Open conversations on Clara's number keep that number at the flip | RED | protected only when the sending code names the conversation; several senders do not (section 2) |
| 8 | Every tenant and prospect reply in AppFolio wakes Clara | RED | four gaps, three are one-line fixes (section 3) |
| 9 | "One switch for all modules" | RED as worded | maintenance texts to tenants and the renewal tool texts never consult the switch; they stay on Clara's line (section 2) |
| 10 | Western Slope's daily AppFolio request budget | RED | the inbox copy alone used 3,664 of 4,000 by 7 pm on Oct 19, before a single Clara text (section 4) |
| 11 | Situs Group | RED | no inbox copy, no Clara login in AppFolio, Clara not live; "answer AppFolio replies first" is not a mode that exists (section 6) |
| 12 | Tour confirmation and reminder through AppFolio | GREEN | Willows, Oct 20 01:25Z: the tour booked by text and Clara's confirming reply went through AppFolio (thread row 1166348275, 52 s). The 1-hour reminder fired Oct 20 14:00:00Z and reached the test phone from the AppFolio texting number 23 s later (AppFolio message 1166428613); nothing left Clara's own number and no "door down" alert posted. The separate tour-confirmation sender did not fire on the text-booked path (the confirming reply covers it). Two bugs found on the way: the record holds a different unit than Clara confirmed (#21278); the weekend check-in step is not registered on the tour worker (#21280) |
| 13 | Follow-up texts through AppFolio, and they stop when the person replies | YELLOW | the Willows re-engagement cycle restarted on the Oct 20 replies; its next touch is due about Oct 21 01:24Z and will be checked then |
| 14 | After a STOP, the next send is refused on both numbers | GREEN with one hole | Willows, Oct 20 01:31–01:37Z: STOP recorded in 60 s, Clara's next reply blocked by the shared gate (no outbox row, nothing reached the phone), START recorded, the next reply went through AppFolio again (row 1166350188). The hole: a send graded "transactional" to a stopped number is allowed and only logged, so the refusal holds for outreach-graded sends only (ask A7). Also found: Clara tried to confirm the STOP by text and the blocked row shows as sent (#21279) |
| 15 | A teammate's AppFolio text puts Clara on hold | YELLOW | unit-covered; needs a second AppFolio login to run; and nothing ever releases that hold |
| 16 | Texts with a photo or PDF stay on Clara's number | YELLOW | in code, never run |
| 17 | Held texts expire or are re-sent under the caps | YELLOW | no retryable hold has ever happened live |
| 18 | Clara's texts in AppFolio show under her own login at Western Slope | YELLOW | credential says user 540 "Clara Propflow"; not verified by a send. If wrong, her texts read back as staff and mute her |
There is no "new conversations only" mode. The company setting is read on every single send, with no cache and no restart. The flip changes the next outbound text of every conversation at the company, decided per send by four rules in this order.
| Case | Next Clara text leaves from |
|---|---|
| Started on Clara's number before the flip; the send names the conversation | Clara's number, unless a teammate or the renter wrote in AppFolio after her last text; then AppFolio |
| Started on Clara's number; the send does not name the conversation | AppFolio: a second number mid-conversation, no guard |
| Started in AppFolio | AppFolio, into the same thread |
| Brand-new person after the flip | AppFolio: Clara must start a thread from the person's guest card. No card = held, one alert, never Clara's number |
| Brand-new person who texts Clara's number first | Clara's number |
| Photo or PDF, staff, vendor | Clara's number, always |
| A scheduled job that started before the flip (tour reminder, follow-up step, renewal reminder) | Decided at the moment it sends, same rules; nothing is remembered from when the job started |
Running at Western Slope right now (Temporal, read on Oct 20 00:58Z): 0 renewal jobs, 2 tour jobs, 19 follow-up sequences, 4 re-engagement cycles, 63 maintenance jobs. All of the leasing ones name their conversation, so they keep Clara's number for a Clara-number thread; the household-member variants do not. The maintenance ones never consult the switch.
Western Slope specifically: the inbox copy has been on since Oct 16, so staff texts and AppFolio's own template texts are already filed on Western Slope conversations. A replay on the design page found 33 of 41 people would get Clara's next text on the number they last wrote to; 8 would not.
Not today. Fede wants it to be true. The wake rule is: a live inbound text from the renter, the switch on, and Clara's own text is the newest office-side message on that conversation. Her texts from her own number count, so a Western Slope prospect she has been texting on her number who answers inside AppFolio does wake her, and her reply then leaves through AppFolio.
Side effect of the flip, stated plainly (Oct 20): with the three gaps closed (#21315, merging dark; the door is off at every customer, so nothing changes until a flip), a tenant who texts first wakes Clara; a tenant replying to any Clara text, not only a renewal offer, wakes her; a bulk send or an AppFolio notice no longer counts as a teammate speaking. A teammate who wrote after Clara still silences her, and under Supervised every send is still held. The source for "wake on every reply" is a relay of Fede's Oct 19 voice note, not his raw words; session 005 is confirming the rule with him, and the PR closes if he says no.
| Gap | Fix | Size |
|---|---|---|
| Tenant texts never wake her (held "tenants later") | PR #21221, open tonight | merging |
| After #21221, a tenant wakes her only if her last text was a renewal | drop that one condition (issue #21246) | one line |
| The renter writes first and nobody from the office has spoken | wake when there is no office-side message at all | one line |
| A bulk send or an AppFolio notice after Clara's text counts as "a teammate spoke" | exclude bulk and notice rows from the teammate check | one line |
| A teammate wrote after Clara | none: this is Fede's own "another human replied, we stop" rule; the hold still blocks the send even if the wake fired | his call on the shared-inbox page |
| Texts that arrived while the switch was off (Western Slope since Oct 16) are never re-decided | none planned; only texts after the flip are judged. Renters waiting in AppFolio before the flip get no reply from Clara | by design (Fede Oct 15: no late catch-up) |
| Rows held "tenants later" before #21221 do not re-file | mark them history; otherwise they would wake her on stale texts | one-off script, issue #21213 |
One budget of 4,000 robot requests per AppFolio database per day covers the inbox copy and every door text. The inbox copy alone used 3,664 by 7 pm MT (3,324 on Oct 18; 3,470 on Oct 16 and 17).
A reply into an existing thread: 7. Starting a thread from a known guest card: 20. Finding the card by phone first: 220. Past the ceiling a text is held for good with a "door down" alert; it never falls back to Clara's number.
Clara sends about 13 texts a day at Western Slope. On a day like Oct 19 the door would go down in the evening while the inbox copy keeps ticking. This needs a decision before the flip: a cheaper inbox copy (fewer reads once the backfill is done), a bigger ceiling, or a reserved slice for sends.
| Fact | Situs Group | Western Slope |
|---|---|---|
| Inbox copy | off, never ran | on since Oct 16 (912 rows) |
| Clara's login in AppFolio | none | user 540 "Clara Propflow" |
| Clara live | no | yes |
| Company line | attached Oct 19 17:58Z | attached |
| AppFolio texting in use | inbox read on Oct 12: no messages; about half of tenant texting runs on two staff members' personal cells | in daily use by staff |
| Phone system | Crexendo; phase 1 proposal: nights and weekends to Clara | forwarded to Clara |
"Answer AppFolio replies first" is not a mode that exists. The wake needs the switch on, and the switch moves all of Clara's leasing outbound at the same time. Flipping Situs today would have Clara start threads and never hear back, because nothing copies the inbox. Replies-only needs a small new build: the wake reads its own setting instead of the door switch, plus the "renter writes first" fix above; the reply itself already leaves through AppFolio because the renter's AppFolio text is the newest row. Before any of it: Clara's AppFolio login at Situs, the inbox copy on with a few days of budget readings, Clara live.
All at the Willows (our test property), never across the shared-bench blackouts (03:40–04:30Z and 07:00–07:45Z). Started tonight: runs 2, 3 and 4. Run 1 needs a purchase.
| Run | Turns green | Needs | Minutes |
|---|---|---|---|
| 1. New lead: create a guest card → Clara's first email → her first text starts the AppFolio thread → prospect replies → Clara replies through AppFolio | row 6: the run was done Oct 20 16:58Z (L3) and row 6 is green; the reds left are rows 7 to 11 | one fresh Twilio number: every one of our 26 numbers already has a person, a thread or a live job on it. A purchase, Fede's go | 45–60 |
| 2. Tour booked inside the door thread → confirmation through AppFolio; tour set ~70 min out so the reminder fires through AppFolio | rows 12 | the Willows test prospect line (has a door thread) | 20 + 70 wall clock |
| 3. STOP → trigger a send → refused on both numbers → START | row 14 | same line | 15 |
| 4. Follow-up: the running Willows re-engagement cycle on that line fires its next touch through the door on its own; reply stops it | row 13 | observe, then reply | passive |
| 5. Teammate text in AppFolio on that thread, then the prospect replies → Clara stays quiet | row 15 | a second AppFolio login at the Willows database | 20 |
| 6. Photo or PDF to a prospect → leaves from Clara's number | row 16 | a product path that sends media to a prospect; none obvious for leasing | 15 |
| 7. Number-switch replay (read-only): run Western Slope's open conversations through the door decision per sender type and count the jumps | row 7 sized | builder time | 60 |
| 8. Tenant leg: after robot #580 and app #21249 merge, a renewal-style text to a Willows test tenant, tenant replies, Clara's held reply, approve, sent in AppFolio | tenant side | the Willows test tenant whose thread was opened tonight | 30 |
| # | Ask | Options | Recommendation |
|---|---|---|---|
| A1 | Buy one Twilio number for the new-lead run (row 6: the run was done Oct 20 16:58Z (L3) and row 6 is green; the reds left are rows 7 to 11) | DONE: Fede said yes Oct 20 02:50Z; bought +1 720 734 8022 (Twilio sid PN15a51f3d903a660ef33f002551e9ce09, "Door new-lead test caller (Willows)", $1.15/mo). The new-lead run started after the 04:30Z bench blackout | yes: about $1.15 a month. Checked Oct 20 03:05Z against all 27 lines we own: 24 have already texted or called the Willows; the 3 clean ones are live duty lines (staff sign-in codes, the talk-to-a-person ring line, the Situs login-code line) and could still be known to AppFolio from a call. A fresh number is the only clean way |
| A2 | The number-switch senders (row 7) | (a) fix the known ones before the flip: the teammate-answer relay reads the thread id it already has; household-member and mass texts name their thread · (b) accept the jumps | (a): three small fixes, no switch; the relay fix is one line |
| A3 | The request budget (row 10) | (a) reserve a slice of the 4,000 for sends and slow the inbox copy once the backfill is done · (b) raise the ceiling · (c) flip and watch | (a): the copy is the spender; a reserved slice means a Clara text is never the one that trips the ceiling |
| A4 | "Every reply wakes Clara" (row 8) | (a) the three one-line fixes now, the teammate rule stays · (b) leave the wake as is | (a) |
| A5 | "All modules" (row 9) | (a) keep maintenance and renewal-tool texts on Clara's number for now and say so · (b) route them through the switch too (a day, and the tenant side depends on #580/#21249) | (a) for the first flip; (b) as the next build |
| A6 | Situs Group | (a) nothing until Clara is live there with a login and the inbox copy on · (b) build "replies only" as its own setting now | (a), then (b) if Situs still wants replies-first |
| A7 | A send graded "transactional" reaches a stopped number through AppFolio today (allowed and logged). Keep that on the AppFolio door, or refuse every send after STOP on the door? | Refuse every send after STOP on the door; AppFolio itself has already told the person they are unsubscribed. One small fix, no switch | yes / hold |
| Id | Claim | Status | Evidence |
|---|---|---|---|
| R1 | Reply loop, double text, Clara-number thread stays, STOP/START recorded: proven live at the Willows on Oct 19 (05:53Z, 08:30Z, 11:01Z, 11:05Z, 11:10Z); the new-lead thread start was proven at the Willows on Oct 20 16:58Z (run L3, about 27 robot requests, 99 s reply round trip, no false alert; the Oct 16 try had been abandoned) | VERIFIED | session 002 battle-test-results.md Parts 1–3; proof table on pms-conversations-in-clara-picture#oct19; issue #21068 |
| R2 | The company door is read per send (direct organization read, no cache found) and the thread is read only when the send names a conversation; group B senders (team-note relay, household parties with no prospect row, mass texts, router misses, first renewal offer) do not name one and jump to AppFolio; maintenance-to-tenant and renewal tool texts pass only an entitlement property id so the door read returns null | VERIFIED (code at 866fb1c9f) | dispatcher.ts:515–530; thread-door.ts:55–98; outbound-record.ts:111–132; reply-release.ts:1580, :2763–2783; rating.ts:883; company-text-door.ts:18–29; readiness/agentA-senders.md (43 senders) |
| R3 | Running Temporal workflows by company at 2026-10-20 00:58Z: Western Slope 63 maintenance, 19 follow-up, 4 re-engagement, 2 tour, 0 renewal; Situs 2 maintenance, 1 follow-up | VERIFIED (production, read-only) | temporal workflow list, running = 358; readiness/temporal-running.json, wf/inputs.jsonl |
| R4 | Wake rule: live inbound renter text, door on, Clara's text newest office-side; tenant threads held at main; the four gaps and their one-line fixes | VERIFIED (code) | wake-on-reply.ts:49–96; file-message.ts:256–269; #21221 branch; readiness/agentB-inbound.md |
| R5 | One 4,000-request daily ceiling per database covers the mirror and the door; WS used 3,664 by 18:59 MT on Oct 19 with zero door sends (3,324 Oct 18; 3,470 Oct 16–17); past the ceiling a door text is held final; reply 7, card start 20, phone lookup 220 requests | VERIFIED (code + production STATE row) | watch.ts:141, :212–233; appfolio-text-door.ts:138–146; l4-core.ts:5707–5709; PMSMIRROR#appfolio#westernslopepm STATE |
| R6 | Situs: inbox copy absent, no Clara login (no claraUserId), claraLive false, 0 mirror rows, company line attached 2026-10-19T17:58Z; "replies first" needs the wake to read its own setting | VERIFIED (production, read-only) + INFERENCE on the build | ORG#org_a3376147 PROFILE and attachments; PMSMIRROR#appfolio#situsgroup count 0; readiness/agentC-sidefx-situs.md |
| R7 | "On a day like Oct 19 the door would go down in the evening" and "about 13 texts a day" are arithmetic on the readings above, not a measured outage | INFERENCE | readiness/findings.md section 5 |
Raw findings with every file:line, record id and test number: session 002 scratchpad door/readiness/ (local only; contains test numbers).