Using Project Risk Quantification
PRQ runs a Monte Carlo cost-risk simulation against a register of project risks. Open it at /prq and you'll land on the Acme Platform Migration sample register — four risks against a $1.5M base estimate. Edit it in place to see the engine respond, or hit Sample to reset back to it any time.
The article assumes you understand Monte Carlo basics. If not, start with Monte Carlo basics for project risk and Probability distributions in PRQ first.
The project header
Three fields, all editable inline:
- Project name — appears in exports, the PDF cover, and the headline narrative paragraph.
- Base estimate (optional) — the cost figure the contingency is calculated against. PRQ runs without one, but the recommended-contingency callout and the convergence diagnostic both lean on it. If there's no formal base estimate (e.g. for an event-risk model), leave it empty and PRQ will fall back to evaluating convergence against the P90 directly.
- Currency — USD / AUD / EUR / GBP / JPY. Drives the formatting of every numeric output. Internal storage is unitless; switching currency changes the label, not the numbers.
The risk register
Each row is a risk with four properties:
- Risk name — short identifier.
- Category — Operational, Schedule, Technical, Regulatory, Financial, Reputational. Used for grouping and colour cues; doesn't affect the simulation.
- Probability of occurrence — the chance, per simulation iteration, that this risk triggers. A 30% probability means in any one iteration there's a 30% chance the risk fires and contributes its impact to the iteration's total.
- Impact distribution — the family of values the impact could take if the risk does trigger. Triangular, PERT, or fixed (see probability distributions).
Click a row to edit it. Hit + Add risk to add a new one. Trash icon to delete. The header above the table tracks "active in the simulation" — risks without both a probability and an impact distribution are kept in the register but excluded from the run.
Correlation between risks (optional)
Below the register is a collapsed "Correlation between risks" row. Open it to specify pairwise rank correlations between the active risks. The matrix is K×K (K = number of active risks), upper-triangle editable; the lower triangle mirrors automatically and the diagonal is pinned at 1.0.
Use anchor values: −0.3 mild negative, 0 independent, +0.3 mild positive, +0.6 strong positive. Workshop-based judgement is usually the right input source — arbitrary numbers are worse than leaving the matrix as identity.
PSD validation runs on every change. If your matrix isn't positive-semi-definite (which can happen when you specify incompatible pairwise correlations), the panel surfaces the smallest eigenvalue and offers a "Apply nearest correction" button (Higham nearest-correlation matrix). The correction preserves the structure as best it can while making the matrix valid.
Choosing iteration count
The simulation block exposes presets: 1 000 / 5 000 / 10 000 / 25 000 / 50 000. Trade-offs:
- 1 000 — fast (~50 ms). Useful for rapid iteration during workshop tuning. P50 / P80 / P90 will jump ~5–10% between runs; not stable enough for a final number.
- 10 000 — the default. ~500 ms. Stabilises P50 / P80 / P90 to within ~2% on most registers. The right choice for the report.
- 50 000 — ~2 s. Tightens the tails (P95 / P99) for tail-sensitive analyses. Adds time but doesn't materially move P50 / P80.
The convergence badge below the percentile grid in the results view tells you whether your iteration count was enough. If it reads "marginal", bump to the next preset.
Running the simulation
Click ▶ Run simulation (the singular teal CTA on the page). The button switches to a progress bar with a Cancel affordance. The engine runs in a Web Worker so the UI stays responsive even at 50 000 iterations.
If the worker can't start (rare — happens on some restrictive corporate environments where Web Workers are blocked at the browser level), the simulation falls back to running on the main thread synchronously. You'll see a soft notice but the results are identical.
Reading the results
After the run finishes, the page expands to show:
Run summary band
Project name, iteration count, active-risk count, base estimate, and the run timestamp. Plus a Pill on the right that reads "Converged" (green) or "Marginal" (ochre) per the convergence diagnostic.
Hero stat row
Four StatCards. The first — wide, ink ground, teal value — is the recommended contingency at P80. The other three are P50, P80, and P90 in their semantic colours (confidence-green / teal / ink). The P80 contingency is the single number most stakeholders copy into their plan.
Headline narrative
A locked-structure paragraph that names the project, the active- risk count, the iteration count, the P50 and P80, the contingency dollar amount and percentage of base, and the top three contributors to variance. Same paragraph appears on the PDF cover so the on-screen and printed versions tell the same story.
Three full-bleed chart cards
Histogram (40 buckets of total impact + percentile-pill markers for P50 / P80 / P90), S-curve (cumulative distribution of total impact), and tornado (top risks by Spearman ρ² to the totals when correlation is in play, or by closed-form variance share otherwise). The top tornado bar is teal — the singular "fix this first" cue.
All percentiles strip + key findings
Seven percentile cells (P10 / P25 / P50 / P75 / P80 / P90 / P95) wrapped to a 4 + 3 layout, with P50 in green-wash and P80 in teal-wash. Below: mean, std-dev, iterations count, active-risks, and the convergence half-width.
Risk register table
Demoted treatment at the bottom of the page — the same register you fed in, formatted for the report reader rather than for editing.
Exporting the report
Two formats:
- Export JSON — full register envelope (schema v2). Use for backup, version control, or handoff. The result isn't included; only the inputs (so the export is reproducible but lightweight).
- Download PDF — a 6+ page A4 portrait corporate- style report with the brand Solid M cover. Sections: cover → executive summary (key findings + percentiles) → distribution + S-curve → sensitivity tornado → correlation heatmap (if applied) → risk register (paginated) → methodology annex (independence notice, run params, contingency, sensitivity method, distribution params per active risk, tool / schema / generation timestamp).
Iterating on the model
The most valuable thing PRQ does is let you ask "what if?" Edit a risk's probability or distribution mode and re-run; the contingency moves in real time. A few patterns that come up repeatedly:
- The top contributor. The tornado tells you which risk drives most of the variance. If you can buy down that risk's probability or top-end impact (via treatment), the contingency shrinks materially. If you can't, the right response might be to escalate it for explicit acceptance.
- The correlation flip. Run once with identity (independent), then add the correlations you suspect, and re-run. The gap between the two contingency numbers tells you how much your independence assumption was hiding.
- The convergence check. If the convergence badge says "marginal" at 10 000 iterations, you have either too-rough distributions (refine them) or genuinely fat tails (bump to 50 000 and document the choice).