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:

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 askedWhat Clara saidVerdict
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

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).

PieceStatusWhat it does
Lease-answer engine + voice/SMS wiringMERGED · deployedPublished-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 answersMERGED (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 calendarMERGEDSigned-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 answersMERGED · not yet proven liveNew 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 auditMERGEDBoth 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 harnessMERGED · seededReversible staging of Fede as an approved applicant at the Willows (seed/status/reset)
Review-pipeline pagination fixMERGEDThe 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

ChannelRound 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

Questions to ask, and what Clara should say

AskExpected 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:

Order of operations stands: fleet pass green → Fede tests at the Willows → policy row + flags at Camellia.

Honest caveats

PropFlow Docs