A quick, high-level map of how Clara works alongside the property-management system, not inside it — what talks to what, what exists for staff, and where the gaps are today.
2026-09-27 · owner: Trinity · for Fede · every "built" claim is footnoted to a file, every "missing" claim is stated as such
Clara is a coworker, not a feature of the property-management system (PMS). The PMS — AppFolio today — stays the system of record: the lease, the ledger, the unit, the guest card all live there. Clara is a separate system of work that sits beside it: she answers the phone, the text line and the inbox, decides what to do, and writes the outcome back into the PMS so the client's own staff see it where they already work. She never replaces AppFolio's data model; she operates it, the way an employee would, through the one door the client already gave her (the browser robot) and a read API.
On this page
Every channel lands on one identity check, which hands off to whichever engine owns the intent. Nothing crosses a company (org) boundary — a property belongs to exactly one org, and every line, calendar, mailbox and login attaches to an org or to a property inside it.1
Internal employees use two surfaces: the web app (typed, for records and settings) and a phone conversation with Clara herself (voice or text, no typing UI). The two don't overlap much — staff read in the web app and talk to Clara for anything that needs a decision or an action.
| Capability | Status | Evidence |
|---|---|---|
| Read AppFolio (units, tenants, work orders, renewals, vendors…) | Built | Read API + browser-agent integration, dozens of read tools (e.g. appfolio.list_work_orders, appfolio.get_tenant_details)4 |
| Write guest card / note / showing / vendor assignment (robot) | Built | One robot write outbox, one writer5 |
| Send application link | Built | Dedicated lambda + prospect follow-up flow6 |
| Book / reschedule / cancel tours on real calendars | Built | Microsoft Graph calendar client + tour tools (leasing.schedule_tour, leasing.reschedule_tour, leasing.cancel_tour)7 |
| Knowledge-base lookup (policy, property facts) | Built | leasing.get_property_details, org/portfolio knowledge sections, voice knowledge gate8 |
| Transfer / connect a caller to a person | Built | comms.connect_caller, non-looping dial-target resolver9 |
| Take a message / page a human on escalation | Built | handle-escalate-to-human.ts — every escalation pages a human, no silent tier10 |
| Ask a staff member a question by text, and read the reply | Built | Company-level switch, off by default; ask + reply-intent + release modules11 |
| Staff notices (email / SMS) on bookings, renewals, escalations | Built | Notice modules under domain/leasing/*notice*, delivered-event proof required12 |
| Concession watcher (auto-flag pricing changes) | Built | lambda/concession-watcher13 |
| Prospect / tour notes capture (voice & text, no dashboard editor) | Built | Notes come from a voice or text turn with Clara and are written to the tour record and the AppFolio guest card; no notes-editor UI, by design2 |
| Rating prompts after a maintenance visit | Partial | Setting + atomic claim exist on branches; not confirmed live on main at time of writing14 |
| Self-guided / unattended tours | Missing | No matching tool, handler, or lambda found in the checkout |
| Unified staff inbox across channels | Missing | Marketing copy names it; no corresponding app surface found3 |
Filled from the tool catalog and channel-adapter status doc, not memory.15
| Capability | Voice | SMS | Web-form / guest card | |
|---|---|---|---|---|
| Greet / identify a repeat contact | ✅ | ✅ | ✅ | ◐ card lookup only |
| Answer from knowledge base | ✅ | ✅ | ✅ | ✗ no dialogue |
| Offer tour slots | ✅ | ✅ | ✅ | ✗ |
| Book a tour | ✅ | ✅ | ✅ | ✗ |
| Guest-card create / update | ✅ | ✅ | ✅ | ✅ source, not target |
| Send application link | ✅ | ✅ | ✅ | ✗ |
| Hand off to a person | ✅ transfer | ✅ staff text | ✅ staff email | ✗ |
| Take a message | ✅ | ✅ | ✅ | ✗ |
| Reminders / follow-up cadence | ◐ triggers, not carries | ✅ | ✅ | ✗ |
| Staff notices | ✅ triggers one | ✅ | ✅ | ✗ |
Telegram is a real production channel too, but only as an SMS fallback and the team's own end-to-end test channel — it is not a customer-facing channel and is left out of the table above.15
~/.claude/propflow-docs/artifacts/portfolio-architecture-how.html ("what keeps one customer's data away from another's is a filter in our code, not a wall in the database" — status: proposed, pending Gera and Fede).~/.claude/propflow-docs/artifacts/leasing-engine-designs.html#notes-field-audit; ruling in project memory feedback_notes_via_voice_text_never_website_2026_09_17.md (Fede, 2026-09-17).src/app/(public)/platform/page.tsx, src/content/home.ts; the design doc that would build it is still a brainstorming memo: docs/planning/channel-adapter-design.md. No corresponding app route found under src/app/(workspace)/(operations).src/lib/integrations/appfolio, src/lib/integrations/appfolio-api, src/lib/integrations/appfolio-browser-agent; read tool examples in src/lib/tools/appfolio.ts (e.g. appfolio.list_work_orders:619, appfolio.get_tenant_details:434).src/lib/domain/leasing/guest-card-write-back-outbox.ts, src/lib/domain/leasing/guest-card-outbox-writer-real.ts, src/lib/domain/leasing/guest-card-outbox-writer.ts.lambda/application-link/.src/lib/domain/calendar/outlook-client.ts, src/lib/domain/calendar/provider/outlook.ts; tour tools in src/lib/tools/leasing.ts (leasing.schedule_tour:539, leasing.reschedule_tour:744, leasing.cancel_tour:844, leasing.book_tour:1132).src/lib/tools/leasing.ts (leasing.get_property_details:43); src/lib/domain/leasing/knowledge/, src/lib/domain/portfolio/knowledge/, src/lib/domain/escalation/voice-knowledge-gate.ts.src/lib/tools/comms.ts (comms.connect_caller:270); loop guard: src/lib/domain/properties/clara-line-loop.ts (firstNonLoopingDialTarget).src/lib/tools/handlers/handle-escalate-to-human.ts.src/lib/domain/escalation/staff-ask-by-text-switch.ts (company-level, default off), src/lib/domain/escalation/open-matter.ts (sendStaffAskSms, openMatterAndAsk), src/lib/domain/escalation/staff-reply-intent.ts, src/lib/domain/escalation/reply-release.ts.src/lib/domain/leasing/team-notice-send-claim.ts, src/lib/domain/leasing/held-first-email-team-notice.ts, src/lib/domain/leasing/send-pending-notice.ts; delivered-event requirement in project memory feedback_staff_notices_on_needs_delivered_event_2026_09_17.md.lambda/concession-watcher/handler.ts.feat/maintenance-rating-prompt-setting, fede/rating-prompt-atomic-claim) — not verified as merged/live on main during this pass.docs/planning/channel-adapter-design.md ("Complete for the channels that still exist, as of 2026-09-19" — voice, SMS/Twilio, email/SES inbound wired; Telegram = SMS fallback + internal test channel; WhatsApp/iMessage externally gated, not built).