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_term_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)
"
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 output
import openpyxl
from openpyxl.styles import Font, Alignment, PatternFill, Border, Side
from openpyxl.utils import get_column_letter
wb = openpyxl.Workbook()
ws = wb.active
ws.title = "Sale vs Refi"
FONT = "Arial"
BLUE = Font(name=FONT, size=10, color="0000FF")
BLACK = Font(name=FONT, size=10, color="000000")
BOLD = Font(name=FONT, size=10, bold=True, color="000000")
HEADER_FONT = Font(name=FONT, size=11, bold=True, color="FFFFFF")
TITLE_FONT = Font(name=FONT, size=14, bold=True, color="000000")
SUBTITLE_FONT = Font(name=FONT, size=10, italic=True, color="595959")
HEADER_FILL = PatternFill(start_color="1F4E78", end_color="1F4E78", fill_type="solid")
SUBHEADER_FILL = PatternFill(start_color="D9E1F2", end_color="D9E1F2", fill_type="solid")
TOTAL_BORDER = Border(top=Side(style="thin"))
CUR = '$#,##0;($#,##0);"-"'
PCT = '0.00%'
def set_col_widths(widths):
for i, w in enumerate(widths, start=1):
ws.column_dimensions[get_column_letter(i)].width = w
set_col_widths([40, 18, 18, 18, 4])
r = 1
ws.cell(r, 1, "Brix on Belleview — Sale vs. Refinance Analysis").font = TITLE_FONT
r += 1
ws.cell(r, 1, "Englewood, CO | Source: JLL Quote Matrix UW dated 6.30.2026; Brix on Belleview Balance Sheet, Period = May 2026 (Cash Book)").font = SUBTITLE_FONT
r += 2
# ---------------- INPUTS ----------------
ws.cell(r, 1, "KEY INPUTS").font = BOLD
r += 1
input_row_start = r
inputs = [
("Gross Sale Price", 23900000, CUR),
("Outstanding Debt Balance (payoff)", 18558526, CUR),
("Brokerage Commission (% of Sale Price)", 0.0075, PCT),
("Escrow / Lender Impound Release at Payoff", None, CUR), # formula below
(" Lender Impounds - Property Taxes", 224993.69, CUR),
(" Lender Impounds - Insurance", 148725.82, CUR),
(" Escrow - Reserve", 42202.64, CUR),
("CMBS Total Loan Funding (no rate buydown)", 18040000, CUR),
("CMBS Net Proceeds w/ Rate Buydown (optional)", 18786600, CUR),
("Debt Fund Total Loan Funding", 18710000, CUR),
("Est. Reserve Forward-Funding at Closing ($300/unit x 183 units, 1-yr)", 54900, CUR),
]
labels_rows = {}
for label, val, fmt in inputs:
ws.cell(r, 1, label).font = BLACK if label.startswith(" ") else BLACK
c = ws.cell(r, 2)
if val is not None:
c.value = val
c.font = BLUE
c.number_format = fmt
labels_rows[label.strip()] = r
r += 1
# Escrow release = sum of three impound lines
escrow_release_row = labels_rows["Escrow / Lender Impound Release at Payoff"]
tax_row = labels_rows["Lender Impounds - Property Taxes"]
ins_row = labels_rows["Lender Impounds - Insurance"]
esc_row = labels_rows["Escrow - Reserve"]
ws.cell(escrow_release_row, 2).value = f"=SUM(B{tax_row}:B{esc_row})"
ws.cell(escrow_release_row, 2).font = BLACK
sale_price_row = labels_rows["Gross Sale Price"]
debt_row = labels_rows["Outstanding Debt Balance (payoff)"]
comm_pct_row = labels_rows["Brokerage Commission (% of Sale Price)"]
cmbs_base_row = labels_rows["CMBS Total Loan Funding (no rate buydown)"]
cmbs_buydown_row = labels_rows["CMBS Net Proceeds w/ Rate Buydown (optional)"]
debtfund_row = labels_rows["Debt Fund Total Loan Funding"]
reserve_row = labels_rows["Est. Reserve Forward-Funding at Closing ($300/unit x 183 units, 1-yr)"]
r += 1
# ---------------- SCENARIO TABLE ----------------
ws.cell(r, 1, "SCENARIO COMPARISON").font = BOLD
r += 1
header_row = r
headers = ["", "Sale", "Refi - CMBS (base)", "Refi - CMBS (rate buydown)", "Refi - Debt Fund"]
for i, h in enumerate(headers, start=1):
c = ws.cell(header_row, i, h)
c.font = HEADER_FONT
c.fill = HEADER_FILL
c.alignment = Alignment(horizontal="center")
r += 1
col_map = {"Sale": 2, "CMBS_base": 3, "CMBS_buy": 4, "DebtFund": 5}
def label_cell(row, text, bold=False):
c = ws.cell(row, 1, text)
c.font = BOLD if bold else BLACK
# Row: Gross proceeds / new loan funding
row_gross = r
label_cell(row_gross, "Gross Sale Price / New Loan Funding")
ws.cell(row_gross, col_map["Sale"], f"=B{sale_price_row}").number_format = CUR
ws.cell(row_gross, col_map["CMBS_base"], f"=B{cmbs_base_row}").number_format = CUR
ws.cell(row_gross, col_map["CMBS_buy"], f"=B{cmbs_buydown_row}").number_format = CUR
ws.cell(row_gross, col_map["DebtFund"], f"=B{debtfund_row}").number_format = CUR
for c in range(2, 6):
ws.cell(row_gross, c).font = BLACK
r += 1
row_comm = r
label_cell(row_comm, "Less: Brokerage Commission (0.75%)")
ws.cell(row_comm, col_map["Sale"], f"=-B{sale_price_row}*B{comm_pct_row}").number_format = CUR
ws.cell(row_comm, col_map["Sale"]).font = BLACK
r += 1
row_reserve = r
label_cell(row_reserve, "Less: Est. Reserve Forward-Funding at Closing")
ws.cell(row_reserve, col_map["CMBS_base"], f"=-B{reserve_row}").number_format = CUR
ws.cell(row_reserve, col_map["CMBS_buy"], f"=-B{reserve_row}").number_format = CUR
ws.cell(row_reserve, col_map["DebtFund"], f"=-B{reserve_row}").number_format = CUR
for c in [col_map["CMBS_base"], col_map["CMBS_buy"], col_map["DebtFund"]]:
ws.cell(row_reserve, c).font = BLACK
r += 1
row_payoff = r
label_cell(row_payoff, "Less: Outstanding Debt Payoff")
for key in ["Sale", "CMBS_base", "CMBS_buy", "DebtFund"]:
ws.cell(row_payoff, col_map[key], f"=-B{debt_row}").number_format = CUR
ws.cell(row_payoff, col_map[key]).font = BLACK
r += 1
row_escrow = r
label_cell(row_escrow, "Plus: Escrow / Lender Impound Release")
ws.cell(row_escrow, col_map["Sale"], f"=B{escrow_release_row}").number_format = CUR
ws.cell(row_escrow, col_map["Sale"]).font = BLACK
r += 1
row_net = r
label_cell(row_net, "NET SALE PROCEEDS / NET CASH TO (FROM) SPONSOR", bold=True)
for key in ["Sale", "CMBS_base", "CMBS_buy", "DebtFund"]:
col = col_map[key]
colL = get_column_letter(col)
ws.cell(row_net, col, f"=SUM({colL}{row_gross}:{colL}{row_escrow})")
cc = ws.cell(row_net, col)
cc.number_format = CUR
cc.font = BOLD
cc.border = TOTAL_BORDER
ws.cell(row_net, 1).border = TOTAL_BORDER
r += 2
row_label2 = r
label_cell(row_label2, "Read: Sale = net equity realized. Refi = net cash out to (equity required from) sponsor at closing.", )
ws.cell(row_label2, 1).font = Font(name=FONT, size=9, italic=True, color="595959")
r += 2
# ---------------- KEY METRICS FROM TERM SHEET ----------------
ws.cell(r, 1, "REFI EXECUTION METRICS (JLL Quote Matrix, 6.30.2026)").font = BOLD
r += 1
metric_header_row = r
mh = ["Metric", "CMBS", "Debt Fund"]
for i, h in enumerate(mh, start=1):
c = ws.cell(metric_header_row, i, h)
c.font = HEADER_FONT
c.fill = HEADER_FILL
r += 1
metrics = [
("Rate Type", "Fixed", "Floating (Term SOFR + spread)"),
("Interest-Only Period", "Full Term", "2 yrs (of 3+1+1 term)"),
("Coupon (as of 6/29/2026)", "6.79%", "6.40%"),
("Spread", "2.65%", "2.75%"),
("Index Floor", "N/A", "0.10%"),
("Max LTV", "75%", "70%"),
("Actual LTV", "68%", "70%"),
("Min DSCR Covenant", "1.20x IO", "1.00x IO"),
("Actual (Underwritten) DSCR", "1.04x IO", "1.16x IO"),
("Proceeds Constraint", "DSCR", "LTV"),
("Min In-Place Debt Yield", "7.00%", "6.50%"),
("Exit / Stabilized Debt Yield Test", "N/A", "7.00% exit / 9.67% stabilized"),
("Prepayment", "1yr lockout, then defeasance 12-18mo, then min. interest", "Term structure 3+1+1; cash mgmt per lockbox"),
("Cash Management", "Standard", "Springing lockbox required"),
("Rate Buydown Available", "Yes (max ~3% upfront)", "No (unavailable on floating-rate loans)"),
]
for label, cmbs_v, df_v in metrics:
ws.cell(r, 1, label).font = BLACK
ws.cell(r, 2, cmbs_v).font = BLACK
ws.cell(r, 3, df_v).font = BLACK
r += 1
r += 1
ws.cell(r, 1, "Notes:").font = BOLD
r += 1
notes = [
"1) All refinance terms per JLL Quote Matrix Underwriting dated 6.30.2026, indicative and subject to formal lender approval/quotes; not locked until day of closing.",
"2) Sale commission assumed at 0.75% of gross sale price per user input; no other transaction costs (title, transfer tax, legal) included.",
"3) Escrow/lender impound release assumes existing tax, insurance, and reserve escrows (per May-2026 balance sheet) are returned to sponsor at loan payoff; actual release is lender/servicer dependent and not itself a term-sheet item.",
"4) Reserve forward-funding at closing ($300/unit x 183 units = $54,900) reflects the underwritten replacement reserve noted in the JLL pro forma; JLL flags PCA-based reserves for an asset of this vintage (1961) typically run $350-400/unit, which could increase upfront reserve funding beyond this estimate.",
"5) CMBS actual underwritten DSCR (1.04x IO) sits below the 1.20x IO minimum shown for that program at the quoted $18.04M proceeds level - flag for execution risk; final sizing may be lower or require a rate buydown to clear the DSCR test.",
"6) Existing loan prepayment penalty/defeasance cost on the current debt being refinanced or sold off is not included in either scenario; if applicable, deduct from Net Sale Proceeds / Net Cash to Sponsor above.",
]
for n in notes:
ws.cell(r, 1, n).font = Font(name=FONT, size=9, italic=True, color="595959")
ws.row_dimensions[r].height = 28
ws.cell(r, 1).alignment = Alignment(wrap_text=True, vertical="top")
ws.merge_cells(start_row=r, start_column=1, end_row=r, end_column=4)
r += 1
ws.freeze_panes = "B2"
wb.save("output/Brix_Sale_vs_Refi_Analysis.xlsx")
print("saved")
cd /vercel/sandbox && python3 build_workbook.py
cd /vercel/sandbox && python skills/xlsx/scripts/workbook_integrity_scan.py output/Brix_Sale_vs_Refi_Analysis.xlsx && python skills/xlsx/scripts/recalc.py output/Brix_Sale_vs_Refi_Analysis.xlsx
ws.cell(r, 1, "Brix on Belleview — Sale vs. Refinance Analysis").font = TITLE_FONT
ws.cell(r, 1, "Brix on Belleview - Sale vs. Refinance Analysis").font = TITLE_FONT
("CMBS Net Proceeds w/ Rate Buydown (optional)", 18786600, CUR), ("CMBS New Loan Funding w/ Rate Buydown (optional)", 18786600, CUR),cmbs_buydown_row = labels_rows["CMBS Net Proceeds w/ Rate Buydown (optional)"]
cmbs_buydown_row = labels_rows["CMBS New Loan Funding w/ Rate Buydown (optional)"]
Now fix the metrics table (store percentages/text as numeric where applicable), lock anchors, and widen columns:
metrics = [
("Rate Type", "Fixed", "Floating (Term SOFR + spread)"),
("Interest-Only Period", "Full Term", "2 yrs (of 3+1+1 term)"),
("Coupon (as of 6/29/2026)", "6.79%", "6.40%"),
("Spread", "2.65%", "2.75%"),
("Index Floor", "N/A", "0.10%"),
("Max LTV", "75%", "70%"),
("Actual LTV", "68%", "70%"),
("Min DSCR Covenant", "1.20x IO", "1.00x IO"),
("Actual (Underwritten) DSCR", "1.04x IO", "1.16x IO"),
("Proceeds Constraint", "DSCR", "LTV"),
("Min In-Place Debt Yield", "7.00%", "6.50%"),
("Exit / Stabilized Debt Yield Test", "N/A", "7.00% exit / 9.67% stabilized"),
("Prepayment", "1yr lockout, then defeasance 12-18mo, then min. interest", "Term structure 3+1+1; cash mgmt per lockbox"),
("Cash Management", "Standard", "Springing lockbox required"),
("Rate Buydown Available", "Yes (max ~3% upfront)", "No (unavailable on floating-rate loans)"),
]
for label, cmbs_v, df_v in metrics:
ws.cell(r, 1, label).font = BLACK
ws.cell(r, 2, cmbs_v).font = BLACK
ws.cell(r, 3, df_v).font = BLACK
r += 1metrics = [
("Rate Type", "Fixed", None, "Floating (Term SOFR + spread)", None),
("Interest-Only Period", "Full Term", None, "2 yrs (of 3+1+1 term)", None),
("Coupon (as of 6/29/2026)", 0.0679, PCT, 0.0640, PCT),
("Spread", 0.0265, PCT, 0.0275, PCT),
("Index Floor", None, None, 0.0010, PCT),
("Max LTV", 0.75, PCT, 0.70, PCT),
("Actual LTV", 0.68, PCT, 0.70, PCT),
("Min DSCR Covenant", "1.20x IO", None, "1.00x IO", None),
("Actual (Underwritten) DSCR", "1.04x IO", None, "1.16x IO", None),
("Proceeds Constraint", "DSCR", None, "LTV", None),
("Min In-Place Debt Yield", 0.07, PCT, 0.065, PCT),
("Exit / Stabilized Debt Yield Test", "N/A", None, "7.00% exit / 9.67% stabilized", None),
("Prepayment", "1yr lockout, then defeasance 12-18mo, then min. interest", None, "Term structure 3+1+1; cash mgmt per lockbox", None),
("Cash Management", "Standard", None, "Springing lockbox required", None),
("Rate Buydown Available", "Yes (max ~3% upfront)", None, "No (unavailable on floating-rate loans)", None),
]
for label, cmbs_v, cmbs_fmt, df_v, df_fmt in metrics:
ws.cell(r, 1, label).font = BLACK
c2 = ws.cell(r, 2, cmbs_v)
c2.font = BLACK
if cmbs_fmt:
c2.number_format = cmbs_fmt
c3 = ws.cell(r, 3, df_v)
c3.font = BLACK
if df_fmt:
c3.number_format = df_fmt
ws.row_dimensions[r].height = 15
r += 1Now fix the unlocked anchor (row 22 references to B6 should be locked) and widen columns / fix note font size consistency:
cd /vercel/sandbox && grep -n "comm_pct_row\|B{debt_row}\|B{sale_price_row}\|set_col_widths\|Font(name=FONT, size=9" build_workbook.pyws.cell(row_gross, col_map["Sale"], f"=B{sale_price_row}").number_format = CUR
ws.cell(row_gross, col_map["CMBS_base"], f"=B{cmbs_base_row}").number_format = CUR
ws.cell(row_gross, col_map["CMBS_buy"], f"=B{cmbs_buydown_row}").number_format = CUR
ws.cell(row_gross, col_map["DebtFund"], f"=B{debtfund_row}").number_format = CURws.cell(row_gross, col_map["Sale"], f"=$B${sale_price_row}").number_format = CUR
ws.cell(row_gross, col_map["CMBS_base"], f"=$B${cmbs_base_row}").number_format = CUR
ws.cell(row_gross, col_map["CMBS_buy"], f"=$B${cmbs_buydown_row}").number_format = CUR
ws.cell(row_gross, col_map["DebtFund"], f"=$B${debtfund_row}").number_format = CURws.cell(row_comm, col_map["Sale"], f"=-B{sale_price_row}*B{comm_pct_row}").number_format = CURws.cell(row_comm, col_map["Sale"], f"=-$B${sale_price_row}*$B${comm_pct_row}").number_format = CURws.cell(row_reserve, col_map["CMBS_base"], f"=-B{reserve_row}").number_format = CUR
ws.cell(row_reserve, col_map["CMBS_buy"], f"=-B{reserve_row}").number_format = CUR
ws.cell(row_reserve, col_map["DebtFund"], f"=-B{reserve_row}").number_format = CURws.cell(row_reserve, col_map["CMBS_base"], f"=-$B${reserve_row}").number_format = CUR
ws.cell(row_reserve, col_map["CMBS_buy"], f"=-$B${reserve_row}").number_format = CUR
ws.cell(row_reserve, col_map["DebtFund"], f"=-$B${reserve_row}").number_format = CUR ws.cell(row_payoff, col_map[key], f"=-B{debt_row}").number_format = CUR ws.cell(row_payoff, col_map[key], f"=-$B${debt_row}").number_format = CURNow widen columns and fix font size consistency (use 10pt everywhere for notes instead of 9pt) plus fix narrow column widths:
set_col_widths([40, 18, 18, 18, 4])
set_col_widths([70, 24, 26, 26, 4])
cd /vercel/sandbox && sed -i 's/size=9, italic=True/size=10, italic=True/g' build_workbook.py
cd /vercel/sandbox && python3 build_workbook.py && python skills/xlsx/scripts/workbook_integrity_scan.py output/Brix_Sale_vs_Refi_Analysis.xlsx
High-severity findings clear (0). Now recalc and read back key figures.
cd /vercel/sandbox && python skills/xlsx/scripts/recalc.py output/Brix_Sale_vs_Refi_Analysis.xlsx
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('output/Brix_Sale_vs_Refi_Analysis.xlsx', data_only=True)
ws = wb['Sale vs Refi']
for row in range(1, 46):
vals = [ws.cell(row, c).value for c in range(1,5)]
if any(v is not None for v in vals):
print(row, vals)
"
cd /vercel/sandbox && python3 -c "
import openpyxl
wb = openpyxl.load_workbook('output/Brix_Sale_vs_Refi_Analysis.xlsx', data_only=True)
ws = wb['Sale vs Refi']
for row in [18,19,20,21,22,23,24]:
vals = [ws.cell(row, c).value for c in range(1,6)]
print(row, vals)
"
Good, all values confirmed. Now save to library and present.
Sale nets ~$5.6M of liquidity today; both refis are roughly a wash at the closing table — CMBS actually requires you to write a check unless you buy down the rate
| Line Item | Sale | Refi - CMBS (base) | Refi - CMBS (rate buydown) | Refi - Debt Fund |
|---|---|---|---|---|
| Gross Sale Price / New Loan Funding | $23,900,000 | $18,040,000 | $18,786,600 | $18,710,000 |
| Less: Brokerage Commission (0.75%) | -$179,250 | n/a | n/a | n/a |
| Less: Est. Reserve Forward-Funding at Closing | n/a | -$54,900 | -$54,900 | -$54,900 |
| Less: Outstanding Debt Payoff | -$18,558,526 | -$18,558,526 | -$18,558,526 | -$18,558,526 |
| Plus: Escrow/Lender Impound Release | $415,922 | n/a | n/a | n/a |
| Net Sale Proceeds / Net Cash to (from) Sponsor | $5,578,1461 | -$573,4261 | $173,1741 | $96,5741 |
Sale at $23.9M. Gross price less $18,558,526 debt payoff and $179,250 brokerage commission (0.75%), plus $415,922 of escrow/lender-impound balances (property-tax, insurance, and reserve escrows per the May-2026 balance sheet) that are released back to the sponsor at loan payoff, nets $5,578,146 of immediate liquidity .
Refi — CMBS. JLL is quoting $18,040,000 of proceeds (68% LTV, 6.79% fixed coupon, full-term IO) . Against the $18,558,526 payoff plus an estimated $54,900 of reserve forward-funding at closing, that's $573,426 of new equity you'd have to contribute to close — not liquidity, a cash call . A rate buydown (~$383,400 cost, standard on this program) lifts proceeds to $18,786,600 and flips the math to a $173,174 cash-out, but that's a $383K spend to manufacture ~$750K of incremental proceeds — worth doing only if you need every dollar and can absorb the buydown cost .
Refi — Debt Fund. $18,710,000 (70% LTV, floating Term SOFR + 2.75%, 2-yr IO of a 3+1+1 term) nets a modest $96,574 cash-out with no buydown available on floating-rate paper .
On your stated objective — near-term liquidity — the sale is not close. It delivers 10x-plus the cash of either refi option, and does so without taking on new debt service or floating-rate exposure. If you need to raise cash now, that's the lever.
Between the two refis (no material liquidity difference, but the risk profiles diverge):
Neither refi option is disqualifying, but if liquidity is the driver, they're a rounding error next to the sale.
This is a read-only snapshot of a RealAI analysis.