Controls define what should work. Findings document what didn't. Risk quantifies why it matters.
Risk Register started as a dimensional table inside AuditForge, tracking likelihood and impact as mutable fields that silently overwrote history. When the concept proved universal, it was extracted to WorkBench. But unlike Controls and Findings, Risk didn't just move. It matured. The promotion split one table into seven fact-disciplined artifacts. The data migrated. The overwrite semantics didn't.
A risk register is not a list of what might go wrong. It is a list of what you are watching so you can act early.
17 risks across 8 categories. 10 have no controls mapped.
Every risk plotted by likelihood × impact. Color + numeric score in every cell. Three visual states: unmitigated, inherent+residual, controls-mapped-awaiting-assessment.
| Rare | Unlikely | Possible | Likely | Almost Certain | |
|---|---|---|---|---|---|
| Severe | 5 | 10 | 15 | 20 | 25 |
| Major | 4 | 8 | 12 | 16 | 20 |
| Moderate | 3 | 6 | 9 | 12 | 15 |
| Minor | 2 | 4 | 6 | 8 | 10 |
| Negligible | 1 | 2 | 3 | 4 | 5 |
Risk drives controls. Controls are tested. Findings MAY trigger reassessment. Three modules, one loop.
Each assessment is a new row. The old row is unchanged. No overwrite. This is what the new model enables.
Six modules, one identity. The tab count IS the Sibling Mandate proof.
Same risk. Better architecture. The promotion didn't just move data — it matured the model.
| Risk ID | RISK-005 |
| Description | Control testing evidence not retained with defined standards… |
| Category | COMPLIANCE (enum) |
| Likelihood | LIKELY (mutable field) |
| Impact | MODERATE (mutable field) |
| Rating | HIGH (mutable) |
| Last Updated | 2026-03-15 (overwrite — old value gone) |
| Risk ID | RISK-005 |
| Description | Control testing evidence not retained with defined standards… |
| Category FK | Compliance |
| Before | → | After |
|---|---|---|
| likelihood (mutable field) | → | Fact_RiskAssessment.likelihoodId (FK) |
| impact (mutable field) | → | Fact_RiskAssessment.impactId (FK) |
| inherentRiskRating (mutable) | → | inherentRiskScore (derived, immutable) |
| updatedAt (overwrite timestamp) | → | effectiveDate + recordedDate (bitemporal) |
| (no history) | → | previousAssessmentId (supersede chain) |
Same risk. Better architecture.
Council reviews, extraction history, the Governance Triangle proof.
Maturation split: dim_risk (1 table, overwrite) → 7 fact-disciplined artifacts. 5 migrations, 18/18 verify.
8/8 council convergence. 5×5 matrix, Governance Triangle circuit, maturation before/after, temporal coherence.
Third module promoted. First maturation split shipped. Governance Triangle complete. The cathedral compounds.