Vision v4 vs. Reality — Gap Analysis
How far the system is today from the long-term technical vision ("Clara does the work"), what we already do well, where the gaps are, and the five opportunities that close the most distance. Evidence gathered by four read-only code investigations of the production repo on 2026-08-16; every claim below was checked against code, not docs. The vision is a multi-year north star, so "gap" here means distance still to travel, not a miss.
Scorecard — vision promise vs. what's in production
| Vision promise | Today | What we found |
|---|---|---|
| Leasing is a goal (book → follow up → application), not Q&A | Real | Multi-touch follow-up sequences (email → text at +24h/+48h/+7d/+14d, post-tour application chase, re-engagement after silence) run by default on every property with no switch, and stop the moment the goal is met.src/lib/domain/leasing/outreach-cadence-schedule.ts, outreach-stop-conditions.ts, reengagement-trigger.ts |
| Maintenance runs on its own (intake → triage → dispatch) | Real | Send-gate removed 2026-06-11; every work-order change dispatches to AppFolio unconditionally. Most autonomous loop we have. |
| "Your answer becomes policy" | Real | A staff reply to an escalation is written straight into that property's knowledge base, no review step, live on the next conversation.src/lib/domain/escalation/teaching-capture.ts |
| Judgment with boundaries, fair-housing escalation | Real | Fail-closed guards throughout, two-key arming on every send path that touches money, hard human gate on turnover charges and on every collections message, escalation state machine with reminders and takeover. |
| Intelligence: "which residents, what they said" | Seed | The renewal-risk signal names specific residents and cites the exact email where they said they're leaving. But it's a once-a-day batch, the AI-written narrative is staff-only, and nothing equivalent exists for vendors, maintenance, or collections. No "ask why" chat.src/lib/domain/insights/signals/renewal-risk.ts, lambda/portfolio-insights-snapshot |
| Measured on outcomes (occupancy, resolution), not volume | Half | Funnel-leak, tour no-show, vacancy days, leasing velocity are computed — but only rendered as a report. The Command Center headline is counts and dollars-saved. No metric ever changes what Clara does next. |
| "She never asks that question again" | Fragile | Only near-identical wording matches; no check of learned answers before escalating (relies on the model noticing); and the whole knowledge block is capped at 4,500 characters — as a property learns more, older answers silently fall off and Clara says "not on file."agents/clara/lib/agent/property-knowledge-block.ts (KNOWLEDGE_BLOCK_MAX_CHARS) |
| PM can call/text/email Clara and delegate an outcome | One flow | Only the move-out/turnover flow executes from a PM text end-to-end. A PM emailing Clara isn't recognized as staff. Dashboard "Ask Clara" has 23 lookup tools and zero that change anything. The permission table already authorizes staff for far more — the tools just aren't offered.agents/clara/lib/agent/capabilities/index.ts, src/lib/tools/role-matrix.ts, src/lib/domain/dashboard/chat/tools.ts |
| "Drop rents by $150" / "assistance letter" / "work collections" | Not yet | Bulk rent change is marked "planned" and never offered. No document generation exists. Collections is a background cadence, not something a PM can invoke. |
| One brain: renewal knows maintenance history | Not yet | Zero references to work orders or complaints across all 30 renewal files. |
| One brain: turnover knows the vendor's track record | Not yet | No vendor score/rating/reliability field exists. Job outcomes are written after completion but never read back into vendor choice. |
| One brain: invoice knows the work order | Real | Invoices live inside the work order record; charge decisions reason about estimate-vs-actual. |
| Every property makes her better (compounding) | Engineer-mediated | Learned answers are hard-walled per property (correct for privacy). The one cross-property path — promoting a "principle" portfolio-wide — is a data type with no consumer yet, and by decision always a human act. Today compounding = engineers changing the prompt. |
| Five loops run on their own for a new property | One of five | Out of the box only prospect follow-up runs unattended. Renewals shadow-only; turnover auto only under $500 after arming; collections can never send without a click. Each needs an engineer-flipped company switch plus a per-property switch.src/lib/domain/admin/arms-registry.ts |
| Logs into your PMS like a new hire, no migration | AppFolio only | AppFolio: self-serve, 1–3 hours. Yardi/RealPage: "coming soon" tiles; the shared PMS layer is ~¼ wired and the highest-stakes writes call AppFolio directly. Yale is a hand-built, months-long project. |
| Fully audited | Half | Tool-call log exists but expires after 30 days and covers ~39 of 74 action handlers. No single "why did Clara do this" record. |
What we do well
- The safety posture is engineered, not prompted. Guards fail closed, money-adjacent sends need two keys, and the team pulled two well-intentioned "honesty" features within hours on 2026-08-15 when they blocked correct answers to real Camellia customers — after replaying 177 real conversations to size the blast radius. "We review every conversation" is true.
- Leasing follow-up is genuinely goal-driven and on everywhere. This is the clearest existing proof of the "Gen 3" claim.
- Maintenance is autonomous end-to-end.
- The teaching loop exists and is live — the mechanism behind the deepest moat in the vision is already in production.
- Quality machinery is unusually deep for the team size: 30+ eval suites, real-vendor-call replay, live voice simulation tests, prompt-drift guard, real-time conversation grader paging Slack, Grading Playground turning human verdicts into a regression corpus.
- Identity spine and per-property config are clean; nothing in production code gates behavior on a hardcoded Camellia.
Top 5 opportunities
Ranked by distance closed toward the vision per unit of effort. Each is a direction, not a spec.
1. Make Clara delegable — a real "PM instruction" path
The vision's headline experience and the biggest gap. The authority already exists (the permission table lets staff do work orders, renewals, pricing reads, tenant lookups); the offer doesn't — the tool composer never hands those tools to a PM, and the staff-reply classifier only knows "decision" or "question," never "do this."
- Recognize staff on email (today phone only).
- Add an instruction intent to staff replies; give the PM channel and dashboard chat mutating tools behind confirmations.
- Ship one flagship command end-to-end. "Get unit 204 ready" is closest — turnover already executes; generalize the entry point. Then bulk rent change (already marked "planned").
2. A knowledge base that scales — and "never ask again" as a hard check
The 4,500-character cap is a time bomb: the more Clara is taught, the more she forgets. This directly protects the most defensible promise in the doc.
- Retrieve learned answers by relevance instead of dumping everything.
- Semantic (not exact-string) matching on "was this already answered."
- Consult learned answers before deciding to escalate; add a regression eval for "taught once → not re-escalated."
3. Wire the two "one brain" edges that matter most
- Renewal decisions and conversations pull the tenant's open/recent work orders and complaint signals.
- A vendor scorecard (on-time %, quote-vs-actual, callback outcomes — the data is already written after jobs, just never read) feeding turnover/maintenance vendor choice.
Turns two vision sentences from false to true and feeds opportunity 5's "slow vendor behind it."
4. Close the loop from outcomes to behavior; show outcomes, not volume
- Make the customer-facing scoreboard outcome-first: occupancy, days-to-lease, resolution time, loop-closed rate.
- Let a signal trigger action: a leaky post-tour stage escalates cadence; a renewal-risk hit triggers proactive outreach. Today the goal-chasing code and the outcome-measuring code never talk.
5. Autonomous-by-default for a new property (safely) — arming ladder + PMS layer
- A per-property autonomy profile set during onboarding (shadow → arm per loop with proof gates), self-serve rather than script-flipped.
- Finish the PMS abstraction so renewal/maintenance/vendor writes go through the registry — the prerequisite for Yale/CONAM being anything other than bespoke.
Without this, every customer is a project and "AI runs the routine" needs an engineer per property.
Honorable mentions
- Durable audit trail — drop the 30-day expiry, cover every handler, one queryable decision record. Cheap, and it's what "fair housing built in" rests on.
- Conversational portfolio intelligence — the renewal-risk engine and the anti-hallucination narrative exist; extend to vendors/maintenance and expose the "why" in the product.
- Redesigned honesty guard, gated on the 177-conversation replay before it ships again.
Method & caveats
Four read-only investigations over PropFlow-Technologies/propflowai at HEAD on 2026-08-16 (system inventory; PM-delegation + outcome metrics; cross-workflow context + learning + audit; intelligence + onboarding + arms). Claims marked "Real / Not yet" were confirmed by reading the code paths cited; onboarding effort figures are estimates. Shipping velocity is high, so flag states may have moved since. A related, deeper audit of the coworker gap is at Clara as a Coworker — Capabilities.