Provide a sale vs. refinance analysis for Brix on Belleview, calculating net equity for a sale at $23,900,000 with an $18,558,526 outstanding debt balance and 0.75% brokerage commission, and net additional equity required under both the CMBS and Debt Fund scenarios from the attached JLL term sheet. My primary objective in evaluating these options is maximizing near-term liquidity and my preference between the refinance structures is no preference — show me the numbers. Summarize the net proceeds or equity delta for each scenario side by side and flag any material differences in execution risk, reserves, or cash-out constraints between the two refinance options.
cd /vercel/sandbox && python3 -c "
import pdfplumber
with pdfplumber.open('jll_termsheet.pdf') as pdf:
print('PAGES:', len(pdf.pages))
for i, page in enumerate(pdf.pages, start=1):
text = page.extract_text() or ''
print(f'=== PAGE {i} ===')
print(text)
"
cd /vercel/sandbox && python3 -c "
import pdfplumber
with pdfplumber.open('balance_sheet.pdf') as pdf:
print('PAGES:', len(pdf.pages))
for i, page in enumerate(pdf.pages, start=1):
text = page.extract_text() or ''
print(f'=== PAGE {i} ===')
print(text)
"
mkdir -p /vercel/sandbox/output && cat > /vercel/sandbox/build_model.py << 'EOF'
import openpyxl
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
wb = Workbook()
ws = wb.active
ws.title = "Sale vs Refi"
FONT = "Arial"
BLUE = Font(name=FONT, color="0000FF")
BLACK = Font(name=FONT, color="000000")
BOLD = Font(name=FONT, bold=True)
BOLDBLUE = Font(name=FONT, bold=True, color="0000FF")
TITLE = Font(name=FONT, bold=True, size=14)
HEAD = Font(name=FONT, bold=True, color="FFFFFF")
HEADFILL = PatternFill("solid", fgColor="1F4E78")
SUBFILL = PatternFill("solid", fgColor="D9E1F2")
TOTFONT = Font(name=FONT, bold=True)
TOPBORDER = Border(top=Side(style="thin"))
def setcell(cell, value, font=BLACK, fmt=None, fill=None, align=None, border=None):
cell.value = value
cell.font = font
if fmt: cell.number_format = fmt
if fill: cell.fill = fill
if align: cell.alignment = align
if border: cell.border = border
USD0 = '$#,##0;($#,##0);"-"'
PCT2 = '0.00%'
PCT1 = '0.0%'
MULT = '0.00x'
ws.column_dimensions['A'].width = 42
ws.column_dimensions['B'].width = 18
ws.column_dimensions['C'].width = 18
ws.column_dimensions['D'].width = 18
ws.column_dimensions['E'].width = 40
r = 1
ws.merge_cells(f'A{r}:E{r}')
setcell(ws[f'A{r}'], "Brix on Belleview — Sale vs. Refinance Analysis", TITLE)
r += 1
setcell(ws[f'A{r}'], "183 units | Englewood, CO | Existing debt payoff basis: borrower-provided balance", Font(name=FONT, italic=True, size=9))
r += 2
# ---------------- INPUTS ----------------
setcell(ws[f'A{r}'], "INPUTS", HEAD, fill=HEADFILL); ws.merge_cells(f'A{r}:E{r}')
r += 1
row_labels = [
("Sale Price", 23900000, USD0, "Per user"),
("Outstanding Debt Balance (payoff)", 18558526, USD0, "Per user"),
("Brokerage Commission (%)", 0.0075, PCT2, "Per user"),
("Lender Escrow/Impound Release (est.)", 415922.15, USD0, "Balance sheet 5/31/26: Tax impound $224,993.69 + Insurance impound $148,725.82 + Reserve escrow $42,202.64"),
("New Lender Reserve Funding Req'd (est. min)", 54900, USD0, "$300/unit x 183 units per JLL term sheet; PCA may require $350-400/unit"),
("CMBS Total Funding (Loan Proceeds)", 18040000, USD0, "JLL term sheet, CMBS Option 1, 5yr Full-Term IO"),
("CMBS Actual DSCR", 1.04, MULT, "JLL term sheet (Min DSCR 1.20x IO)"),
("CMBS Actual LTV", 0.68, PCT1, "JLL term sheet (Max LTV 75%)"),
("CMBS Actual Debt Yield", 0.0771, PCT2, "JLL term sheet"),
("Debt Fund Total Funding (Loan Proceeds)", 18710000, USD0, "JLL term sheet, 3+1+1 Floating, 2yr IO"),
("Debt Fund Actual DSCR", 1.16, MULT, "JLL term sheet (Min DSCR 1.00x IO)"),
("Debt Fund Actual LTV", 0.70, PCT1, "JLL term sheet (Max LTV 70.0%)"),
("Debt Fund Actual Debt Yield", 0.0743, PCT2, "JLL term sheet (Exit Debt Yield 7.00%)"),
]
input_rows = {}
for label, val, fmt, src in row_labels:
setcell(ws[f'A{r}'], label, BLACK)
setcell(ws[f'B{r}'], val, BLUE, fmt)
setcell(ws[f'E{r}'], src, Font(name=FONT, italic=True, size=9, color="808080"))
input_rows[label] = r
r += 1
r += 1
SALE_PRICE = f"$B${input_rows['Sale Price']}"
DEBT_BAL = f"$B${input_rows['Outstanding Debt Balance (payoff)']}"
COMM_PCT = f"$B${input_rows['Brokerage Commission (%)']}"
ESCROW = f"$B${input_rows['Lender Escrow/Impound Release (est.)']}"
RESERVE_FUND = f"$B${input_rows['New Lender Reserve Funding Req\\'d (est. min)']}"
CMBS_PROCEEDS = f"$B${input_rows['CMBS Total Funding (Loan Proceeds)']}"
DF_PROCEEDS = f"$B${input_rows['Debt Fund Total Funding (Loan Proceeds)']}"
# ---------------- SALE SCENARIO ----------------
setcell(ws[f'A{r}'], "SCENARIO 1: SALE AT $23,900,000", HEAD, fill=HEADFILL); ws.merge_cells(f'A{r}:E{r}')
r += 1
sale_start = r
setcell(ws[f'A{r}'], "Gross Sale Price"); setcell(ws[f'B{r}'], f"={SALE_PRICE}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Less: Brokerage Commission (0.75%)"); setcell(ws[f'B{r}'], f"=-{SALE_PRICE}*{COMM_PCT}", BLACK, USD0)
comm_row = r
r += 1
setcell(ws[f'A{r}'], "Less: Payoff of Outstanding Debt"); setcell(ws[f'B{r}'], f"=-{DEBT_BAL}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Plus: Return of Lender Escrow/Impounds (est.)"); setcell(ws[f'B{r}'], f"={ESCROW}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET SALE PROCEEDS TO BORROWER", TOTFONT);
sale_net_row = r
setcell(ws[f'B{r}'], f"=SUM(B{sale_start}:B{r-1})", TOTFONT, USD0, border=TOPBORDER)
ws[f'A{r}'].border = TOPBORDER
r += 2
# ---------------- CMBS REFI ----------------
setcell(ws[f'A{r}'], "SCENARIO 2: REFINANCE — CMBS (5yr Full-Term IO, Fixed)", HEAD, fill=HEADFILL); ws.merge_cells(f'A{r}:E{r}')
r += 1
cmbs_start = r
setcell(ws[f'A{r}'], "New Loan Proceeds (Total Funding)"); setcell(ws[f'B{r}'], f"={CMBS_PROCEEDS}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Plus: Return of Lender Escrow/Impounds (est.)"); setcell(ws[f'B{r}'], f"={ESCROW}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Less: Payoff of Outstanding Debt"); setcell(ws[f'B{r}'], f"=-{DEBT_BAL}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Less: New Lender Reserve Funding Req'd (est. min)"); setcell(ws[f'B{r}'], f"=-{RESERVE_FUND}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET CASH TO / (ADDITIONAL EQUITY FROM) BORROWER", TOTFONT)
cmbs_net_row = r
setcell(ws[f'B{r}'], f"=SUM(B{cmbs_start}:B{r-1})", TOTFONT, USD0, border=TOPBORDER)
ws[f'A{r}'].border = TOPBORDER
r += 1
setcell(ws[f'A{r}'], "Memo: excludes lender legal/closing fees & rate buydown cost (not itemized in term sheet)", Font(name=FONT, italic=True, size=9, color="808080"))
r += 2
# ---------------- DEBT FUND REFI ----------------
setcell(ws[f'A{r}'], "SCENARIO 3: REFINANCE — DEBT FUND (3+1+1 Floating, 2yr IO)", HEAD, fill=HEADFILL); ws.merge_cells(f'A{r}:E{r}')
r += 1
df_start = r
setcell(ws[f'A{r}'], "New Loan Proceeds (Total Funding)"); setcell(ws[f'B{r}'], f"={DF_PROCEEDS}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Plus: Return of Lender Escrow/Impounds (est.)"); setcell(ws[f'B{r}'], f"={ESCROW}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Less: Payoff of Outstanding Debt"); setcell(ws[f'B{r}'], f"=-{DEBT_BAL}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "Less: New Lender Reserve Funding Req'd (est. min)"); setcell(ws[f'B{r}'], f"=-{RESERVE_FUND}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET CASH TO / (ADDITIONAL EQUITY FROM) BORROWER", TOTFONT)
df_net_row = r
setcell(ws[f'B{r}'], f"=SUM(B{df_start}:B{r-1})", TOTFONT, USD0, border=TOPBORDER)
ws[f'A{r}'].border = TOPBORDER
r += 1
setcell(ws[f'A{r}'], "Memo: excludes lender legal/closing/origination fees (not itemized in term sheet); floating-rate exposure", Font(name=FONT, italic=True, size=9, color="808080"))
r += 2
# ---------------- SIDE BY SIDE SUMMARY ----------------
setcell(ws[f'A{r}'], "SIDE-BY-SIDE SUMMARY", HEAD, fill=HEADFILL); ws.merge_cells(f'A{r}:D{r}')
r += 1
hdr_row = r
setcell(ws[f'A{r}'], "Metric", BOLD, fill=SUBFILL)
setcell(ws[f'B{r}'], "Sale", BOLD, fill=SUBFILL, align=Alignment(horizontal="center"))
setcell(ws[f'C{r}'], "CMBS Refi", BOLD, fill=SUBFILL, align=Alignment(horizontal="center"))
setcell(ws[f'D{r}'], "Debt Fund Refi", BOLD, fill=SUBFILL, align=Alignment(horizontal="center"))
r += 1
setcell(ws[f'A{r}'], "Net Cash / Equity Impact at Closing")
setcell(ws[f'B{r}'], f"=B{sale_net_row}", BLACK, USD0)
setcell(ws[f'C{r}'], f"=B{cmbs_net_row}", BLACK, USD0)
setcell(ws[f'D{r}'], f"=B{df_net_row}", BLACK, USD0)
summary_net_row = r
r += 1
setcell(ws[f'A{r}'], "DSCR")
setcell(ws[f'B{r}'], "n/a", BLACK)
setcell(ws[f'C{r}'], f"={input_rows['CMBS Actual DSCR']and '$B$'+str(input_rows['CMBS Actual DSCR'])}", BLACK, MULT)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual DSCR']}", BLACK, MULT)
r += 1
setcell(ws[f'A{r}'], "LTV")
setcell(ws[f'B{r}'], "n/a", BLACK)
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual LTV']}", BLACK, PCT1)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual LTV']}", BLACK, PCT1)
r += 1
setcell(ws[f'A{r}'], "Debt Yield")
setcell(ws[f'B{r}'], "n/a", BLACK)
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual Debt Yield']}", BLACK, PCT2)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual Debt Yield']}", BLACK, PCT2)
r += 2
# Freeze panes and font default
ws.freeze_panes = "A5"
for row in ws.iter_rows():
for c in row:
if c.font is None or c.font.name != FONT:
c.font = Font(name=FONT, bold=c.font.bold if c.font else False, italic=c.font.italic if c.font else False, color=c.font.color if c.font else None, size=c.font.size if c.font else 11)
wb.save("/vercel/sandbox/output/Brix_on_Belleview_Sale_vs_Refi.xlsx")
print("saved")
print("rows:", dict(sale_net_row=sale_net_row, cmbs_net_row=cmbs_net_row, df_net_row=df_net_row, hdr_row=hdr_row, summary_net_row=summary_net_row))
EOF
python3 /vercel/sandbox/build_model.py ("New Lender Reserve Funding Req'd (est. min)", 54900, USD0, "$300/unit x 183 units per JLL term sheet; PCA may require $350-400/unit"), ("New Lender Reserve Funding Required (est. min)", 54900, USD0, "$300/unit x 183 units per JLL term sheet; PCA may require $350-400/unit"),RESERVE_FUND = f"$B${input_rows['New Lender Reserve Funding Req\\'d (est. min)']}"RESERVE_FUND = f"$B${input_rows['New Lender Reserve Funding Required (est. min)']}"setcell(ws[f'A{r}'], "Less: New Lender Reserve Funding Req'd (est. min)"); setcell(ws[f'B{r}'], f"=-{RESERVE_FUND}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET CASH TO / (ADDITIONAL EQUITY FROM) BORROWER", TOTFONT)
cmbs_net_row = rsetcell(ws[f'A{r}'], "Less: New Lender Reserve Funding Required (est. min)"); setcell(ws[f'B{r}'], f"=-{RESERVE_FUND}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET CASH TO / (ADDITIONAL EQUITY FROM) BORROWER", TOTFONT)
cmbs_net_row = rsetcell(ws[f'A{r}'], "Less: New Lender Reserve Funding Req'd (est. min)"); setcell(ws[f'B{r}'], f"=-{RESERVE_FUND}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET CASH TO / (ADDITIONAL EQUITY FROM) BORROWER", TOTFONT)
df_net_row = rsetcell(ws[f'A{r}'], "Less: New Lender Reserve Funding Required (est. min)"); setcell(ws[f'B{r}'], f"=-{RESERVE_FUND}", BLACK, USD0)
r += 1
setcell(ws[f'A{r}'], "NET CASH TO / (ADDITIONAL EQUITY FROM) BORROWER", TOTFONT)
df_net_row = rsetcell(ws[f'C{r}'], f"={input_rows['CMBS Actual DSCR']and '$B$'+str(input_rows['CMBS Actual DSCR'])}", BLACK, MULT)setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual DSCR']}", BLACK, MULT)cd /vercel/sandbox && python3 build_model.py
cd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py output/Brix_on_Belleview_Sale_vs_Refi.xlsx && python skills/xlsx/scripts/recalc.py output/Brix_on_Belleview_Sale_vs_Refi.xlsx
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('output/Brix_on_Belleview_Sale_vs_Refi.xlsx')
ws = wb.active
for r in range(43, 48):
print(r, [ws.cell(r,c).value for c in range(1,5)])
"
setcell(ws[f'A{r}'], "DSCR")
setcell(ws[f'B{r}'], "n/a", BLACK)
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual DSCR']}", BLACK, MULT)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual DSCR']}", BLACK, MULT)
r += 1
setcell(ws[f'A{r}'], "LTV")
setcell(ws[f'B{r}'], "n/a", BLACK)
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual LTV']}", BLACK, PCT1)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual LTV']}", BLACK, PCT1)
r += 1
setcell(ws[f'A{r}'], "Debt Yield")
setcell(ws[f'B{r}'], "n/a", BLACK)
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual Debt Yield']}", BLACK, PCT2)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual Debt Yield']}", BLACK, PCT2)
r += 2setcell(ws[f'A{r}'], "DSCR (not applicable to a sale)")
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual DSCR']}", BLACK, MULT)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual DSCR']}", BLACK, MULT)
r += 1
setcell(ws[f'A{r}'], "LTV (not applicable to a sale)")
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual LTV']}", BLACK, PCT1)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual LTV']}", BLACK, PCT1)
r += 1
setcell(ws[f'A{r}'], "Debt Yield (not applicable to a sale)")
setcell(ws[f'C{r}'], f"=$B${input_rows['CMBS Actual Debt Yield']}", BLACK, PCT2)
setcell(ws[f'D{r}'], f"=$B${input_rows['Debt Fund Actual Debt Yield']}", BLACK, PCT2)
r += 2Now fixing the em-dashes and merged cells / narrow column issues:
cd /vercel/sandbox && sed -i \ -e 's/Sale vs\. Refinance Analysis/Sale vs Refinance Analysis/' \ -e 's/REFINANCE — CMBS/REFINANCE - CMBS/' \ -e 's/REFINANCE — DEBT FUND/REFINANCE - DEBT FUND/' \ build_model.py grep -n "—" build_model.py
setcell(ws[f'A{r}'], "Brix on Belleview — Sale vs Refinance Analysis", TITLE)setcell(ws[f'A{r}'], "Brix on Belleview - Sale vs Refinance Analysis", TITLE)ws.column_dimensions['A'].width = 42
ws.column_dimensions['A'].width = 54
cd /vercel/sandbox && python3 build_model.py && python skills/xlsx/scripts/workbook_integrity_scan.py output/Brix_on_Belleview_Sale_vs_Refi.xlsx && python skills/xlsx/scripts/recalc.py output/Brix_on_Belleview_Sale_vs_Refi.xlsx
Gate passes, zero errors. Now read back recalculated values for citations.
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('output/Brix_on_Belleview_Sale_vs_Refi.xlsx', data_only=True)
ws = wb.active
for r in range(1, 48):
row = [ws.cell(r,c).value for c in range(1,5)]
if any(v is not None for v in row):
print(r, row)
"
Numbers confirmed. Now save and present the workbook, then write the response.
Sale delivers roughly $5.6M of day-one liquidity; the Debt Fund refi nets ~$512K cash-out; the CMBS refi requires you to write a check.
| Metric | Sale | CMBS Refi (5yr Full-Term IO) | Debt Fund Refi (3+1+1 Floating) |
|---|---|---|---|
| Gross Proceeds / Loan Amount | $23,900,000 | $18,040,000 | $18,710,000 |
| Less Brokerage Commission | -$179,250 | n/a | n/a |
| Less Debt Payoff | -$18,558,526 | -$18,558,526 | -$18,558,526 |
| Plus Escrow/Impound Release | +$415,9221 | +$415,9221 | +$415,9221 |
| Less New Reserve Funding | n/a | -$54,9001 | -$54,9001 |
| Net Cash Impact | $5,578,146 | -$157,504 | $512,496 |
| DSCR | n/a | 1.04x | 1.16x |
| LTV | n/a | 68% | 70% |
| Debt Yield | n/a | 7.71% | 7.43% |
On pure near-term liquidity, the sale is not close: it clears $5.58M to you versus a $512K cash-out on the Debt Fund refi or a $158K equity call on CMBS . The sale price covers the $18,558,526 payoff with $5,162,224 left over after the 0.75% ($179,250) commission , and you also get back the ~$415,922 of lender-held tax, insurance, and reserve impounds sitting on the books as of May — that escrow release applies to all three paths since payoff triggers it regardless of exit route.
Between the two refis, the numbers land close but on opposite sides of zero — and that's before financing costs neither term sheet itemizes:
One live option that doesn't clear the bar: CMBS offers a rate buydown to 5.03% for $344,200, netting $18,786,600 — better proceeds than the base CMBS deal — but it drives DSCR to 0.97x, under the 1.20x IO floor and under 1.0x outright . That's not a structure a CMBS lender closes; treat it as off the table rather than a fourth column.
Execution risk, unglossed: the sale is priced and done in one transaction — no lender re-underwrite, no rate lock risk, no floating-rate exposure — but it's the only path that gives up the asset. The Debt Fund route is a floating structure with a 7.00% exit debt yield test and 9.67% stabilized debt yield hurdle baked in, meaning refinancing or exiting that loan later requires NOI growth the in-place numbers don't yet support. CMBS carries defeasance (not simple prepay) with a 1-year lockout , so it's the stickiest structure if your horizon is short. Both refi quotes are explicitly subject to formal approval and an acceptable refinance test — neither is committed capital the way a signed PSA would be.
If near-term liquidity is truly the objective and you have no strategic reason to hold, the sale outdistances both refis by roughly $5.1M-$5.7M of immediate cash. If you're keeping the asset, Debt Fund is the liquidity-maximizing refi of the two — CMBS trades cash today for coverage cushion you didn't ask for.
This is a read-only snapshot of a RealAI analysis.