Every register has a column at the bottom. Probability times impact, summed: so many days, so many pounds. On this one it says 118.5 days and £1.98m, and everyone in the room knows it is not a forecast. Two risks on the same chain, one after the other, cost more together than either costs alone. Two on different blocks cost the time of the worse one. One with a month of float costs money and no time at all. The sum cannot tell those apart. The programme can, so I put eighteen ordinary hospital risks on one and ran them in pairs.
The programme
A generated acute hospital on a live estate: four blocks, an energy centre, a car park, a helipad, a link bridge, four phased handovers, 10,117 activities and £428,000,000 of priced work from 1 March 2027 to a logic-driven finish on 20 March 2031. Block C, the theatres, sits on the footprint of a ward block that has to be decanted and demolished first, and the critical path runs straight through it: asbestos, demolition, piling, frame, fit-out, commissioning, twelve theatre validations in turn, handover.
The register
Eighteen risks, each with a likelihood band, a delay in working days, a cost, and the activities it is linked to. Asbestos beyond the survey, obstructions under Block C, winter concrete on Block A, a late steel fabricator on Block B, the DNO diversion, the switchgear, the air handling units, Gateway 2, a drylining shortage across 214 zones, a theatre design change, an M&E insolvency, lifts, imaging, the validations, the decants. Nothing exotic. Six have a mitigation written against them; two of those, the trial holes, are already done.
One thing about how a linked risk counts. The drylining shortage is linked to 214 partition zones. If it fires it adds ten days to the job once, on the linked activity where it bites, not ten days to each zone. The form says so under the field.
The whole job first
Read the left-hand column before the right. With no risks at all, the 80% finish is already 88 days past the plan, and the best of two thousand runs is 67 days past it. That is the importer's default range doing what a default does: one day under, two over, on every activity, and a critical path of 361 short activities that can barely finish early and can all finish late. The risks are the 80 days and £2.1m on top. Keep that column in mind; it decides what the pairs show.
Two on the same chain
Sixteen risks closed, two left open: the asbestos beyond the survey and the ground under Block C. One sits on the demolition, the other on the piling that follows it. Zero float, one after the other. Then each on its own.
The money adds, near enough: £531,352 apart, £526,480 together. The days do more than add, because at the 80% line a risk that fires half the time is partly hidden in the half where it does not, and two on the same chain leave fewer runs where neither fired. The register wrote 7.5 days and 10 days and summed them. The programme says the pair is worse than its parts.
Two on different blocks
Eight and one make eight. The two blocks run side by side and the finish only hears from whichever is worse, which is the winter pours seven times in ten. The fabricator's money still lands, all of it. The register summed 8.4 and 6 days and was wrong by most of it.
Float swallows days, not money
Possible, ten days, £80,000, a 9 on the matrix. On the finish it is nothing: the 80%, the 90% and the worst case of two thousand runs sit where they sat with no risks at all. On the money it is every pound, because the engine always adds the cost and only lands the delay where the logic lets it.
The single point that was not one
I expected this pair to hurt. On paper the energisation has zero float and the switchgear risk is twenty days. The panel gave it one day, and the worst case of two thousand runs did not move at all. The reason is the left-hand column from earlier. The simulation finds the critical path again on every run from the sampled durations, and three hundred short fit-out activities, each leaning late, outgrow a dozen long energy-centre ones by weeks. By the time the switchgear fires, the energisation has float it does not have on the plan, and the engine does what it says: float absorbs. The plan's float table and the simulation's are not the same table, and the risk I was surest about did least.
One approval, four blocks; and the last one
What the mitigations buy
Nine days and £178,392 at the 80% line, for £325,000 of winter working, an early switchgear order, a second drylining gang and theatre pre-validation. The register promised 14.7 expected days. Nine of them reached the finish; the rest went to risks it was not listening to.
Finance, reading the same run
What this does not tell you
The ranges are the importer's defaults, nobody's judgement, and they lean late; that is why the no-risk finish is already June and why the switchgear did nothing. Type ranges from the people doing the work and the pairs will move. Every risk fires on its own: a bad winter on Block A does not make the fabricator later, and on a real job it might. A delay lands once, on the linked activity where it bites; a risk that would stretch 214 zones by a day each is not modelled that way. And two thousand runs of ten thousand activities took three and a half minutes here, past the three-minute cut on the live server, so a job this size needs fewer runs there.
Run it on your own register
GeneraGantt reads MS Project, Primavera P6 and Asta Powerproject. Log the register against the activities it would hit, close everything but the two you are arguing about, and run them. Then open the two. Free while it is in testing, with a sample programme loaded. Nothing is saved: your schedule leaves with you.
The programme in this article is a generated one, built so that risks of each kind sit where they would on a real acute hospital: in series on the demolition chain, in parallel on two frames, behind float, and in front of everything. The trust and the town do not exist. Every figure quoted is read off the app after importing the file, logging the register through the app's own service and running the panel; nothing is quoted that is not on a screenshot.