I'm evaluating Buzz Golden Hill for a financing decision and need help determining a supportable valuation. The property was built in 2016 and stabilzied and I am seeking a new perm loan since the current fixed rate period is ending. My target LTV 65% and a 8.50% debt yield and I need to understand whether current NOI and market conditions support my desired loan amount of $9.25MM. Please assess the property's income potential, cap rate, and estimated value in the context of today's lending environment.
Now pulling property financials, attributes, market cap rate, mortgage rate quotes, and treasury.
Buzz Golden Hill (2995 B St, San Diego, CA 92102) — 36-unit, 573 sqft-avg micro-unit product; platform shows a 2021 build year against your 2016, so flag which is right when you correct the form. The bigger gap: there's no operating statement on file for this property (financials are all blank) and no rent-roll sample confidence, so I need a T12 or a basis to underwrite off — pick one below, and attach the T12 if you have it since that's what will actually move the number.
Now let's set up the workbook file and write the population script.
mkdir -p output && cp agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v3_clean.xlsx "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" && cd output && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx')
print(wb.sheetnames)
"
cat > output/calc_market_rent_basis.py << 'EOF'
# Derive the market-rent-per-unit input for Buzz Golden Hill (36 units, 573 sf avg)
# using zip 92102 in-place rent/sqft applied to the property's actual avg unit size,
# since the zip's blended per-unit average implies a much larger typical unit than this micro-unit product.
zip_rent_psf_avg = 3.10 # zip 92102 in_place_rent_sqft_latest_avg
zip_rent_avg = 2488.19 # zip 92102 in_place_rent_latest_avg (blended, all bed types)
implied_zip_avg_unit_sf = zip_rent_avg / zip_rent_psf_avg
subject_unit_sf = 573
subject_rent_per_unit_month = zip_rent_psf_avg * subject_unit_sf
units = 36
gpr_annual = subject_rent_per_unit_month * units * 12
print(f"Implied zip avg unit size: {implied_zip_avg_unit_sf:.0f} sf")
print(f"Subject market rent/unit/month (size-adjusted): ${subject_rent_per_unit_month:,.2f}")
print(f"Subject GPR (annual, market basis): ${gpr_annual:,.2f}")
EOF
python3 output/calc_market_rent_basis.pycat > output/populate.py << 'EOF'
import openpyxl
from datetime import date
path = "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx"
wb = openpyxl.load_workbook(path)
A = wb["Assumptions"]
PF = wb["Pro Forma"]
PP = wb["Prepayment"]
DF = wb["Defeasance"]
# ---------- Assumptions: Collateral B4 block ----------
A["C5"] = "Buzz Golden Hill"
A["C6"] = "2995 B St"
A["C7"] = "San Diego, CA 92102"
A["C8"] = "Multifamily"
A["C9"] = 36
A["C10"] = 20628
A["C11"] = "Units"
A["C13"] = 2016 # user-stated year built (platform showed 2021; adopting user's figure per intake)
A["C14"] = 0.9812 # zip 92102 physical occupancy (property-level sample was insufficient)
A["C15"] = "Market Averages" # no T12 on file; underwriting off market benchmarks per intake
# ---------- Loan request E4 block ----------
A["F5"] = "Origination"
A["F6"] = "Refinance-Term"
A["F7"] = date(2026, 9, 9)
A["F8"] = 9250000
A["F9"] = 0.0593 # Freddie Mac CME Fixed, 65% LTV, 10-yr avg quote, 9/2/26
A["F10"] = 10
A["F11"] = 0
A["F12"] = 30
A["F14"] = 0.0
A["F15"] = "Non-Recourse"
# ---------- Credit box E17 block ----------
A["F18"] = 0.65
A["F19"] = 1.35 # amortizing DSCR floor, matched to the Fannie/Freddie 65% LTV product actually quoted
A["F20"] = 1.20 # IO floor (template default; loan carries no IO)
A["F21"] = 0.085 # borrower's target debt yield floor
A["F23"] = "user-provided"
A["F24"] = 50
A["F25"] = 50
# ---------- Market benchmarks E27 block ----------
A["F29"] = 0.0746 # Central San Diego submarket vacancy (1 - 92.54% occupancy)
A["F30"] = 0.05 # MF asset-class norm
A["F32"] = 0.4045 # San Diego MSA total opex % of EGI (no submarket-specific split available)
A["F33"] = 0.42 # MF asset-class norm
A["F35"] = "Yes"
A["F36"] = 0.0493 # San Diego MF cap rate, latest quarter (2026 Q2)
# F37 Appraisal Cap Rate - no appraisal on file, left blank (disclosure only, not sourced)
A["F38"] = 1776.30 # market rent/unit/month, size-adjusted to subject's 573 sf avg unit
A["F39"] = 0.01 # concessions, % of GPR (typical norm; not separately disclosed at zip/submarket)
A["F40"] = 0.01 # bad debt, % of GPR (typical norm)
A["F41"] = 0.0395 # other income, % of GPR (San Diego MSA benchmark: other income % of net rent)
A["F44"] = "Modest"
# ---------- Sponsor & guarantee ----------
A["C18"] = "Borrower (sponsor financials not provided at intake)"
A["C19"] = "Full Payment"
A["C20"] = "No"
# ---------- Growth & exit ----------
A["C28"] = 0.02 # NOI growth - conservative given trailing rent softness in the zip
A["C29"] = 0
A["C30"] = 0.02
A["C31"] = "Good"
# ---------- Takeout terms at maturity ----------
A["C34"] = 0.0625 # assumed takeout rate 10 years out (current 5.93% plus a modest long-run add)
A["C35"] = 1.25
A["C36"] = 0.65
A["C37"] = 0.085
A["C38"] = 30
A["C41"] = "Deep"
# ---------- Bridge / recovery / participation ----------
A["C53"] = 0.05 # foreclosure & legal, % of value
A["C54"] = 12 # workout carry, months
# ---------- Rollover (non-MF) ----------
A["F47"] = "No"
# ---------- Flag thresholds (leave at template defaults, write explicitly) ----------
A["F55"] = 0.90
A["F56"] = 0.30
A["F57"] = 0.10
A["F58"] = 0.03
# ---------- Pro Forma: historical columns left at 0 (no T12) ----------
for row in [5,6,7,8,9,13,14,15,16,17,18,19,20,21,22]:
for col in ["C","D","E"]:
cell = f"{col}{row}"
if PF[cell].value in (None,):
PF[cell] = 0
PF["C39"] = 0.0375 # management fee % of EGI - San Diego MSA benchmark
PF["C40"] = 300 # replacement reserves $/unit/year - approx from 1.02% capex/EGI benchmark
# ---------- Prepayment ----------
PP["C4"] = 120 # exit at maturity (10-yr term = month 120) - hold-to-maturity request
PP["C5"] = 0.01
PP["C6"] = 0.02
PP["C7"] = 50
PP["C8"] = 24
PP["C9"] = 3
PP["C10"] = "Yield Maintenance"
curve = {
"D27": 0.0397, # 6mo
"D28": 0.0412, # 1yr
"D29": 0.0436, # 2yr
"D30": 0.0441, # 3yr
"D31": 0.0454, # 5yr
"D32": 0.0465, # 7yr
"D33": 0.0477, # 10yr - platform (national_metrics_daily, 9/3/26), wins at this tenor
"D34": 0.0523, # 20yr
"D35": 0.0522, # 30yr
}
for cell, val in curve.items():
PP[cell] = val
PP["C36"] = date(2026, 9, 3)
for i in range(49, 59):
pass # step-down schedule left at template default 5-4-3-2-1-0
# ---------- Defeasance ----------
DF["C11"] = 25000
DF["C12"] = 40000
DF["C13"] = 10000
DF["C14"] = 15000
DF["C15"] = 10000
DF["C16"] = "Open Window"
wb.save(path)
print("Saved.")
EOF
python3 output/populate.pycd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" 2>&1 | tail -60
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v3_clean.xlsx')
A = wb['Assumptions']
for c in ['C47','C48','C49','C50','C51','C52']:
print(c, repr(A[c].value))
"
cd /vercel/sandbox && python skills/xlsx/scripts/recalc.py "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" 2>&1 | tail -40
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v3_clean.xlsx', data_only=False)
V = wb['Version']
print(V['D22'].value)
"
cd /vercel/sandbox && cp "agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v3_clean.xlsx" /tmp/orig_test.xlsx && python skills/xlsx/scripts/recalc.py /tmp/orig_test.xlsx 2>&1 | tail -20
cd /vercel/sandbox && python3 << 'EOF'
import openpyxl, json
path = "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx"
wb = openpyxl.load_workbook(path, data_only=True)
A = wb["Assumptions"]
PF = wb["Pro Forma"]
LS = wb["Loan Sizing"]
AM = wb["Amortization"]
RA = wb["Refi Analysis"]
PP = wb["Prepayment"]
DF = wb["Defeasance"]
RC = wb["Recovery"]
SB = wb["Stress & Break-Even"]
out = {}
out["PF_E28_T12_NOI"] = PF["E28"].value
out["PF_F28_Market_NOI"] = PF["F28"].value
out["PF_G28_Lender_NOI"] = PF["G28"].value
out["PF_G29_haircut_$"] = PF["G29"].value
out["PF_G30_haircut_%"] = PF["G30"].value
out["PF_G31_opex_ratio"] = PF["G31"].value
out["PF_C43_lender_cap"] = PF["C43"].value
out["PF_C44_lender_value"] = PF["C44"].value
out["PF_C45_value_per_unit"] = PF["C45"].value
out["PF_G5_GPR"] = PF["G5"].value
out["PF_G6_vacancy"] = PF["G6"].value
out["PF_G9_other_income"] = PF["G9"].value
out["PF_G11_EGI"] = PF["G11"].value
out["PF_G23_total_opex"] = PF["G23"].value
out["LS_C14_lenderNOI"] = LS["C14"].value
out["LS_C17_DSCR"] = LS["C17"].value
out["LS_C18_debt_yield"] = LS["C18"].value
out["LS_C19_LTV"] = LS["C19"].value
out["LS_C29_supportable_proceeds"] = LS["C29"].value
out["LS_C30_binding_constraint"] = LS["C30"].value
out["LS_C35_surplus_gap"] = LS["C35"].value
out["LS_C36_counter_offer"] = LS["C36"].value
out["LS_C24_27_test_floors"] = [LS[f"C{r}"].value for r in range(24,28)]
out["LS_E24_27_max_loan_by_test"] = [LS[f"E{r}"].value for r in range(24,28)]
out["LS_F24_27_result"] = [LS[f"F{r}"].value for r in range(24,28)]
out["AM_N4_balance_maturity"] = AM["N4"].value
out["AM_N5_WAL"] = AM["N5"].value
out["AM_N6_lender_apr"] = AM["N6"].value
out["RA_C21_NOI_maturity"] = RA["C21"].value
out["RA_C28_stressed_refi_proceeds"] = RA["C28"].value
out["RA_C30_refi_gap"] = RA["C30"].value
out["RA_C29_binding_takeout"] = RA["C29"].value
out["RA_C33_result"] = RA["C33"].value
out["PP_C70_prepay_fee"] = PP["C70"].value
out["PP_C73_payoff"] = PP["C73"].value
out["PP_C77_call_protection_through"] = PP["C77"].value
out["DF_C47_cheaper_route"] = DF["C47"].value
out["DF_C48_savings"] = DF["C48"].value
out["RC_E14_recovery_pct_par_-20"] = RC["E14"].value
out["RC_E16_loss_severity"] = RC["E16"].value
out["SB_C18_NOI_breakeven"] = SB["C18"].value
out["SB_C21_NOI_cushion_pct"] = SB["C21"].value
out["SB_C23_breakeven_occ"] = SB["C23"].value
out["SB_C24_breakeven_rent"] = SB["C24"].value
out["SB_C29_value_decline_breaks_refi"] = SB["C29"].value
out["SB_C31_NOI_decline_breaks_refi"] = SB["C31"].value
out["SB_C32_exit_cap_breaks_refi"] = SB["C32"].value
# integrity checks
checks = {}
for r in range(23,48):
label = A[f"H{r}"].value
val = A[f"I{r}"].value
if label:
checks[f"row{r}"] = (label, val)
out["checks"] = checks
print(json.dumps(out, indent=2, default=str))
EOFA["F38"] = 1776.30 # market rent/unit/month, size-adjusted to subject's 573 sf avg unit
A["F38"] = 2039.57 # market rent/unit/month - zip 92102 studio (0-bed) in-place rent, matching subject's compact 573 sf unit typology
cd /vercel/sandbox && rm -f "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" && cp agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v3_clean.xlsx "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" && python3 output/populate.py && python skills/xlsx/scripts/recalc.py "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" 2>&1 | tail -20
cd /vercel/sandbox && python3 << 'EOF'
import openpyxl, json
path = "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx"
wb = openpyxl.load_workbook(path, data_only=True)
A = wb["Assumptions"]
PF = wb["Pro Forma"]
LS = wb["Loan Sizing"]
AM = wb["Amortization"]
RA = wb["Refi Analysis"]
RC = wb["Recovery"]
SB = wb["Stress & Break-Even"]
DF = wb["Defeasance"]
out = {}
out["PF_G5_GPR"] = PF["G5"].value
out["PF_G11_EGI"] = PF["G11"].value
out["PF_G23_total_opex"] = PF["G23"].value
out["PF_G28_Lender_NOI"] = PF["G28"].value
out["PF_G31_opex_ratio"] = PF["G31"].value
out["PF_C43_lender_cap"] = PF["C43"].value
out["PF_C44_lender_value"] = PF["C44"].value
out["PF_C45_value_per_unit"] = PF["C45"].value
out["LS_C17_DSCR"] = LS["C17"].value
out["LS_C18_debt_yield"] = LS["C18"].value
out["LS_C19_LTV"] = LS["C19"].value
out["LS_C29_supportable_proceeds"] = LS["C29"].value
out["LS_C30_binding_constraint"] = LS["C30"].value
out["LS_C35_surplus_gap"] = LS["C35"].value
out["LS_C36_counter_offer"] = LS["C36"].value
out["LS_E24_27_max_loan_by_test"] = [LS[f"E{r}"].value for r in range(24,28)]
out["LS_F24_27_result"] = [LS[f"F{r}"].value for r in range(24,28)]
out["AM_N4_balance_maturity"] = AM["N4"].value
out["RA_C21_NOI_maturity"] = RA["C21"].value
out["RA_C28_stressed_refi_proceeds"] = RA["C28"].value
out["RA_C30_refi_gap"] = RA["C30"].value
out["RA_C33_result"] = RA["C33"].value
out["RC_E14_recovery_pct_par_-20"] = RC["E14"].value
out["RC_E16_loss_severity"] = RC["E16"].value
out["SB_C18_NOI_breakeven"] = SB["C18"].value
out["SB_C21_NOI_cushion_pct"] = SB["C21"].value
out["SB_C23_breakeven_occ"] = SB["C23"].value
out["SB_C24_breakeven_rent"] = SB["C24"].value
out["DF_C47_cheaper_route"] = DF["C47"].value
checks = {}
for r in range(23,48):
label = A[f"H{r}"].value
val = A[f"I{r}"].value
if label:
checks[f"row{r}"] = (label, val)
out["checks"] = checks
print(json.dumps(out, indent=2, default=str))
EOFcd /vercel/sandbox && python3 << 'EOF'
import openpyxl, json
path = "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx"
wb = openpyxl.load_workbook(path, data_only=True)
LS = wb["Loan Sizing"]
for c in ["C36","C37","C38","C39","C40","C41","C42","C43","C20"]:
print(c, LS[c].value)
AM = wb["Amortization"]
print("N4 balance at maturity", AM["N4"].value)
RA = wb["Refi Analysis"]
print("C19 maturity month", RA["C19"].value, "C20 balance at maturity", RA["C20"].value)
print("C24 stressed rate", RA["C24"].value)
SB = wb["Stress & Break-Even"]
print("stress grid C6:G11")
for r in range(6,12):
print(r, [SB[f"{c}{r}"].value for c in ["B","C","D","E","F","G"]])
EOFcd /vercel/sandbox && python3 << 'EOF'
import openpyxl, json
path = "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx"
wb = openpyxl.load_workbook(path, data_only=True)
A = wb["Assumptions"]
PF = wb["Pro Forma"]
print("Verdict cap C21:", A["C21"].value)
print("PF G30 haircut pct:", PF["G30"].value)
print("PF G26 opex uplift:", PF["G26"].value)
print("PF F31 vacancy floor applied:", A["F31"].value)
print("PF F34 opex ratio applied:", A["F34"].value)
print("Mark to market F43:", A["F43"].value)
print("F42 T12 in place rent:", A["F42"].value)
RC = wb["Recovery"]
for r in range(5,17):
print(r, [RC[f"{c}{r}"].value for c in ["B","C","D","E","F"]])
print("thresholds", [RC[f"C{r}"].value for r in range(20,25)])
EOFcd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" 2>&1 | python3 -c "
import json,sys
d=json.load(sys.stdin)
high=[f for f in d.get('findings',[]) if f.get('severity')=='high']
print('HIGH count:', len(high))
for f in high: print(f['sheet'], f['cell'], f['category'])
"cd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py "output/Buzz Golden Hill_Credit_UW_2026-09-09_v1.xlsx" --json output/integrity.json > /dev/null 2>&1; python3 -c "
import json
d=json.load(open('output/integrity.json'))
high=[f for f in d.get('findings',[]) if f.get('severity')=='high']
print('HIGH count:', len(high))
for f in high: print(f['sheet'], f['cell'], f['category'])
"DECLINE at $9.25MM — the collateral supports about $5.0MM
Buzz Golden Hill's fundamentals cap out well below the ask. This isn't a structuring problem — DSCR runs 0.73x at the requested balance against a 1.35x floor, and no plausible rate or occupancy scenario closes that gap at $9.25MM. The number to work from is the counter-offer.
| Metric | Requested $9.25MM | Supportable $5.01MM |
|---|---|---|
| Lender-case NOI | $482,8771 | $482,877 |
| Lender value | $9,794,658 | $9,794,658 |
| DSCR at proceeds | 0.73x | 1.35x |
| Debt yield at proceeds | 5.22% | 9.64% |
| LTV at proceeds | 94.4% | 51.1% |
| Binding constraint | n/a | DSCR – Amortizing Test |
The ask. Borrower is seeking a $9.25MM non-recourse perm refinance on Buzz Golden Hill — a 36-unit, ~573 sf-average-unit mid-rise at 2995 B St in San Diego's Golden Hill submarket — targeting 65% LTV and an 8.5% debt yield ahead of a maturing fixed-rate loan. No T12 or rent roll was provided at intake, so the lender case is built off datamart benchmarks: a 30-year, no-IO, 10-year structure priced off the current Freddie Mac CME 65%-LTV quote of 5.93% , against a 1.35x DSCR floor pulled from that same product and the borrower's own 8.5% debt-yield target.
Coverage. Lender-case NOI comes to $482,877 — built on a market rent of $2,040/unit/month, the zip 92102 studio (0-bed) in-place rent , since the property's compact unit size matches that typology far better than the zip's blended $2,488 average, which implies an ~800 sf typical unit. Vacancy is floored at 7.46%, the Central San Diego submarket rate (well above the zip's own 1.9%, but that's the field the model calls for), and OpEx floors at 42% of EGI, the higher of the San Diego MSA benchmark (40.5%) and the multifamily class norm . Capitalized at the San Diego multifamily cap rate of 4.93% , that NOI supports a lender value of $9.79MM — which lines up closely with the county's own assessed value of $9.71MM , a good independent check given there's no T12 to reconcile against. At the requested $9.25MM, that's 94% LTV, nowhere near the borrower's 65% target, because the target assumed a $14.2MM valuation the income approach doesn't support. DSCR is what actually binds: 0.73x against the 1.35x floor , and debt yield lands at 5.22% versus the 8.5% target . Supportable proceeds: $5,009,129 — a $4.24MM gap to the ask . Sizing to the DSCR floor instead produces a 9.64% debt yield and 51% LTV — proceeds-only fixes don't touch this; the property simply doesn't throw off enough cash.
Getting out at maturity. Running the requested $9.25MM balance through the schedule (illustrative, since it's not what would actually get funded), the loan amortizes to $7.73MM at year 10 . NOI grows to $588,624 even at a conservative 2%/year, but a takeout lender at that point can only support $6.05MM against the balance — a $1.68MM refi gap that persists a full decade out. Nothing about time cures this loan at this size.
Where it breaks. It doesn't need a shock to break — it's broken at close. NOI would need to run 37% above the lender case just to reach break-even at 1.00x on the requested debt service , which implies occupancy above 112% or rent 22% above the market benchmark — both impossible. Even dropping the rate 100 bps to the current cap rate (4.93%) only lifts DSCR to 0.82x, still underwater.
If it defaults. At the requested balance, recovery runs 73.8% of par at a 20% value decline, with 11.6% loss severity — below the 90% recovery threshold the model flags. That's a secondary concern next to the coverage problem, but it confirms the basis has no cushion at this loan size.
Sponsor & guarantee. No sponsor financials were provided at intake, which caps any approval at "Approve with Structure pending guarantor review" — moot here since the fundamentals independently drive a Decline.
Collateral & market check. San Diego multifamily cap rates have compressed to 4.93%, the tightest reading in the trailing two years , which helps value but can't offset the revenue shortfall. Submarket occupancy has softened to 92.5%, down 227 bps over the trailing 12 months against 7,168 multifamily permits issued in the MSA over the same period — a market adding supply while absorption cools, not the backdrop for underwriting aggressive rent growth. One data flag worth resolving before this goes further: the platform shows a 2021 year-built against your 2016 — worth confirming which is right, though it doesn't move this verdict.
Structure. Given the fundamentals, there's no structural fix that gets to $9.25MM — the counter-offer is the deal:
Bottom line. The gap here isn't a lender being conservative — it's that a 36-unit, ~$2,000/unit-rent micro-studio asset generates about $483K of NOI, and $9.25MM of debt needs roughly double that to clear a 1.35x floor. The single thing most worth doing before shopping this further: pull an actual T12 and rent roll. If in-place rents or occupancy run meaningfully above the market-benchmark proxy used here, the number moves — but it would need to move by 60%+ to reach the $9.25MM ask, which a T12 is unlikely to produce on a 100%-leased 36-unit building already renting at market.
This is a read-only snapshot of a RealAI analysis.