# Data sources and lineage — vision build

Every number the site shows traces back to one of the rows below: source, URL,
fetch time, and how it was retrieved. Same lineage discipline as
`solution/data/README.md` — nothing here is invented to fill a gap; a gap is
shown as a gap.

## Tooling note (read this first)

Two tools did the real scraping, used for what each is actually good at:

- **WebSearch / WebFetch** (Claude Code's built-in tools) — property and
  comparable-listing **text/data fields**: rent, deposit, area, furnishing,
  amenities, descriptions. Both subject properties and all 25 comps came
  from this.
- **Firecrawl** (real headless-browser scrape) — **photos**, for listings
  whose gallery is JS-rendered and invisible to a plain fetch. DSR Ultima's
  own listing page is exactly that case: a `curl` of its raw HTML returns a
  bare client-side-hydration SPA shell (zero `<img>` src attributes, no
  `og:image` meta tag) — confirmed by retrying twice, consistently 50,592
  bytes both times. A real Firecrawl scrape (`--format images`, a 3-second
  JS wait) rendered the page and found 3 real gallery photo URLs. **This was
  specific to that one listing's page, not a general nobroker.in
  limitation** — a spot-check of other comps found several with
  server-rendered galleries, retrievable with a plain `curl`, no Firecrawl
  needed (that's how the second property's photos were found).

Both properties in this build now have **real, photo-grounded renovation
capex** — see section 4 below. "Maps API" in the tools-used panel is
OpenStreetMap (Nominatim + Overpass) rather than Google Maps — free,
keyless, real data, same query shape a paid Maps integration would use in
production.

## 1. Subject properties

### DSR Ultima, HSR Layout (deal A)

| Field | Value |
|---|---|
| Source | nobroker.in listing detail page |
| URL | https://www.nobroker.in/property/2-bhk-apartment-for-rent-in-hsr-layout-bangalore-for-rs-55000/8a9f87038d8ceed5018d8debae325080/detail |
| Retrieved via | WebFetch (text fields), Firecrawl (photos — see tooling note) |
| Output | `subject-property.json` |
| Photos | 3 real, via Firecrawl — `dsr-ultima-photos/` |

### Vijayalakshmi 20th Main, HSR Layout (deal B)

| Field | Value |
|---|---|
| Source | nobroker.in listing detail page |
| URL | https://www.nobroker.in/property/2-bhk-apartment-for-rent-in-hsr-layout-bangalore-for-rs-42000/8aa9bb1c9f40cee2019f40fcb5d119e2/detail |
| Retrieved via | WebFetch (text fields), plain `curl` (photos — server-rendered gallery) |
| Output | `subject-property-2.json` |
| Photos | 3 real, via plain fetch — `demo-property-photos/` |

## 2. Comparable listings (market evidence)

| Field | Value |
|---|---|
| Source | nobroker.in search results — "2 BHK Flats for Rent in HSR Layout Bangalore" |
| URL | https://www.nobroker.in/2bhk-flats-for-rent-in-hsr_layout_bangalore |
| Retrieved via | WebFetch (HTML → markdown) |
| Output | `comps-raw.json`, `comps-raw.csv` (25 rows, exactly as returned — dupes/mislabels/outliers left in and flagged inline, not scrubbed) |
| Known gap | No `posted_date`/`last_seen_date` exposed by this source (same gap `solution/data` already documents for nobroker.in) — freshness is marked unknown, not assumed, in the engine |

## 3. Locality / nearby amenities

| Field | Value |
|---|---|
| Geocoding source | OpenStreetMap Nominatim |
| Geocode query | "HSR Layout Sector 1 Bangalore" (neither subject building has an OSM entry; public listings don't expose exact coordinates either, so the nearest resolvable named-area node is used as the anchor point for both deals) |
| Amenities source | OpenStreetMap Overpass API (overpass-api.de) |
| Retrieved via | `curl` (direct API calls, no key required) |
| Query | radius search, 1500m, for hospital/clinic/supermarket/bar/pub/restaurant/pharmacy/school + rail station within 3000m |
| Output | `locality.json`, raw Overpass response in `raw/overpass-result.json` |
| Substitutes for | Google Maps Places API (would be the production choice; same query shape) |

## 4. Renovation / furnishing capex estimate

**Run for real on both properties.** The sub-agent
(`../agents/renovation-capex-brief.md`) assessed each unit room by room
against only its own real photos — no text-only guessing, no placeholder.

- **DSR Ultima**: ₹17,600–32,800–62,700, from 3 Firecrawl-recovered photos.
  Real findings include a dated wardrobe finish and a possibly-missing
  ceiling fan; most of the listing's own furnishing claims (kitchen, sofa,
  beds, second AC) aren't visible in any of the 3 photos and remain
  unverified. Full result: `dsr-ultima-photos/capex-result.json`.
- **Vijayalakshmi 20th Main**: ₹20,000–45,000–76,000, from 3 plain-fetch
  photos. Real findings include unfinished two-tone paint, ambiguous floor
  material, and a loose unrouted cable. Full result:
  `demo-property-photos/capex-demo-result.json`.

Both are genuinely partial reads — only 3 of each listing's likely 8-12+
gallery photos were recoverable, so bathrooms and approach/access (Flent's
top two weighted quality factors) are unassessed on both. See each result's
own `unknowns` list. Rendered together on `site/capex-demo.html` and inline
on each deal's dashboard KPI 2 card.

## 5. Broker price-discovery (voice agent + CRM)

Not built, not simulated with fake transcripts. See
`../agents/broker-voice-agent-architecture.md` for the design; the UI shows
this as a labeled "planned — v2" panel, not fake call data.
