Suneel ReddySuneel Reddy
FrameworkCredit & Risk

The Project Finance Model That Could Not Show a Bad Outcome

September 21, 2026 ยท 5 min read
The Project Finance Model That Could Not Show a Bad Outcome

I built a project finance model this week and the first version had a bug that I think sits inside a lot of real ones.

Every stress case came back better than the base case. Cut the tariff by 10% and minimum cover improved. Raise the interest rate and cover improved. The model was, quite cheerfully, incapable of showing a bad outcome.

The cause was not arithmetic. It was that the model re-sized the debt inside every sensitivity. Debt was sculpted to a target DSCR, so when revenue fell, the loan fell with it, and cover snapped straight back to target. Perfectly consistent, entirely wrong โ€” because the loan agreement was signed before the shock arrived.

So the engine is now split in two, and the split is the whole framework:

  • Close sizes the debt once, on the sponsor case, and fixes the principal schedule.
  • Evaluate runs any assumption set against that fixed schedule.

Editing an assumption re-underwrites the deal and answers how much debt does this support. The risk panels hold the loan at what was committed and answer what happens to us now. Both are useful. Confusing them is how a model ends up unable to fail.

Open the workbench โ€” four asset presets, and everything recomputes as you change the numbers.

Five things the model made me get right

1. The textbook sizing formula returns loans that cannot be drawn

Debt as the present value of CFADS over target cover is the standard result. On a ramping asset it happily produces a loan whose first-year interest bill exceeds the entire allowable debt service.

The toll road preset does exactly this. Traffic starts at 62% of mature volume, so allowable service in year one is below the interest alone, and the sculpt is infeasible. Real transactions solve it the way the model now does: capitalise interest through the ramp, start principal later, and if that still is not enough, shrink the loan until cover clears its own lock-up in every year.

Watch the cover chart on that preset. The first four years carry no cash debt service at all and the balance grows before it starts falling.

2. A capex overrun does not touch the cover ratio

The tornado ranks capex last on the DSCR axis with a swing of essentially zero, and that is not a rendering error.

An overrun against a committed facility is funded by sponsor equity or contingency. The debt service schedule does not change, so cover does not move. What moves is the equity return. Two risks that sit next to each other in a risk register behave completely differently in the capital structure, and only one of them is a lender problem.

3. Cutting costs can reduce cover โ€” in one specific year

My invariant tests flagged this and I assumed it was a bug. It is not.

On the toll road, a 10% cut in operating cost lowers minimum cover slightly. Lower costs mean higher taxable profit, which burns through the carried-forward tax losses a year sooner, so tax arrives in a year that was previously sheltered. In that one year the tax bill exceeds the cost saving, and cover dips.

Cover ratios are not monotone in the inputs once tax timing is modelled. A sensitivity table built on the assumption that they are will occasionally be wrong about the sign.

4. Sizing to a point estimate does not remove the distribution

Every preset is sized to hit its target cover exactly in the base case. Then the simulation moves all the drivers together through a common factor, because traffic and construction cost and interest rates all key off the same cycle, and single-variable sensitivities systematically understate the joint tail.

Solar, sized to exactly 1.25x:

Minimum DSCR
Base case1.25x
P501.23x
P90 (exceeded in 90% of paths)1.09x
P(touching lock-up)25%
P(breaching default level)5%

A deal that is precisely on target in the base case carries a one-in-four chance of a covenant conversation. That gap is the entire argument for looking at a distribution rather than a number.

5. LLCR flatters you when there is no tail

Loan life cover stops at debt maturity. Project life cover runs to the end of the concession or the asset. The gap between them is the tail, and the tail is what you refinance into.

  • Solar, debt tenor matched to the PPA: LLCR 1.25, PLCR 1.58, fifteen years of tail.
  • Availability PPP, debt running almost to contract end: LLCR 1.27, PLCR 1.31, two years of tail.

Nearly identical LLCR. Completely different refinancing story. Which is why the operations phase of the framework asks about the tail rather than about the ratio.

The lifecycle layer

Five phases, each with the question it is actually asking, the output that answers it, and the mistake it is known for:

PhaseAsksAnswered by
DevelopmentCan this be financed, and on what terms?Sculpted debt capacity, gearing, minimum DSCR
Financial closeIs the structure robust to what moves?Tornado, lender cases, breach probability
ConstructionWill it deliver on budget and time?S-curve, CPI and SPI, forecast at completion
Ramp-upIs the revenue assumption holding?Actual against the band, DSCR against lock-up
OperationsIs there refinancing capacity?LLCR, PLCR, remaining tail

The construction phase carries its own version of the same trap as the sizing bug. Spend against budget is the wrong comparison โ€” a project can spend exactly to plan while delivering less than planned, and the two look identical on a cost report right up until they do not. Earned value separates them: cost performance and schedule performance move independently, and the workbench lets you drag both.

Open the workbench

Annual periods, generic presets, no tranching or hedging or cash sweep, and a single flat tax rate. It is a framework for structuring the argument and seeing which lever matters โ€” the transaction model is a longer document and it should be built on the actual contracts.

#ProjectFinance#Infrastructure#CreditRisk#DSCR#RiskAnalysis#MonteCarlo#EarnedValue#PPP
Written by Suneel Reddy โ€” read more at suneelreddy.com โ†’
Let's talk