[object Object]

← back to Commercialrealestate

Chat: add per-unit rent rolls + real SFV sale comps to grounding context

a22e0f047d8799f3ab436ad5a5b4d88ed2b693d4 · 2026-06-21 16:56:40 -0700 · Steve

- data/comps.json: 16 real SFV comps + submarket cap benchmarks (scraped 2026-06-21)
- rent_roll on the 3 MLS-verified deals (Canby/Schoenborn/Amigo)
- viewer getContext() now feeds rent rolls + comps to the chat; comps.json fetched on boot
- new example chips (rent roll, comps, price-vs-comps)
- verified end-to-end: chat renders rent-roll table + comps benchmark, backend=cli (free)

Files touched

Diff

commit a22e0f047d8799f3ab436ad5a5b4d88ed2b693d4
Author: Steve <steve@designerwallcoverings.com>
Date:   Sun Jun 21 16:56:40 2026 -0700

    Chat: add per-unit rent rolls + real SFV sale comps to grounding context
    
    - data/comps.json: 16 real SFV comps + submarket cap benchmarks (scraped 2026-06-21)
    - rent_roll on the 3 MLS-verified deals (Canby/Schoenborn/Amigo)
    - viewer getContext() now feeds rent rolls + comps to the chat; comps.json fetched on boot
    - new example chips (rent roll, comps, price-vs-comps)
    - verified end-to-end: chat renders rent-roll table + comps benchmark, backend=cli (free)
---
 data/comps.json    | 27 ++++++++++++++++++
 data/listings.json |  6 ++--
 data/ranked.json   | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 public/index.html  | 14 +++++++--
 4 files changed, 124 insertions(+), 6 deletions(-)

diff --git a/data/comps.json b/data/comps.json
new file mode 100644
index 0000000..ffc777c
--- /dev/null
+++ b/data/comps.json
@@ -0,0 +1,27 @@
+{
+  "note": "Real SFV comparable sales + active comps gathered 2026-06-21 via Exa (LoopNet/Compass/broker sites). Cap rates are broker/MLS-stated — directional, verify in DD.",
+  "submarket_cap_benchmarks": {
+    "SFV multifamily (older / RSO stock, pre-1978)": "~5.3-6.0% in-place",
+    "SFV multifamily (newer / non-RSO, post-2008 / NoHo)": "~6.2-6.8% in-place",
+    "SFV retail & single-tenant NNN": "~6.0-7.3%",
+    "context": "In-place caps sit BELOW the ~7.8% debt constant at 6.75% / 25% down -> most leveraged deals run negative/breakeven cash flow."
+  },
+  "comps": [
+    {"submarket": "Reseda/Northridge MF", "address": "6640 Darby Ave, Reseda", "units": 18, "price": 3420000, "cap": 5.94, "ppu": 190000, "year": 1963, "status": "Sold"},
+    {"submarket": "Reseda/Northridge MF", "address": "6652 Darby Ave, Reseda", "units": 23, "price": 4400000, "cap": 6.79, "ppu": 191304, "year": 1962, "status": "Sold"},
+    {"submarket": "Reseda/Northridge MF", "address": "8135 Reseda Blvd", "units": 10, "price": 2325000, "cap": 5.45, "ppu": 250000, "year": 1981, "status": "Active", "note": "non-RSO (AB1482)"},
+    {"submarket": "Reseda/Northridge MF", "address": "18547 Saticoy St, Reseda", "units": 13, "price": 3100000, "cap": 6.75, "year": 1987, "status": "Active", "note": "non-RSO"},
+    {"submarket": "Reseda/Northridge MF", "address": "18356 Napa St, Northridge", "units": 16, "price": 4350000, "cap": 5.60, "ppu": 271875, "year": 1986, "status": "Active"},
+    {"submarket": "Van Nuys/Lake Balboa MF", "address": "16020 Vanowen St", "units": 10, "price": 1600000, "cap": 5.50, "status": "Sold"},
+    {"submarket": "Van Nuys/Lake Balboa MF", "address": "14623 Calvert St", "units": 9, "price": 1950000, "cap": 5.30, "ppu": 216667, "year": 1964, "status": "Active"},
+    {"submarket": "Van Nuys/Lake Balboa MF", "address": "15405 Vanowen St", "units": 30, "price": 5350000, "cap": 5.68, "year": 1960, "status": "Active"},
+    {"submarket": "Van Nuys/Lake Balboa MF", "address": "6451 Kester Ave", "units": 14, "price": 4750000, "cap": 5.75, "ppu": 339286, "year": 1988, "status": "Active", "note": "non-RSO"},
+    {"submarket": "North Hollywood MF (newer/non-RSO)", "address": "7443 Troost Ave", "units": 4, "price": 2350000, "cap": 6.18, "year": 2020, "status": "Active"},
+    {"submarket": "North Hollywood MF (newer/non-RSO)", "address": "5743 Case Ave", "units": 4, "price": 2400000, "cap": 5.23, "year": 2018, "status": "Active"},
+    {"submarket": "North Hollywood MF (newer/non-RSO)", "address": "5263 Cartwright Ave", "units": 5, "price": 2999000, "cap": 6.41, "year": 2025, "status": "Active", "note": "Opportunity Zone"},
+    {"submarket": "Pacoima value-add MF", "address": "12600 Correnti St", "units": 14, "price": 3300000, "cap": 7.50, "year": null, "status": "Active", "note": "assumable $2.5M loan @3.9% -> 12.2% CoC; plans for 20 more units"},
+    {"submarket": "SFV retail / NNN", "address": "6020 Canoga Ave, Woodland Hills", "units": 2, "price": 5500000, "cap": 6.35, "status": "Active", "note": "2-tenant NNN, Warner Center"},
+    {"submarket": "SFV retail / NNN", "address": "10701 Burbank Blvd, NoHo", "units": 1, "price": 2799000, "cap": 7.30, "year": 1951, "status": "Active", "note": "STNL cannabis, $204k NOI"},
+    {"submarket": "SFV retail / NNN", "address": "Reseda Plaza (18300 Vanowen St)", "units": 8, "price": 4110000, "cap": 6.09, "year": 1973, "status": "Active", "note": "Ralphs-anchored strip, 6.23% CoC"}
+  ]
+}
diff --git a/data/listings.json b/data/listings.json
index dd479f2..9c80254 100644
--- a/data/listings.json
+++ b/data/listings.json
@@ -14,9 +14,9 @@
     {"id": "victory13350", "address": "13350 Victory Blvd", "city": "Van Nuys", "zip": "91401", "type": "Multifamily", "price": 1299995, "units": 5, "sqft": 3468, "cap_rate": 4.49, "year_built": 1951, "rent_control": "Not on LA RSO (per listing)", "status": "Active", "upside_note": "~30% rent upside; 5 garage spaces add revenue; copper plumbing partial", "source": "https://www.compass.com/homedetails/13350-Victory-Blvd-Van-Nuys-CA-91401/1J7A3S_pid/"},
     {"id": "sepulveda8144", "address": "8144 Sepulveda Pl", "city": "Panorama City", "zip": "91402", "type": "Multifamily", "price": 1400000, "units": 6, "sqft": 5418, "cap_rate": 5.00, "year_built": 1952, "rent_control": "LA RSO (pre-1978) — assume rent controlled", "status": "Active", "upside_note": "All 2bd/1ba unit mix; tremendous upside; newer roof, copper plumbing, owned laundry", "source": "https://www.compass.com/homedetails/8144-Sepulveda-Pl-Panorama-City-CA-91402/1IJRNO_pid/"},
     {"id": "canby7260", "address": "7260 Canby Ave", "city": "Reseda", "zip": "91335", "type": "Multifamily", "price": 1425000, "units": 6, "sqft": 5108, "cap_rate": 4.75, "year_built": 1954, "rent_control": "LAR2; pre-1978 likely RSO", "status": "Active", "upside_note": "RTI plans for 2 ADUs -> projected 7.08% cap, 7.60% pre-tax CoC post-ADU; $272/sf post-ADU; Walk Score 86 near CSUN", "source": "https://www.loopnet.com/Listing/7260-Canby-Ave-Reseda-CA/34975971/"},
-    {"id": "canby7304", "address": "7302-7304 Canby Ave", "city": "Reseda", "zip": "91335", "type": "Mixed-use", "price": 1250000, "units": 5, "sqft": 5048, "cap_rate": 5.96, "cap_rate_projected": 7.80, "noi_actual": 74497, "gross_actual": 112200, "expenses": 37703, "verified": true, "year_built": 1926, "rent_control": "C2 (LAC2) mixed commercial+residential", "status": "Active", "upside_note": "VERIFIED (MLS #26654413): actual in-place cap ~5.96% (NOI $74,497 on $112,200 gross, $37,703 exp) — the 7.8% headline is PROJECTED, achieved mainly by doubling the commercial unit $2,000->$4,000/mo + bumping the 3bd. SELLER FINANCING confirmed. Price CUT $1,399,000->$1,250,000 (motivated seller). Occupancy ambiguous (listing desc says 3 occupied vs MLS 0% vacancy — verify rent roll). C2 development optionality.", "source": "https://www.compass.com/homedetails/7304-Canby-Ave-Reseda-CA-91335/1IO7AS_pid/"},
-    {"id": "schoenborn17920", "address": "17920 Schoenborn St", "city": "Northridge", "zip": "91325", "type": "Multifamily", "price": 1395000, "units": 6, "sqft": 4962, "cap_rate": 5.97, "noi_actual": 83282, "gross_actual": 121394, "expenses": 38112, "verified": true, "year_built": 1959, "rent_control": "LAR3 / rent controlled (1959); pre-1978 RSO", "status": "Active", "upside_note": "VERIFIED (MLS): actual in-place 5.97% cap (NOI $83,282 on $121,394 gross, $38,112 exp); rent-controlled (LAR3, 1959) limits upside. Live-in-one play near CSUN/Northridge Hospital.", "source": "https://www.compass.com/homedetails/17920-Schoenborn-St-Northridge-CA-91325/1JVU5S_pid/"},
-    {"id": "amigo8357", "address": "8357 Amigo Ave", "city": "Northridge", "zip": "91324", "type": "Multifamily", "price": 1249000, "units": 4, "sqft": 3816, "cap_rate": 5.63, "noi_actual": 70270, "gross_actual": 89460, "expenses": 19190, "verified": true, "year_built": 1960, "rent_control": "LAR3", "status": "Active", "upside_note": "VERIFIED (MLS): honest in-place cap ~5.63% = gross $89,460 - exp $19,190 = NOI $70,270 (the MLS 'NOI $88,310' field ignores expenses — unreliable). Stated expenses $19,190 look LOW (verify taxes/insurance/mgmt in DD). Price cut $1,350,000->$1,249,000 (motivated). Quad near CSUN.", "source": "https://www.compass.com/homedetails/8357-Amigo-Ave-Northridge-CA-91324/1IMLRO_pid/"},
+    {"id": "canby7304", "address": "7302-7304 Canby Ave", "city": "Reseda", "zip": "91335", "type": "Mixed-use", "price": 1250000, "units": 5, "sqft": 5048, "cap_rate": 5.96, "cap_rate_projected": 7.80, "noi_actual": 74497, "gross_actual": 112200, "expenses": 37703, "verified": true, "rent_roll": [{"unit": 1, "type": "commercial 0bd/1ba", "rent": 2000, "proforma": 4000}, {"unit": 2, "type": "3bd/3ba", "rent": 2550, "proforma": 3000}, {"unit": 3, "type": "1bd/1ba", "rent": 1550}, {"unit": 4, "type": "1bd/1ba", "rent": 1500}, {"unit": 5, "type": "1bd/1ba", "rent": 1750}], "year_built": 1926, "rent_control": "C2 (LAC2) mixed commercial+residential", "status": "Active", "upside_note": "VERIFIED (MLS #26654413): actual in-place cap ~5.96% (NOI $74,497 on $112,200 gross, $37,703 exp) — the 7.8% headline is PROJECTED, achieved mainly by doubling the commercial unit $2,000->$4,000/mo + bumping the 3bd. SELLER FINANCING confirmed. Price CUT $1,399,000->$1,250,000 (motivated seller). Occupancy ambiguous (listing desc says 3 occupied vs MLS 0% vacancy — verify rent roll). C2 development optionality.", "source": "https://www.compass.com/homedetails/7304-Canby-Ave-Reseda-CA-91335/1IO7AS_pid/"},
+    {"id": "schoenborn17920", "address": "17920 Schoenborn St", "city": "Northridge", "zip": "91325", "type": "Multifamily", "price": 1395000, "units": 6, "sqft": 4962, "cap_rate": 5.97, "noi_actual": 83282, "gross_actual": 121394, "expenses": 38112, "verified": true, "rent_roll": [{"unit": 1, "type": "1bd/1ba", "rent": 1153}, {"unit": 2, "type": "1bd/1ba", "rent": 1227}, {"unit": 3, "type": "1bd/1ba", "rent": 1299}, {"unit": 4, "type": "2bd/1ba", "rent": 2200}, {"unit": 5, "type": "3bd/1ba", "rent": 2800}, {"unit": 6, "type": "1bd/1ba", "rent": 1750}], "year_built": 1959, "rent_control": "LAR3 / rent controlled (1959); pre-1978 RSO", "status": "Active", "upside_note": "VERIFIED (MLS): actual in-place 5.97% cap (NOI $83,282 on $121,394 gross, $38,112 exp); rent-controlled (LAR3, 1959) limits upside. Live-in-one play near CSUN/Northridge Hospital.", "source": "https://www.compass.com/homedetails/17920-Schoenborn-St-Northridge-CA-91325/1JVU5S_pid/"},
+    {"id": "amigo8357", "address": "8357 Amigo Ave", "city": "Northridge", "zip": "91324", "type": "Multifamily", "price": 1249000, "units": 4, "sqft": 3816, "cap_rate": 5.63, "noi_actual": 70270, "gross_actual": 89460, "expenses": 19190, "verified": true, "rent_roll": [{"unit": 1, "type": "2bd/1ba", "rent": 1509}, {"unit": 2, "type": "2bd/1ba", "rent": 2300}, {"unit": 3, "type": "2bd/1ba", "rent": 1651}, {"unit": 4, "type": "2bd/1ba", "rent": 2000}], "year_built": 1960, "rent_control": "LAR3", "status": "Active", "upside_note": "VERIFIED (MLS): honest in-place cap ~5.63% = gross $89,460 - exp $19,190 = NOI $70,270 (the MLS 'NOI $88,310' field ignores expenses — unreliable). Stated expenses $19,190 look LOW (verify taxes/insurance/mgmt in DD). Price cut $1,350,000->$1,249,000 (motivated). Quad near CSUN.", "source": "https://www.compass.com/homedetails/8357-Amigo-Ave-Northridge-CA-91324/1IMLRO_pid/"},
     {"id": "wilbur9014", "address": "9014 Wilbur Ave", "city": "Northridge", "zip": "91324", "type": "Multifamily", "price": 1700000, "units": 4, "sqft": 3211, "cap_rate": null, "year_built": 1980, "rent_control": "Built 1980 -> NOT LA RSO; AB1482 only", "status": "Active", "upside_note": "Cap not disclosed; 1980 build = no LA rent control (higher increases); remodeled + new-construction units; adjacent 2-unit also available", "source": "https://www.compass.com/homedetails/9014-Wilbur-Ave-Northridge-CA-91324/1KTV77_pid/"},
     {"id": "tilden8843", "address": "8843-8845 Tilden Ave", "city": "Panorama City", "zip": "91402", "type": "Multifamily", "price": 1050000, "units": 3, "sqft": 2076, "cap_rate": null, "year_built": 1948, "rent_control": "Pre-1978 -> LA RSO", "status": "Active", "upside_note": "Cap not disclosed; $350k/unit; individually metered; owner-user/house-hack friendly", "source": "https://www.coldwellbankerhomes.com/ca/panorama-city/8843-tilden/pid_69954470/"},
     {"id": "tilden8837", "address": "8837 Tilden Ave", "city": "Panorama City", "zip": "91402", "type": "Multifamily", "price": 899000, "units": 2, "sqft": 1794, "cap_rate": 5.30, "year_built": 1948, "rent_control": "Pre-1978 -> LA RSO", "status": "Active", "upside_note": "Duplex; small entry point; on market 51 days", "source": "https://www.compass.com/homedetails/8837-Tilden-Ave-Panorama-City-CA-91402/1JQEEP_pid/"},
diff --git a/data/ranked.json b/data/ranked.json
index 5457474..b16681d 100644
--- a/data/ranked.json
+++ b/data/ranked.json
@@ -38,6 +38,35 @@
       "gross_actual": 112200,
       "expenses": 37703,
       "verified": true,
+      "rent_roll": [
+        {
+          "unit": 1,
+          "type": "commercial 0bd/1ba",
+          "rent": 2000,
+          "proforma": 4000
+        },
+        {
+          "unit": 2,
+          "type": "3bd/3ba",
+          "rent": 2550,
+          "proforma": 3000
+        },
+        {
+          "unit": 3,
+          "type": "1bd/1ba",
+          "rent": 1550
+        },
+        {
+          "unit": 4,
+          "type": "1bd/1ba",
+          "rent": 1500
+        },
+        {
+          "unit": 5,
+          "type": "1bd/1ba",
+          "rent": 1750
+        }
+      ],
       "year_built": 1926,
       "rent_control": "C2 (LAC2) mixed commercial+residential",
       "status": "Active",
@@ -90,6 +119,38 @@
       "gross_actual": 121394,
       "expenses": 38112,
       "verified": true,
+      "rent_roll": [
+        {
+          "unit": 1,
+          "type": "1bd/1ba",
+          "rent": 1153
+        },
+        {
+          "unit": 2,
+          "type": "1bd/1ba",
+          "rent": 1227
+        },
+        {
+          "unit": 3,
+          "type": "1bd/1ba",
+          "rent": 1299
+        },
+        {
+          "unit": 4,
+          "type": "2bd/1ba",
+          "rent": 2200
+        },
+        {
+          "unit": 5,
+          "type": "3bd/1ba",
+          "rent": 2800
+        },
+        {
+          "unit": 6,
+          "type": "1bd/1ba",
+          "rent": 1750
+        }
+      ],
       "year_built": 1959,
       "rent_control": "LAR3 / rent controlled (1959); pre-1978 RSO",
       "status": "Active",
@@ -383,6 +444,28 @@
       "gross_actual": 89460,
       "expenses": 19190,
       "verified": true,
+      "rent_roll": [
+        {
+          "unit": 1,
+          "type": "2bd/1ba",
+          "rent": 1509
+        },
+        {
+          "unit": 2,
+          "type": "2bd/1ba",
+          "rent": 2300
+        },
+        {
+          "unit": 3,
+          "type": "2bd/1ba",
+          "rent": 1651
+        },
+        {
+          "unit": 4,
+          "type": "2bd/1ba",
+          "rent": 2000
+        }
+      ],
       "year_built": 1960,
       "rent_control": "LAR3",
       "status": "Active",
diff --git a/public/index.html b/public/index.html
index d1b2883..834dbba 100644
--- a/public/index.html
+++ b/public/index.html
@@ -201,8 +201,15 @@ function getContext(){
   lines.push(`Verdict: DTD panel 3/3 picked 7302-7304 Canby Ave Reseda (id canby7304). Its 7.8% cap is PROJECTED; actual in-place ~5.96% (NOI $74,497).`);
   lines.push('RANKED PROPERTIES (current scenario):');
   DATA.ranked.forEach(p=>{ const f=p.finance;
-    lines.push(`#${p.rank} id=${p.id} | ${p.address}, ${p.city} | ${p.type} | $${p.price.toLocaleString()} | ${p.units}u | cap ${p.cap_rate!=null?p.cap_rate+'%':'n/d'}${p.cap_rate_projected?` (proj ${p.cap_rate_projected}%)`:''} | NOI ${f.noi?'$'+f.noi.toLocaleString():'n/d'} | CoC ${f.coc!=null?f.coc+'%':'n/a'} | DSCR ${f.dscr??'n/a'} | cash needed $${f.cashNeeded.toLocaleString()} ${f.affordable?'(in budget)':'(OVER budget)'} | composite ${p.composite} | rec ${p.qwen?.recommendation||'n/a'} | status ${p.status}`);
+    lines.push(`#${p.rank} id=${p.id} | ${p.address}, ${p.city} | ${p.type} | $${p.price.toLocaleString()} | ${p.units}u | cap ${p.cap_rate!=null?p.cap_rate+'%':'n/d'}${p.cap_rate_projected?` (proj ${p.cap_rate_projected}%)`:''}${p.verified===true?' VERIFIED':''} | NOI ${f.noi?'$'+f.noi.toLocaleString():'n/d'} | CoC ${f.coc!=null?f.coc+'%':'n/a'} | DSCR ${f.dscr??'n/a'} | cash needed $${f.cashNeeded.toLocaleString()} ${f.affordable?'(in budget)':'(OVER budget)'} | composite ${p.composite} | rec ${p.qwen?.recommendation||'n/a'} | status ${p.status}`);
+    if(p.rent_roll) lines.push('   rent roll: '+p.rent_roll.map(u=>`#${u.unit} ${u.type} $${u.rent}/mo`+(u.proforma?` (proj $${u.proforma})`:'')).join('; '));
   });
+  if(DATA.comps){
+    lines.push('\nSUBMARKET CAP BENCHMARKS:');
+    Object.entries(DATA.comps.submarket_cap_benchmarks).forEach(([k,v])=>lines.push(`- ${k}: ${v}`));
+    lines.push('COMPARABLE SALES (real, scraped 2026-06-21 — directional, verify in DD):');
+    DATA.comps.comps.forEach(c=>lines.push(`- ${c.submarket} | ${c.address} | ${c.units}u | $${c.price.toLocaleString()} | ${c.cap?c.cap+'% cap':'cap n/d'}${c.ppu?` | $${c.ppu.toLocaleString()}/unit`:''} | ${c.status}${c.note?' ('+c.note+')':''}`));
+  }
   return lines.join('\n');
 }
 
@@ -255,8 +262,9 @@ async function ask(text){
 }
 
 // ---- boot ----
+fetch('data/comps.json').then(r=>r.json()).then(c=>{ if(DATA) DATA.comps=c; else window.__comps=c; }).catch(()=>{});
 fetch('data/ranked.json').then(r=>r.json()).then(d=>{
-  DATA=d;
+  DATA=d; if(window.__comps) DATA.comps=window.__comps;
   $('#sub').innerHTML = `${d.ranked.length} active listings · <b>${d.meta.market}</b> · budget <b>$400,000</b> down${d.generated?' · sourced '+d.generated:''}`;
   $('#verdictBody').innerHTML = `<b>DTD panel (3/3):</b> best $400k-down pick = <b>7302-7304 Canby Ave, Reseda</b> (mixed-use, seller financing — the only deal with positive/near-breakeven leverage). <br>
     <b>DD correction:</b> its headline <b>7.8% cap is PROJECTED</b>; actual in-place ≈ <b>5.96%</b> (NOI $74,497 on $112,200 gross). Price cut $1.399M→$1.25M. <br>
@@ -274,7 +282,7 @@ fetch('data/ranked.json').then(r=>r.json()).then(d=>{
   $('#density').oninput=()=>{ document.documentElement.style.setProperty('--cols',$('#density').value); localStorage.setItem('sfv_density',$('#density').value); };
   $('#maxPrice').oninput=()=>{ maxPrice = $('#maxPrice').value?+$('#maxPrice').value:null; render(); };
   // chat
-  const EX=['Why is Canby #1 — is its 7.8% cap real?','Show only deals under $1M at 30% down, sorted by cash-on-cash','Which deals actually cash-flow?','Take me to the best retail/NNN option'];
+  const EX=['Show the rent roll for Schoenborn','What are the comps for Reseda multifamily?','Is Canby priced right vs comps?','Show only deals under $1M at 30% down, sorted by cash-on-cash','Which deals actually cash-flow?'];
   $('#examples').innerHTML = EX.map(x=>`<button class="ex">${x}</button>`).join('');
   $('#examples').onclick=e=>{ if(e.target.classList.contains('ex')){ $('#q').value=e.target.textContent; $('#q').focus(); } };
   $('#chatform').onsubmit=e=>{ e.preventDefault(); const t=$('#q').value.trim(); if(!t) return; $('#q').value=''; ask(t); };

← 0feadae Ranking integrity: verify top picks vs MLS + unverified-NOI  ·  back to Commercialrealestate  ·  Expand listing set (+5) + gated live-comps route 1351a12 →