MRM Compliance Dashboard — Power BI Build Guide¶
Overview¶
Examiner-facing dashboard for model inventory status, validation coverage, risk distribution, and monitoring trends. This dashboard supports compliance with Fed SR 11-7 and OCC 2011-12 reporting expectations by providing centralized visibility into MRM program metrics.
Note: This dashboard aids in meeting regulatory reporting requirements. Organizations should verify that dashboard content and refresh cadence meet their specific examination obligations.
Data Model¶
Connect to the following Dataverse tables. Use the OData connector in Power BI Desktop with your environment URL.
| Table | Role |
|---|---|
fsi_modelinventory |
Primary — agent model inventory records |
fsi_mrmriskrating |
Risk scoring history per agent |
fsi_validationcycle |
Validation workflow lifecycle |
fsi_validationfinding |
Findings raised during validation |
fsi_monitoringrecord |
Scheduled performance monitoring data |
fsi_mrmcomplianceevent |
Audit trail of compliance-relevant events |
Relationships¶
fsi_modelinventory1:N →fsi_mrmriskrating(on lookup columnfsi_modelinventory_lookup; in Power BI, join onfsi_modelinventory_lookup_value)fsi_modelinventory1:N →fsi_validationcycle(on lookup columnfsi_modelinventory_lookup)fsi_validationcycle1:N →fsi_validationfinding(on lookup columnfsi_validationcycle_lookup)fsi_modelinventory1:N →fsi_monitoringrecord(on lookup columnfsi_modelinventory_lookup)fsi_modelinventory1:N →fsi_mrmcomplianceevent(on lookup columnfsi_modelinventory_lookup)
Note: Child tables reference the parent via Dataverse lookup columns (suffix
_Lookup), not direct FK columns. The Dataverse Power BI connector exposes these as<lookupname>_valueGUID columns.fsi_modelidis the alternate-key text on the parent (e.g.,MRM-2026-00001); use it for display, not joins.
Dashboard Pages¶
Page 1: Inventory Overview¶
| Visual | Type | Description |
|---|---|---|
| Total Agents in MRM Inventory | Card | COUNTROWS(fsi_modelinventory) |
| Agents Pending Submission | Card | Count where fsi_mrmstatus = 100000000 (Pending Submission). Note: Registered is the agent-registry-automation status, not an mrmstatus value. |
| Agents Validated | Card | Count where fsi_validationstatus = 100000006 (Validated). Use the integer value or join the _Label shadow column added by Power BI for the Choice type. |
| Agents by MRM Tier | Bar chart | X-axis: fsi_mrmtier (Tier 1–4), Y-axis: count |
| Risk Rating Distribution | Pie chart | Segments: Critical, High, Medium, Low from fsi_currentriskrating |
| Agent Inventory Detail | Table | Columns: Model ID, Name, Tier, Rating, Status, Next Validation Due |
Filter bar: MRM Tier, Risk Rating, Validation Status, Business Function.
Page 2: Validation Status¶
| Visual | Type | Description |
|---|---|---|
| Open Validation Cycles | Card | Count where fsi_cyclestatus not in (100000006 [Validated], 100000007 [Rejected]) |
| Overdue Validations | Card | Uses Overdue Validations DAX measure (see below) |
| SLA Breaches | Card | Count of cycles where any SLA phase is breached |
| Validation Status by Tier | Stacked bar | X-axis: Tier, segments: cycle status values |
| Validation Cycle Durations | Timeline | Start: fsi_submitteddate, End: fsi_validationcompleteddate |
| Active Cycles Detail | Table | Cycle ID, Model Name, Phase, Assigned Validator, SLA Status, Days Remaining |
Page 3: Findings & Remediation¶
| Visual | Type | Description |
|---|---|---|
| Open Critical Findings | Card | Count where severity = Critical and status ≠ Closed |
| Total Open Findings | Card | Count where status ≠ Closed |
| Findings by Category | Bar chart | X-axis: fsi_findingcategory, Y-axis: count |
| Findings by Severity | Bar chart | X-axis: fsi_severity, Y-axis: count |
| Open Findings Detail | Table | Finding ID, Model Name, Category, Severity, Owner, Due Date, Status |
Page 4: Monitoring Trends¶
| Visual | Type | Description |
|---|---|---|
| Error Rate Trends | Line chart | X-axis: week, Y-axis: error rate, series: agent name |
| Escalation Rate Trends | Line chart | X-axis: week, Y-axis: escalation rate, series: agent name |
| Threshold Breaches This Month | Card | Count of monitoring records with breach flags |
| Recent Monitoring Alerts | Table | Agent Name, Metric, Threshold, Actual Value, Drift Signal, Date |
Page 5: Compliance Events¶
| Visual | Type | Description |
|---|---|---|
| Total Events (Last 30 Days) | Card | Filtered count of fsi_mrmcomplianceevent |
| Events by Type | Bar chart | X-axis: fsi_eventtype, Y-axis: count |
| Events by SR 11-7 Pillar | Pie chart | Segments from fsi_sr117pillar (option set fsi_mrm_sr117pillar: 100000000=Pillar 1, 100000001=Pillar 2, 100000002=Pillar 3) |
| Recent Compliance Events | Table | Event ID, Model Name, Event Type, Impact Level, Date, Details |
Key DAX Measures¶
Agents Not Validated =
CALCULATE(
COUNTROWS(fsi_modelinventory),
fsi_modelinventory[fsi_validationstatus] <> 100000006 -- 100000006 = Validated
)
Tier 1 Coverage =
DIVIDE(
CALCULATE(COUNTROWS(fsi_modelinventory),
fsi_modelinventory[fsi_mrmtier] = 100000001, -- Tier 1
fsi_modelinventory[fsi_validationstatus] = 100000006), -- Validated
CALCULATE(COUNTROWS(fsi_modelinventory),
fsi_modelinventory[fsi_mrmtier] = 100000001),
0
)
Overdue Validations =
CALCULATE(
COUNTROWS(fsi_modelinventory),
fsi_modelinventory[fsi_nextvalidationdue] < TODAY(),
fsi_modelinventory[fsi_validationstatus] = 100000006 -- Validated
)
Avg Cycle Duration Days =
AVERAGEX(
FILTER(fsi_validationcycle, NOT(ISBLANK(fsi_validationcycle[fsi_validationcompleteddate]))),
DATEDIFF(fsi_validationcycle[fsi_submitteddate], fsi_validationcycle[fsi_validationcompleteddate], DAY)
)
Open Critical Findings =
CALCULATE(
COUNTROWS(fsi_validationfinding),
fsi_validationfinding[fsi_severity] = 100000001, -- Critical (severity is 1-based)
fsi_validationfinding[fsi_remediationstatus] <> 100000004 -- Closed (column is fsi_remediationstatus, not fsi_findingstatus)
)
Refresh Schedule¶
| Setting | Recommended Value |
|---|---|
| Refresh frequency | Daily |
| Refresh time | 06:00 AM UTC |
| Rationale | Flow 1 (Inventory Sync) runs at 05:00 AM UTC — scheduling the refresh one hour later helps capture the latest sync results |
Implementation note: Configure scheduled refresh in the Power BI Service workspace settings after publishing. Gateway configuration may be required for on-premises Dataverse environments.
Row-Level Security (Optional)¶
For environments where agent owners should see only their own models:
- Create a role named
AgentOwnerFilter - Add DAX filter on
fsi_modelinventory:[fsi_ownerupn] = USERPRINCIPALNAME() - Assign agent owners to this role in Power BI Service
- MRM team and examiners should not be assigned to this role
Publication Checklist¶
- All five pages render with live data
- DAX measures return expected values
- Refresh schedule configured (daily at 06:00 AM UTC)
- Row-level security configured (if applicable)
- Dashboard shared with MRM team and governance stakeholders
- Document Power BI workspace URL in DELIVERY-CHECKLIST.md