Composite study

This is a product-class write-up, not a named-client story and not a results press release. Counts below describe the pack we actually write (approach points, tools, layers) — not invented bug totals or conversion lifts.

4
Approach points
4
Tools in the pack
4
Layers covered
3
Challenges documented

Overview

Card price and detail price drifted after a feed update. The assistant used the stale card embedding.

“Good schools” and crime commentary appeared without a data source — both are fair-housing-sensitive.

Sold listings still had an “ask for a tour” CTA in chat.

Industry pattern this is grounded in

Wrong price, stale status, or invented property facts destroy trust and create fair-housing and misrepresentation risk. Map/list desync is the classic non-AI twin of the same problem.

Highlights

Typical launch bar: Wait until journeys and evals agree — do not ship on demo scores alone.

Challenges

01

MLS lag meant the truth was minutes behind; the assistant spoke in the present tense.

02

Geocodes for new builds put pins in the wrong neighborhood, and the model narrated that neighborhood.

03

Agents wanted the bot to “sell the listing.”

How we tested

01

Facts (price, beds, HOA, status) from listing fields or refuse.

02

Neighborhood commentary marked non-authoritative or omitted.

03

Map bounds, filters, and list pane stay in sync; sold/off-market cannot be treated as available.

04

Lead routing isolation; buyer A cannot see buyer B’s inquiry.

Starting point vs what we required

Starting point versus the controls we required
Starting pointWhat we required
MLS lag meant the truth was minutes behind; the assistant spoke in the present tense.Facts (price, beds, HOA, status) from listing fields or refuse.
Geocodes for new builds put pins in the wrong neighborhood, and the model narrated that neighborhood.Neighborhood commentary marked non-authoritative or omitted.
Agents wanted the bot to “sell the listing.”Map bounds, filters, and list pane stay in sync; sold/off-market cannot be treated as available.

What we delivered

01

Journeys / UI

  • Playwright — Search, map, listing, lead form
02

API / contract

  • Postman — Feed ingest, status, lead IDOR
03

Adversarial evals

  • Promptfoo — Invented HOA/flood/school facts
04

RAG quality

  • Ragas — Answers grounded in listing JSON

Outcomes

Present-tense facts required a fresh field read. Stale feed showed “as of” in the UI. Chat CTAs respected status.

Playwright: filter → open listing → attributes match. API: agent B cannot PATCH agent A’s listing. Promptfoo: invented HOA.

Stack

Testing stack used on this product class
LayerToolWhat we validated
Journeys / UIPlaywrightSearch, map, listing, lead form
API / contractPostmanFeed ingest, status, lead IDOR
Adversarial evalsPromptfooInvented HOA/flood/school facts
RAG qualityRagasAnswers grounded in listing JSON

Same method as the rest of our work: severity-ranked findings, pass rules in writing, and a ship / wait / block call. See the evaluation method and tool comparison.