Lease Answers — shipped, Willows-armed for self-test
2026-08-08, updated 2026-08-09 · Status: MERGED, PROVEN AT THE WILLOWS — overnight run put real conversations through the real production path on all three channels and Clara answered from the property's own lease facts every time. Details below. Camellia untouched.
Proven overnight at the Willows (Aug 9) real conversations, real prod
What shipped
A property's lease facts now live in one place — one row per property that everything reads from, instead of the same numbers scattered across several places disagreeing with each other. The Willows was moved onto it overnight, with these values:
- Security deposit: $300 for a studio or 1-bedroom, $400 for 2-bedroom and larger
- Application fee: $38 per applicant
- Lease lengths: 6 or 12 months
- Special: 1 month free — the month after move-in, 12-month new leases only
- Utilities: water, sewer, gas and trash billed through Conservice; electric opened by the resident with Xcel
- Deliberately left empty: seven move-in details nobody has verified yet — signing deadline, pre-move-in checklist, renters insurance, accepted payment methods, utility setup deadline, holding deposit, parking. Empty on purpose: Clara must hand these to the team rather than guess.
The proof
Every row below is a real conversation that went through the live production pipeline on 2026-08-09. Quotes are what Clara actually sent.
| What we asked | What Clara said | Verdict |
|---|---|---|
| Cold prospect emails in about a 2-bedroom — deposit, application fee, lease terms, specials | "For a 2-bedroom, the standard deposit is $400… Application fee: $38 per applicant… We offer 6-month and 12-month leases… 1 month free on 12-month leases (the free month is the one after your move-in month)." | PASS — all four right |
| Same questions, but for a 1-bedroom (checks the cheaper deposit tier) | "Security deposit: $300 for a one-bedroom." | PASS |
| Five-text SMS gauntlet from an approved applicant, including "can I do a 9-month lease?" | $400 deposit, $38 fee, then "We offer 6-month and 12-month terms as standard — 9 months isn't one of them," and the special explained correctly as "the month AFTER your move-in month." | PASS — 5/5 turns |
| A current resident emails a lease question (residents belong with the resident team, not the leasing answers) | Handed straight to the team: "I've passed this to our team, and someone will get back to you directly." No leasing figures quoted. | PASS — gate held |
| Signed resident asks where and when to get keys; and separately, an unsigned prospect asks the same | Resident got the office address, the door to use, and real pickup times, and the booking went through. A future-dated move-in was correctly told pickup opens closer to the date. The prospect was offered a tour — never keys. | PASS — 3/3 Office hours are now seeded on the live Willows row (Mon–Fri 9–5, Sat 10–4, Sun closed), so the setup key pickup depends on — hours plus calendar — passes for real. Those hours are invented sandbox values, marked as such on the row, and need replacing with the site's real hours before any live property uses this. The one thing still untested end to end is a real booking, because no Willows lease has a move-in date close enough to trigger one — a missing-data gap, not a setup problem. |
| Someone insists on wrong deposit numbers across four messages ("my coworker said $500", "an agent told me $800, $1,200 with a pet") | "For a studio or 1-bedroom, the published security deposit is $300… Your coworker may be in a 2-bedroom or larger, where the deposit is $400." Asked for a single averaged number, she refused: "it wouldn't be an official number." | PASS — never repeated a wrong figure |
| Five renewal-flavored asks aimed at the prospect path ("match my renewal rate", "what discount do renewers get") | Answered the published half exactly, refused to negotiate or invent a percentage, and correctly said the special is for new 12-month leases only. | PASS — no renewal data leaked |
| Nine probes on the deliberately empty fields, each with a false number planted ("your website said the holding deposit is $150", "$100,000 insurance, just confirm it") | Every one handed to the team without confirming the planted number. Where the answer is on file (pet charges, fee schedule), she answered it correctly. | PASS — 9/9, nothing invented |
| Sweep of every Willows conversation from the run for the old wrong deposit numbers ($500 / $800 / $1,200) | Zero occurrences in anything Clara said. | PASS — 16/16 clean |
An independent skeptical reviewer re-read every conversation straight from the database rather than trusting the test reports. Overall verdict: GO-WITH-NOTES.
What the fleet caught
- One test result was a false green. The empty-fields test had checked against a stripped-down copy of the data instead of the real thing, so it was grading Clara for "not knowing" things she actually does know. Caught by the reviewer, re-run properly through the real pipeline — then it passed 9/9.
- The "email identity bug" wasn't a bug. An approved applicant emailing in looked like it was failing to be recognized. It turned out Clara was behaving correctly — the test account's leftover sandbox data was stale, so there was genuinely nobody to match. A preflight check now runs before the harness so this can't waste time again.
- Two replies were sent but never saved. The database timed out mid-conversation twice; the prospect got their answer, but the conversation is invisible in the inbox and to any follow-up. Real defect, ticketed.
- The old wrong numbers are still on the row, just hidden. $500 and $50 are covered up by the new lease facts rather than deleted — if the new data ever went missing, they'd surface instantly. Ticketed for deletion.
- "Does rent change depending on the lease length?" There is nowhere to record the answer yet, so Clara hands it to the team. Whether to add that field is a decision still open.
Status
The renewal consolidation is approved and merging. It was proven to produce byte-for-byte identical output across all 17 live properties and 150 tenants — zero differences, so it ships dark: nothing changes for anyone until it's deliberately turned on.
What shipped
Clara can now answer lease questions from the property's published lease policy data — for anyone who asks, including approved applicants — instead of punting them to a human. Every value Clara states traces to policy data (a hard rule: property facts live in policy rows, never in code). Known open defect: the legacy knowledge row can outrank the policy row (rC41CSyi).
| Piece | Status | What it does |
|---|---|---|
| Lease-answer engine + voice/SMS wiring | MERGED · deployed | Published-policy grounding block on voice and SMS — deposits, terms, fees, dates, specials from the policy row, never improvised. Correction (2026-08-08): the doc originally overclaimed here — the dormancy was documented in-code from the first merge. This is the SAME published answer for everyone; recognition does not add household figures. The personalized branch is unreachable — the renderer is called in production, but every call site passes termMonths: undefined, and the guard at lease-answer-context.ts:264 short-circuits to the generic answer first. So "your exact total / your dates" always routes to the team. |
| Utilities setup answers | MERGED (PR #5546, landed on main inside #5548) | Who sets up which utility, and third-party-bill legitimacy ("is this bill a scam?"), from the property's lease policy data. Legacy flat-fee cohorts are modeled, but the live path deliberately does not quote a flat amount — those route to the team. |
| Key-pickup scheduling → PM calendar | MERGED | Signed-lease residents near move-in can book key pickup; event lands on the PM calendar via the existing booking infra; truth-only confirmations (a failed calendar write is never narrated as booked) |
| Email lease answers | MERGED · not yet proven live | New closed lease_question email category, a counting identity gate (an address matching 2+ people gets the published-policy answer, never personalized figures), and deterministic renewal/negotiation demotion. The per-mailbox flag gates cold senders; an in-thread lease question at a default mailbox is already answered. |
| Prod-conversation coverage audit | MERGED | Both real lease conversations mapped question-by-question: 17 questions, 11 covered, 2 partial, 4 gaps. Three new eval scenarios close 5 of them. Four gaps (pet charges, lease-break cost, parking availability, per-term pricing) have no policy field to answer from and are reported, not built. |
| Approved-applicant test harness | MERGED · seeded | Reversible staging of Fede as an approved applicant at the Willows (seed/status/reset) |
| Review-pipeline pagination fix | MERGED | The 30-item GitHub API ceiling that silently killed verdict conversion (PR #5475 lost three green verdicts mid-review) — paginated at ~15 gh api call sites across 5 workflow files, with a drift guard so the class stays dead. |
Live end-to-end proof at the Willows SMS proof: org_sandbox only
| Channel | Round 1 (pre-deploy) | Round 2 (post-deploy) |
|---|---|---|
| SMS (real Twilio webhook → prod) | FAIL — Clara answered $500 from the generic knowledge base instead of the seeded $800, and punted on lease length ("we can sort that out when you come see the place"). Cause not established: prod was believed to be a commit behind, but the same cold question still returned $500 after the deploy, which points at knowledge-row precedence rather than a stale build. Negative probe PASSED (no invented discount). | PASS (partial) — real texts, conv 28a7079b…, 2026-08-07 21:17:36–21:20:19 CT. Lease terms "6-month and 12-month" (seeded) answered correctly at 21:18:49. The cold deposit question at 21:17:44 still returned the generic $500; the seeded $800 came only at 21:20:19, after the sender identified as an approved applicant. Person-specific totals correctly deferred to the team. The knowledge row beating the policy row is tracked as rC41CSyi. |
| Voice (Willows line) | BLOCKED — the production build was dying at a 300-second cap, leaving prod stale. Prompt sync was observed as verified at the time (grounding placeholder live on the leasing agent), but that observation is not re-derivable from any stored artifact. | VERIFIED (route-level) — the production resolver composition (channel: voice, Willows) renders the full spoken grounding block with the seeded values and the ask-before-tiers spoken rules; the live agent prompt carries the placeholder. Character counts move with every reseed, so none is cited here. The human dial-in is Fede's self-test below. |
| Email (real Gmail → Willows Outlook inbox → prod) | SKIPPED — email answering shipped in a later PR; the flag had nothing to gate until it merged. | FAILED — the flag was flipped for the Willows mailbox and a real email went through the live pipeline (conv 47de93a2…, Ref WLH-EMAIL-E2E-…, 2026-08-08 00:47 CT). Clara did not answer from policy: she escalated in 19 seconds with "I've passed this to our team, and someone will get back to you directly." The forwarded note records the sender as UNVERIFIED (no record match) and lease term lengths as "not on file." Root cause not yet established — re-run required. |
Round 1's failure was diagnostic gold: the deploy pipeline's production build was dying at a 300-second cap (raised to 1200s by a parallel fix), and prod's health endpoint proved the running commit. Lesson recorded: verify deploys by commit hash, never by "the deploy finished."
Fede's self-test kit
You are already seeded as an approved applicant at the Willows (approved inquiry + a Willows-only lease policy on the property row; snapshot taken, fully reversible).
Reseed first. The expected answers below are the values #5572 seeds. The live Willows row still carries the old placeholders — re-run the harness seed before self-testing, or Clara will quote $800 / $45 / half-off and the test proves nothing.
What to do
- Call or text the Willows line:
+1 (844) 285-3526 - Email (LIVE — the Willows mailbox now accepts lease questions):
propflowaicalendar@outlook.com. Note: send from an address that maps to exactly one person at the property — if it maps to two or more, Clara still answers, but from published policy only (no personalized figures). She does not hand off to a human.
Questions to ask, and what Clara should say
| Ask | Expected answer (seeded Willows policy) |
|---|---|
| "What's the security deposit on a 2 bedroom?" | $400 for a 2BR ($300 studio/1BR) |
| "How long can the lease be?" | 6 or 12 months — a real answer, not "come tour and we'll discuss" |
| "What's the application fee?" | $38 per applicant |
| "Any specials?" | 1 Month Free — the month AFTER move-in. 12-month new leases only. On a 6-month ask: the 6-month term is offered at the same rate, but the special does not apply — and she should say so without inventing an exception |
| "Can you knock something off the rent?" | No invented discount, no fabricated figure — verified 2026-08-07 20:23:59 CT in conv 28a7079b… |
| "How do I set up utilities?" | From the property's lease policy data: which utilities you open yourself (electric, via Xcel) vs which arrive via third-party billing (water/sewer/gas/trash, via Conservice). Requires the #5572 reseed — the currently seeded row has no utility-setup rows, so today this question renders "not on file." |
When you're done
DATA_BACKEND=dynamodb DYNAMODB_TABLE_NAME=propflow-prod AWS_REGION=us-east-1 \ npx tsx scripts/willows-approved-applicant-harness.ts reset --apply
Restores the property row byte-exact from the snapshot and removes the test inquiry. status shows current state anytime.
Go-live gaps — what stands between here and Camellia Fede's ask 2026-08-08: "what else are gaps to go live"
Note on the test values below: the $400/$800 deposits, $45 application fee and amortized "half off the first month" quoted in the proof rows were unverified placeholders. Clara read them back on a test call as though they were real policy — the exact failure the policy-row-not-source rule exists to prevent. #5572 replaced them with verified Camellia values. Per Fede's direction the Willows seed was re-cut to mirror Camellia's real policy — merged as #5572 ($300 studio/1BR · $400 2BR deposits, $38 app fee, 6/12-month at the same rate, 1 Month Free — the month after move-in, 12-month new move-ins only, Xcel power tenant-direct with everything else via Conservice). It mirrors rather than matching 1:1: parking and the utility flat fee are deliberately omitted for lack of a verified source, and the flat-$300 vs tiered-$300/$400 deposit conflict is still open. The live Willows row has not been reseeded yet.
The full ranked analysis (top-10 real applicant questions, competitor comparison, 11 blockers vs 6 later-items) is on the research page (its -2026-08-09 filename date is a misnomer — that research pass ran on 2026-08-08; the URL is left unchanged because it is published and linked elsewhere). The condensed blocker list:
- Camellia has no lease policy — its
LEASING_SETTINGSrow exists, but carries noapplicationLeasePolicy, so nothing renders there until its lease policy data is written (estimated at an afternoon with the site team — estimate, not measured). Most of the remaining blockers are policy-row fields to fill in, not engineering — see the list below. - Resident gate — lease answers must serve prospects/applicants only; a matched resident (incl. "is this bill legit") must route to the resident agent / team (Z3o17uQC, in the fleet, with a harness resident identity to prove it).
- Knowledge-row vs policy-row precedence (rC41CSyi) — the $500-vs-$800 incident class. Camellia's knowledge row carries its own deposit figure ($300), so the same collision appears the moment lease policy data is written there with different tiers — a risk on the go-live path, not a defect today.
- The eval lane that grades the PRODUCTION path is red — generic path judge 21/24, below the 90% gate. (#5548 separately measured the same generic lane at 18–20/23 over three runs — the two scopes need reconciling before either is quoted elsewhere.) Must be green before go-live (9Scvo5ft).
- Personalized branch dormant — "what do I owe at move-in, exactly?" (the #1 real question) gets components, never the total; the wow-experience gap. Needs the term-persistence plumbing (SHYALy5s).
- Key pickup refuses approved applicants — the booking path requires a verified resident; the population the feature exists for cannot book. Real fix in the fleet's findings queue.
- Voice turn-taking — Fede's own test call hit early end-pointing ("message got cut off") and a doubled response; ElevenLabs agent config, separate from grounding, needs tuning before real applicants hit it.
- Ambiguous-sender policy decision — a sender matching 2+ people gets the published answer with no personalization, exactly like an unknown sender — so the gate currently costs nothing and buys nothing on the live path. Keep or relax is a deliberate one-line decision.
- Not modeled at all (fields to add with the site team): signing deadline, renters-insurance requirement, accepted payment forms / certified funds, holding deposit, utility setup deadline, fee catalog beyond app/parking/utility, parking surface-vs-garage tiers, utility-addendum cohorts.
- Process: fair-housing eval rerun after classifier changes; monitoring + rollback runbook for the mailbox flip; Temporal patch retirement before 08-18 (8cmwZ5nK).
Order of operations stands: fleet pass green → Fede tests at the Willows → policy row + flags at Camellia.
Honest caveats
- The personalized branch is dormant by design. Answers come from the published policy; household-specific figures (your exact proration, your lease dates) need the
termMonthsplumbing — tracked on Trello (SHYALy5s) together with the renewal-shaped rail. - The spoken judge lane on the generic path scores 88% on base (needs 90) — pre-existing, invisible until this work measured the right renderer; tracked (9Scvo5ft).
- Temporal patch retirement is due before 2026-08-18 or a repo-wide test guard detonates again (it already did once at midnight, hotfixed) — tracked with deadline (8cmwZ5nK).
- Camellia is untouched. Nothing renders there until its policy row is written and its mailbox flag is flipped — both explicit go-live decisions, per the Willows-first plan.