Size a 10-year fixed-rate Fannie Mae refinance on The Mark at Brickyard (Beltsville, MD). The sponsor is asking for $80 million, 30-year amortization, non-recourse, hold through maturity. Use a Fannie conventional credit box: max LTV 75%, DSCR floor 1.25x. What's supportable, what binds, and what structure gets to an approve?
cat scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_manifest_v5.md
cd scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/; sed -n '/^## 6/,/^## 12/p' RealAI_Credit_Underwriting_Template_manifest_v5.md | head -c 40000
cd scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/; awk '/^## 11/,0' RealAI_Credit_Underwriting_Template_manifest_v5.md | sed -n '/five .CHECK/,$p' | head -c 12000
cd /vercel/sandbox; mkdir -p scripts extracts; cp scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v5_clean.xlsx /tmp/t.xlsx; python3 -c "
import openpyxl
wb=openpyxl.load_workbook('/tmp/t.xlsx')
for ws in wb.worksheets:
if ws.sheet_state!='visible': continue
for row in ws.iter_rows():
for c in row:
f=c.fill.fgColor.rgb if c.fill and c.fill.fgColor else None
if f=='FFFFF2CC':
lab=ws.cell(row=c.row,column=c.column-1).value
print(ws.title,c.coordinate,repr(lab)[:45],repr(c.value))
for dv in ws.data_validations.dataValidation:
print(' DV',ws.title,dv.sqref,dv.formula1)
""""Populate RealAI Credit UW template v5 for The Mark at Brickyard — $80M Fannie 10-yr refi.
Inputs sourced from RealAI datamart pulls (2026-09-30) and Fed H.15 (2026-09-24 curve)."""
import openpyxl, shutil, sys, datetime
SRC = sys.argv[1]
OUT = sys.argv[2]
shutil.copy(SRC, OUT)
wb = openpyxl.load_workbook(OUT)
A, P, PP, D, LS = wb["Assumptions"], wb["Pro Forma"], wb["Prepayment"], wb["Defeasance"], wb["Loan Sizing"]
a = {
# collateral
"C5": "The Mark at Brickyard", "C6": "12401 Brickyard Blvd", "C7": "Beltsville, MD 20705",
"C8": "Multifamily", "C9": 433, "C10": 410484, "C11": "Units", "C13": 2013, "C14": 0.963,
"C15": "T12 Actuals",
# sponsor
"C18": "Mark Owner LLC", "C19": "Partial / Springing", "C20": "No",
# growth & exit (underwriting assumptions)
"C28": 0.02, "C29": 0, "C30": 0.02, "C31": "Deep", "C32": 0.03,
# takeout at maturity
"C34": 0.0645, "C35": 1.25, "C36": 0.75, "C37": 0.08, "C38": 30, "C41": "Deep",
# recovery / participation
"C52": 36, "C53": 0.05, "C54": 12, "C55": 0, "C56": 0,
# loan request
"F5": "Origination", "F6": "Refinance-Term", "F7": datetime.datetime(2026, 12, 1),
"F8": 80_000_000, "F9": 0.0645, "F10": 10, "F11": 0, "F12": 30, "F14": 0.01,
"F15": "Non-Recourse",
# credit box (user: 75% LTV, 1.25x); DY floor informational only (test switched off)
"F18": 0.75, "F19": 1.25, "F20": 1.20, "F21": 0.085, "F22": 0.10, "F23": "user-provided",
"F24": 50, "F25": 50,
# benchmarks
"F29": round(1 - 0.9634, 4), # submarket physical vacancy (Beltsville/Laurel/South Laurel)
"F30": 0.05, "F32": 0.4525, # DC MSA OpEx ratio (submarket not carried)
"F33": 0.42, "F35": "No", "F36": 0.0573, # DC MSA MF cap 2Q26
"F38": 2019.33, "F44": "Modest",
"F47": "No",
"F55": 0.90, "F56": 0.30, "F57": 0.10, "F58": 0.03,
}
for k, v in a.items(): A[k] = v
# T12 (platform operating statement, RealAI Ops Benchmarks)
t12 = {"E5": 10621657.13, "E6": 406057.38, "E7": 0, "E8": 0, "E9": 1123977.57,
"E13": 669010.22, "E14": 633048.74, "E15": 555431.15, "E16": 0, "E17": 0,
"E18": 72230.87 + 287394.78, "E19": 475843.83, "E20": 1306760.15, "E21": 169301.36,
"E22": 0, "C39": 0.042, "C40": 250}
for k, v in t12.items(): P[k] = v
# DSCR-amortizing, DSCR-IO, DY, LTV include switches
LS["D24"], LS["D25"], LS["D26"], LS["D27"] = "Yes", "Yes", "No", "Yes"
# Prepayment: Fannie standard yield maintenance, Treasury-flat discount, 1% floor, open last 6 mo
pp = {"C4": 60, "C5": 0.01, "C6": 0.02, "C7": 0, "C8": 0, "C9": 6, "C10": "Yield Maintenance",
"C36": datetime.datetime(2026, 9, 24)}
for k, v in pp.items(): PP[k] = v
curve = [0.0410, 0.0440, 0.0487, 0.0499, 0.0503, 0.0509, 0.0518, 0.0553, 0.0547]
for i, r in enumerate(curve): PP[f"D{27+i}"] = r
for i, r in enumerate([0.05, 0.04, 0.03, 0.02, 0.01, 0, 0, 0, 0, 0]): PP[f"C{49+i}"] = r
d = {"C11": 25000, "C12": 40000, "C13": 10000, "C14": 15000, "C15": 10000,
"C16": "Open Window", "C53": "No"}
for k, v in d.items(): D[k] = v
wb.save(OUT)
print("written", OUT)
cd /vercel/sandbox; mkdir -p outputs; F="outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v1.xlsx"; python3 scripts/populate_mark_brickyard.py scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v5_clean.xlsx "$F" && python3 skills/xlsx/scripts/recalc.py "$F" | tail -5; python3 skills/xlsx/scripts/workbook_integrity_scan.py "$F" --json /tmp/scan.json >/dev/null; echo exit $?; python3 -c "
import json;d=json.load(open('/tmp/scan.json'));
fs=d.get('findings',d);
hi=[f for f in fs if isinstance(f,dict) and f.get('severity')=='high'];print(len(hi));[print(f) for f in hi[:10]]"cd /vercel/sandbox; python3 -c "
import json;d=json.load(open('/tmp/scan.json'));
fs=d.get('findings',d);
hi=[f for f in fs if isinstance(f,dict) and f.get('severity')=='high'];[print(f['category'],f['sheet'],f['cell'],f.get('references',f.get('links_to'))) for f in hi]"cd /vercel/sandbox; cat >> scripts/populate_mark_brickyard.py <<'EOF'
# --- gate fixes: non-load-bearing scalars written explicitly (not left blank) ---
wb = openpyxl.load_workbook(OUT)
A, P, PP = wb["Assumptions"], wb["Pro Forma"], wb["Prepayment"]
for k in ("C47", "C48", "C49", "C51"): A[k] = 0 # bridge block, unused on Refinance-Term
A["F39"], A["F40"] = 0, 0 # market concessions / bad debt (T12 carries none; market column unused on T12 basis)
A["F41"] = 0.0715 # DC MSA other income % of net rent (market column only)
for k in ("C85", "C86", "C87"): PP[k] = 0 # spread maintenance, unused on YM
for col in ("C", "D"): # Year -2 / Year -1 not provided
for r in (5, 6, 7, 8, 9, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22): P[f"{col}{r}"] = 0
wb.save(OUT)
print("gate fixes written")
EOF
F="outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v1.xlsx"; python3 scripts/populate_mark_brickyard.py scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v5_clean.xlsx "$F" && python3 skills/xlsx/scripts/workbook_integrity_scan.py "$F" --json /tmp/scan.json >/dev/null && python3 skills/xlsx/scripts/recalc.py "$F" | tail -4Consolidated read-back:
import openpyxl, sys
wb = openpyxl.load_workbook(sys.argv[1], data_only=True)
cells = {
"Pro Forma": ["E11","E28","G5","G6","G9","G11","G23","G24","G25","G26","G28","G29","G30","G31","G32","C43","C44","C45"],
"Loan Sizing": ["C14","C15","C17","C18","C19","C20","E24","E25","E26","E27","F24","F27","C29","C30","C31","C32","C35","C36","C37","C38","C39","C40","C41","C42","C43","J5","J6","J7","J8","J9","J10","J11","J12","J13"],
"Amortization": ["N4","N5","N6"],
"Refi Analysis": ["C6","C20","C21","C22","C23","C24","C25","C26","C27","C28","C29","C30","C31","C32","C33","C40","C62"],
"Prepayment": ["C18","C41","C70","C71","C72","C73","C77","C78"],
"Defeasance": ["C8","C47","C49","C50","C51"],
"Recovery": ["C13","D13","E13","F13","C14","D14","E14","F14","C20","C21","C22","C23","C24"],
"Stress & Break-Even": ["C17","C18","C19","C20","C21","C22","C23","C24","C28","C29","C30","C31","C32","C33","C13","C14"],
"Assumptions": ["F31","F34","F42","F43","C21","C39","C40"] + [f"I{r}" for r in range(23,48)] + ["I50","I51","I52","I53"],
}
for sh, lst in cells.items():
ws = wb[sh]
for c in lst:
lab = ws.cell(row=ws[c].row, column=2).value
print(f"{sh}!{c}\t{lab!r:.50}\t{ws[c].value!r}")
ws = wb["Stress & Break-Even"]
print("grid rates", [ws[f"B{r}"].value for r in range(6,12)])
for r in range(6,12): print([round(ws.cell(row=r,column=c).value,2) for c in range(3,8)])
ws = wb["Refi Analysis"]
print("DSCR by yr", [ws.cell(row=11,column=c).value for c in range(4,15)])
print("sens row56-60", [[ws.cell(row=r,column=c).value for c in range(4,15)] for r in (56,60)])
cd /vercel/sandbox; python3 scripts/readback_mark_brickyard.py "outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v1.xlsx"
cd /vercel/sandbox; python3 scripts/readback_mark_brickyard.py "outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v1.xlsx"
cd /vercel/sandbox; cat > scripts/populate_mark_brickyard_counter.py <<'EOF'
"""Scenario 2: same inputs as populate_mark_brickyard.py, proceeds solved to the binding DSCR floor (Loan Sizing!C36 of v1 = $63.30M, rounded down)."""
import subprocess, sys, openpyxl
SRC, OUT = sys.argv[1], sys.argv[2]
subprocess.run([sys.executable, "scripts/populate_mark_brickyard.py", SRC, OUT], check=True)
wb = openpyxl.load_workbook(OUT); wb["Assumptions"]["F8"] = 63_300_000; wb.save(OUT)
print("counter-offer proceeds written")
EOF
T=scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v5_clean.xlsx
F2="outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v2.xlsx"
python3 scripts/populate_mark_brickyard_counter.py $T "$F2" && python3 skills/xlsx/scripts/workbook_integrity_scan.py "$F2" --json /tmp/scan2.json >/dev/null && python3 skills/xlsx/scripts/recalc.py "$F2" | grep total_errors && python3 scripts/readback_mark_brickyard.py "$F2" | grep -E "Loan Sizing!C1[4-9]|C29|C30|C35|Amortization|Refi Analysis!C(2[0-9]|3[0-3]|40|62)|Prepayment!C(18|70|71|73|77)|Defeasance!C5[01]|Recovery!(C|D|E|F)14|Recovery!C2[0-4]|Stress & Break-Even!C(1[3-9]|2[0-4]|29|3[0-3])|Assumptions!I(3[4-9]|4[0-7])"cd /vercel/sandbox; sed -i 's/63_300_000/63_250_000/; s/\$63.30M, rounded down/$63.30M, rounded down to $63.25M so DSCR clears 1.25x/' scripts/populate_mark_brickyard_counter.py T=scratch/inputs/agents/01a087be-a40c-70fb-88a9-40a61b0703c2/RealAI_Credit_Underwriting_Template_v5_clean.xlsx F2="outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v2.xlsx" python3 scripts/populate_mark_brickyard_counter.py $T "$F2" && python3 skills/xlsx/scripts/workbook_integrity_scan.py "$F2" --json /tmp/scan2.json >/dev/null && python3 skills/xlsx/scripts/recalc.py "$F2" | grep total_errors && python3 scripts/readback_mark_brickyard.py "$F2" | grep -E "Loan Sizing!C1[5-9]|C35|Amortization!N4|Refi Analysis!C(28|30|32|33)|Prepayment!C(70|71)|Defeasance!C51|Recovery!(E13|E14|F13|C20|C23)|Stress & Break-Even!C(18|21|23|29|31|32)|Assumptions!I(3[4-9]|4[0-7])"
The Mark at Brickyard: $80M Fannie Mae 10-year fixed refi
Decline at $80M. Approve with Structure at $63.25M. The DSCR floor binds, and $80M breaks both of your limits.
Recommended structure: Fannie Conventional, $63.25M, fixed at about 6.45%, 10-year term, 30-year amortization, no interest-only, yield maintenance through month 114 then open, non-recourse with standard carve-outs.
Data caveat: no sponsor T12 or rent roll was uploaded. The operating statement is the platform's modeled P&L, and it is unverified.
| $80M request | $63.25M counter | |
|---|---|---|
| DSCR (floor 1.25x) | 0.99x | 1.25x |
| LTV (max 75%) | 76.8% | 60.7% |
| Debt yield | 7.5% | 9.4% |
| Balance at maturity | $67.7M | $53.6M |
| Refi surplus/(gap) at stressed terms | ($0.9M) | +$13.3M |
How the lender-case NOI was built:
Assumptions I used:
(All loan figures come from these two models.)
Assume the modeled financials from RealAI are verified. Generate an IC Memo at 63.25MM, branded for Walker & Dunlop. I have attached their logo
cd /vercel/sandbox; ls outputs scripts; cat realai-assets/README.md | head -50
cd /vercel/sandbox; python3 -c "
from PIL import Image; im=Image.open('scratch/inputs/library/01a0f3fc-05c4-702a-b762-599e0dd3b2ee/walkerdunlop.jpeg'); print(im.size, im.getpixel((5,5)), im.getpixel((100,120)))
import openpyxl
wb=openpyxl.load_workbook('outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v2.xlsx',data_only=True)
pf=wb['Pro Forma']
for r in list(range(5,12))+list(range(13,29)): print(r,pf.cell(r,2).value,[pf.cell(r,c).value for c in (5,7,8,9)])
ls=wb['Loan Sizing']; print([ls[c].value for c in ('E24','E26','E27','C29','C20')])
ra=wb['Refi Analysis'];
for r in (4,8,9,11,12,16): print(r,ra.cell(r,2).value,[round(ra.cell(r,c).value,3) if isinstance(ra.cell(r,c).value,float) else ra.cell(r,c).value for c in range(4,15)])
am=wb['Amortization']; print(am['N5'].value, am['N6'].value, am['F5'].value)
a=wb['Assumptions']; print(a['I36'].value)
"cd /vercel/sandbox; sed -n 1,200p skills/docx/references/metadata.md | head -60
cd /vercel/sandbox; mkdir -p assets; cp scratch/inputs/library/01a0f3fc-05c4-702a-b762-599e0dd3b2ee/walkerdunlop.jpeg assets/walkerdunlop.jpeg; fc-list | grep -iE "georgia|liberation serif|dejavu serif" | head -3
"""Walker & Dunlop-branded IC memo: The Mark at Brickyard, $63.25M Fannie Mae 10-yr fixed refinance.
All loan figures read live from the recalculated counter-offer workbook (v2) and request workbook (v1).
Usage: python scripts/build_wd_ic_memo.py <plain_out.docx> <formatted_out.docx>"""
import sys, openpyxl
import matplotlib; matplotlib.use("Agg")
import matplotlib.pyplot as plt
from docx import Document
from docx.shared import Inches, Pt, RGBColor
from docx.enum.style import WD_STYLE_TYPE
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT
from docx.oxml.ns import qn
from docx.oxml import OxmlElement
PLAIN, FMT = sys.argv[1], sys.argv[2]
V1 = "outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v1.xlsx"
V2 = "outputs/The Mark at Brickyard_Credit_UW_2026-09-30_v2.xlsx"
LOGO = "assets/walkerdunlop.jpeg"
w1 = openpyxl.load_workbook(V1, data_only=True); w2 = openpyxl.load_workbook(V2, data_only=True)
g = lambda wb, ref: wb[ref.split("!")[0]][ref.split("!")[1]].value
m = lambda v, d=1: f"${v/1e6:,.{d}f}M"
d0 = lambda v: f"${v:,.0f}"
pc = lambda v, d=1: f"{v*100:.{d}f}%"
x = lambda v: f"{v:.2f}x"
# ---- figures (workbook) ----
F = dict(
loan=g(w2,"Assumptions!F8"), rate=g(w2,"Assumptions!F9"), dscr=g(w2,"Loan Sizing!C17"), dy=g(w2,"Loan Sizing!C18"),
ltv=g(w2,"Loan Sizing!C19"), perunit=g(w2,"Loan Sizing!C20"), ds=g(w2,"Stress & Break-Even!C17"),
sup=g(w2,"Loan Sizing!C29"), bind=g(w2,"Loan Sizing!C30"),
t12egi=g(w2,"Pro Forma!E11"), t12noi=g(w2,"Pro Forma!E28"), egi=g(w2,"Pro Forma!G11"), opex=g(w2,"Pro Forma!G25"),
opexr=g(w2,"Pro Forma!G31"), noi=g(w2,"Pro Forma!G28"), hc=g(w2,"Pro Forma!G30"), uplift=g(w2,"Pro Forma!G26"),
value=g(w2,"Pro Forma!C44"), vpu=g(w2,"Pro Forma!C45"), cap=g(w2,"Pro Forma!C43"),
bal=g(w2,"Amortization!N4"), wal=g(w2,"Amortization!N5"), apr=g(w2,"Amortization!N6"),
noim=g(w2,"Refi Analysis!C21"), srate=g(w2,"Refi Analysis!C22"), scap=g(w2,"Refi Analysis!C23"), sval=g(w2,"Refi Analysis!C24"),
refi=g(w2,"Refi Analysis!C28"), gap=g(w2,"Refi Analysis!C30"), refcov=g(w2,"Refi Analysis!C32"), salecov=g(w2,"Refi Analysis!C40"),
cush=g(w2,"Stress & Break-Even!C21"), beocc=g(w2,"Stress & Break-Even!C23"), berent=g(w2,"Stress & Break-Even!C24"),
vbreak=g(w2,"Stress & Break-Even!C29"), nbreak=g(w2,"Stress & Break-Even!C31"), capbreak=g(w2,"Stress & Break-Even!C32"),
rec20=g(w2,"Recovery!E13"), rec30=g(w2,"Recovery!F13"), parbreak=g(w2,"Recovery!C20"), basis=g(w2,"Recovery!C23"),
ym=g(w2,"Prepayment!C70"), ympct=g(w2,"Prepayment!C71"), cpt=g(w2,"Prepayment!C77"),
r_dscr=g(w1,"Loan Sizing!C17"), r_ltv=g(w1,"Loan Sizing!C19"), r_dy=g(w1,"Loan Sizing!C18"), r_gap=g(w1,"Loan Sizing!C35"),
need=g(w1,"Stress & Break-Even!C22"), t_dscr=g(w1,"Loan Sizing!E24"), t_dy=g(w1,"Loan Sizing!E26"), t_ltv=g(w1,"Loan Sizing!E27"),
)
ra = w2["Refi Analysis"]
yrs = [ra.cell(4, c).value for c in range(5, 15)]
dscr_yr = [ra.cell(11, c).value for c in range(5, 15)]
pf = w2["Pro Forma"]
# ---- W&D palette ----
NAVY = RGBColor(0x00, 0x2B, 0x4E); BLUE = RGBColor(0x3E, 0x6E, 0x9A); GREY = RGBColor(0x5F, 0x6B, 0x78)
NAVY_HEX, BLUE_HEX, LIGHT_HEX, RULE_HEX = "002B4E", "3E6E9A", "E9EEF4", "B8C4D1"
# ---- charts ----
plt.rcParams.update({"font.family": "DejaVu Sans", "font.size": 9})
fig, ax = plt.subplots(figsize=(6.2, 2.5), dpi=220)
labels = ["DSCR 1.25x", "Debt yield\n(informational)", "LTV 75%", "Sponsor request"]
vals = [F["t_dscr"]/1e6, F["t_dy"]/1e6, F["t_ltv"]/1e6, 80.0]
cols = ["#002B4E", "#9FB3C8", "#3E6E9A", "#C9D3DE"]
b = ax.barh(labels[::-1], vals[::-1], color=cols[::-1])
for rect, v in zip(b, vals[::-1]): ax.text(v + 0.8, rect.get_y() + rect.get_height()/2, f"${v:,.1f}M", va="center", fontsize=8.5, color="#1F2A36")
ax.axvline(F["loan"]/1e6, color="#B5563C", lw=1.2, ls="--"); ax.text(F["loan"]/1e6 + 0.5, 3.45, f"Recommended ${F['loan']/1e6:.2f}M", color="#B5563C", fontsize=8)
ax.set_xlim(0, 92); ax.set_xlabel("Maximum loan by test ($M)")
for s in ("top", "right"): ax.spines[s].set_visible(False)
ax.set_title("DSCR binds at $63.3M, well below the $80M request", loc="left", fontsize=10, color="#002B4E", fontweight="bold")
fig.tight_layout(); fig.savefig("scratch/wd_chart_sizing.png"); plt.close(fig)
fig, ax = plt.subplots(figsize=(6.2, 2.4), dpi=220)
ax.plot(yrs, dscr_yr, color="#002B4E", lw=2, marker="o", ms=3.5, label="Underwritten DSCR")
ax.axhline(1.25, color="#B5563C", lw=1.1, ls="--", label="1.25x floor")
ax.set_ylim(1.15, 1.45); ax.set_xticks(yrs); ax.set_xlabel("Loan year"); ax.set_ylabel("DSCR (x)")
for s in ("top", "right"): ax.spines[s].set_visible(False)
ax.legend(frameon=False, fontsize=8, loc="upper left")
ax.set_title(f"Coverage builds from {dscr_yr[0]:.2f}x to {dscr_yr[-1]:.2f}x by maturity", loc="left", fontsize=10, color="#002B4E", fontweight="bold")
fig.tight_layout(); fig.savefig("scratch/wd_chart_dscr.png"); plt.close(fig)
# ---- plain draft ----
doc = Document()
for s in doc.sections:
s.page_width, s.page_height = Inches(8.5), Inches(11)
s.top_margin = s.bottom_margin = Inches(0.9); s.left_margin = s.right_margin = Inches(1.0)
for name in ("Eyebrow", "Eyebrow Secondary", "Stat", "Body Small", "Disclaimer"):
doc.styles.add_style(name, WD_STYLE_TYPE.PARAGRAPH)
def P(text, style=None, bold_lead=None):
p = doc.add_paragraph(style=style)
if bold_lead:
p.add_run(bold_lead).bold = True
p.add_run(text); return p
def T(rows, widths, header=True):
t = doc.add_table(rows=len(rows), cols=len(rows[0]))
for i, r in enumerate(rows):
for j, v in enumerate(r):
c = t.cell(i, j); c.text = str(v); c.width = Inches(widths[j])
return t
logo_p = doc.add_paragraph(); logo_p.add_run().add_picture(LOGO, width=Inches(2.1))
P("Investment committee memorandum", "Eyebrow")
P("The Mark at Brickyard", "Title")
P(f"{m(F['loan'],2)} Fannie Mae DUS conventional fixed-rate refinance · 433 units · Beltsville, MD", "Subtitle")
P("Prepared September 30, 2026 · Walker & Dunlop Multifamily Finance", "Body Small")
T([["Loan term", "Detail"],
["Borrower", "Mark Owner LLC (fee owner of record)"],
["Execution", "Fannie Mae DUS conventional, fixed rate"],
["Proceeds", f"{m(F['loan'],2)} ({d0(F['perunit'])} per unit)"],
["Rate", f"{pc(F['rate'],2)} estimated all-in, fixed"],
["Term / amortization", "10 years / 30 years, no interest-only"],
["Prepayment", f"Yield maintenance through month {F['cpt']}; open final 6 months"],
["Recourse", "Non-recourse, standard carve-outs"],
["Coverage at close", f"{x(F['dscr'])} DSCR · {pc(F['ltv'])} LTV · {pc(F['dy'],2)} debt yield"],
["Recommendation", "Approve with conditions"]], [1.8, 4.7])
doc.add_heading("Recommendation", 1)
P(f"Approve a {m(F['loan'],2)} Fannie Mae 10-year fixed-rate refinance, sized to the 1.25x amortizing DSCR floor. "
f"The sponsor requested $80.0M; on the lender case that request covers only {x(F['r_dscr'])} and runs {pc(F['r_ltv'])} LTV, failing both "
f"credit-box tests. Supportable proceeds are {m(F['sup'])}, bound by the {F['bind'].lower()}. "
f"Holding 1.25x at $80.0M requires {m(F['need'],2)} of NOI, above the trailing {m(F['t12noi'],2)}, so no pricing or haircut relief closes the gap.")
P(f"At {m(F['loan'],2)} the loan is well protected: {pc(F['ltv'])} LTV against a lender value of {m(F['value'])}, a {pc(F['cush'])} NOI cushion to 1.00x, "
f"and a stressed maturity refinance that clears with {m(F['gap'])} to spare. The approval is conditioned on receipt and review of the sponsor's personal financial statement and liquidity, "
"which have not been provided.")
doc.add_picture("scratch/wd_chart_sizing.png", width=Inches(6.4))
P("Figure 1. Maximum loan by credit test. The debt yield test is shown for reference and is not part of the agency sizing box.", "Caption")
doc.add_heading("Credit thesis", 2)
for lead, txt in [
("Stabilized, well-located collateral. ", "A 2013-vintage, 433-unit, four-story brick community on 7.4 acres in the Beltsville/Laurel/South Laurel submarket, 96.3% physically occupied, in line with the submarket."),
("Premium positioning with income headroom. ", "Average in-place rent of $2,045 sits roughly 12% above the submarket average of $1,824, with a rent-to-income ratio of 24.7%, about average for the metro."),
("Conservative basis. ", f"The loan sits at {d0(F['perunit'])} per unit against a lender value of {d0(F['vpu'])} per unit and a December 2020 sale at $104.0M."),
("Amortization de-risks the exit. ", f"The balance falls to {m(F['bal'],2)} at maturity; a takeout lender at stressed terms would lend {m(F['refi'],2)}."),
]:
P(txt, "List Bullet", lead)
doc.add_heading("Underwriting", 1)
P("Per committee instruction, the RealAI operating statement is treated as the verified trailing-12 statement. The lender case then applies agency underwriting floors: "
f"vacancy at the higher of actual, market or 5%; other income reduced 10%; expenses floored at the DC-metro benchmark ratio of 45.3% of lender EGI plus $250 per unit in replacement reserves; "
f"and management at 4.2% of EGI. The result is a {pc(F['hc'])} NOI haircut, of which {m(F['uplift'],2)} is the expense floor.")
rows = [["Line item", "Trailing 12", "Lender case", "Per unit", "% of EGI"]]
for r, lab in [(5,"Gross potential rent"),(6,"Less: vacancy"),(9,"Other income"),(11,"Effective gross income"),
(13,"Payroll"),(14,"Repairs & maintenance"),(15,"Utilities"),(18,"Marketing & administrative"),(19,"Management fee"),
(20,"Real estate taxes"),(21,"Insurance"),(22,"Replacement reserves"),(26,"Expense floor uplift"),(25,"Total operating expenses"),(28,"Net operating income")]:
e = pf.cell(r,5).value; gv = pf.cell(r,7).value; h = pf.cell(r,8).value
pct = gv / F["egi"] if r != 11 else 1.0
rows.append([lab, "-" if e is None else d0(e), d0(gv), d0(h), pc(pct)])
T(rows, [2.2, 1.1, 1.1, 0.9, 0.9])
P("Table 1. Operating statement, trailing 12 versus lender case. Management fee and reserves are re-struck on lender EGI.", "Caption")
P(f"Capitalized at the DC-metro institutional multifamily cap rate of {pc(F['cap'],2)} (2Q26), lender-case NOI of {d0(F['noi'])} supports a value of {m(F['value'])}, "
"essentially equal to the 2020 purchase price. No appraisal has been received; the appraisal cap is disclosure-only and does not size the loan.")
doc.add_heading("Loan sizing", 1)
T([["Metric", "Sponsor request", "Recommended", "Credit box"],
["Proceeds", "$80.00M", m(F["loan"],2), "-"],
["DSCR (amortizing)", x(F["r_dscr"]), x(F["dscr"]), "1.25x minimum"],
["Loan-to-value", pc(F["r_ltv"]), pc(F["ltv"]), "75.0% maximum"],
["Debt yield", pc(F["r_dy"],2), pc(F["dy"],2), "Not tested"],
["Annual debt service", "-", d0(F["ds"]), "-"],
["Surplus / (gap) to supportable", m(F["r_gap"]), "-", "-"]], [2.1, 1.4, 1.4, 1.6])
P("Table 2. Coverage at the request and at the recommended proceeds.", "Caption")
P(f"Pricing is estimated at {pc(F['rate'],2)}: Fannie Mae's 10-year, 80% LTV / 1.25x tier averaged 6.38% as of September 23, 2026, adjusted for the 7 bp rise in the 10-year Treasury to 5.18% since. "
f"The rate should be locked at application; the 10-year is at a 19-year high and volatile. Lender yield including a 1% origination fee is {pc(F['apr'],2)} with a weighted average life of {F['wal']:.1f} years.")
doc.add_heading("Maturity and refinance risk", 1)
P(f"NOI is grown at 2.0% rent and 3.0% expense growth, reaching {d0(F['noim'])} at maturity. A takeout at a stressed {pc(F['srate'],2)} rate and {pc(F['scap'],2)} cap, "
f"sized to 1.25x, 75% LTV and an 8.0% debt yield, would lend {m(F['refi'],2)} against a {m(F['bal'],2)} balance: refinance coverage of {x(F['refcov'])}. "
f"A sale at the stressed value of {m(F['sval'])} covers the balance {x(F['salecov'])}.")
doc.add_picture("scratch/wd_chart_dscr.png", width=Inches(6.4))
P("Figure 2. Underwritten DSCR by loan year at recommended proceeds.", "Caption")
doc.add_heading("Stress and break-even", 1)
T([["Test", "Result"],
["NOI cushion to 1.00x DSCR", pc(F["cush"])],
["Break-even occupancy (1.00x)", pc(F["beocc"])],
["Break-even rent (% of underwritten)", pc(F["berent"])],
["Value decline that breaks the refinance", pc(F["vbreak"])],
["NOI decline that breaks the refinance", pc(F["nbreak"])],
["Exit cap that breaks the refinance", pc(F["capbreak"],2)]], [4.0, 2.5])
P("Table 3. Break-even analysis at recommended proceeds.", "Caption")
doc.add_heading("Recovery in default", 1)
P(f"Assuming default in month 36, 5% foreclosure costs and 12 months of carry, a distressed sale recovers {pc(F['rec20'],0)} of the outstanding balance at a 20% value decline "
f"and {pc(F['rec30'],0)} at a 30% decline. Recovery equals the balance until value falls {pc(F['parbreak'])}, and the lender basis cushion is {pc(F['basis'])}.")
doc.add_heading("Prepayment", 1)
P(f"Standard Fannie Mae yield maintenance, discounted at the Treasury flat with a 1% minimum, applies through month {F['cpt']}; the loan is open for the final six months. "
f"A month-60 exit would cost {m(F['ym'],2)} ({pc(F['ympct'])} of balance). That is consistent with the sponsor's stated hold to maturity. If an early sale becomes likely, "
"a step-down prepayment alternative should be priced before rate lock.")
doc.add_heading("Sponsorship", 1)
P("The borrower of record is Mark Owner LLC, which acquired the property in December 2020 for $104.0M ($240,185 per unit). The loan is non-recourse with standard carve-out guaranties. "
"No personal financial statement, schedule of real estate owned or liquidity verification has been provided. Approval is conditioned on a guarantor meeting Fannie Mae's net worth and liquidity requirements "
"and on confirmation of the existing loan payoff. If the payoff exceeds the new proceeds, the refinance is cash-in, and the sponsor must evidence liquidity to fund the shortfall.")
doc.add_heading("Market", 1)
P("The submarket is 96.3% occupied, with median in-place rent up 0.2% year over year and asking rents up 2.7%. The subject's in-place rent was flat over the last 12 months, and its asking rent of about $2,019 sits 1.2% below in-place, a modest negative mark-to-market. "
"Across the DC metro, 13,291 units are under construction and permits over the last 12 months (12,083 units) exceed the prior 12 months (7,692 units), so supply pressure through the loan term is modest but rising. "
"The metro institutional multifamily cap rate has moved from 5.50% to 5.73% over the past two years.")
doc.add_heading("Risks and mitigants", 1)
T([["Risk", "Mitigant"],
["Rising rates at lock", "Lock at application; proceeds sized with a 7 bp cushion over the September 23 snapshot."],
["Expense growth outpacing rent", f"Lender case already carries expenses at {pc(F['opexr'])} of EGI versus 36.8% trailing; 20% NOI cushion."],
["New supply across the metro", "DSCR cash-management trigger at 1.15x; 96% occupied, premium-positioned 2013 product."],
["Sponsor capacity undocumented", "Condition precedent: guarantor PFS, liquidity and REO schedule."],
["Cash-in refinance", "Confirm existing payoff; sponsor to fund any shortfall at closing."],
["Early exit cost", "Yield maintenance priced; step-down alternative available at a rate premium."]], [2.1, 4.4])
P("Table 4. Principal risks and structural responses.", "Caption")
doc.add_heading("Conditions precedent", 1)
for c in ["Guarantor personal financial statement, liquidity verification and schedule of real estate owned meeting Fannie Mae requirements.",
"Existing loan payoff statement; sponsor equity to cover any shortfall.",
"Appraisal supporting value of at least $84.3M (75% LTV at recommended proceeds) and a physical needs assessment confirming reserves.",
"Current rent roll and trailing-12 statement tying to the underwritten operating statement.",
"Rate lock at or below the underwritten rate; proceeds to be re-sized to 1.25x at any higher lock rate."]:
P(c, "List Number")
P("This memorandum is based on RealAI platform data as of September 30, 2026, treated as verified at the committee's direction, and on the Walker & Dunlop credit underwriting model for this transaction. "
"Pricing is indicative and subject to Fannie Mae approval and market conditions at rate lock. Not a commitment to lend.", "Disclaimer")
doc.save(PLAIN)
# ---- W&D formatting (presentation only) ----
d = Document(PLAIN)
def font(style, name="Arial", size=None, color=None, bold=None, italic=None):
st = d.styles[style]; f = st.font; f.name = name
st.element.get_or_add_rPr(); rpr = st.element.rPr
rf = rpr.find(qn("w:rFonts")) or OxmlElement("w:rFonts")
for k in ("w:ascii", "w:hAnsi", "w:cs", "w:eastAsia"): rf.set(qn(k), name)
if rf.getparent() is None: rpr.append(rf)
if size: f.size = Pt(size)
if color is not None: f.color.rgb = color
if bold is not None: f.bold = bold
if italic is not None: f.italic = italic
return st
def rule(p, color=BLUE_HEX, sz=8, side="bottom", space=4):
pPr = p._p.get_or_add_pPr(); b = pPr.find(qn("w:pBdr"))
if b is None: b = OxmlElement("w:pBdr"); pPr.append(b)
e = OxmlElement(f"w:{side}"); e.set(qn("w:val"), "single"); e.set(qn("w:sz"), str(sz)); e.set(qn("w:space"), str(space)); e.set(qn("w:color"), color); b.append(e)
SERIF = "Georgia"
n = font("Normal", "Arial", 10, RGBColor(0x1F, 0x2A, 0x36)); n.paragraph_format.space_after = Pt(6); n.paragraph_format.line_spacing = 1.12
font("Title", SERIF, 26, NAVY, bold=False).paragraph_format.space_after = Pt(2)
font("Subtitle", "Arial", 11.5, BLUE, italic=False).paragraph_format.space_after = Pt(4)
h1 = font("Heading 1", SERIF, 15, NAVY, bold=False); h1.paragraph_format.space_before = Pt(16); h1.paragraph_format.space_after = Pt(6); h1.paragraph_format.keep_with_next = True
h2 = font("Heading 2", "Arial", 11, BLUE, bold=True); h2.paragraph_format.space_before = Pt(10); h2.paragraph_format.space_after = Pt(4); h2.paragraph_format.keep_with_next = True
e = font("Eyebrow", "Arial", 9, BLUE, bold=True); e.font.all_caps = True; e.paragraph_format.space_before = Pt(10); e.paragraph_format.space_after = Pt(2)
font("Body Small", "Arial", 8.5, GREY).paragraph_format.space_after = Pt(10)
font("Caption", "Arial", 8, GREY, italic=True, bold=False).paragraph_format.space_after = Pt(10)
font("Disclaimer", "Arial", 7.5, GREY, italic=True).paragraph_format.space_before = Pt(18)
for s in ("List Bullet", "List Number"): font(s, "Arial", 10, RGBColor(0x1F, 0x2A, 0x36)).paragraph_format.space_after = Pt(4)
for p in d.paragraphs:
if p.style.name == "Heading 1": rule(p, RULE_HEX, 6)
if p.style.name == "Subtitle": rule(p, NAVY_HEX, 12, space=8)
if p.style.name == "Caption": p.paragraph_format.keep_with_next = False
for i, p in enumerate(d.paragraphs):
if p.runs and p.runs[0]._r.findall(".//" + qn("w:drawing")):
p.alignment = WD_ALIGN_PARAGRAPH.LEFT; p.paragraph_format.keep_with_next = True
def shade(cell, hexc):
tcPr = cell._tc.get_or_add_tcPr(); s = OxmlElement("w:shd"); s.set(qn("w:val"), "clear"); s.set(qn("w:color"), "auto"); s.set(qn("w:fill"), hexc); tcPr.append(s)
def borders(tbl):
tblPr = tbl._tbl.tblPr; b = OxmlElement("w:tblBorders")
for side in ("top", "bottom", "insideH"):
el = OxmlElement(f"w:{side}"); el.set(qn("w:val"), "single"); el.set(qn("w:sz"), "4"); el.set(qn("w:color"), RULE_HEX); b.append(el)
for side in ("left", "right", "insideV"):
el = OxmlElement(f"w:{side}"); el.set(qn("w:val"), "nil"); b.append(el)
tblPr.append(b)
for ti, t in enumerate(d.tables):
t.alignment = WD_TABLE_ALIGNMENT.LEFT; borders(t)
grid = t._tbl.tblGrid
for j, gc in enumerate(grid.findall(qn("w:gridCol"))):
gc.set(qn("w:w"), str(int(t.cell(0, j).width.inches * 1440)))
ncol = len(t.columns)
for i, row in enumerate(t.rows):
trPr = row._tr.get_or_add_trPr(); cs = OxmlElement("w:cantSplit"); trPr.append(cs)
label = row.cells[0].text
total = label in ("Effective gross income", "Total operating expenses", "Net operating income", "Recommendation")
for j, c in enumerate(row.cells):
for p in c.paragraphs:
p.paragraph_format.space_after = Pt(1); p.paragraph_format.space_before = Pt(1)
if j > 0 and ti in (1, 2): p.alignment = WD_ALIGN_PARAGRAPH.RIGHT
for r in p.runs:
r.font.size = Pt(8.5); r.font.name = "Arial"
if i == 0: r.font.bold = True; r.font.color.rgb = RGBColor(0xFF, 0xFF, 0xFF)
elif total: r.font.bold = True; r.font.color.rgb = NAVY
if i == 0: shade(c, NAVY_HEX)
elif total: shade(c, LIGHT_HEX)
elif ti == 0 and j == 0: shade(c, "F4F6F9")
if i == 0:
hdr = OxmlElement("w:tblHeader"); trPr.append(hdr)
# footer
for s in d.sections:
fp = s.footer.paragraphs[0]; fp.text = "Walker & Dunlop · Investment committee memorandum · The Mark at Brickyard · Confidential draft for committee use"
for r in fp.runs: r.font.size = Pt(7.5); r.font.color.rgb = GREY; r.font.name = "Arial"
d.save(FMT)
print("plain:", PLAIN, "formatted:", FMT)
cd /vercel/sandbox; python3 - <<'EOF'
s=open('scripts/build_wd_ic_memo.py').read()
s=s.replace(''' fp = s.footer.paragraphs[0]; fp.text = "Walker & Dunlop · Investment committee memorandum · The Mark at Brickyard · Confidential draft for committee use"
for r in fp.runs:''',''' fp = s.footer.paragraphs[0]
for r in fp.runs:''')
s=s.replace('''doc.save(PLAIN)''','''for s in doc.sections:
s.footer.paragraphs[0].text = "Walker & Dunlop · Investment committee memorandum · The Mark at Brickyard"
doc.save(PLAIN)''')
open('scripts/build_wd_ic_memo.py','w').write(s)
EOF
rm -f scratch/wd_*; mkdir -p scratch/qa; python3 scripts/build_wd_ic_memo.py scratch/wd_plain.docx scratch/wd_fmt.docx && python3 skills/docx/scripts/verify_text_unchanged.py scratch/wd_plain.docx scratch/wd_fmt.docx && cd scratch/qa && rm -f * && libreoffice --headless --convert-to pdf ../wd_fmt.docx --outdir . >/dev/null 2>&1; pdftoppm -png -r 110 wd_fmt.pdf page; lscd /vercel/sandbox; python3 - <<'EOF'
s=open('scripts/build_wd_ic_memo.py').read()
s=s.replace('"DSCR binds at $63.3M, well below the $80M request"', 'r"DSCR binds at \\$63.3M, well below the \\$80M request"')
s=s.replace('m = lambda v, d=1: f"${v/1e6:,.{d}f}M"','m = lambda v, d=1: f"${v/1e6:,.{d}f}M" if v >= 0 else f"(${-v/1e6:,.{d}f}M)"')
s=s.replace('doc.add_picture("scratch/wd_chart_sizing.png", width=Inches(6.4))','doc.add_picture("scratch/wd_chart_sizing.png", width=Inches(5.9))')
s=s.replace('figsize=(6.2, 2.5), dpi=220','figsize=(6.2, 2.25), dpi=220')
s=s.replace(''' p.paragraph_format.space_after = Pt(1); p.paragraph_format.space_before = Pt(1)''',''' p.paragraph_format.space_after = Pt(1); p.paragraph_format.space_before = Pt(1)
if i < len(t.rows) - 1: p.paragraph_format.keep_with_next = True''')
open('scripts/build_wd_ic_memo.py','w').write(s)
EOF
grep -n 'DSCR binds' scripts/build_wd_ic_memo.py
rm -f scratch/wd_*; python3 scripts/build_wd_ic_memo.py scratch/wd_plain.docx scratch/wd_fmt.docx 2>/dev/null && python3 skills/docx/scripts/verify_text_unchanged.py scratch/wd_plain.docx scratch/wd_fmt.docx | head -2 && cd scratch/qa && rm -f * && libreoffice --headless --convert-to pdf ../wd_fmt.docx --outdir . >/dev/null 2>&1; pdftoppm -png -r 110 wd_fmt.pdf page; lscd /vercel/sandbox; python3 - <<'EOF'
s=open('scripts/build_wd_ic_memo.py').read()
chart='''doc.add_picture("scratch/wd_chart_sizing.png", width=Inches(5.9))
P("Figure 1. Maximum loan by credit test. The debt yield test is shown for reference and is not part of the agency sizing box.", "Caption")
'''
s=s.replace(chart,'')
s=s.replace('''P("Table 2. Coverage at the request and at the recommended proceeds.", "Caption")''','''P("Table 2. Coverage at the request and at the recommended proceeds.", "Caption")
'''+chart)
s=s.replace("has moved from 5.50% to 5.73% over the past two years.","has moved from 5.41% in 3Q24 to 5.73% in 2Q26.")
open('scripts/build_wd_ic_memo.py','w').write(s)
EOF
rm -f scratch/wd_*; python3 scripts/build_wd_ic_memo.py scratch/wd_plain.docx scratch/wd_fmt.docx 2>/dev/null && python3 skills/docx/scripts/verify_text_unchanged.py scratch/wd_plain.docx scratch/wd_fmt.docx | head -2 && cd scratch/qa && rm -f * && libreoffice --headless --convert-to pdf ../wd_fmt.docx --outdir . >/dev/null 2>&1; pdftoppm -png -r 80 wd_fmt.pdf page; ls; cd ..; python3 -c "
from PIL import Image; ims=[Image.open(f'qa/page-{i}.png') for i in range(1,6)]; w=sum(i.width for i in ims); h=ims[0].height; c=Image.new('RGB',(w,h),'white'); x=0
for i in ims: c.paste(i,(x,0)); x+=i.width
c.save('qa/strip.png')"Layout looks good. Finalizing metadata and saving.
cd /vercel/sandbox; python3 skills/docx/scripts/finalize_metadata.py scratch/wd_fmt.docx --title "Investment committee memorandum: The Mark at Brickyard" --subject "Fannie Mae 10-year fixed-rate refinance credit recommendation for The Mark at Brickyard" --keywords "Walker & Dunlop; investment committee memo; The Mark at Brickyard; multifamily; Fannie Mae refinance" --author "Walker & Dunlop" --company "Walker & Dunlop" --description "Investment committee memorandum prepared with RealAI." --output "scratch/The Mark at Brickyard_IC Memo_WD.docx"
I've written the Walker & Dunlop IC memo for the $63.25M Fannie Mae 10-year fixed refinance: five pages with your logo, W&D navy colors, four tables and two charts. It recommends approve with conditions.
Headline numbers at $63.25M:
What treating the financials as verified changes, and what it doesn't:
Why it's "with conditions," not a clean approve:
Brand check: the footer says "Walker & Dunlop · Investment committee memorandum" and the file's author and company are set to Walker & Dunlop. I didn't add a "confidential" label because you didn't specify one. Tell me if W&D uses a standard legend.
Files are in the sandbox:
Brand it with this logo instead
cd /vercel/sandbox; f=scratch/inputs/library/01a0f407-d5a8-70d2-9867-f8b7cb3258ac/walkerdunlop.svg; head -c 600 $f; echo; grep -o 'fill="[^"]*"' $f | sort | uniq -c | head; cp $f assets/walkerdunlop.svg; python3 -c "import cairosvg" 2>&1; which rsvg-convert inkscape convert
cd /vercel/sandbox; pip install -q cairosvg 2>&1 | tail -1; python3 -c "
import cairosvg; cairosvg.svg2png(url='assets/walkerdunlop.svg', write_to='assets/walkerdunlop_logo.png', output_width=2800)
from PIL import Image; im=Image.open('assets/walkerdunlop_logo.png'); print(im.size, im.mode)"cd /vercel/sandbox; python3 - <<'EOF'
s=open('scripts/build_wd_ic_memo.py').read()
s=s.replace('LOGO = "assets/walkerdunlop.jpeg"','LOGO = "assets/walkerdunlop_logo.png" # rendered from assets/walkerdunlop.svg (user-supplied)')
s=s.replace('logo_p.add_run().add_picture(LOGO, width=Inches(2.1))','logo_p.add_run().add_picture(LOGO, width=Inches(3.4))')
s=s.replace('NAVY = RGBColor(0x00, 0x2B, 0x4E)','NAVY = RGBColor(0x0F, 0x2B, 0x4D)')
s=s.replace('NAVY_HEX, BLUE_HEX, LIGHT_HEX, RULE_HEX = "002B4E"','NAVY_HEX, BLUE_HEX, LIGHT_HEX, RULE_HEX = "0F2B4D"')
s=s.replace('#002B4E','#0F2B4D')
s=s.replace('if p.style.name == "Subtitle": rule(p, NAVY_HEX, 12, space=8)','if p.style.name == "Subtitle": rule(p, "18BEF0", 12, space=8)')
s=s.replace('cols = ["#0F2B4D", "#9FB3C8", "#3E6E9A", "#C9D3DE"]','cols = ["#0F2B4D", "#9FB3C8", "#18BEF0", "#C9D3DE"]')
open('scripts/build_wd_ic_memo.py','w').write(s)
EOF
grep -c 0F2B4D scripts/build_wd_ic_memo.py
rm -f scratch/wd_* "scratch/The Mark"*; python3 scripts/build_wd_ic_memo.py scratch/wd_plain.docx scratch/wd_fmt.docx 2>/dev/null && python3 skills/docx/scripts/verify_text_unchanged.py scratch/wd_plain.docx scratch/wd_fmt.docx | head -2 && mkdir -p scratch/qa && cd scratch/qa && rm -f * && libreoffice --headless --convert-to pdf ../wd_fmt.docx --outdir . >/dev/null 2>&1; pdftoppm -png -r 200 -f 1 -l 1 wd_fmt.pdf p; pdftoppm -png -r 70 wd_fmt.pdf s; lscd /vercel/sandbox; python3 skills/docx/scripts/finalize_metadata.py scratch/wd_fmt.docx --title "Investment committee memorandum: The Mark at Brickyard" --subject "Fannie Mae 10-year fixed-rate refinance credit recommendation for The Mark at Brickyard" --keywords "Walker & Dunlop; investment committee memo; The Mark at Brickyard; multifamily; Fannie Mae refinance" --author "Walker & Dunlop" --company "Walker & Dunlop" --description "Investment committee memorandum prepared with RealAI." --output "scratch/The Mark at Brickyard_IC Memo_WD.docx" | grep output
The memo now uses your Walker & Dunlop logo, saved as a new version of the same file.
Files are in the sandbox:
This is a read-only snapshot of a RealAI analysis.