Best Practices
These patterns help you build CRML models that are maintainable, auditable, and portable.
This guidance is engine agnostic and UI agnostic. Where workflows are mentioned, assume you can use CRML Studio to manage documents, run validation, and trigger risk modelling through your chosen engine.
1) Keep scenarios threat-centric and portable
In CRML, a scenario is a threat-centric definition (frequency + severity + optional scenario-scoped control references).
Best practice:
- Put the baseline threat model in a
crml_scenario: "1.0"document. - Do not embed exposure/inventory (asset counts) into the scenario.
Why:
- You can reuse the same scenario across organizations and portfolios.
- You can compare “threat landscape” separately from “organizational posture”.
2) Use portfolios for exposure, aggregation, and posture (we call this callibration)
Use a crml_portfolio: "1.0" document to:
- Define assets/exposure (inventory cardinalities and tags).
- Combine multiple scenarios with an explicit semantics method (
sum,max,mixture,choose_one). - Express organizational control posture (directly or via catalog + assessment packs).
In CRML Studio, this typically looks like:
- Create/import scenario documents.
- Create a portfolio representing your organisation and import the scenarios you want to simulate.
- Validate the portfolio (and optionally validate referenced scenarios).
- Run the simulation in your configured engine.
3) Treat engine-defined parts as explicit assumptions
CRML intentionally does not standardize all modelling internals.
scenario.frequency.modelandscenario.severity.modelare engine-defined identifiers.- Component structures (e.g.,
severity.components) may also be engine-defined.
Best practice:
- Write down the intended interpretation in
meta.descriptionand/or in your project documentation. - Prefer a small set of model identifiers across your organization to keep models comparable.
4) Prefer human-auditable parameterization
For monetary severity inputs:
- Prefer
medianovermuwhen your engine supports it. - Always include
currencyon monetary inputs.
For numeric readability:
- Use ISO-style digit grouping strings (e.g.,
"100 000") if your tooling supports “numberish” parsing.
5) Model controls with a clean separation of concerns
Practical control modelling usually requires three layers:
- Scenario layer: which controls are relevant to the threat (scenario control references).
- Catalog layer: canonical control IDs and definitions (control catalogs).
- Assessment layer: organization-specific implementation evidence (assessments).
Best practice:
- Keep catalogs and assessments in their own documents.
- Reference those documents from a portfolio.
- Treat any “control effectiveness math” as engine-defined unless standardized in your spec.
6) Keep execution-time config out-of-band
Some concerns are intentionally execution-time configuration, not risk-model content:
- FX/rates for currency conversion.
- Random seeds, run counts, and runtime-specific options.
Best practice:
- Store these as separate config documents (or studio project settings), not in scenarios.
7) Document limitations explicitly
Every “real” model has limitations. Make them part of the example:
- Which parts are standardized by CRML vs chosen by the engine/tool.
- Which parameters are sourced from data vs expert judgement.
- What’s not modeled (e.g., second-order effects, tail dependencies, control degradation).