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
for fname in ['balance_sheet.pdf','jll_termsheet.pdf']:
print('=====FILE', fname, '=====')
with pdfplumber.open(fname) 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/build && cat > /vercel/sandbox/build/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()
BLUE = Font(name="Arial", size=10, color="0000FF")
BLACK = Font(name="Arial", size=10, color="000000")
BOLD = Font(name="Arial", size=10, bold=True, color="000000")
HEADER_FONT = Font(name="Arial", size=11, bold=True, color="FFFFFF")
HEADER_FILL = PatternFill("solid", fgColor="1F4E78")
SUB_FILL = PatternFill("solid", fgColor="D9E1F2")
TITLE_FONT = Font(name="Arial", size=14, bold=True, color="1F4E78")
THIN = Side(style="thin", color="BFBFBF")
BORDER = Border(top=THIN, bottom=THIN, left=THIN, right=THIN)
TOPBORDER = Border(top=Side(style="thin", color="000000"))
def style_header(ws, row, col_start, col_end):
for c in range(col_start, col_end+1):
cell = ws.cell(row=row, column=c)
cell.font = HEADER_FONT
cell.fill = HEADER_FILL
cell.alignment = Alignment(horizontal="center", vertical="center")
def set_widths(ws, widths):
for i, w in enumerate(widths, start=1):
ws.column_dimensions[get_column_letter(i)].width = w
# ============ SHEET 1: INPUTS ============
ws = wb.active
ws.title = "Inputs"
set_widths(ws, [38, 18, 18, 18, 18])
ws["A1"] = "Brix on Belleview - Sale vs. Refinance Inputs"
ws["A1"].font = TITLE_FONT
ws.merge_cells("A1:E1")
r = 3
ws.cell(row=r, column=1, value="SALE SCENARIO").font = BOLD
ws.cell(row=r, column=1).fill = SUB_FILL
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=2)
r += 1
ws.cell(row=r, column=1, value="Gross Sale Price"); ws.cell(row=r, column=2, value=23900000).font = BLUE
ws.cell(row=r, column=2).number_format = "$#,##0"
SALE_PRICE = f"Inputs!$B${r}"
r += 1
ws.cell(row=r, column=1, value="Outstanding Debt Balance (Payoff)"); ws.cell(row=r, column=2, value=18558526).font = BLUE
ws.cell(row=r, column=2).number_format = "$#,##0"
DEBT_PAYOFF = f"Inputs!$B${r}"
r += 1
ws.cell(row=r, column=1, value="Brokerage Commission Rate"); ws.cell(row=r, column=2, value=0.0075).font = BLUE
ws.cell(row=r, column=2).number_format = "0.00%"
COMM_RATE = f"Inputs!$B${r}"
r += 2
ws.cell(row=r, column=1, value="REFINANCE SCENARIOS (JLL Term Sheet, dated as of 6/29/2026 index)").font = BOLD
ws.cell(row=r, column=1).fill = SUB_FILL
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=5)
r += 1
headers = ["", "CMBS - Base (5yr Fixed)", "CMBS - Rate Buydown", "Debt Fund (Floating, 3+1+1)"]
for i, h in enumerate(headers):
ws.cell(row=r, column=i+1, value=h).font = BOLD
ws.cell(row=r, column=i+1).fill = SUB_FILL
hdr_row = r
r += 1
rows_data = [
("Total Loan Funding / Gross Proceeds", 18040000, 19170000, 18710000, "$#,##0"),
("Buydown Cost (if applicable)", 0, -383400, 0, "$#,##0"),
("Loan Coupon (Rate)", 0.0679, 0.0639, 0.0640, "0.00%"),
("Interest-Only Period", None, None, None, "text"),
("Amortization", 30, 30, 30, "0\" yr\""),
("Max LTV", 0.75, 0.75, 0.70, "0.0%"),
("Actual LTV", 0.68, 0.72, 0.70, "0.0%"),
("Actual DSCR", 1.04, 0.97, 1.16, "0.00\"x\""),
("Actual Debt Yield", 0.0771, 0.0767, 0.0743, "0.00%"),
("Proceeds Constraint", None, None, None, "text"),
]
text_vals = {
"Interest-Only Period": ("Full Term (5yr)", "Full Term (5yr)", "2yr of 3+1+1 Term"),
"Proceeds Constraint": ("DSCR (1.20x IO min)", "DSCR (1.20x IO min)", "LTV (70% max)"),
}
data_start = r
for label, cmbs, cmbs_bd, df, fmt in rows_data:
ws.cell(row=r, column=1, value=label)
if fmt == "text":
vals = text_vals[label]
for i, v in enumerate(vals):
ws.cell(row=r, column=2+i, value=v).font = BLACK
else:
for i, v in enumerate([cmbs, cmbs_bd, df]):
cell = ws.cell(row=r, column=2+i, value=v)
cell.font = BLUE
cell.number_format = fmt
r += 1
r += 1
ws.cell(row=r, column=1, value="Notes: CMBS proceeds constrained by DSCR (1.20x IO); Debt Fund constrained by LTV (70%). Debt Fund is floating-rate (Term SOFR + 2.75%; current all-in 6.40%) and requires a springing lockbox. Rate buydowns are unavailable on the floating-rate Debt Fund loan per JLL notes.").font = Font(name="Arial", size=9, italic=True, color="595959")
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=5)
ws.row_dimensions[r].height = 30
ws.cell(row=r, column=1).alignment = Alignment(wrap_text=True, vertical="top")
# store cell refs for formulas sheet
refs = {}
for idx, (label, *_rest) in enumerate(rows_data):
refs[label] = data_start + idx
wb.save("/vercel/sandbox/build/brix_belleview_sale_vs_refi.xlsx")
print("inputs done", refs, "SALE_PRICE", SALE_PRICE, "DEBT_PAYOFF", DEBT_PAYOFF, "COMM_RATE", COMM_RATE)
EOF
python3 /vercel/sandbox/build/build_model.pycat > /vercel/sandbox/build/build_model2.py << 'EOF'
import openpyxl
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.utils import get_column_letter
path = "/vercel/sandbox/build/brix_belleview_sale_vs_refi.xlsx"
wb = openpyxl.load_workbook(path)
BLUE = Font(name="Arial", size=10, color="0000FF")
BLACK = Font(name="Arial", size=10, color="000000")
GREEN = Font(name="Arial", size=10, color="008000")
BOLD = Font(name="Arial", size=10, bold=True, color="000000")
HEADER_FONT = Font(name="Arial", size=11, bold=True, color="FFFFFF")
HEADER_FILL = PatternFill("solid", fgColor="1F4E78")
SUB_FILL = PatternFill("solid", fgColor="D9E1F2")
TITLE_FONT = Font(name="Arial", size=14, bold=True, color="1F4E78")
TOTAL_BORDER = Border(top=Side(style="thin", color="000000"))
GOOD_FILL = PatternFill("solid", fgColor="E2EFDA")
BAD_FILL = PatternFill("solid", fgColor="FCE4D6")
def set_widths(ws, widths):
for i, w in enumerate(widths, start=1):
ws.column_dimensions[get_column_letter(i)].width = w
ws = wb.create_sheet("Sale vs Refi Analysis")
set_widths(ws, [36, 20, 20, 20, 20])
ws["A1"] = "Brix on Belleview - Sale vs. Refinance: Net Proceeds Comparison"
ws["A1"].font = TITLE_FONT
ws.merge_cells("A1:E1")
ws["A2"] = "All figures link to Inputs tab; change any blue input to re-run the comparison."
ws["A2"].font = Font(name="Arial", size=9, italic=True, color="595959")
ws.merge_cells("A2:E2")
r = 4
ws.cell(row=r, column=1, value="1) SALE SCENARIO").font = BOLD
ws.cell(row=r, column=1).fill = SUB_FILL
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=2)
r += 1
sale_rows = {}
def add_row(row, label, formula, fmt="$#,##0", font=BLACK, indent=False):
ws.cell(row=row, column=1, value=label)
if indent:
ws.cell(row=row, column=1).alignment = Alignment(indent=1)
c = ws.cell(row=row, column=2, value=formula)
c.number_format = fmt
c.font = font
return row
add_row(r, "Gross Sale Price", "=Inputs!$B$4", font=GREEN); r+=1
add_row(r, "Less: Outstanding Debt Payoff", "=-Inputs!$B$5", font=GREEN); r+=1
add_row(r, "Less: Brokerage Commission (0.75% of Price)", "=-Inputs!$B$4*Inputs!$B$6", font=BLACK); r+=1
sale_net_row = r
ws.cell(row=r, column=1, value="Net Sale Equity to Owner").font = BOLD
c = ws.cell(row=r, column=2, value=f"=SUM(B{r-3}:B{r-1})")
c.number_format = "$#,##0"
c.font = BOLD
for col in (1,2):
ws.cell(row=r, column=col).border = TOTAL_BORDER
r += 2
ws.cell(row=r, column=1, value="2) REFINANCE SCENARIOS - NET CASH TO / (FROM) OWNER AT CLOSING").font = BOLD
ws.cell(row=r, column=1).fill = SUB_FILL
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=4)
r += 1
col_headers_row = r
ws.cell(row=r, column=2, value="CMBS - Base").font = BOLD
ws.cell(row=r, column=3, value="CMBS - Rate Buydown").font = BOLD
ws.cell(row=r, column=4, value="Debt Fund").font = BOLD
for c in (2,3,4):
ws.cell(row=r, column=c).fill = SUB_FILL
ws.cell(row=r, column=c).alignment = Alignment(horizontal="center")
r += 1
# Gross loan proceeds
ws.cell(row=r, column=1, value="Gross Loan Funding")
ws.cell(row=r, column=2, value="=Inputs!$B$10").font = GREEN
ws.cell(row=r, column=3, value="=Inputs!$C$10").font = GREEN
ws.cell(row=r, column=4, value="=Inputs!$D$10").font = GREEN
for c in (2,3,4):
ws.cell(row=r, column=c).number_format = "$#,##0"
r += 1
ws.cell(row=r, column=1, value="Less: Rate Buydown Cost")
ws.cell(row=r, column=2, value="=Inputs!$B$11").font = GREEN
ws.cell(row=r, column=3, value="=Inputs!$C$11").font = GREEN
ws.cell(row=r, column=4, value="=Inputs!$D$11").font = GREEN
for c in (2,3,4):
ws.cell(row=r, column=c).number_format = "$#,##0"
r += 1
net_proceeds_row = r
ws.cell(row=r, column=1, value="Net Loan Proceeds Available").font = BOLD
for c, col in zip((2,3,4), ["B","C","D"]):
cell = ws.cell(row=r, column=c, value=f"=SUM({col}{r-2}:{col}{r-1})")
cell.number_format = "$#,##0"
cell.font = BOLD
cell.border = TOTAL_BORDER
ws.cell(row=r, column=1).border = TOTAL_BORDER
r += 1
ws.cell(row=r, column=1, value="Less: Outstanding Debt Payoff")
for c, col in zip((2,3,4), ["B","C","D"]):
cell = ws.cell(row=r, column=c, value="=-Inputs!$B$5")
cell.number_format = "$#,##0"
cell.font = GREEN
r += 1
net_equity_row = r
ws.cell(row=r, column=1, value="Net Cash Out / (Additional Equity Required)").font = BOLD
for c, col in zip((2,3,4), ["B","C","D"]):
cell = ws.cell(row=r, column=c, value=f"={col}{net_proceeds_row}+{col}{r-1}")
cell.number_format = "$#,##0;($#,##0)"
cell.font = BOLD
cell.border = TOTAL_BORDER
ws.cell(row=r, column=1).border = TOTAL_BORDER
r += 2
ws.cell(row=r, column=1, value="3) SIDE-BY-SIDE LIQUIDITY SUMMARY").font = BOLD
ws.cell(row=r, column=1).fill = SUB_FILL
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=5)
r += 1
summ_hdr = r
for i, h in enumerate(["Scenario", "Net Cash Impact at Closing", "Cash-Out / (Cash-In)", "Ongoing Rate Structure", "Prepayment"]):
ws.cell(row=r, column=i+1, value=h).font = HEADER_FONT
ws.cell(row=r, column=i+1).fill = HEADER_FILL
ws.cell(row=r, column=i+1).alignment = Alignment(horizontal="center", wrap_text=True)
r += 1
ws.row_dimensions[r].height = 15
summary_rows = [
("Sale (net equity)", f"='Sale vs Refi Analysis'!B{sale_net_row}", "Cash-out (full liquidity)", "N/A - full exit", "N/A"),
("Refinance - CMBS (base)", f"='Sale vs Refi Analysis'!B{net_equity_row}", None, "Fixed 6.79%, 5yr Term IO", "Yield Maint., last 90 days open"),
("Refinance - CMBS (rate buydown)", f"='Sale vs Refi Analysis'!C{net_equity_row}", None, "Fixed 6.39% (after buydown), 5yr Term IO", "Yield Maint., last 90 days open"),
("Refinance - Debt Fund", f"='Sale vs Refi Analysis'!D{net_equity_row}", None, "Floating SOFR+2.75% (6.40% all-in), 2yr IO of 3+1+1", "Minimum Interest (soft)"),
]
for label, formula, tag, rate, prepay in summary_rows:
ws.cell(row=r, column=1, value=label).font = BLACK
c = ws.cell(row=r, column=2, value=formula)
c.number_format = "$#,##0;($#,##0)"
c.font = GREEN
ws.cell(row=r, column=3, value=f'=IF(B{r}>=0,"Cash-Out","Cash-In Required")')
ws.cell(row=r, column=4, value=rate).alignment = Alignment(wrap_text=True)
ws.cell(row=r, column=5, value=prepay).alignment = Alignment(wrap_text=True)
r += 1
ws.row_dimensions[col_headers_row].height = 15
set_widths(ws, [38, 20, 20, 30, 26])
wb.save(path)
print("sheet2 done", sale_net_row, net_proceeds_row, net_equity_row, summ_hdr)
EOF
python3 /vercel/sandbox/build/build_model2.pyNow let's recalc and run the integrity scan.
cd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py build/brix_belleview_sale_vs_refi.xlsx; echo "EXIT: $?"
cat > /vercel/sandbox/build/fix_model.py << 'EOF'
import openpyxl
from openpyxl.styles import Font, Alignment
from openpyxl.utils import get_column_letter
path = "/vercel/sandbox/build/brix_belleview_sale_vs_refi.xlsx"
wb = openpyxl.load_workbook(path)
# Fix label/link mismatches: rename summary labels to match target metric name
ws2 = wb["Sale vs Refi Analysis"]
label_map = {
21: "CMBS (base) - Net Cash Out / (Additional Equity Required)",
22: "CMBS (rate buydown) - Net Cash Out / (Additional Equity Required)",
23: "Debt Fund - Net Cash Out / (Additional Equity Required)",
}
for row, lab in label_map.items():
ws2.cell(row=row, column=1, value=lab)
ws2.column_dimensions["A"].width = 46
# Fix Inputs narrow column B9 (Brokerage Commission Rate label sits in A9, value B9 fine) actually flagged B9 content length 23 -> widen col B
ws1 = wb["Inputs"]
ws1.column_dimensions["B"].width = 24
ws1.column_dimensions["C"].width = 22
ws1.column_dimensions["D"].width = 22
ws1.column_dimensions["E"].width = 22
# Normalize fonts: set every cell with a value to Arial 10 unless it's a designated header/title (already Arial). Fix Calibri defaults from openpyxl (default font may be Calibri 11 on some blank/default cells)
for ws in (ws1, ws2):
for row in ws.iter_rows():
for cell in row:
if cell.value is not None:
f = cell.font
if f.name != "Arial":
is_title = f.size and f.size >= 14
is_header = f.color and f.color.rgb == "00FFFFFF"
newsize = f.size if f.size else 10
cell.font = Font(name="Arial", size=newsize, bold=f.bold, italic=f.italic, color=f.color)
wb.save(path)
print("fixed")
EOF
python3 /vercel/sandbox/build/fix_model.py
cd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py build/brix_belleview_sale_vs_refi.xlsx; echo "EXIT: $?"Gate passes (0 HIGH). Remaining are advisory (title merges are fine per convention). Now recalc to get final values.
cd /vercel/sandbox && python skills/xlsx/scripts/recalc.py build/brix_belleview_sale_vs_refi.xlsx
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('build/brix_belleview_sale_vs_refi.xlsx', data_only=True)
ws = wb['Sale vs Refi Analysis']
for r in range(1,24):
vals = [ws.cell(row=r,column=c).value for c in range(1,6)]
print(r, vals)
"
Numbers check out. Now save to library, present, and write the response.
Sale wins on liquidity — refinance leaves cash on the table at best, and requires new equity at worst.
| Scenario | Gross Proceeds/Funding | Less Debt Payoff | Less Transaction Cost | Net Cash to/(from) Owner | Cash-Out or Cash-In |
|---|---|---|---|---|---|
| Sale | $23,900,0001 | ($18,558,526) | ($179,250) | $5,162,224 | Cash-Out |
| CMBS (Base) | $18,040,0001 | ($18,558,526) | $0 | ($518,526) | Cash-In Required |
| CMBS (Rate Buydown) | $19,170,0001 | ($18,558,526) | ($383,400) | $228,074 | Cash-Out |
| Debt Fund | $18,710,0001 | ($18,558,526) | $0 | $151,474 | Cash-Out |
The sale nets $5.16M in cash — $23.9M price, less the $18,558,526 payoff, less $179,250 brokerage (0.75%) . Nothing else comes close on near-term liquidity, since that's your stated objective.
Neither refinance option generates real liquidity, and one requires you to write a check:
Since you have no structural preference, the liquidity math should decide it: CMBS-with-buydown edges out the Debt Fund by ~$77K in cash-out, but that's a rounding error next to the risk and rate profile differences:
Bottom line for a liquidity-first mandate: the sale is the only path that actually frees $5.16M. If you refinance instead, CMBS-with-buydown and the Debt Fund both leave you roughly flat to slightly cash-positive at closing — call it a wash on day-one dollars — so the decision comes down to whether you want fixed-rate certainty and a clean 5-year hold (CMBS) or a smaller cash-out with floating-rate exposure and a lockbox (Debt Fund). Neither refinance option is a liquidity event; both are closer to "keep the asset and touch up the capital stack."
This is a read-only snapshot of a RealAI analysis.