Model policy impact and control coverage
Use the Decision Simulator to compare exposure before and after CID222, test policy changes without saving them, grade NIST CSF controls and export the evidence.
- Version: 0.4
- Feature: compliance
- Role: admin_user, auditor
- Type: task
The Decision Simulator is the modelling view inside Compliance. It compares the same historical detection window three ways: what would have reached a provider without CID222, what remained risky under the current policy, and what would remain after a proposed change. It also connects detections to NIST CSF 2.0 controls and shows whether each control is holding over time.
Warning
The monetary result is a deterministic exposure model, not a probability forecast, legal opinion or Monte Carlo loss estimate. Use it to compare policy choices under one documented formula. Do not present it as the fine an authority will impose.
What do I need?
- Licence
- Any package with compliance
- Role
admin_userauditor
Prerequisites
- The appliance has recorded detections in the selected period; an empty window cannot grade a control.
- The compliance reference data and NIST CSF 2.0 control seeds loaded successfully at boot.
- The report-renderer service is healthy if you need the PDF export.
/assets/screenshots/grc-simulator@0.4.pngRead the three projections
For each regulation, the simulator returns these states over the same tenant, group, channel and date window:
| Projection | Meaning |
|---|---|
| Baseline | Every historical detection is treated as if it had reached the provider |
| Current | Masked and rejected detections are neutralised; flagged detections still contribute |
| Simulation | The current state after your proposed reduction is applied to the remaining risky detections |
The model saturates rather than growing forever:
The result carries formula_notes, regulation caps and the static exchange rates used for EUR
conversion. Exported reports use the same server-side run, so the PDF cannot silently differ from
the numbers on screen.
Test a policy change
Choose one scope
Select the whole scope available to your account, one tenant or one group. Tenant and group are mutually exclusive. Then choose the date window and, where offered, the traffic channel.
Confirm that current data is mature enough
Check the detection count and the period. A control with no matching detections is Untested, not healthy. Widen the period only when it represents the decision you are making.
Move the regulation or control targets
Regulation mode applies a reduction percentage directly. Control mode computes the improvement from each control's seeded baseline, keeps the best linked control per entity type, then weights the result by the detection mix for each regulation.
Compare the deltas
The result separates exposure already avoided by CID222 from the additional what-if share. The what-if endpoints do not change a filter, a threshold or a database row.
Export the evidence
Select the PDF action after confirming the subject and window. The report carries that scope. File it with the evidence period it describes, not as a timeless certificate.
Understand control status
Control coverage is the share of linked detections that CID222 masked or blocked. Volume alone does not decide the grade.
| State | Meaning |
|---|---|
| Holding | Coverage is at or above the control's floor |
| Partial | Coverage is below the floor but inside the configured partial band |
| Failing | Coverage is below that band |
| Untested | No matching detection exists in the period; this is not a pass |
The default floor is 95%. The default partial band is 90–95%, and its width follows a floor an administrator moves. A row's reason names a disabled covering rule when one can be identified; otherwise it states the measured percentage and shortfall. Daily observations support an audit window: missing days remain missing and are never filled in as healthy.
Note
Changing a control threshold changes the grade only. It sends no SIEM event, webhook or email and changes no traffic policy. Configure the filter itself under Input filters.
Role boundaries
An auditor can read policy impact, baselines, controls, coverage, history and thresholds. The
auditor can also run a non-persistent what-if and render its PDF. Only an admin_user can run the
stored simulation workflow, record today's observation, run control targets and change grading
thresholds.
API reference
| Method and path | Purpose |
|---|---|
GET /admin/grc/simulator/policy-impact | Measured impact of the policy currently in force |
POST /admin/grc/simulator/policy-impact/what-if | Compute a hypothetical conversion of flag/warn rules; stores nothing |
GET /admin/grc/simulator/baseline | Baseline projection with no reductions |
POST /admin/grc/simulator/run | Regulation-reduction simulation |
GET /admin/grc/simulator/controls | Seeded NIST CSF 2.0 control catalogue |
POST /admin/grc/simulator/run-controls | Simulation from per-control target percentages |
GET /admin/grc/simulator/control-coverage | Current control grades and reasons |
GET /admin/grc/simulator/control-history | Observation-window summary |
GET /admin/grc/simulator/control-history/{controlId} | Daily series for one control |
POST /admin/grc/simulator/control-history/record | Record today's readings now; idempotent for the day |
GET /admin/grc/simulator/control-thresholds | Current floors and partial band |
PUT /admin/grc/simulator/control-thresholds | Change grading floors |
POST /admin/grc/simulator/report/pdf | Re-run and render the scoped PDF |
Verify
- Run the baseline and confirm its subject and date window match the page filters.
- Set one what-if reduction and confirm Current stays fixed while Simulation changes.
- Open control coverage and confirm every row has a state, evidence count and status reason.
- Open control history and confirm
days_observedmatches the dates actually recorded. - Export a PDF and compare its subject, period and totals with the screen.
If it fails
- A 403
FEATURE_NOT_LICENSEDmeans the installed licence does not carrycompliance. - An empty result usually means the selected scope or period has no detections. Confirm the same filters in Compliance and All detections.
- Untested means no matching evidence, not a healthy control. Do not lower a threshold to hide the absence of evidence.
- A PDF 503 means the report renderer is unavailable. Follow the report-rendering runbook:
Runbookperformance
A PDF or report will not render
You might see: Failed to render compliance scorecard PDF · Failed to render detections PDF · Failed to render executive summary PDF · Failed to render regulations PDF
Before you start
Checks
- 1
Read whether the report renderer answered
diagnostics · services[report-renderer].reachable = true
- 2
Read whether the renderer reports itself healthy
diagnostics · services[report-renderer].healthy = true
- 3
Check whether only the large exports fail
expected · The small export succeeds.
- 4
For a compliance dossier, read whether the render was reconciled against the record
expected · The renderer reported its rendered ids.
Causes and fixes
Reached when Cause Explanation, fix and verification check 1 fails renderer-not-reachable(warning)PDF rendering is a separate service the gateway calls over REPORT_RENDERER_URL. With that service absent or unreachable, every PDF export fails and everything else on the page keeps working — which is why the failure looks specific to one button.
Fix: Start the report renderer and confirm the gateway's URL matches the port it listens on. Follow One service is unreachable or reports itself unhealthy if it will not come up.
Verify: diagnostics · services[report-renderer].reachable = truecheck 2 fails renderer-unhealthy(warning)A renderer that answers and reports itself unhealthy usually failed to initialise something it needs — a font set or a headless browser. It will keep answering and keep failing.
Fix: Read the renderer's error and its container logs, then restart or rebuild the service.
Verify: diagnostics · services[report-renderer].healthy = truecheck 3 fails renderer-resource-limited(warning)Rendering holds the whole document in memory. A large date range or a wide estate produces a document that exceeds the container's memory limit, and the kernel kills the renderer rather than the request failing cleanly.
Fix: Export a narrower range, or raise the renderer's memory limit. Check whether the container was OOM-killed — see A container was killed for running out of memory.
Verify: expected · The PDF downloads.check 4 fails dossier-unreconciled(warning)A compliance dossier is evidence. The product will not hand over a rendered document it could not check against the frozen record, because an unchecked report is worse than no report. The dossier JSON is unaffected and stays downloadable.
Fix: Fix the renderer first, then re-render the dossier. Use the JSON in the meantime — it is the same record.
Verify: expected · The PDF is produced and the download is allowed.
If that does not apply: Attach the support bundle, the report and date range you exported, and the renderer's container log tail.
Related pages
- Compliance — source evidence and regulation coverage.
- Compliance reports — frozen reporting periods and exports.
- Input filters — the controls that actually change traffic decisions.
- Regulatory mapping — how detections map to articles and controls.
Last updated on