AXCS provides preferred equity and rescue capital. In the Austin metro, find market-rate properties of 150+ units built 2000 or later that last sold between mid-2021 and September 2022, with the sale price per unit. For each, show in-place rent change over 12 months, current occupancy, and days on market versus its submarket. Rank them by likelihood that the owner faces a refinancing gap today.
"""Refi-gap screen: Austin MF, 150+ units, built 2000+, last sold Jul-2021..Sep-2022 with a recorded price.
Inputs are copied from RealAI Datamart query results (property_mfr, submarket, market caprate_ts,
market mf_pnl_benchmarks, mortgage_rates). Assumptions are labeled and editable at the top.
"""
import json
# ---------------- Assumptions (editable) ----------------
ACQ_LTV = 0.65 # assumed acquisition loan-to-price (2021-22 vintage), interest-only, no paydown
CAP_TODAY = 0.0490 # Green Street Austin MF cap rate, 2Q26
MKT_OTHER_INC = 0.1290 # Austin other income % of net rent (mf_pnl_benchmarks)
MKT_NOI_MARGIN = 0.4511 # Austin NOI % of EGI (mf_pnl_benchmarks)
# Refi tiers (Freddie CME fixed, 10-yr, 30-yr amort): (LTV max, rate, DSCR min)
TIERS = [(0.65, 0.0606, 1.35), (0.80, 0.0618, 1.25)]
AMORT_YRS = 30
CAP_AT_SALE = {"3Q21": 0.0354, "4Q21": 0.0343, "1Q22": 0.0358, "2Q22": 0.0389, "3Q22": 0.0398}
def quarter(d):
y, m = int(d[:4]), int(d[5:7])
return f"{(m-1)//3+1}Q{str(y)[2:]}"
def constant(r, yrs=AMORT_YRS):
i = r / 12; n = yrs * 12
return 12 * i / (1 - (1 + i) ** -n)
# ---------------- Submarket benchmarks ----------------
SUB = { # id: (name, in-place t12 median chg, occupancy, DOM median)
"716dd44f13f312a4817bbd9423eb3dfe": ("East Central Austin", -0.0353, 0.9260, 63),
"ab4b9968f16b41e70abdec1dadf0974d": ("Far West Blvd", -0.0458, 0.9465, 63),
"bb42723f5a02e4599a1fbd332212f610": ("Round Rock - south", -0.0191, 0.9253, 72),
"6181e5d5b72e4069a7e1d2e65ec08c92": ("Pershing", -0.0268, 0.9131, 72),
"4c7e9a0dd70046840796fcbd67aaaaa0": ("Georgetown - west", -0.0296, 0.9290, 69),
"762e3ab64c7c40341b840a79defcfb9c": ("Cedar Park", -0.0277, 0.9315, 66),
"91823b937bfddb257636785e0ee3a381": ("Walnut Forest", -0.0620, 0.9105, 72),
"d2f950a35ddc82a91e1bd462fb2f0909": ("Round Rock - east", -0.0255, 0.9233, 66),
"fd7bdff3b0991efa1a43d110b35480b0": ("San Marcos/Kyle", -0.0360, 0.9156, 88),
"8acfa38b5a1b4de4c7126d7c954edfa6": ("Brushy Creek", -0.0426, 0.9592, 63),
"8d4dfbd44021ad3126e424824bb3c73b": ("Downtown - south", -0.0539, 0.9532, 67),
}
# ---------------- Properties ----------------
# name, id, submarket, units, yr built, sale date, price, ppu, rent_type,
# in-place avg, in-place t12 median chg, occ, DOM, property NOI margin (None -> market), notes
P = [
("Bell South Shore","b0f5b109f9cf11e435983afc757f4cf3","716dd44f13f312a4817bbd9423eb3dfe",506,2013,"2022-06-09",177156000,350110.67,"MARKET",1955.76,0.0076,0.9506,99,None,""),
("Nalle Woods of Westlake","5618a6580fbbe9ac55b4d5f9bdca9a83","ab4b9968f16b41e70abdec1dadf0974d",238,2003,"2021-07-01",67500000,283613.45,"MARKET",2255.42,-0.0133,0.9496,92,None,""),
("Preserve at Rolling Oaks","2dd0fe6fd999ebf09aa45058e347536b","bb42723f5a02e4599a1fbd332212f610",494,2001,"2022-09-29",137283930,277902.69,"MARKET_AND_AFFORDABLE",1497.22,-0.0221,0.9190,60,0.6157,"Fee owner: Housing Authority of the City of Austin (PFC structure)"),
("Nexus East","cfa587bca572237b50bea121bab99440","6181e5d5b72e4069a7e1d2e65ec08c92",352,2021,"2021-11-22",86875000,246803.98,"MARKET_AND_AFFORDABLE",1565.90,-0.0538,0.9659,152,None,"Bought in lease-up; 57% rent sample coverage"),
("The Summit at Rivery Park","617eace508a346d397fac87ddcde9432","4c7e9a0dd70046840796fcbd67aaaaa0",228,2015,"2022-01-24",51138500,224291.67,"MARKET",1272.60,-0.0245,0.9211,87,None,"56% rent sample coverage"),
("Vera Cedar Park","cd067f2bf9b135a7c42cdd701d10d3df","762e3ab64c7c40341b840a79defcfb9c",242,2022,"2021-12-17",52485125,216880.68,"MARKET",1710.31,-0.0086,0.8430,117,None,"Bought pre-completion"),
("The Reserve at Walnut Creek","0fcfa1dfbda9297a603f4a3f9641cb89","91823b937bfddb257636785e0ee3a381",284,2002,"2022-04-01",59388605,209114.81,"MARKET",1348.63,-0.0493,0.8345,103,None,""),
("Reveal 54","af7af01ac22d70a8fd77d5e857409e70","d2f950a35ddc82a91e1bd462fb2f0909",418,2019,"2021-09-29",85312500,204096.89,"MARKET",1603.83,-0.0313,0.8995,55,0.48,""),
("Palm Valley Apartments","b7ff9ca206175cb45c77cd650e7c51b8","d2f950a35ddc82a91e1bd462fb2f0909",340,2008,"2022-01-14",67250984,197797.01,"MARKET",1255.50,-0.0269,0.9235,48,0.4037,""),
("Ventana at Plum Creek","c8cd2636b6b06a15637962ee2daad3ba","fd7bdff3b0991efa1a43d110b35480b0",180,2018,"2022-02-28",32867700,182598.33,"MARKET",1355.80,-0.0185,0.9667,217,0.4101,"DOM on few leases (9 unleased units)"),
("Lakeline Parmer Lane Apartments","a6b7c5415c2a024dca145a2146518128","8acfa38b5a1b4de4c7126d7c954edfa6",312,2000,"2021-09-15",35000000,112179.49,"MARKET",1169.36,0.0336,0.9135,14,0.3659,"Reported NOI $1.78M used"),
]
LAKELINE_NOI = 1780164.45 # mf_pnl_net_operating_income
recs = []
for (n, pid, sm, u, yb, sd, price, ppu, rt, ipr, ipchg, occ, dom, margin, note) in P:
smn, s_chg, s_occ, s_dom = SUB[sm]
q = quarter(sd)
net_rent = ipr * u * occ * 12
egi = net_rent * (1 + MKT_OTHER_INC)
m = margin if margin is not None else MKT_NOI_MARGIN
noi = LAKELINE_NOI if pid == "a6b7c5415c2a024dca145a2146518128" else egi * m
value = noi / CAP_TODAY
loan = price * ACQ_LTV
proceeds = max(min(ltv * value, noi / (dscr * constant(r))) for ltv, r, dscr in TIERS)
gap = loan - proceeds
recs.append(dict(
entity=n, id=pid, submarket=smn, units=u, year_built=yb, sale_date=sd, sale_qtr=q,
sale_price=price, price_per_unit=ppu, rent_type=rt, note=note,
cap_at_sale=CAP_AT_SALE[q], implied_noi_at_sale=price * CAP_AT_SALE[q],
in_place_rent=ipr, in_place_t12=ipchg, sub_in_place_t12=s_chg, rent_vs_sub=ipchg - s_chg,
occupancy=occ, sub_occupancy=s_occ, occ_vs_sub=occ - s_occ,
dom=dom, sub_dom=s_dom, dom_vs_sub=dom - s_dom,
noi_today=noi, noi_margin=m, noi_chg_vs_sale=noi / (price * CAP_AT_SALE[q]) - 1,
value_today=value, value_per_unit=value / u, value_chg=value / price - 1,
est_loan=loan, refi_proceeds=proceeds, refi_gap=gap, gap_per_unit=gap / u,
gap_pct_of_loan=gap / loan,
))
def label(g):
return "Severe" if g >= 0.30 else ("Material" if g >= 0.10 else ("Thin" if g > 0 else "No gap"))
for r in recs:
r["gap_label"] = label(r["gap_pct_of_loan"])
json.dump(recs, open("refi_gap/records.json", "w"), indent=1)
# Sensitivity: gap % of loan at alternative acquisition LTV and cap rate
sens = []
for r in recs:
row = {"entity": r["entity"]}
for ltv in (0.55, 0.65, 0.75):
for cap in (0.049, 0.0525, 0.055):
v = r["noi_today"] / cap
pr = max(min(l * v, r["noi_today"] / (d * constant(rt))) for l, rt, d in TIERS)
row[f"ltv{int(ltv*100)}_cap{cap*100:.2f}"] = round((r["sale_price"] * ltv - pr) / (r["sale_price"] * ltv), 3)
sens.append(row)
json.dump(sens, open("refi_gap/sensitivity.json", "w"), indent=1)
print(f"debt constants: {[round(constant(t[1]),4) for t in TIERS]}")
hdr = f"{'Property':32} {'$/unit':>8} {'Val/u':>8} {'ValChg':>7} {'NOIchg':>7} {'Loan$M':>7} {'Refi$M':>7} {'Gap$M':>7} {'Gap/u':>8} {'Gap%':>6} {'Label':>8}"
print(hdr)
for r in sorted(recs, key=lambda x: -x["gap_pct_of_loan"]):
print(f"{r['entity'][:32]:32} {r['price_per_unit']:8.0f} {r['value_per_unit']:8.0f} {r['value_chg']:7.1%} {r['noi_chg_vs_sale']:7.1%} "
f"{r['est_loan']/1e6:7.1f} {r['refi_proceeds']/1e6:7.1f} {r['refi_gap']/1e6:7.1f} {r['gap_per_unit']:8.0f} {r['gap_pct_of_loan']:6.1%} {r['gap_label']:>8}")
print()
print(f"{'Property':32} {'IPchg':>7} {'SubIP':>7} {'Occ':>6} {'SubOcc':>6} {'dOcc':>6} {'DOM':>4} {'SubDOM':>6} {'dDOM':>5}")
for r in recs:
print(f"{r['entity'][:32]:32} {r['in_place_t12']:7.2%} {r['sub_in_place_t12']:7.2%} {r['occupancy']:6.1%} {r['sub_occupancy']:6.1%} {r['occ_vs_sub']*100:6.1f} {r['dom']:4d} {r['sub_dom']:6d} {r['dom_vs_sub']:5d}")
print()
for s in sens:
print(s["entity"][:28], {k: v for k, v in s.items() if k != "entity"})
cd /vercel/sandbox && python refi_gap/refi_gap_screen.py
Goal: For a preferred-equity / rescue-capital investor, find public evidence of debt distress or recapitalization for 11 Austin-area apartment properties that last sold between July 2021 and September 2022. This feeds a ranking of which owners likely face a refinancing gap today (current date 2026-09-29).
Properties (name — address — last sale date — sale price — recorded fee owner):
For each property, use web_search (and web_fetch where a result looks relevant) to look for: acquisition financing details (lender, loan amount, loan type e.g., floating-rate bridge / agency / CLO, maturity), foreclosure postings or notices of trustee sale, loan modifications/extensions, special servicing or watchlist mentions (CRE CLO, CMBS/Freddie K-deal), recapitalizations, rescue capital, or resale/listing since the 2021-22 purchase. Also confirm the buyer/sponsor name for the 2021-22 sale. Try 2-3 queries per property (e.g., "<name> Austin apartments loan", "<name> foreclosure", "<sponsor> <name> acquisition"). Keep it efficient; do not spend more than ~4 tool calls per property.
Rules: Report only what a source actually says; do not infer loan terms. Flag conflicts. If nothing is found, say "nothing found". Note that Texas is a non-disclosure state and deed of trust details may not be online.
Output: Save a JSON file at subagents/distress_scan/findings.json with one object per property: {name, sponsor_buyer, lender, loan_amount, loan_type, maturity, distress_signals (list of short strings), sources (list of {url, verbatim_quote})}. Return a compact summary table in your final report with the same fields plus the URL and a short verbatim quote for every fact.
Ran targeted web searches (2-4 per property) for public evidence of debt distress, foreclosure, special servicing, recapitalization, or resale activity on 11 Austin-area apartment properties sold 2021-2022. No property returned a confirmed foreclosure notice, special-servicing/watchlist listing, CMBS/CRE-CLO delinquency report, or recapitalization announcement naming that specific asset. Texas's non-disclosure status and the absence of asset-specific trade-press coverage limited what's discoverable online. Full detail with quotes/URLs saved to subagents/distress_scan/findings.json.
Compact summary table:
| Property | Sponsor/Buyer (confirmed) | Lender/Loan/Maturity | Distress Signals | Confidence |
|---|---|---|---|---|
| Bell South Shore | Bell Partners (Bell Fund VII) | nothing found | None found; Bell reported securing normal acquisition financing in 2023 (multifamilydive.com) | Low-med |
| Nalle Woods of Westlake | Morningside Group | nothing found | None found; still under Morningside mgmt | Low |
| Preserve at Rolling Oaks | Housing Authority of Austin (PFC likely) | nothing found | None found; couldn't locate PFC bond docs | Low |
| Nexus East | TMP Airport Blvd Project LLC (buyer name beyond LLC unconfirmed) | nothing found | None found; Newmark confirmed as sale broker (rebusinessonline.com) | Low |
| Summit at Rivery Park | 1400 Rivery Property LLC (unconfirmed) | nothing found | None found | Low |
| Vera Cedar Park | CRP/SRE Cedar Park II Owner LP — possible Carlyle Realty Partners affiliation (unconfirmed, inferred from unrelated BaFin filing naming "CRP/SRE" entities) | nothing found | None found — flagged conflict: sponsor link is speculative | Low |
| Reserve at Walnut Creek | Reserve Walnut Creek Property Owner LLC (unconfirmed) | nothing found | None found; a SEC CLO exhibit and a generic syndication-loss article both mention "Walnut Creek" but do not refer to this Austin asset — explicitly excluded as false positives | L |
cd /vercel/sandbox && S=skills/multi-entity-analysis/scripts/cross_check.py; python $S --check coverage refi_gap/records.json | head -c 600; echo; python $S --check composite --components gap_pct_of_loan,occ_vs_sub,rent_vs_sub,dom_vs_sub --weights 0.55,-0.15,-0.15,0.15 refi_gap/records.json > refi_gap/composite.json; python -c "
import json;d=json.load(open('refi_gap/composite.json'));
[print(i+1,r['entity'],round(r['score'],1),{k:round(v,2) for k,v in r.get('contributions',{}).items()}) for i,r in enumerate(d['ranked'])]"; python $S --check buckets --field gap_label --expected "Severe,Material,Thin,No gap" refi_gap/records.jsoncd /vercel/sandbox && python - <<'EOF'
import re
p='refi_gap/refi_gap_screen.py'; s=open(p).read()
s=s.replace(''' return "Severe" if g >= 0.30 else ("Material" if g >= 0.10 else ("Thin" if g > 0 else "No gap"))''',''' return "Severe" if g >= 0.40 else ("High" if g >= 0.25 else "Moderate")''')
s+='''
# Current debt yield on assumed loan vs debt yield a 1.25x / 6.18% agency refi requires
req_dy = 1.25 * constant(0.0618)
print(f"required debt yield at 1.25x/6.18%: {req_dy:.2%}")
for r in recs:
print(f"{r['entity'][:32]:32} DY on assumed loan {r['noi_today']/r['est_loan']:.2%} NOI ${r['noi_today']/1e6:.2f}M value ${r['value_today']/1e6:.1f}M")
'''
open(p,'w').write(s)
EOF
python refi_gap/refi_gap_screen.py | tail -13
S=skills/multi-entity-analysis/scripts/cross_check.py
python $S --check buckets --field gap_label --expected "Severe,High,Moderate" refi_gap/records.json | tr -d '\n '; echo
python $S --check composite --components gap_pct_of_loan,occ_vs_sub,rent_vs_sub,dom_vs_sub --weights 0.55,-0.15,-0.15,0.15 refi_gap/records.json > refi_gap/composite.json
python - <<'EOF'
import json
d=json.load(open('refi_gap/composite.json')); R={r['entity']:r for r in json.load(open('refi_gap/records.json'))}
for i,x in enumerate(d['ranked']):
r=R[x['entity']]
print(f"{i+1}. {r['entity']} | score {x['score']:.1f} | {r['gap_label']} | ${r['price_per_unit']:,.0f}/u ({r['sale_date']}) | est val ${r['value_per_unit']:,.0f}/u ({r['value_chg']:+.0%}) | gap ${r['refi_gap']/1e6:.1f}M = ${r['gap_per_unit']:,.0f}/u = {r['gap_pct_of_loan']:.0%} of loan | IP t12 {r['in_place_t12']:+.1%} vs {r['sub_in_place_t12']:+.1%} | occ {r['occupancy']:.1%} vs {r['sub_occupancy']:.1%} | DOM {r['dom']} vs {r['sub_dom']}")
EOF
python $S --check extremum --field gap_per_unit --direction max --claim "Bell South Shore" refi_gap/records.json | tr -d '\n '; echo
python $S --check extremum --field occupancy --direction min --claim "The Reserve at Walnut Creek" refi_gap/records.json | tr -d '\n '; echo
python $S --check predicate --field in_place_t12 --op gt --value 0 --claim "Lakeline Parmer Lane Apartments" refi_gap/records.json | tr -d '\n '; echo
python $S --check predicate --field value_chg --op gt --value 0 --claim "Lakeline Parmer Lane Apartments" refi_gap/records.json | tr -d '\n '; echoEleven market-rate or mixed-income deals fit your filters and have both a recorded price and current operating data. Every one of them likely has a refinancing gap today. The problem is interest rates, not asset value. At a 4.90% Austin multifamily cap rate and about 6.2% on 10-year agency debt at 1.25x coverage , a lender needs about a 9.2% debt yield. If the buyers borrowed 65% of the price, these assets earn only 4.9–7.8% on that loan . Debt coverage is what caps the new loan in every case, not loan-to-value, so the result doesn't change unless cap rates rise above about 5.5%.
The debt is an assumption. I can't see the actual loans (Texas doesn't require sale prices or loan terms to be disclosed). I assumed each buyer borrowed 65% of the price, interest-only, with no paydown.
| # | Property (submarket) | Units / built | Sale date · $/unit | Est. value/unit today | Est. gap ($M · % of loan) | In-place rent 12-mo: property vs submarket | Occupancy: property vs submarket | Days on market: property vs submarket |
|---|---|---|---|---|---|---|---|---|
| 1 | Reserve at Walnut Creek (Walnut Forest) | 284 / 2002 | Apr-22 · $209,115 | $140,369 (−33%) | $17.3M · 45% | −4.9% vs −6.2% | 83.5% vs 91.0% | 103 vs 72 |
| 2 | Summit at Rivery Park (Georgetown W) | 228 / 2015 | Jan-22 · $224,292 | $146,201 (−35%) | $15.4M · 46% | −2.5% vs −3.0% | 92.1% vs 92.9% | 87 vs 69 |
| 3 | Palm Valley (Round Rock E) | 340 / 2008 | Jan-22 · $197,797 | $129,417 (−35%) | $20.2M · 46% | −2.7% vs −2.5% | 92.3% vs 92.3% | 48 vs 66 |
| 4 | Bell South Shore (East Central) | 506 / 2013 | Jun-22 · $350,111 | $231,881 (−34%) | $52.4M · 46% | +0.8% vs −3.5% | 95.1% vs 92.6% | 99 vs 63 |
| 5 | Nexus East (Pershing)† | 352 / 2021 | Nov-21 · $246,804 | $188,646 (−24%) | $21.0M · 37% | −5.4% vs −2.7% | 96.6% vs 91.3% | 152 vs 72 |
| 6 | Vera Cedar Park (Cedar Park) | 242 / 2022 | Dec-21 · $216,881 | $179,827 (−17%) | $10.9M · 32% | −0.9% vs −2.8% | 84.3% vs 93.2% | 117 vs 66 |
| 7 | Ventana at Plum Creek (San Marcos/Kyle) | 180 / 2018 | Feb-22 · $182,598 | $148,613 (−19%) | $7.1M · 33% | −1.8% vs −3.6% | 96.7% vs 91.6% | 217 vs 88‡ |
| 8 | Preserve at Rolling Oaks (Round Rock S)† | 494 / 2001 | Sep-22 · $277,903 | $234,234 (−16%) | $27.4M · 31% | −2.2% vs −1.9% | 91.9% vs 92.5% | 60 vs 72 |
| 9 | Reveal 54 (Round Rock E) | 418 / 2019 | Sep-21 · $204,097 | $191,461 (−6%) | $12.7M · 23% | −3.1% vs −2.5% | 90.0% vs 92.3% | 55 vs 66 |
| 10 | Nalle Woods of Westlake (Far West) | 238 / 2003 | Jul-21 · $283,613 | $267,128 (−6%) | $9.9M · 23% | −1.3% vs −4.6% | 95.0% vs 94.7% | 92 vs 63 |
| 11 | Lakeline Parmer Lane (Brushy Creek) | 312 / 2000 | Sep-21 · $112,179 | $116,442 (+4%) | $3.3M · 15% | +3.4% vs −4.3% | 91.3% vs 95.9% | 14 vs 63 |
Sources: sale data ; property rent, occupancy and days on market ; submarket benchmarks ; modeled value, gap and ranking .
† Mixed market and affordable units. ‡ Ventana's days-on-market figure rests on only 9 unleased units.
No public distress was found. Searches turned up no foreclosure notices, special-servicing mentions or recapitalizations tied to any of these 11 properties. The only practical way to see the actual loans is the deed-of-trust records at the Travis, Williamson and Hays county clerks.
If it would help, I can turn this into an Excel model where you can change the assumed borrowing level, rate and cap rate for each property.
I would like to propose AXCS capabilities to Walnut Creek and propose a solution based on their unique situation. Here is the website for AXCS you can use for your research, and I have attached our logo. https://www.axcscapital.com/
cd /vercel/sandbox && head -c 1500 proposal/AXCS_logo.svg; echo; wc -c proposal/AXCS_logo.svg; cat subagents/distress_scan/findings.json | python -c "import json,sys;d=json.load(sys.stdin);d=d if isinstance(d,list) else d.get('properties',d);[print(json.dumps(x)[:1500]) for x in d if 'Walnut' in json.dumps(x)]""""Outside-in recapitalization sizing for The Reserve at Walnut Creek (284 units, Austin 78754).
Inputs from RealAI Datamart; assumptions labeled. Illustrative only - to be replaced by owner's T12, rent roll, loan docs.
"""
UNITS = 284
PRICE = 59_388_605 # Apr-2022 sale
ACQ_LTV = 0.65 # assumption (loan not observed)
IP_RENT = 1348.63 # in-place avg, Sep-2026
OCC_NOW = 0.8345 # physical occupancy, Sep-2026
OCC_STAB = 0.94 # stabilization target (property ran 93-99% Jan-Aug 2026; submarket 91.05%)
OTHER_INC = 0.129 # Austin other income % of net rent
NOI_MARGIN = 0.4511 # Austin NOI % of EGI
CAP = 0.049 # Austin MF cap 2Q26
TAX = 802_870.41 # 2025 property tax
ASSESSED = 36_449_625 # 2025 assessed value
def constant(r, yrs=30):
i = r / 12; n = yrs * 12
return 12 * i / (1 - (1 + i) ** -n)
def noi(occ, rent=IP_RENT):
return rent * UNITS * occ * 12 * (1 + OTHER_INC) * NOI_MARGIN
loan = PRICE * ACQ_LTV
noi_now, noi_stab = noi(OCC_NOW), noi(OCC_STAB)
val_now, val_stab = noi_now / CAP, noi_stab / CAP
agency_now = min(0.80 * val_now, noi_now / (1.25 * constant(0.0618)))
agency_stab = min(0.80 * val_stab, noi_stab / (1.25 * constant(0.0618)))
print(f"Assumed existing loan: ${loan/1e6:.1f}M (${loan/UNITS:,.0f}/unit)")
print(f"NOI today @ {OCC_NOW:.1%}: ${noi_now/1e6:.2f}M | value ${val_now/1e6:.1f}M (${val_now/UNITS:,.0f}/u)")
print(f"NOI stabilized @ {OCC_STAB:.0%}: ${noi_stab/1e6:.2f}M | value ${val_stab/1e6:.1f}M (${val_stab/UNITS:,.0f}/u)")
print(f"Agency proceeds today ${agency_now/1e6:.1f}M -> gap ${ (loan-agency_now)/1e6:.1f}M")
print(f"Agency proceeds stabilized ${agency_stab/1e6:.1f}M -> gap ${ (loan-agency_stab)/1e6:.1f}M")
print(f"Debt yield on assumed loan: today {noi_now/loan:.2%}, stabilized {noi_stab/loan:.2%}")
print(f"Assessed value ${ASSESSED/1e6:.1f}M = {ASSESSED/PRICE-1:+.0%} vs purchase; tax/unit ${TAX/UNITS:,.0f}")
print(f"Lost occupancy revenue: {(OCC_STAB-OCC_NOW)*UNITS:.0f} units x rent = ${(OCC_STAB-OCC_NOW)*UNITS*IP_RENT*12/1e6:.2f}M/yr gross")
# ---- Illustrative recap: bridge-to-stabilization + AXCS rescue preferred equity ----
SR_LTV = 0.65 # new senior bridge sized on current value (GSP-placed)
PREF_CAP = 0.80 # AXCS pref attaches to 80% of current value (last-dollar basis)
RESERVES = 1_500_000 # capex/lease-up + interest-carry reserve funded by pref (assumption)
senior = SR_LTV * val_now
pref_total = PREF_CAP * val_now - senior
pref_to_payoff = pref_total - RESERVES
payoff_capacity = senior + pref_to_payoff
residual = loan - payoff_capacity
print("\n-- Illustrative recap (sized on today's value) --")
print(f"New senior bridge {SR_LTV:.0%}: ${senior/1e6:.1f}M")
print(f"AXCS preferred equity to {PREF_CAP:.0%}: ${pref_total/1e6:.1f}M (of which reserves ${RESERVES/1e6:.1f}M)")
print(f"Capital available to retire existing loan: ${payoff_capacity/1e6:.1f}M")
print(f"Residual to resolve (lender discount/modification + sponsor equity): ${residual/1e6:.1f}M = {residual/loan:.0%} of existing loan")
for split in (0.5,):
print(f" e.g. {split:.0%} lender DPO/modification = ${residual*split/1e6:.1f}M ({residual*split/loan:.0%} of loan); sponsor new equity ${residual*(1-split)/1e6:.1f}M")
# Exit test at stabilization
print("\n-- Exit test at stabilization --")
exit_agency = agency_stab
print(f"Stabilized agency takeout ${exit_agency/1e6:.1f}M vs senior+pref ${ (senior+pref_total)/1e6:.1f}M -> coverage {exit_agency/(senior+pref_total):.0%}")
print(f"Stabilized value ${val_stab/1e6:.1f}M; senior+pref LTV at stabilization {(senior+pref_total)/val_stab:.0%}")
print(f"Pref attachment: {senior/val_now:.0%}-{(senior+pref_total)/val_now:.0%} of today's value; ${senior/UNITS:,.0f}-${(senior+pref_total)/UNITS:,.0f}/unit")
cd /vercel/sandbox && python proposal/walnut_creek_solution.py
cd /vercel/sandbox && cat >> proposal/walnut_creek_solution.py <<'EOF'
print("\n-- Takeout hurdle and loan-size sensitivity --")
need = (senior + pref_total) * 1.25 * constant(0.0618)
print(f"NOI needed for agency takeout of senior+pref: ${need/1e6:.2f}M = {need/noi_stab-1:+.0%} vs stabilized NOI")
for r in (0.0518, 0.0550):
print(f" agency takeout at {r:.2%} rate on stabilized NOI: ${min(0.8*val_stab, noi_stab/(1.25*constant(r)))/1e6:.1f}M")
for ltv in (0.55, 0.65, 0.75):
L = PRICE*ltv
print(f" existing loan @ {ltv:.0%} LTV ${L/1e6:.1f}M -> residual after senior+pref payoff ${ (L-payoff_capacity)/1e6:.1f}M")
EOF
python proposal/walnut_creek_solution.py | tail -7cd /vercel/sandbox/proposal && python -c "import docx, matplotlib; print('ok')"; python -c "import cairosvg" 2>&1 | tail -1; which rsvg-convert convert magickcd /vercel/sandbox/proposal && (pip install -q cairosvg 2>&1 | tail -1); python -c "import cairosvg; cairosvg.svg2png(url='AXCS_logo.svg', write_to='logo.png', output_width=800)" && python -c "from PIL import Image; im=Image.open('logo.png'); print(im.size, im.mode)"import matplotlib
matplotlib.use("Agg")
import matplotlib.pyplot as plt
from docx import Document
from docx.shared import Pt, RGBColor, Inches, Cm
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
NAVY = RGBColor(0x00, 0x3D, 0x59); TEAL = RGBColor(0x2A, 0x84, 0x9E); GREY = RGBColor(0x55, 0x5F, 0x66)
NAVY_HEX, TEAL_HEX, LIGHT_HEX = "003D59", "2A849E", "E8F2F5"
# ---------------- Chart: occupancy and asking rent, monthly (RealAI Rent Index) ----------------
months = ["Sep-24","Oct-24","Nov-24","Dec-24","Jan-25","Feb-25","Mar-25","Apr-25","May-25","Jun-25","Jul-25","Aug-25",
"Sep-25","Oct-25","Nov-25","Dec-25","Jan-26","Feb-26","Mar-26","Apr-26","May-26","Jun-26","Jul-26","Aug-26","Sep-26*"]
occ = [93.3,95.4,96.8,96.5,94.4,95.4,95.1,96.1,95.4,96.1,96.5,95.1,93.7,93.3,94.0,93.7,93.7,94.7,95.4,97.9,97.2,98.6,98.2,98.6,83.5]
ask = [1465,1422,1427,1495,1474,1479,1466,1460,1426,1455,1458,1436,1423,1386,1393,1425,1417,1369,1354,1307,1325,1349,1207,1235,1071]
fig, ax1 = plt.subplots(figsize=(7.2, 3.0), dpi=200)
ax1.plot(months, occ, color="#003D59", lw=2.2, marker="o", ms=3, label="Physical occupancy (%)")
ax1.axhline(91.05, color="#003D59", ls=":", lw=1); ax1.text(0.2, 91.4, "Walnut Forest submarket occupancy 91.1%", fontsize=6.5, color="#003D59")
ax1.set_ylim(80, 100); ax1.set_ylabel("Occupancy (%)", fontsize=8, color="#003D59")
ax2 = ax1.twinx(); ax2.plot(months, ask, color="#2A849E", lw=2.2, marker="s", ms=3, label="Avg asking rent ($)")
ax2.set_ylim(1000, 1600); ax2.set_ylabel("Asking rent ($/mo)", fontsize=8, color="#2A849E")
for a in (ax1, ax2):
a.tick_params(labelsize=6.5); [s.set_visible(False) for s in a.spines.values()]
ax1.set_xticks(range(0, len(months), 3)); ax1.set_xticklabels(months[::3])
h1, l1 = ax1.get_legend_handles_labels(); h2, l2 = ax2.get_legend_handles_labels()
ax1.legend(h1 + h2, l1 + l2, fontsize=6.5, loc="lower left", frameon=False)
ax1.grid(axis="y", color="#DDDDDD", lw=0.5)
plt.tight_layout(); plt.savefig("chart_ops.png"); plt.close()
# ---------------- Document ----------------
doc = Document()
sec = doc.sections[0]
sec.left_margin = sec.right_margin = Inches(0.9); sec.top_margin = Inches(0.7); sec.bottom_margin = Inches(0.7)
st = doc.styles["Normal"]; st.font.name = "Calibri"; st.font.size = Pt(10.5); st.font.color.rgb = RGBColor(0x22,0x2B,0x30)
st.element.rPr.rFonts.set(qn("w:eastAsia"), "Calibri")
st.paragraph_format.space_after = Pt(5); st.paragraph_format.line_spacing = 1.12
for lvl, size, col in ((1, 15, NAVY), (2, 12, TEAL)):
h = doc.styles[f"Heading {lvl}"]; h.font.name = "Calibri"; h.font.size = Pt(size); h.font.bold = True; h.font.color.rgb = col
h.element.rPr.rFonts.set(qn("w:asciiTheme"), "") if False else None
h.paragraph_format.space_before = Pt(12 if lvl == 1 else 8); h.paragraph_format.space_after = Pt(4)
def shade(cell, hexcol):
tcPr = cell._tc.get_or_add_tcPr(); sh = OxmlElement("w:shd")
sh.set(qn("w:val"), "clear"); sh.set(qn("w:color"), "auto"); sh.set(qn("w:fill"), hexcol); tcPr.append(sh)
def bottom_rule(p, hexcol=TEAL_HEX, sz="12"):
pPr = p._p.get_or_add_pPr(); b = OxmlElement("w:pBdr"); bt = OxmlElement("w:bottom")
bt.set(qn("w:val"), "single"); bt.set(qn("w:sz"), sz); bt.set(qn("w:space"), "4"); bt.set(qn("w:color"), hexcol)
b.append(bt); pPr.append(b)
def para(text="", bold_lead=None, size=None, color=None, italic=False, align=None, after=None):
p = doc.add_paragraph()
if bold_lead:
r = p.add_run(bold_lead); r.bold = True; r.font.color.rgb = NAVY
if size: r.font.size = Pt(size)
r = p.add_run(text); r.italic = italic
if size: r.font.size = Pt(size)
if color: r.font.color.rgb = color
if align: p.alignment = align
if after is not None: p.paragraph_format.space_after = Pt(after)
return p
def bullet(text, lead=None):
p = doc.add_paragraph(style="List Bullet")
if lead:
r = p.add_run(lead); r.bold = True; r.font.color.rgb = NAVY
p.add_run(text); p.paragraph_format.space_after = Pt(3)
return p
def table(rows, widths, header=True, bold_last=False, zebra=True, size=9):
t = doc.add_table(rows=len(rows), cols=len(rows[0])); t.alignment = WD_TABLE_ALIGNMENT.CENTER
t.style = "Table Grid"
for i, row in enumerate(rows):
for j, val in enumerate(row):
c = t.cell(i, j); c.width = Inches(widths[j]); c.text = ""
p = c.paragraphs[0]; r = p.add_run(str(val)); r.font.size = Pt(size)
p.paragraph_format.space_after = Pt(1)
if j > 0: p.alignment = WD_ALIGN_PARAGRAPH.RIGHT if any(ch.isdigit() for ch in str(val)[:3]) or str(val)[:1] in "$(-+~[" else WD_ALIGN_PARAGRAPH.LEFT
if header and i == 0:
shade(c, NAVY_HEX); r.bold = True; r.font.color.rgb = RGBColor(0xFF,0xFF,0xFF)
elif zebra and i % 2 == 0:
shade(c, LIGHT_HEX)
if bold_last and i == len(rows) - 1: r.bold = True
# light borders
tbl = t._tbl; tblPr = tbl.tblPr; borders = OxmlElement("w:tblBorders")
for e in ("top","left","bottom","right","insideH","insideV"):
el = OxmlElement(f"w:{e}"); el.set(qn("w:val"), "single"); el.set(qn("w:sz"), "4"); el.set(qn("w:color"), "C9D6DC"); borders.append(el)
tblPr.append(borders)
doc.add_paragraph().paragraph_format.space_after = Pt(2)
return t
# Header / footer
hdr = sec.header.paragraphs[0]; hdr.text = ""; r = hdr.add_run("ΛXCS Capital | Confidential discussion draft"); r.font.size = Pt(8); r.font.color.rgb = GREY
hdr.alignment = WD_ALIGN_PARAGRAPH.RIGHT
ftr = sec.footer.paragraphs[0]; r = ftr.add_run("ΛXCS Capital · 1900 Avenue of the Stars, Suite 250, Los Angeles, CA 90067 · 650 Fifth Avenue, Suite 1100, New York, NY 10022 · info@axcscapital.com")
r.font.size = Pt(7.5); r.font.color.rgb = GREY; ftr.alignment = WD_ALIGN_PARAGRAPH.CENTER
# ---------------- Cover block ----------------
p = doc.add_paragraph(); p.add_run().add_picture("logo.png", width=Inches(1.15)); p.paragraph_format.space_after = Pt(10)
p = doc.add_paragraph(); r = p.add_run("Recapitalization Proposal"); r.bold = True; r.font.size = Pt(24); r.font.color.rgb = NAVY
p.paragraph_format.space_after = Pt(0)
p = doc.add_paragraph(); r = p.add_run("The Reserve at Walnut Creek · 284 units · 8038 Exchange Drive, Austin, TX 78754"); r.font.size = Pt(12.5); r.font.color.rgb = TEAL; r.bold = True
bottom_rule(p)
para("Prepared for: Ownership, Reserve Walnut Creek Property Owner LLC", size=9.5, color=GREY, after=0)
para("Prepared by: ΛXCS Investments, with George Smith Partners (GSP)", size=9.5, color=GREY, after=0)
para("Date: September 29, 2026", size=9.5, color=GREY, after=10)
# ---------------- 1. Executive summary ----------------
doc.add_heading("1. Executive summary", level=1)
para("The Reserve at Walnut Creek is a well-located, 2015-renovated garden community whose rents are still "
"affordable for its residents. It was bought in April 2022 for $59.4 million ($209,115 per unit), when "
"Austin multifamily cap rates were near 3.9%. Cap rates are now 4.9% and 10-year agency debt costs about "
"6.2%. On our outside-in estimate, today's lenders would size a new loan at about $21 million. That leaves "
"a gap of roughly $17 million against a typical 2022 acquisition loan.")
para("The asset isn't broken; the capital stack is. September's move-outs and rent cuts have made that gap "
"urgent. ΛXCS proposes a three-part recapitalization that keeps the current sponsor in control and buys "
"the time and reserves needed to re-stabilize:")
bullet(" GSP negotiates with the current lender: an extension or modification, or a discounted payoff, on the existing loan.", "Lender resolution.")
bullet(" GSP places a senior bridge loan sized to today's value (about $25.9 million, 65% of value).", "New senior bridge.")
bullet(" About $6.0 million of preferred equity from ΛXCS. This fills the stack to 80% of today's value and funds a $1.5 million lease-up, capex and interest reserve. The sponsor keeps the upside after the preferred return.", "ΛXCS rescue preferred equity.")
para("We are asking for a no-cost, NDA-protected exchange of the T-12, rent roll and loan documents. That lets us turn "
"this outside-in view into an indicative term sheet within two weeks of receipt.", italic=True, color=GREY)
# ---------------- 2. What we see ----------------
doc.add_heading("2. What we see: a good asset under sudden leasing pressure", level=1)
doc.add_picture("chart_ops.png", width=Inches(6.6))
cap = para("Monthly physical occupancy and average asking rent. *Sep-26 is the latest weekly reading (week of Sep 26). Source: RealAI Rent Index.", size=8, color=GREY, italic=True)
table([
["Indicator (latest)", "Reserve at Walnut Creek", "Walnut Forest submarket", "Read"],
["Physical occupancy", "83.5%", "91.0%", "Down from 98.6% three months ago"],
["Asking rent (avg)", "$1,071", "$1,318", "−11.6% in 3 months, −11.6% YoY"],
["In-place rent (avg), 12-mo change", "$1,349; −4.9%", "$1,295; −6.2%", "Rents holding better than the submarket"],
["New-lease trade-out", "−18.2%", "−5.3%", "Aggressive pricing to refill units"],
["Days on market (leases signed, 30 days)", "103", "72", "Absorbing slower than peers"],
["Retention (trailing 12 months)", "73.2%", "65.8%", "Residents who stay are sticky"],
["Rent-to-income ratio", "15.7%", "n/a", "Below Austin average: residents can afford rent"],
["2025 assessed value", "$36.4M ($128,344/unit)", "", "−39% vs. purchase price"],
], [2.0, 1.55, 1.35, 1.9])
para("Our read: until this summer the property ran at 93–99% occupancy. The September drop to 83.5% "
"(54 unleased units) coincided with a sharp asking-rent reset. That is typical of a leasing push while "
"cash flow is being squeezed by debt service. The fundamentals that matter for recovery are intact: "
"better-than-submarket in-place rents, 73% retention, affordable rents relative to income, and a "
"renovated unit finish (LVP, stone counters, in-unit W/D, garages). If the 30 units lost above 94% occupancy are re-leased at today's "
"in-place rent, that adds about $0.48 million a year to gross revenue.")
# ---------------- 3. The capital gap ----------------
doc.add_heading("3. The capital gap, outside-in", level=1)
table([
["", "Amount", "Per unit", "Basis"],
["April 2022 purchase price", "$59.4M", "$209,115", "Recorded sale"],
["Assumed acquisition loan (65% LTV)", "$38.6M", "$135,925", "Assumption; loan not publicly recorded"],
["Estimated NOI today (83.5% occupied)", "$1.95M", "$6,878", "In-place rent + Austin opex benchmarks"],
["Estimated value today (4.90% cap)", "$39.9M", "$140,369", "−33% vs. purchase"],
["Max agency refinance today (1.25x DSCR, 6.18%)", "$21.3M", "$74,942", "Coverage, not LTV, sets the loan size"],
["Estimated refinance gap", "$17.3M", "$60,898", "≈45% of the assumed loan"],
], [2.6, 0.9, 0.9, 2.4], bold_last=True)
para("Two points shape the solution:")
bullet(" Even at 94% occupancy, NOI of about $2.20 million supports only about $24.0 million of agency debt. Operational recovery alone doesn't close the gap at today's rates, which is why patient structured capital is needed.", "Re-stabilizing helps but doesn't solve it.")
bullet(" The debt yield on the assumed loan is about 5.1%. Today's agency sizing needs roughly 9.2%. Any lender is therefore better served by a funded recapitalization than by a forced sale into a market that has repriced about 33%.", "The lender has a reason to negotiate.")
# ---------------- 4. Proposed solution ----------------
doc.add_heading("4. Proposed solution: a sponsor-friendly rescue recapitalization", level=1)
doc.add_heading("Illustrative sources and uses (sized to today's value)", level=2)
table([
["Sources", "Amount", "% of today's value", "Uses", "Amount"],
["New senior bridge (GSP-placed)", "$25.9M", "65%", "Retire / restructure existing loan", "$30.4M"],
["ΛXCS preferred equity", "$6.0M", "65–80%", "Lease-up, capex & interest reserve", "$1.5M"],
["Lender concession + sponsor equity", "$8.2M", "—", "Residual existing-loan balance", "$8.2M"],
["Total", "$40.1M", "", "Total", "$40.1M"],
], [2.05, 0.8, 1.05, 2.05, 0.8], bold_last=True)
para("The $8.2 million residual is the piece to negotiate. For example, it could be split between a lender "
"discount or modification of about $4.1 million (11% of the loan) and $4.1 million of new sponsor equity. "
"If the actual loan was 55% of the purchase price rather than 65%, the residual falls to about $2.3 million. "
"If it was 75%, the residual rises to about $14.1 million, and a longer extension with the current lender "
"becomes the better first step.", size=9.5)
doc.add_heading("Why each piece is there", level=2)
bullet(" GSP's loan restructuring and loan sale teams open the conversation with the current lender, special servicer or CLO manager. The goal is an extension, rate cap or interest relief, or a discounted payoff. If the lender prefers to exit, GSP can arrange a note sale to a friendly buyer.", "Step 1: Lender resolution (GSP).")
bullet(" A 3-year floating-rate bridge (plus extensions) from GSP's bank, debt fund and credit-platform relationships. It is sized to in-place income, with future funding for the leasing plan.", "Step 2: Senior bridge (GSP).")
bullet(" Preferred equity attaching at about 65–80% of today's value (about $91,000–$112,000 per unit). A 2026 purchase at that basis would be a deep discount to the 2022 price. The sponsor keeps control of day-to-day operations and all upside above the preferred return.", "Step 3: ΛXCS preferred equity.")
bullet(" Where the sponsor also needs GP capital, ΛXCS can invest as a co-GP instead of, or alongside, the preferred equity.", "Optional: co-GP capital.")
bullet(" Energy and water upgrades (HVAC, roofs, water fixtures) can be financed off-balance-sheet through Texas PACE via ΛXCS's C-PACE platform, subject to program eligibility and senior lender consent. That preserves reserves for leasing.", "Optional: C-PACE.")
doc.add_heading("Indicative preferred equity framework (for discussion)", level=2)
table([
["Term", "Indicative structure"],
["Amount", "~$6.0M (including ~$1.5M reserves), to be refined on T-12 / rent roll"],
["Position", "Preferred equity in the property-owning entity, behind the new senior bridge"],
["Attachment / detachment", "~65% / ~80% of current value (~$91K–$112K per unit)"],
["Preferred return", "[__]% current pay + [__]% accrued, set at term sheet"],
["Term", "3 years + [1+1] extensions, matched to the senior bridge"],
["Sponsor role", "Sponsor remains managing member; ΛXCS has customary major-decision consents"],
["Protections", "Budget and leasing-plan approvals; performance triggers; step-in rights on default"],
["Redemption", "From sale or refinance proceeds, any time after a minimum-return period"],
], [1.7, 5.1])
para("Economic terms are placeholders pending ΛXCS investment committee review and diligence.", size=8.5, italic=True, color=GREY)
# ---------------- 5. Business plan and exits ----------------
doc.add_heading("5. Path to stabilization and exit", level=1)
bullet(" Re-lease the 54 unleased units and return to at least 94% occupancy. Stop blanket asking-rent cuts; lead with targeted concessions and renewals, building on a 73% retention base.", "Months 0–9: refill.")
bullet(" Hold in-place rent near $1,350 and rebuild trade-outs as Walnut Forest supply is absorbed. Review the property-tax assessment each year (the 2025 assessment of $36.4 million already reflects the repricing).", "Months 6–18: protect rent.")
bullet(" At about $2.20 million of stabilized NOI, the property would be worth about $44.9 million at a 4.9% cap. Senior bridge plus preferred equity would then be about 71% of value, a workable sale or recapitalization exit.", "Months 18–36: exit.")
para("To be candid: at today's 6.2% agency rates, a stabilized agency refinance (about $24.0 million) covers about "
"75% of the senior bridge plus preferred equity. Taking out both through an agency loan needs either about "
"33% more NOI or lower rates. At a 5.5% agency rate, proceeds rise to about $25.8 million. The base case "
"exit is therefore a sale or recapitalization at stabilization, with an agency refinance as the upside case.", size=9.5)
# ---------------- 6. Why AXCS ----------------
doc.add_heading("6. Why ΛXCS", level=1)
bullet(" ΛXCS Investments' focus is co-GP investments and preferred equity / mezzanine capital, including opportunistic and special-situations capital such as preferred equity and rescue capital.", "Built for this situation.")
bullet(" Senior decision makers are involved from sourcing to close. We underwrite in-house, manage documentation and stay hands-on through execution.", "One team, start to finish.")
bullet(" Through George Smith Partners, founded in 1992, we've facilitated transactions totaling over $100 billion, of which GSP directly closed or placed over $35 billion. GSP covers debt, structured finance, JV equity, loan restructuring and loan sales, with affiliates including Texas.", "The full capital stack, in-house.")
bullet(" More than 75 CRE professionals, supported by technology that brings transparency, speed and accuracy to execution.", "Speed and certainty.")
# ---------------- 7. Next steps ----------------
doc.add_heading("7. Proposed next steps", level=1)
table([
["Step", "What", "Timing"],
["1", "Introductory call; mutual NDA", "Week 1"],
["2", "Owner shares T-12, current rent roll, loan agreement, maturity and extension terms, lender contact", "Week 1–2"],
["3", "ΛXCS / GSP underwriting; indicative term sheet and lender strategy", "Within 2 weeks of data"],
["4", "Joint approach to the existing lender; senior bridge quotes", "Weeks 3–6"],
["5", "Diligence, documentation and close", "Target 60–90 days"],
], [0.5, 4.7, 1.6])
# ---------------- Appendix ----------------
doc.add_heading("Appendix: basis of estimates", level=1)
for t in [
"Outside-in estimates only. The existing loan amount, rate, maturity and lender are not publicly recorded in Texas; we assumed a 65%-of-price, interest-only acquisition loan. Every figure will be replaced with the owner's actual documents.",
"Property operating data: RealAI Rent Index (weekly, as of September 26, 2026), 74% unit coverage, 'Excellent' sample confidence. Submarket: Walnut Forest.",
"NOI: in-place rent × 284 units × occupancy × 12, plus other income at 12.9% of rent, times the Austin NOI margin of 45.1% of income (RealAI Ops Benchmarks, 577-property sample).",
"Value: Green Street Austin multifamily cap rate of 4.90% (2Q26). Agency sizing: Freddie Mac CME 10-year fixed, 80% LTV maximum, 1.25x DSCR, 6.18%, 30-year amortization (as of September 23, 2026).",
"Property tax and assessment: Travis County tax roll, 2025 tax year ($802,870; $36.4 million assessed).",
]:
bullet(" " + t)
para("This document is a confidential discussion draft for the recipient only. It is not an offer or a commitment to "
"lend or invest. Any transaction is subject to diligence, investment committee approval and definitive documentation.",
size=8, italic=True, color=GREY)
doc.save("AXCS_Proposal_Reserve_at_Walnut_Creek.docx")
print("saved")
cd /vercel/sandbox/proposal && sed -i 's/\["Lender concession + sponsor equity", "\$8.2M"/["Lender concession (non-cash) + sponsor equity", "$8.2M"/' build_proposal.py && python build_proposal.py && soffice --headless --convert-to pdf AXCS_Proposal_Reserve_at_Walnut_Creek.docx --outdir preview >/dev/null 2>&1; pdfinfo preview/*.pdf | grep Pages; pdftoppm -r 50 -png preview/AXCS_Proposal_Reserve_at_Walnut_Creek.pdf preview/pg; ls preview
cd /vercel/sandbox/proposal && libreoffice --headless --convert-to pdf AXCS_Proposal_Reserve_at_Walnut_Creek.docx --outdir preview 2>&1 | tail -2; pdfinfo preview/*.pdf | grep Pages; pdftoppm -r 45 -png preview/AXCS_Proposal_Reserve_at_Walnut_Creek.pdf preview/pg; python -c "
from PIL import Image; import glob
fs=sorted(glob.glob('preview/pg*.png')); ims=[Image.open(f) for f in fs]
w=sum(i.width for i in ims); h=max(i.height for i in ims); m=Image.new('RGB',(w,h),'white'); x=0
for i in ims: m.paste(i,(x,0)); x+=i.width
m.save('preview/montage.png'); print(m.size)"cd /vercel/sandbox/proposal && pdftotext -layout -f 1 -l 2 preview/AXCS_Proposal_Reserve_at_Walnut_Creek.pdf - | head -70; python -c "
from PIL import Image; im=Image.open('logo.png'); print(im.getbbox(), im.getchannel('A').getextrema())"cd /vercel/sandbox/proposal && python - <<'EOF'
p='build_proposal.py'; s=open(p).read()
s=s.replace(' t.style = "Table Grid"\n',' t.style = "Table Grid"; t.autofit = False\n tl = OxmlElement("w:tblLayout"); tl.set(qn("w:type"), "fixed"); t._tbl.tblPr.append(tl)\n for j, w in enumerate(widths):\n t.columns[j].width = Inches(w)\n')
s=s.replace("That is typical of a leasing push while cash flow is being squeezed by debt service.","That pattern is consistent with a push to refill units while debt service squeezes cash flow; the owner's rent roll will confirm the cause.")
open(p,'w').write(s)
EOF
python build_proposal.py && libreoffice --headless --convert-to pdf AXCS_Proposal_Reserve_at_Walnut_Creek.docx --outdir preview >/dev/null 2>&1; pdfinfo preview/*.pdf | grep Pages; pdftotext -layout -f 3 -l 5 preview/AXCS_Proposal_Reserve_at_Walnut_Creek.pdf - | head -60cd /vercel/sandbox/proposal && python - <<'EOF'
p='build_proposal.py'; s=open(p).read()
s=s.replace(''' if j > 0: p.alignment = WD_ALIGN_PARAGRAPH.RIGHT if any(ch.isdigit() for ch in str(val)[:3]) or str(val)[:1] in "$(-+~[" else WD_ALIGN_PARAGRAPH.LEFT''',''' v = str(val)
if j > 0 and len(v) <= 24 and (v[:1].isdigit() or v[:1] in "$(-+~[−"):
p.alignment = WD_ALIGN_PARAGRAPH.RIGHT''')
open(p,'w').write(s)
EOF
python build_proposal.py && libreoffice --headless --convert-to pdf AXCS_Proposal_Reserve_at_Walnut_Creek.docx --outdir preview >/dev/null 2>&1; pdftotext -layout -f 3 -l 3 preview/AXCS_Proposal_Reserve_at_Walnut_Creek.pdf - | sed -n '38,50p'I've drafted a 5-page proposal from AXCS to the owner of The Reserve at Walnut Creek, using your logo and brand colors. It proposes a three-part rescue that keeps the current owner in control.
Why now. The property ran at 93–99% occupancy through August. It fell to 83.5% in late September, with 54 units unleased . Over the last three months, asking rent dropped 11.6% to $1,071 , and new leases are signing 18% below the previous tenant's rent . The proposal frames this gently: a good asset with the wrong capital structure. Recovery has a real base:
The proposed solution. All figures are my estimates from outside data; the actual loan isn't public.
The exit case. Even back at 94% occupancy, an agency loan at today's 6.2% rate covers only about 75% of the new senior loan plus preferred equity. It would take 33% more income or lower rates to close that . So the base-case exit is a sale or recap once the property is full again. At an estimated $44.9M stabilized value, the senior loan plus preferred equity would be about 71% of value .
The AXCS pitch draws on your website:
Before you send it:
This is a read-only snapshot of a RealAI analysis.