How Clara should answer "how do I use the resident portal?" questions from the property software vendor's own help articles, without bloating her prompt.
Fact set: proposed, pending Fede's review (2026-10-16). Tools: decided 2026-10-16 (#20544), being finished 2026-10-31 · AppFolio first, Yardi later · leasing and resident texts, email and voice
Recommendation: option C. Keep a small, reviewed set of vendor help facts next to each property software adapter, and hand Clara only the 1–3 that match, only on the turns that need them.
Camellia Apartments, 2026-10-16. A prospect who toured on Oct 13 could not open her lease.
| Time (MDT) | What happened |
|---|---|
| 11:31 | She texted: "Whenever I try to review the lease it asks me for an email and password I have not created yet." Clara had no fact for this, emailed the question to the office, and told her "I'll check with the team." no answer |
| 11:33 | She sent a screenshot with no text. Clara answered from the image with a guess: "click Forgot your password?" Nothing in Clara's knowledge backed it. ungrounded |
| AppFolio's help | The lease-signing email itself carries the link that activates the portal. Activation and reminder emails come from donotreply@appfolio.com and often land in spam. The lease email can be resent from Leasing > Leases ("Resend to Tenants"). "Forgot Password?" is step 3 of the vendor's checklist, only after the portal is confirmed active. |
So Clara's guess was plausible, but not what the vendor says for an account that was never activated.
Sources: AppFolio help articles "FAQs: Sending Online Lease Documents" and "FAQs: FolioSpace Online Portal Activations", from our scraped knowledge base. The separate bug where the photo-only text produced an empty office email is fixed in propflowai PR #20491 and is not this page's subject.
"not bloating the prompt, having it be dynamic, where do we store it, what if it goes out of date, what if the vendor updates the instruction."
Ordinary turns carry zero extra prompt text. Only a portal or app question pulls in vendor facts, and only for that one turn (flow at the top).
Account status can only come from the PMS adapter's portal-status read, and that read exists for AppFolio tenants only, not applicants.
Fede: "a better version would be to teach Clara how to resend if needed." Clara resends the lease or portal activation email herself, and forwards to the office only when she can't.
src/lib/integrations/appfolio-browser-agent/l4-core.ts, ~lines 1452–1453) are never used for a resend.| Option | Prompt cost on ordinary turns | Who maintains it | How staleness is caught | Second PMS (Yardi) | |
|---|---|---|---|---|---|
| A. Paste vendor facts into Clara's prompt, per PMS | Every turn | By hand | Nobody notices | Prompt doubles | rejected |
| B. Put the facts in each customer's knowledge base | Only when retrieved | Copied per customer | Drifts per customer | Copied again per customer | rejected |
| C. One help set per PMS, kept with that PMS's adapter in the app repo; last step: Clara resends the email herself, office only if she can't | None; matched turns only | Reviewed in PRs | Weekly re-scrape compares each source article | A sibling file | recommended |
B also breaks Fede's 2026-10-15 rule: PMS facts live in the adapter, never in core code or customer data. In C, each fact row carries the provider, topic, short resident-facing wording, the vendor article title and link, the date scraped, and a fingerprint (content hash) of the source article.
We already scrape AppFolio's help center into a private knowledge-base repo: 1,250 articles in today's scraped index. The scraper exists in the app's PMS agentic layer branch.
| Topic | What Clara may say |
|---|---|
| First login / portal activation | The portal is activated from the link in AppFolio's email. |
| Lease e-sign | The signing link is in the lease email itself. |
| Forgot password | Use "Forgot Password?" only once the portal is active. |
| Activation email sender and spam | It comes from donotreply@appfolio.com; check spam. |
| Resending the email | Clara can resend the lease or activation email herself; if she can't, the office will. |
| Online payments setup | How to set up payments in the portal. |
| Autopay | How to turn on automatic payments. |
| Maintenance request | How to submit a request from the portal. |
| Notice to vacate | How to give notice from the portal. |
| Renters insurance upload | How to upload proof of insurance. |
All sourced from the scraped help articles. Wording written short and plain; vendor prose is never pasted.
The voice renewal check for portal claims already scores zero for any statement about a person's activation status. The same rule carries over:
The fact set improves something Clara already does, so it ships with no switch, live everywhere once proven.
The resend climbs further:
What happened. Situs Group, 2026-10-31, 2:29 PM. A Spanish-speaking resident called Clara: she forgot her portal password, the app said locked, and she wanted to pay rent. Clara took a note and emailed the office. Fede opened her AppFolio tenant page and clicked Send Reset Password Email; Clara then texted her (by hand, as Clara) that the reset link was on its way. The whole fix was one click Clara could have made herself.
How often. 7 of 770 tenant or caller conversations since Aug 2 (about 1 in 100), from roughly 3 people; 6 of the 7 were phone calls. Every one ended in "the team will get back to you". Counted read-only over the production records; treat 7 as a floor.
| Piece of the Oct 16 chain (#20544) | State on Oct 31 | Now |
|---|---|---|
| Company switch, neutral PMS method, Clara tool "resend portal invite" | Merged Oct 17 (propflowai #20545), dark | kept, same switch covers both actions |
| Robot route that sends the activation invite | never opened | building: robot PR, proven live at the Willows |
| Password reset email (today's click) | not in the plan; the tool only said "use Forgot password" | building: new neutral method + robot route; an active portal now gets the reset email |
| Clara gets the tool on calls and texts | never opened | building: voice field, ElevenLabs sync, prompt text, fastlane call before the PR opens |
Rollout. New customer-facing action, so it stays behind portalInviteResendEnabled (default off). Proof is a real resident call or text at the Willows that ends with the reset or activation email landing in a corporate test mailbox. Fede pre-approved the turn-on at Situs Group and Western Slope on 2026-10-31 ("yes"); it happens as soon as the Willows proof passes, and the proof link goes here. The fact set (sections 3 to 10) is a separate decision and is not blocked by this.
14 real cases, 18 contacts. 9 reached Clara (7 calls, 1 text, 1 email), 5 were in the office's own AppFolio texts. Handled well: 2. Partly: 6. Badly: 4. Slow or unclear: 2. English 12, Spanish 2.
| Topic | Cases | Can we fix it ourselves? | Fede's call |
|---|---|---|---|
| Lease e-sign: "asks for an email and password I never created", link expired, won't load | 4 | Yes: resend the lease (same shape as the portal sends) | build |
| Payment option missing or payment failed (bank option gone, "no me deja en línea", Flex Pay confusion) | 4 | No: property settings. Clara explains, office changes | explain only |
| "How do I report a repair on the portal" | 2 | Clara files the work order herself | never point at the portal |
| Verification code never arrives (one Western Slope resident, 5 calls over 3 weeks) | 1 | Not by email. AppFolio's fix is the office unticking two-factor on the tenant record; a candidate one-click action | pending |
| Forgot password / locked out (Situs, Oct 31, Spanish) | 1 | Yes: reset email (building) | build |
| Renters insurance update | 1 | Explain where to upload | explain only |
| Notice to vacate, autopay, activation email never arrived | 0 | Explain only when asked | keep, low priority |
| Flexible rent | 1 | — | out ("not this") |
The Camellia case (Oct 16). An approved applicant could not open her lease; Clara deferred to the office twice, the 5 PM deadline passed, then Clara guessed "Forgot password" from a screenshot. When she called back on Oct 22 asking for a person, Clara rang Camellia's office through the shared ring line; nobody picked up, she reached the office voicemail, and Clara emailed the office her callback number. (An earlier read of this as a transfer to another customer's line was wrong: the ring line is shared and rang the right office. A separate defect, the ring line finding no saved call record and hanging up on 4 October callers, is being fixed on its own PR.)
Full table with conversation ids: session 009 scratch file portal/real-examples.md; the counts above are read-only reads of production, not estimates.
Recommendation. Clara reads AppFolio's own help through one look-up tool that works the same on text, email and calls: resident wording from AppFolio's public resident page (English and Spanish), office fixes from the scraped help center, both refreshed weekly into our database, no help text in code. Where PropFlow can act (balance, repairs, a resend), Clara acts instead of pointing to the portal.
Resident or applicant, any channel, any language
"me pide un código y no me llega"
|
v
Clara calls portal_help with ONE topic from a short fixed list
(that choice is the classifier; not about the portal -> normal reply)
|
v
PMS adapter: the building's PMS, else the company's
(core code never names AppFolio; no identity needed)
|
v
Vendor help rows in our database, per PMS / topic / language
<- weekly: AppFolio public resident page, EN + ES
<- weekly: help-center office articles, robot's read-only route
| 1-2 resident sections + office-fix lines + never-say rules
v
Clara answers in her own words, in their language
| only if the platform can act, and only for a verified resident
v
Their tenancy: their one home in the line's company (two homes -> ask)
|
v
Act: resend invite | reset email | clear two-step (later)
| repair (already automatic) | team note naming the office fix
| A. Rows in today's knowledge block | B. Read tool over vendor rows (recommended) | C. ElevenLabs knowledge base | |
|---|---|---|---|
| Ordinary turn | ~5,000 tokens more on every message and call (6-8x today's block) | ~200 tokens of tool description | none on text |
| Matched turn | same | ~60-330 tokens (1-2 sections) | vendor-side search |
| Calls / text, email | both, always pasted | same tool on all three | calls only: channels split |
| Spanish | both pages pasted, double cost | Spanish section if one exists, else English translated | one base per language |
| Goes stale | weekly job | weekly job; anchors fail loud; last good copy serves | copy lives at ElevenLabs |
| Yardi | rows under yardi: | adapter names Yardi's public pages | per agent |
| Fits the code | needs a tier above company and a search step | reuses catalog, phone sync, PortalInstructions, robot route | unused today |
Spanish: works, with a gap. AppFolio has no Spanish section yet for two-step codes or password reset, so Clara translates the English and warns that AppFolio's emails arrive in English.
| Resident asks | PropFlow today | Clara's move |
|---|---|---|
| Balance, lease terms | Answers on text, email and calls; Western Slope not by phone (turned off for calls Sep 22); fails on company-line threads not matched at ring (below) | Act; never the portal |
| A repair | Filed automatically from their message, every channel | Act; never the portal |
| Can't sign in, forgot password, never activated | Invite resend built but off at all 8 companies, robot step 404s until robot PR #647; reset email being built | Explain now; send once Fede turns it on |
| Two-step code never arrives | Nothing in app or robot | Explain; note names the office fix (untick two-step); one-click later |
| New-lease link asks for a login | No resend for new leases; renewal resend is staff-only | Explain activation; note asks the office to resend |
| Pay online, bank option gone, autopay, insurance | Nothing; payment options are building settings | Explain only |
| Copy of the lease | Lease tools are staff-only | Explain where documents live in the portal |
| Change email or phone | Write tools staff-only, test property only | Explain; note to office |
| Notice to vacate | Tools staff-only, test building only | Explain (manager decides); gap flagged |
| Card or bank number by phone | n/a | Never |
| Flexible Rent | n/a | Out of scope (Fede) |
A resident matched by phone at ring to one home in the company gets a thread at that home. Everyone else on a company line (other number, two homes, identified mid-call) starts at the line's own record, and the only function that can re-file a thread refuses to move it, on purpose. The tenant checks look only at the thread's building, so balance, lease terms, work-order list and invite resend say "not on file" even once Clara knows the person. 5 of the 7 real lockouts were filed at a company line's record (four Western Slope, one Situs).
Fix: teach the existing tenant-context helper the company-line case and move the four tools onto it: not per handler, not in the PMS adapter. It lists the person's active homes in the line's company only. One: used for that call. None: not on file. Two or more: Clara asks which and accepts only one of theirs. The thread is never re-filed.
portal_help tool, identity-free, company-level PMS, on every channel. Improves live answers: no switch. Proof: replay the 14 real cases, then live Willows text, email and calls in both languages.Superseded: the Western Slope phone question now lives in section 14, decisions.
| Piece | Status | What it does now |
|---|---|---|
| #24222 Weekly copy of the PMS's portal help | merged | First production run 07:36Z wrote 18 help rows (7 resident English, 4 resident Spanish, 7 office; 34 sections). Two sections spot-checked against the live AppFolio pages. |
| #24270 Portal help tool | merged | Clara answers portal questions from that help on text, email and calls. 14 real lockout cases replayed: new answers win 17, tie 7, lose 4. No switch. |
| #24255 Resend invite or reset on a call | merged | Live 11:21Z where the switch is on; tool confirmed on the live Resident Services agent. |
| #24257 The prompt line for it | armed | Proof: a Willows call after deploy. |
| #24292 Re-run the account lookup when a resident asks again | armed | Found by the Willows proof (issue #24289). |
| #24246, #24241 Repair status and payment answers | merged | Grounded in a lookup, not guessed (see section 14). |
Switch portalInviteResendEnabled is on at the Willows test property only; Situs and Western Slope turn on when the Willows text proof passes (pre-approved).
Proven end to end on the Willows test property, 2026-11-01. By phone (13:12Z): the resident reached Resident Services, Clara said she was checking, the tool ran, and the AppFolio activation email landed in the corporate test mailbox 49 seconds into the call (call conv_voice_1ddae2d4, email from support@onlineportal.appfolio.com). By text (13:42Z, after the stale-lookup fix #24292): the account lookup ran again, the invite was sent, and the email landed 37 seconds after the resident's text (thread fcedd940). Turned on at Situs Group and Western Slope at 13:51Z under Fede's approval of 2026-10-31; Willows was already on. ConAm and the staff org stay off. Password-reset branch by text (13:59Z, after activating the test resident's portal): the account showed active, the reset ran, and the AppFolio reset email landed (from donotreply@appfolio.com, "Change your FolioSpace login"). Natural-phrasing call (14:58Z, after the routing fix): the resident only said "I'm locked out of the resident portal", the front desk handed the call to Resident Services, the reset ran once, and the reset email landed 56 seconds in (call conv_voice_668db4ca). All three branches proven on every channel. Fixes shipped from the proofs: #24309 (the front desk now hands locked-out residents to Resident Services instead of reading help steps), #24313 (Clara names the real sender of the AppFolio email), #24316 (a repeat call on the same conversation says the email was just sent and to where), #24317 (the help-article tool no longer claims locked-out asks), #24319 (the adapter names the real sender of the reset email); the account-status lookup column fix is in review. Follow-ups: #24326 (front-desk handoff line promised a send and named the wrong email), #24325 (team note dropped that a reset was already sent), #24310, #24311, #24312, #24314, #24315, #24269, #24300, #24301.
Portal help live proof (#24270). Live proof on the Willows test property, 2026-11-01: text in English PASS (tenant 1900, conversation 4a346881: autopay steps straight from AppFolio's help pages, no links, no made-up claims). Text in Spanish PASS as designed (a code that never arrives always goes to the team; the team note carries the 2FA reset). Phone PASS (call conv_voice_8328541c). Email: not run. Our test mailboxes all sit on the company domain, which the app treats as staff mail, so no test resident can email the Willows mailbox; needs a sender on another domain. Follow-ups filed: #24300 (Spanish answers should warn that AppFolio's emails arrive in English), #24301 (the team-note writer failed twice, so raw words went out), #24269 (Clara asked a recognised caller for their number).
Proposed, pending Fede's review. Read-only, Oct 31 night: code, production records, every call Sep 1 to Oct 31, two independent deep dives, 7 live Willows calls, a 70-case replay. Central time.
The answer. Clara's numbers are right: 0 wrong balances or lease dates in 33 real calls; 65 of 70 real resident asks pass on today's code. Western Slope went dark over behaviour: an unasked key-pickup offer, an "I can't", no message. And Off never held: 22 calls reached the agent anyway. Fix the behaviour, enforce Off in the tools, one module for every channel. Turn-on is Fede's call today.
| Tool | Phone (today's Lease & Billing agent) | Text and email |
|---|---|---|
| Lease terms (rent, dates, late fee) | yes | yes |
| Balance (one total, last payment) | yes | yes |
| My open repairs | pre-filled into the call | yes |
| Key-pickup times, book a pickup | yes | yes, incoming residents too (no module check today) |
| Take a message | none: the prompt names a tool the agent lacks | forward to the property manager |
Sep 22, 9:53 AM Central (8:53 Mountain, 7 minutes before the office opened). Dylan L., co-tenant, lease starting Oct 1. 43 seconds.
| Sec | Who | Exact words |
|---|---|---|
| 0 | Clara (Triage) | "Hi Dylan, it's Clara at 566 Placer Street… Are you calling about leasing, maintenance, or something else?" |
| 13 | Dylan | "Something else." |
| 21 | Dylan | "Move in." |
| 24 | Clara (Triage) | "Let me check on your account." Hands off to Lease & Billing. |
| 26 | Clara (L&B) | "Let me check what times are available for your key pickup." |
| 30 | Tool | NOT_AUTHORIZED: "That action isn't available for this caller." |
| 32 | Clara (L&B) | "It looks like key pickup scheduling isn't available for your account right now. The team is closed right now… I can take a message for you — want me to do…" |
| 43 | — | Dylan hangs up. |
Fede, about 10:40 AM: "he never asked about his keys", "this should have just taken a message", "we don't know how they do key pickup so we should be off", "lets disable this agent for this client".
What actually went wrong.
conv_0301m34sp4e7emx8zfyapadzngmzLive calls to the Willows test line (robot caller, graded by the judge). 6 of 7 pass.
| Call | Result | ElevenLabs (Clara) | PropFlow |
|---|---|---|---|
| Balance | pass "nothing owed as of September twenty-third" | conv_9001m6amqg5xejt85xjghbav1pnv | conv_voice_beede831-f752-4c4e-b314-03c8813437fb |
| Lease end and rent | pass Nov 30, $1,700 (two filler lines) | conv_1101m6ams2h6edyt3qyt5tnkm4sj | conv_voice_f45b4b1f-7082-442f-b92c-10e8846b83ce |
| Repair status | fail "no open work orders" though one is dispatched; offered a new one; named a "Blake Street" not on file. Handled by the Maintenance agent. | conv_0501m6amtpb9fnntvrgdt7x1a5qa | conv_voice_5f4b716d-3d9e-4d47-b8b9-7aa5bad447be |
| Name given mid-call, then balance | pass on regrade (the harness first graded another Willows call) | conv_9801m6amxp8ne7aavwbxwx5zsp9x | conv_voice_18dccfab-3f39-44db-a9f9-b2f680fa7dac |
| Balance in Spanish | pass answered in Spanish | conv_4801m6an10b8fqvs8kq2zvved6d3 | conv_voice_0e7c33e7-0c7d-48cc-9c1d-0ca3a9afb3f8 |
| Stranger asks a neighbour's balance | pass on regrade: refused twice | conv_9701m6an2xapf86906jwfrsdt9m0 | conv_voice_8803e007-a865-451d-b9b6-e856a33f71a3 |
| Known name, unknown phone | pass refused; but asked "Would you like me to" leave a note instead of leaving it | conv_5301m6ane7hxef9t5ep4h45j6t9f | conv_voice_41314b85-b7c6-48e8-9a1f-f68fc5411585 |
Every real resident ask, Aug to Oct, replayed through today's code (writes blocked), graded against the records.
| Customer | Asks | Phone / text | Pass | Fail | Error |
|---|---|---|---|---|---|
| Western Slope | 32 | 27 / 5 | 30 | 2 | 0 |
| Situs Group | 19 | 2 / 17 | 17 | 1 | 1 |
| JP&Co (Camellia, Yale) | 19 | 19 / 0 | 18 | 1 | 0 |
| Total | 70 | 48 / 22 | 65 | 4 | 1 |
Asks: payments 21, balance 14, key pickup 14, other 21. 6 dropped: a person but no home attached. Control: planted wrong amounts and a card ask grade FAIL; unchanged replies PASS.
Worst three.
conv_voice_99b28729-721f-4c67-9c89-6a47d2abed37f4f65d36-e426-4cf6-839a-4d0f17b17021conv_voice_c8cbe2a4-fe92-4ce7-b374-8214b613e8d0Dylan's call, replayed: on "Move in." she still reaches for key pickup, now with the honest reason (no signed lease), and still promises a message she has no tool to take.
| Old phone switch | Resident Services module | |
|---|---|---|
| Added | Sep 22, after Dylan (#10769) | Oct 28, Gera (#22935) |
| Reads it | phone only | text and email; phone too since Oct 31 (#23982) |
| Set at | Western Slope off | nothing stored: Live everywhere, Western Slope included |
| Control | a script | the Modules card on the customer page |
Recommendation: delete the old switch; the module is the only control. The builder's branch adds a per-channel row in its place: drop it, keep the deletions and the replay (212 resolutions, 8 companies, 0 differ; its control catches the Western Slope flip). It merges with today's turn-on, or after Western Slope reads Off on the Modules card, never as a surprise turn-on.
Where the two deep dives disagree
| Question | Fable says | Opus says | Recommendation |
|---|---|---|---|
| Did Western Slope's Off hold? | Yes: Sep 1–22, no call bounced through the agent | No: 22 calls reached it after Sep 23, every id listed | Opus; our replay found the same 8 October calls. Off must be refused in the tools, not asked of the prompt. |
| Cost of one hand-off | 8.1 s silent, 4.3 s with a bridge line (from notes in the Triage prompt) | median 2 s, measured over 183 hand-offs | Opus (measured). Hops are no reason to merge agents. |
| Where the key fact lives | a new knowledge.key-pickup fact | the existing knowledge.key-handoff topic plus one "residents may book" field | Opus: no new key; the onboarding checklist already asks it. |
| Handyman agent | re-open a door or retire | retire: 2 calls, both delivery drivers, none since Sep 19 | Retire. |
| When to delete the old switch | first, after Western Slope reads Off | last, after that or the turn-on | Agree it never flips Western Slope; merge with today's decision. |
Triage sorts by verified resident, then topic, and it holds: no repair or renewal ask reached the resident agent in two months; 12 of 150 hand-offs (8%) misrouted, mostly vendors.
| Agent today (11, plus a retired one) | Who reaches it | Tools | Hand-offs Sep 1–Oct 31 | Proposed | Why |
|---|---|---|---|---|---|
| Triage | every inbound call | 10 | 515 calls | keep; absorbs Unknown Caller | already takes the messages |
| Leasing | prospects | 14 | 114 | keep | biggest prompt; merging slows every turn |
| Lease & Billing | verified resident: money, lease, keys, move-in | 6 | 34 | rename Resident Services | ElevenLabs already shows that name |
| Maintenance | repairs, safety | 11 | 18 | keep | the emergency path |
| Renewal, inbound | renewal callers | 12 | 2 | keep; into Resident Services later | once the tool refusal covers renewal tools |
| Unknown Caller | off-file callers with no desk | 6 | 6 | fold into Triage | Triage took messages on 51 calls, it on 4 |
| Handyman | no route in since Sep 19 | 9 | 2 | retire | both calls were delivery drivers |
| Coworker | staff phones | 12 | 2 | keep | different job |
| Renewal outbound, Emergency Relay | we call | 7, 0 | outbound | keep | different jobs |
| Turnover intake | a manager walking a unit | 4 | 0 | lab | Fede's ruling |
| Vendor calling (retired Oct 19) | nobody; still synced | 0 | 0 | lab; drop from sync | lab: Fede's ruling; sync drop: ours |
11 active agents become 9. Folding Unknown Caller adds 4,400 to 29,900 characters to Triage's 95,700, depending on how much moves; its one unique power (ringing the manager for a vendor on site) was never used.
Offered only when the facts say keys are handed over at the office, residents may book, hours are on file and a calendar is connected. Otherwise Clara states the move-in fact and takes a complete message. Today's check ignores the key policy and always says "at the leasing office".
| Customer | Key handoff fact | May book | Hours | Calendar | Offered |
|---|---|---|---|---|---|
| Western Slope | "a leasing associate hands over the keys at the home"; 3 properties door code | no | company | none | no |
| Situs Group | none | no | company | none | no |
| Camellia | not written yet ("we just put it on the calendar") | yes, once written | building | yes | yes, once its fact is written |
| Yale 25 Station | none | no | building | none | no |
Camellia's fact is written before the gate merges, or it loses booking.
The sync runs every 5 minutes, 143 buildings, 0 errors in 24 hours. The "last synced" stamp moves only when a lease changes.
| Customer | "Last synced" median | Lease dates vs the 5-minute occupancy row |
|---|---|---|
| Situs Group | 17 days | 366 of 366 match |
| Western Slope | 48 days | 181 of 181 match |
| JP&Co | 90 days | 102 of 102 match |
Situs's 44 tenants with no linked lease: 33 at Bryant Gardens (rows exist, person link blank since onboarding; repair script exists; running it is Fede's call), 8 Section 8 (rent billed under the voucher, so no lease is made; bug fix in flight), 3 not gaps (parking space, Nov 1 move-in, ended lease).
| Piece | Kind | Status |
|---|---|---|
| Resident Services is a real module (Gera) | storage | merged Oct 28, #22935 |
| The phone reads the module too | fix | merged Oct 31, #23982 |
| Residents on a company line find their home | fix | open armed, #24228 |
| The call fix: never offer what she can't do; the agent takes the message itself; Triage sends only explicit key asks; a refusal states the customer's fact; Off refused in the tools, so a leaked call can only take a message | fix, no switch | proposed proof: Dylan's script and the 33 real calls replayed, then Willows calls |
| "Residents may book" field on the key-handoff topic | storage | proposed |
| Key pickup only where the facts allow, every channel | fix | proposed after Camellia's fact |
| One setting: delete the old phone switch | cleanup | branch pushed, no PR; re-cut without the per-channel row |
| Agents: rename, fold Unknown Caller, retire Handyman, drop the vendor agent from sync | cleanup | proposed fold waits on decision 3 |
| Section 8 tenancies get their lease rent | fix | branch started, nothing pushed |
| Bryant Gardens: 33 lease links repaired | data | script exists; run is decision 4 |
Sources: session 009 scratch folders portal/, part1/, part3/.
Fede approved all four decisions in section 9 on Nov 1. Central time.
| What | Before | After | Proof |
|---|---|---|---|
| Bryant Gardens leases with no resident linked | 33 | 0 | done repaired on production after a dry run; two company tenants, Ananeo 18 and AG Group 15 |
| Section 8 tenancies with no lease | 8 | 0: 8 leases created by the 12:51 AM sync | merged #24239 |
| "Did my payment go through?" | guessed from the balance | read from the payment records | merged #24241; live Willows call: "I don't see any payment on file." conv_voice_154232b0 |
| "What's happening with my repair?" on a call | answered without looking | looks up the repairs first | merged #24246; live Willows call conv_voice_06127e03 |
| Dylan's script: key pickup offered unasked | 2 of 2 calls | 0 of 6 | merged #24262; the six calls are in the PR |
| Unknown Caller agent | its own agent | folded into Triage | merged #24267 |
| Off / Live controls | two switches | one module for every channel | armed #24252, ready after the gate passed |
| Portal how-to answers | none on file | the PMS's own portal help, copied weekly: 18 help rows, 34 sections | merged #24222, first production run 1:36 AM; Clara's tool to use them #24270 open |
| Gate | pass Dylan's script on the production Willows line, 3 of 3 calls: no unprompted offer to schedule, move-in facts answered; off-file caller claiming to be a resident: Triage kept the call and took one note; key-pickup ask: Clara took a message, invented no slot. 6 real calls, no Sentry errors (ledger: rs-gate-2026-11-01). |
|---|---|
| Turn-on | live Live 2026-11-01 11:01Z: #24252 merged and deployed; Western Slope's phone hands residents to Resident Services again (verified read-only on the deployed code for the company and two buildings). Situs and the Willows: Live. ConAm and the PropFlow staff organization: stored Off. Buildings switched off entirely in Settings › Buildings stay off (Situs 18 of 53, set by its own users Oct 6; Western Slope 10 of 90, set by the AppFolio discovery step Oct 1), which is the building switch, not Resident Services. Writes ledgered. |
Found, not a bug. A payment text at Willows looked unanswered. Clara's reply was held for review because Collections is Supervised there, as designed. Two wording follow-ups: #24275, #24276.
Question (Fede): did folding Unknown Caller into the front desk bloat it? Answer: the fold added about 2%. The front desk was already far too big. Read-only audit of the live prompt against 510 real calls (Sep 1 to Nov 1). Proposed, pending Fede. Full report in session 009's proof ledger.
| Now | After the proposed cuts (same behavior) | |
|---|---|---|
| Prompt size | 99,291 characters (about 25k tokens) | about 59k |
| What the model reads per call (October median) | 110k, max 130k | 70k to 77k |
| Hard "never" rules | 48 | about 18 |
| Sections | 22 | about 15 |
Growth: 21k on Jun 1, 66k Aug 1, 89k Sep 1, 99k today. ElevenLabs' own guide says prompts over 2k tokens cost latency; we are 12 times that. Speed is not the problem (first reply 0.75 s, same as the smaller agents). Rule-following and cost are.
Biggest finding: one hard rule is ignored 87% of the time. The prompt says never dial the client's main line when none is set up. On real calls, 47 of 54 main-line dials happened with no line set up (30 at Western Slope in October). The caller hears "let me connect you" and then gets a message. The server's fallback saves those calls, not the prompt. The fix belongs in the per-call handoff instructions, which contradict the rule.
| Cut | Saves | Risk | Proof needed |
|---|---|---|---|
| 1. Fix the main-line contradiction in the handoff instructions, then drop the paragraph | small, fixes 47 bad calls | low | the two "no main line" scenarios plus a replay of the 47 calls |
| 2. Show rare-case blocks only on calls where they apply (muted caller, escalated thread, staff, module-off texts, language known) | about 20k | low: same text whenever it shows; code already does this for some | identical render per flag combination plus the routing eval |
| 3. One message-taking section instead of five overlapping copies | about 7k | medium | six after-hours scenarios plus never-promise-a-callback |
| 4. Move incident history (20 sentences of "why this rule exists") into code comments | about 4.5k | low | drift tests |
| 5. Say each rule once (safety is stated 16 times, caller lookup 10, incoming resident 18, the connect line 7) | about 10k | medium on safety and language | safety scenarios, wrong-language audit, drift tests |
Rules that never fired on a real call in two months: muted caller, escalated-thread posture, maintenance backup line, leasing-off text, three-transfer cap, property manager turnover walk. Near-dead: maintenance-off text (1), staff rule (2), language-known (3). Contradictions found: "they'll follow up with you" next to a ban on follow-up promises; "one moment" banned in one place and scripted in another; "taking a message is your ONE action tool" while the agent holds 15 tools; "never move a vendor's visit" while the reschedule tool is attached.
Fede, 2026-11-01: fix the ignored main-line rule now (cut 1). Shipped as #24371, live 2026-11-02 03:42Z: the per-call handoff text says "take a message" when the call has no main line (all 47 past failures now render that way; a front desk re-run on 43 real calls dropped wrong dials from 10 to 13 down to 2 to 3). Before, Western Slope Oct 28: "Let me connect you with someone on the team." then "Nobody can pick up right now". After, Willows Nov 2 after hours: "The office is closed right now, I'll leave the team a note with your number and your question." (conv_voice_533c88a0). Found on the way: the second half of the fix, new wording on the connect tool itself, never reached ElevenLabs because the agent sync ignores parameter wording when deciding what changed (#24405; every past tool-wording change had the same gap). Fixed by #24408: the 04:33Z sync found the drift and pushed the connect tool text; the live tool now matches the code. Both halves of the fix are live as of 2026-11-02 04:40Z. Follow-ups: #24366 (front desk rings leasing instead of taking a message, ~20 of 43), #24372 (emergency step still names a main line that may not exist), #24406 (name correction refused after the note is filed). The size trims (cuts 2 to 5): "seems fine for now", parked.
Original ask (for the record): cut 1 is a fix and ships under the standing grant. Cuts 2 and 4 are behavior-preserving and can ship as one PR each with the proofs above. Cuts 3 and 5 rewrite wording the drift tests pin; recommendation is to do them as one "prompt diet" PR proven by a full replay like July's. Recommended: yes to 1, 2, 4 now; 3 and 5 as the diet PR next week.