Capstone: risk and the split
The deal works on paper. This closing chapter asks the two questions every committee asks next: how wrong could it be? and who gets what? It answers both without restructuring anything. The claims widen in place, and a waterfall divides the cash the model already produces. That nothing has to be rebuilt is the course's whole thesis landing at once.
Widening the claims
Three numbers in this deal are opinions wide enough to deserve stating with their width — the office rent the market will bear, the construction cost, and the exit cap. They become the assumption page, and the contracts defer to them:
// The deal's contested numbers, stated once with their width. Everything
// else in the terms below is a signed fact and stays literal.
assume office_rent ~ Normal(mean=155000, stdev=8000, clip=[130000, 175000])
source { publisher "Harbor Point leasing brief" as_of 2025-11-01 }
assume monthly_draw ~ Triangular(min=680000, mode=700000, max=780000)
assume exit_cap : rate ~ Normal(mean=0.0625, stdev=0.005, clip=[0.05, 0.08]) within [0.04, 0.10]with rent = inputs.office_rent, amount = inputs.monthly_draw, cap_rate = inputs.exit_cap in the respective contracts. The chapter-6 line holds under pressure: the signed terms — the retail lease, the loan's rate, the breakpoint — stay literal, because they are facts; only opinions got width. The shapes are chapter 12's judgment applied: symmetric market views get Normals, and the construction estimate gets the contractor's own three numbers — floor, bid, blowout — as a Triangular. Two clauses make the page reviewable. source records where the rent view came from, and within [0.04, 0.10] states the range this deal's cap rate may take: the bound is checked, never clamped, wherever the value arrives — a literal, an override, a scenario value or a draw (docs/01 §12.1, §12.8).
And here the base case moves, on purpose: a Triangular's deterministic value is the mean of its three points — (680 + 700 + 780)/3 = 720,000 — not the 700,000 mode. Stating the cost risk's asymmetry made the base construction budget 340,000 heavier and pulled the equity's base IRR from 15.6% to about 14.8%. That is not an artifact to suppress; it is the model saying that an estimate with more room above than below is a higher expected cost. If the committee wants to underwrite the bid, that is a scenario — which is exactly what the run configuration now carries:
{
"deterministic": { "annual_discount_rate": 0.10 },
"scenarios": {
"base": { "annual_discount_rate": 0.10 },
"downside": {
"annual_discount_rate": 0.10,
"parameters": { "inputs.exit_cap": 0.0725, "inputs.office_rent": 140000 }
}
},
"monte_carlo": { "trial_count": 1000, "seed": 20260808 }
}The split
The cash has owners. Two parties join the cast, and the deal ends the way its papers do, with a priority of distributions:
entity party lp : Party
entity party gp : Party
account lp_land_capital due { owner party.lp }
account lp_capital due { owner party.lp }
account gp_promote due { owner party.gp }
// The equity is the LP's, in two interests: capital back with an 8% simple
// preferred return.
// The GP puts in nothing and takes 20% of what is left as its promote.
contract cre.equity_commitment.gp on entity asset.harbor {
term 2026-02..2027-06
terms {
commitment = 0
share = 0
promote_on = cre.equity_commitment.lp
promote_account = gp_promote
promote_residual = 0.20
}
parties { holder = party.gp }
}
waterfall harbor.equity_split on entity asset.harbor {
schedule every month from 2026-01 to 2030-12
from available
pay for contract "cre.equity_commitment.*" line distribution
}and the LP's two commitments from chapter 22 gain their holder and their return:
contract cre.equity_commitment.lp_land on entity asset.harbor {
term 2026-01..2026-01
terms {
commitment = 5500000
share = 1
funding = "at_start"
capital_account = lp_land_capital
preferred_return = 0.08
compounding = "simple"
}
parties { holder = party.lp }
}
contract cre.equity_commitment.lp on entity asset.harbor {
term 2026-02..2027-06
terms {
commitment = 4165000
share = 0.35
funding = "pro_rata"
capital_account = lp_capital
preferred_return = 0.08
compounding = "simple"
}
parties { holder = party.lp }
}The waterfall names the equity once. cre.equity_commitment is the pack's word for a partner's interest, and it contributes the distribution steps the agreement states: the preferred return (preferred_return, compounded annual, monthly or simple), a seniority among interests, and a promote in up to three tiers over IRR or multiple hurdles, with a catch_up. Each interest publishes its own irr, multiple and, each period, cash_on_cash.
Each interest contributes its own steps to the waterfall, in the order the agreement states. First the LP's capital and its 8% simple preferred return, on what it has not yet had back. Then the GP's promote: 20% of what remains, paid into its own account. Then the rest to the LP's two interests, by their shares. The GP puts in no capital, so it contributes the promote alone. The pot is available, the month's own cash after debt service, so the operating years pay the LP's preferred return as the building earns it, and the sale pays the rest. No step can be paid from money that is not there, and in a downside trial the promote is the shock absorber and the preferred return the cushion.
A metric can also fold a party's realized return over its own accounts:
metric lp_irr = irr(party.lp)
metric lp_moic = moic(party.lp)In the base case they read 16.4% and 1.87 (docs/01 §15.3).
In the base case the operating years return the LP 4.5 million of capital and preferred return, and the sale's month another 8.1 million. What remains is 6.8 million: 1,366,627 to the GP and the rest to the LP. Hand-check the promote: 20% of the remainder, to the dollar.
Reading the risk book
One run now produces the full committee packet, and the figure it is read on is the LP's return, which the pack publishes for every interest in every scenario and every trial as metric.cre.equity_commitment.lp.irr. The scenario table: the base case returns the LP 16.4%; the named downside, cap out a hundred basis points and rents soft, returns 11.3%. The deal is worth five points less to the LP in a stated, defensible world, and it says so in its own output. The trials: a thousand seeded paths put the LP's return at a mean of 16.5% with a standard deviation of 2.3 points, and a median of 16.4%, the base case's. That answers chapter 12's first question well: the base case is not flattering itself.
No path in the thousand falls below the LP's 8% preferred return; the lowest is 10.3%, and one path in twenty falls below 12.8%. The shape of the downside tail traces to exactly the input you would guess. Run the drives-the-spread drill and the exit cap dominates, confirming with a thousand runs what chapter 23 argued with one subtraction.
The course, closed
Look at what fits in one readable file: six verbs, five phases of construction finance, a unit-grain rent roll, a reversion on a stated cap rate, three distributions, two scenarios, a thousand trials, and a waterfall. Every line traces to a chapter, every anchor is hand-checked, and the whole thing re-derives from a phase edit. That is what "the model is the set of claims" meant in chapter 1, demonstrated rather than asserted.
What remains beyond the course is more of the same, not different in kind: richer packs, deeper waterfalls, longer rent rolls. The reference part that follows is built for exactly that working life.
Exercises
Widen the claims, split the proceeds
Two final moves.
- Turn the deal's three contested numbers into distributed assumptions, deferred into the terms: office rent (Normal), the monthly draw (Triangular), the exit cap (Normal).
- Add a downside scenario and a thousand seeded trials to the run configuration.
- Add the equity split. Give the LP's two commitments their holder, a capital account each and an 8% simple preferred return; add a GP interest with no capital that takes a 20% promote on the LP; and distribute the month's available cash to both interests every month.
- Run. Read the LP's return,
metric.cre.equity_commitment.lp.irr, in the scenario table and the trial statistics. Confirm the downside falls well below base and stays above the 8% preferred return.
Note what happens to the base case. The deterministic draw for a Triangular is the mean of its three points: 720,000, not the 700,000 mode. Stating the width moved the base case, and the construction budget got 340,000 heavier. Not a bug: that is what asymmetric risk means.
Then, on your own:
- The committee underwrites the contractor's bid: add a
bidscenario pinninginputs.monthly_drawto 700,000 and compare its NPV to base. You have just priced the difference between a mode and a mean — the 340,000 the Triangular moved, given back by a stated choice. - Compound the preferred: state
compounding = "monthly"on the LP's commitment. Confirm the base split barely moves, then explain in one sentence why the downside split moves more. - The graduation exercise: slip construction one quarter, at full risk configuration, and follow the consequence chain through every chapter's claims: draws, interest, take-out, lease-up, exit window, split. Count the lines you had to edit. That number is the course.