Vendor Scheduling Demo — Run of Show

For the Camellia staff meeting · 2026-07-30 · Everything below runs on the sandbox property (appfolio-45, spoken of as The Willows on every call — the company name is never said to a vendor). Fede drives; the audience is the people who make these calls by hand today. The frame for the room: this is the phone-and-paperwork part of a vendor job done for you — the PM keeps every decision (which vendor, what money), Clara does the dialing, the re-dialing, and the writing-it-down.

What changed overnight (why this demo is safe to give)

The story in one breath

A make-ready job needs a vendor. Clara calls the vendor herself from The Willows' own phone line, gets the job on their schedule like a human coordinator would — no permission-asking, PO spoken digit by digit, never approves a price — and when the call ends, the work order is scheduled and the visit appears on the property's Outlook calendar. Later the vendor calls back to move the day; Clara recognizes them from the number, knows exactly which job it is, and the reschedule lands on the work order and the calendar without a human touching anything.

Cast & numbers

RoleWho / number
Clara (outbound vendor agent)dials from The Willows' line +1 844 285 3526 — the vendor's phone shows the property's number, and any callback rings Clara, never the PM
The vendor ("Miracle Method of Denver")Fede's cell +1 404 285 9387 — seeded as the vendor's contact number
The jobPO 90760 · tub/shower resurface · unit 201 (re-check after re-seeding — the seed rotates units)
Property calendarpropflowaicalendar@outlook.com (The Willows' connected Outlook leasing calendar)

Pre-flight (10 minutes before)

  1. Re-seed the PO book (seeded POs go stale after 24 h) and note which unit each PO landed on this time:
    DATA_BACKEND=dynamodb DYNAMODB_TABLE_NAME=propflow-prod AWS_REGION=us-east-1 \
      npx tsx scripts/dev/seed-willows-pos.ts --apply --key-real-vendors
  2. Persona check — Fede's number must read as the vendor, not a prospect:
    bash ~/.claude/skills/willows-persona/persona.sh status
  3. Prompt sync check (was verified in sync today; cheap to re-run):
    npx tsx scripts/verify-vendor-outbound-prompt.ts
  4. Open the proof surfaces before dialing: the Outlook calendar (week view), the work-order page, and the vendor's schedule page in the app.
  5. Phone on speaker, room quiet. Silence other devices — the dial arrives within ~10 s of the command.

Act 1 — Clara calls the vendor ~2 min

npx tsx scripts/vendor-calling/test-dial.ts \
  --job "resurface the tub and shower walls" \
  --vendor "Miracle Method of Denver" \
  --unit <unit-from-seed> --pm "Fede" --po 90760 \
  --i-understand-this-dials

Fede answers as the vendor's front desk:

"Miracle Method, this is Fred."

What to point out to the room while it happens (in their terms):

Act 2 — the paper trail appears ~2 min

Timing note: the writes happen when the call ends (post-call extraction) — give it ~30–60 s before refreshing.

Act 3 — the vendor calls back to reschedule ~2 min

From the same cell, Fede calls The Willows' line back: +1 844 285 3526.

Two rules that make this work: call back from the same phone Clara dialed (recognition is phone-keyed), and the reschedule is written at call end — in-call she promises it, she doesn't claim it's done.

What NOT to claim (honest edges)

If it goes sideways

Where this stands for Camellia — the honest boundary list

What separates "great demo" from "Camellia turns it on Monday." Each item is a decision or a deploy, not a research project.

GateStateWhat it takes
Deploy the two in-flight fixesPRs #4985, #4919Merge on green + Vercel deploy — without #4985, live inbound reschedules refuse; without #4919, unknown-phone vendors can't move their job.
Dial a real vendorNever done — by designEvery outbound call to date is bench (Fede / QA robot). First real dial is a deliberate go from Fede + Camellia, starting with one friendly vendor and one job class.
Purchase-order sync for CamelliaZero PO rows in prodCamellia's vendors already print AppFolio purchase-order numbers on their invoices; enabling the sync gives Clara the numbers she speaks and makes ~$6.7k of 2026 invoice spend attributable on day one. Human decision, one flag + a sync run.
Inbound resolution rate78% autonomous on the 66-call replay corpusUp from 70% baseline overnight; the ≥80% target is one measured prompt iteration away (two of the six remaining failures are grader artifacts, not bad calls). PR #4938 holds the current improvement.
Transfer targetNot armedWhen a caller genuinely needs a human, Clara needs a number to hand off to during office hours — a config decision (front desk vs Joanna's line), not code.
Vendor email & invoicesDetection scoped, decisions parkedSchedule-bearing vendor email and invoices are currently understood and discarded. The lifecycle plan, mined 2026 spend ($39.6k), and the decision list (trusted-sender policy, metered parsing spend) live in the companion doc: Vendor Lifecycle: Coordination → Job Done → Paid.

After the demo

PropFlow Docs