What ModelOps is
Link to section “What ModelOps is”In 30 seconds
Link to section “In 30 seconds”ModelOps is the governance and lifecycle management of every model an organisation relies on: machine-learning models, scoring rules, optimisation models, applications built on large language models (LLMs) and agents, built or bought. For each model it answers: what is it for, how risky is it, who allowed its use, and is it still fit for that use? The working parts: an inventory, a tiering rubric, independent validation where it matters, approval with conditions, review and retirement.
Gartner defines ModelOps as “focused primarily on the governance and life cycle management of a wide range of operationalized artificial intelligence (AI) and decision models, including machine learning, knowledge graphs, rules, optimization, linguistic and agent-based models”.[1] Banks run the governance core under an older name, model risk management (MRM), which US supervisors set out in supervisory guidance in 2011 and replaced in April 2026.[2][3]
At a glance
Link to section “At a glance”| Item | Summary |
|---|---|
| Term status | Emerging. No standards body defines ModelOps; vendors now sell the capability as “AI governance” (IBM cites Gartner’s “first-ever Magic Quadrant for AI Governance Platforms”, which ModelOp dates to 2026).[6][7] The practice is established in banking as MRM. |
| In scope | Inventory, tiering, validation, approval, lifecycle states, change classes, review, exceptions, fairness and explainability reporting, bought models, agents, regulatory mapping, retirement. |
| Out of scope | Pipelines, registries and drift detection → MLOps; LLM evaluations and guardrails → LLMOps; decision logic → DecisionOps; risk appetite method → RiskOps; audit evidence → ComplianceOps; personal data → PrivacyOps; AI spend → FinOps for AI. |
| Prerequisites | MLOps basics; risk vocabulary (RiskOps). |
| Key outputs | Inventory with owners and tiers; validation reports; approval records; exceptions register; portfolio reports. |
The problem ModelOps solves
Link to section “The problem ModelOps solves”Organisations accumulate models faster than they track them: credit scores, fraud rules, vendor anti-money-laundering scenarios, an LLM support assistant, a refund agent. Nobody can list them all or say who approved each use. US guidance warns that “even a fundamentally sound model producing accurate outputs consistent with the model’s design objective can exhibit high model risk if it is misapplied or misused”.[8] Engineering quality does not remove that risk; deciding where a model may be used, and checking, does.
| Operating reality | Without ModelOps | With ModelOps |
|---|---|---|
| Which models exist | Found in incidents or audits | One inventory, reconciled with discovery |
| Scrutiny | Same for all, or none | Proportional to a documented tier |
| Who approved use | The developer | Independent review for tiers 1–2 |
| Vendor and API models | Procurement only | Tiered, validated for your use |
| Old models | Run until something breaks | Reviewed on schedule; retired deliberately |
What ModelOps is not
Link to section “What ModelOps is not”- Not MLOps with a new name. This Atlas’s editorial distinction: MLOps engineers the lifecycle (pipelines, registry, drift detection); ModelOps governs the portfolio (which uses are allowed, at what risk, on whose authority). Gartner’s own “core capabilities” include engineering items such as CI/CD integration and rollback,[1] so no definition enforces this.
- Not a committee that approves everything, nor legal advice: audit evidence belongs to ComplianceOps, and interpreting the law to lawyers.
- Not only for banks: hospitals, airlines and home buyers run consequential models (use cases).
- “Model” means different things. US guidance excludes “deterministic rule-based processes and software where there are no statistical, economic, or financial theories underpinning their design or use” and leaves generative and agentic AI out of scope;[8] the UK PRA asks banks to consider applying MRM to material, complex rules;[9] Canada’s OSFI includes AI/ML methods.[10] Your governance scope can be wider than any regulator’s; record both.
Where ModelOps comes from and where it sits
Link to section “Where ModelOps comes from and where it sits”Origins and evolution
Link to section “Origins and evolution”The practice is older than the name: US guidance SR 11-7 (2011) asked banks for “effective challenge” of models.[2] The label appeared in IBM’s 2019 paper with an engineering meaning,[4] alongside model cards and datasheets;[11][12] since 2023 AI regulation has carried governance beyond banking (methods and regulation). The date of Gartner’s first definition is unknown (cited snapshot: May 2025).[1]
Glossary and mental model
Link to section “Glossary and mental model”| Term | Meaning on this page |
|---|---|
| Model | Any method whose output informs a decision and could be wrong; regulators’ narrower definitions are recorded per model. |
| Model risk | US banking: “the potential for adverse financial consequences associated with models, which may result from decisions made based on model output”.[8] That is risk to the firm; this page also counts what the EU AI Act calls “harm to the health, safety or fundamental rights of natural persons”.[13] |
| Materiality | How much rides on the output. US guidance: purpose “together with model exposure, determines model materiality”.[8] |
| Risk tier | The class that sets a model’s scrutiny; OSFI’s “model risk rating”.[10] |
| Effective challenge | “the critical analysis conducted by objective experts” with independence and “the organizational standing and influence to effect any change”.[8] |
| Material change | A change that needs re-tiering and a new approval (change classes). |
| Exception | Use outside approval: unapproved or unvalidated, outside its purpose, or with persistent performance breaches (PRA’s definition, paraphrased).[9] |
| Overlay | A documented manual correction to model output while a problem is fixed (the PRA’s “post-model adjustment”). |
Mental model: a model holds a licence, not a launch date. The licence names a holder (owner), a scope (approved uses), conditions, an expiry and an issuer who did not build the model. ModelOps issues, renews, restricts and revokes licences.
How ModelOps relates to other Ops
Link to section “How ModelOps relates to other Ops”| Neighbour | Shared ground | The neighbour owns | ModelOps owns |
|---|---|---|---|
| MLOps | Registry, lifecycle states, monitoring | Pipelines, registry engineering, gates as code, drift | Approvals per tier; change classes; review; retirement |
| LLMOps | Foundation models | Evaluations, guardrails, traces, provider regressions | Tier and approval of each LLM use |
| DecisionOps | Rules and scores in decisions | Decision logic and its tests | Governing the models and rules it uses |
| RiskOps | Risk appetite | Enterprise risk method | Applying appetite to models |
| ComplianceOps | Audits | Collecting evidence | Model evidence; obligations mapped to models |
| PrivacyOps | Personal data in models | Lawful basis, impact assessments | Requiring them before approval |
| FinOps for AI | Vendor and API models | Unit economics | Their risk tier and approval |
| DataOps | Input data quality | Pipelines, data contracts | Data limitations per model |
Also: FinCrimeOps runs AML scenarios governed here; ProcurementOps negotiates vendor terms; AIOps is AI for IT operations.
Diagram source (Mermaid)
flowchart TB ML["MLOps: ML pipelines"] LL["LLMOps: LLM apps"] DE["DecisionOps: decision logic"] J1(["`**Build and run** send candidates, results receive approvals, conditions`"]) MO["ModelOps: inventory, tier, validate, approve, review, retire"] J2(["`**Set limits and prove** send appetite, obligations receive inventory, findings`"]) RI["RiskOps: appetite"] PR["PrivacyOps: lawful data"] CO["ComplianceOps: evidence"] ML & LL & DE <--> J1 J1 <--> MO MO <--> J2 J2 <--> RI & PR & CO classDef core fill:#e8f3f2,stroke:#16756f,color:#122029 classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029 classDef flow fill:#ffffff,stroke:#5b7a87,stroke-dasharray:4 3,color:#122029 class MO core class ML,LL,DE,RI,PR,CO neutral class J1,J2 flow
Text equivalent: ModelOps sits in the middle. The builders and runners above it (MLOps, LLMOps, DecisionOps) send candidates and monitoring results and receive approvals and conditions; the functions below it that set limits and prove compliance (RiskOps, PrivacyOps, ComplianceOps) send appetite and obligations and receive the inventory and findings.
Principles and operating model
Link to section “Principles and operating model”A proposed charter and principles
Link to section “A proposed charter and principles”No official ModelOps manifesto exists; this charter is this Atlas’s proposal (one-page version). Mission: every model we rely on is known, owned, used within approved limits, and retired on purpose.
- Inventory before policy. You cannot govern what you have not listed.
- Rigour follows risk. US, UK and Canadian supervisors all ask for scrutiny proportional to a model’s risk.[8][9][10]
- Independence where it matters. Validators “should therefore not be part of any model development activities, nor have a stake in whether or not a model is approved” (PRA).[9] Tier 3 may need only a peer review.
- Approve a use, not a model. “Using a model beyond its intended purpose introduces additional uncertainty and risk.”[8] Approvals name uses, limits and an expiry date.
- Evidence lives with the model, in records that release automation reads and developers cannot edit.
- Bought is not exempt (playbook).
- Retire on purpose, with notice and retained records.
Non-goals: approving every spreadsheet; replacing developers’ testing; legal advice.
Building blocks
Link to section “Building blocks”The minimum viable set: an inventory with OSFI’s minimum fields (ID, name and use, risk rating, owner, developer, origin);[10] a one-page tiering rubric; a validation checklist per tier and model type; approval records with uses, conditions and expiry (templates); change classes; review dates fed by MLOps or LLMOps monitoring; an exceptions register; and model cards with intended use, evaluation by group and limitations.[11]
Roles, ownership and RACI
Link to section “Roles, ownership and RACI”OSFI names the core roles: the owner coordinates development, deployment and monitoring; the developer designs the method; the reviewer assesses “conceptual soundness, inputs, methodology, assumptions, and performance”; the approver has “the authority to approve the use of a model”; the user relies on outputs.[10] Large firms add a model risk (MRM) function;[9] the ML platform team implements gates.
| Activity | Owner | Developer | Validator | MRM function | Approver |
|---|---|---|---|---|---|
| Register the model and propose a tier | A/R | C | — | C | — |
| Confirm the tier | C | I | C | A/R | I |
| Development testing and documentation | A | R | I | I | — |
| Independent validation (tiers 1–2) | C | C | R | A | I |
| Approve use and conditions | C | I | C | R | A |
| Classify a change | R | C | C | A | I |
| Monitoring and breach escalation | A | R | I | C | I |
| Periodic review | A | C | R | R | I |
| Exceptions and overlays | R | C | C | R | A |
| Retirement and consumer notice | A/R | C | I | C | I |
R = responsible, A = accountable, C = consulted, I = informed (an Atlas template). One person may hold the MRM and approver roles, never the developer and validator roles for a tier-1 model. Consultants can validate; US guidance calls for “maintaining proper oversight and integrating that work”.[8]
Lifecycle: states and transitions
Link to section “Lifecycle: states and transitions”OSFI’s lifecycle (design, review, deployment, monitoring, decommission) is “not necessarily sequential”;[10] release automation needs explicit states in the inventory.
Diagram source (Mermaid)
stateDiagram-v2 %% transitions listed in the order that lays the diagram out without crossing edges [*] --> Proposed Proposed --> InValidation: tiered Suspended --> InValidation: redeveloped Approved --> UnderReview: due Proposed --> Rejected InValidation --> Provisional: urgent need Restricted --> Approved: fixed InValidation --> Rejected: unacceptable Approved --> Restricted: breach Approved --> Retired: replaced InValidation --> Approved: accepted Provisional --> Approved: validated Suspended --> Retired Restricted --> Suspended: not fixed Provisional --> Suspended: expired UnderReview --> Approved: fit UnderReview --> Restricted: narrowed Retired --> [*]
Text equivalent: A Proposed model is tiered and enters InValidation, or is Rejected. Validation ends in Approved, Rejected or, for an urgent need, Provisional, which becomes Approved once validated or Suspended when it expires. Approved models go to UnderReview when due and return Approved or Restricted; a breach also restricts them. Restricted ends Approved (fixed) or Suspended. Suspended models are redeveloped (back to InValidation) or Retired; Approved models are retired when replaced.
Provisional exists because US guidance accepts urgent use before validation completes, with controls (see the judgement call).[8] Retired is not a deletion: OSFI asks for retained models and documents, stakeholder alerts and monitoring of “downstream effects”.[10]
Operating model and governance
Link to section “Operating model and governance”- Intake triage (weekly): a temporary tier within days, as OSFI allows (“a temporary risk rating that is confirmed in the model review or model approval stage”).[10]
- Model risk committee (monthly): tier-1 approvals, exceptions, retirements.
- Portfolio report (quarterly): tiers, overdue reviews, exceptions, findings and aggregate risk from “reliance on common assumptions, data, or methodologies”.[8]
- Annual self-assessment, which the PRA expects banks to update “at least annually”.[9]
Architecture and workflow
Link to section “Architecture and workflow”Reference architecture
Link to section “Reference architecture”The architecture is a control plane around existing delivery systems: it records, decides and enforces; pipelines, registries and monitoring stay with MLOps and LLMOps.
Diagram source (Mermaid)
flowchart TB
subgraph SRC["Discovery sources"]
direction LR
REG["Model registries"]
CLD["Cloud AI and API usage"]
PRO["Procurement and vendors"]
end
INT["Intake form"] --> INV[("Inventory: owner, tier, uses, dates")]
SRC -->|"reconcile weekly"| INV
INV --> VAL["Validation workspace: reports, findings"]
VAL --> APR["Approval record: uses, conditions, expiry"]
APR --> GATE{"Release gate checks tier and approval record"}
GATE -->|"pass"| PROD["Production serving"]
GATE -->|"fail"| BLK["Blocked, owner notified"]
PROD -->|"monitoring results"| TRG["Review triggers"]
TRG --> INV
INV --> RPT["Portfolio reports to committee"]
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
class INT,INV,VAL,APR,TRG,RPT core
class GATE decision
class BLK risk
class REG,CLD,PRO,PROD neutral
Text equivalent: An intake form feeds the inventory, reconciled weekly with registries, cloud AI usage and procurement. Models pass to validation and an approval record. A release gate checks tier and approval: pass reaches production, fail is blocked and the owner notified. Monitoring results raise review triggers in the inventory, which feeds portfolio reports.
Trust boundaries. Whoever can move a production alias, or write the evidence a gate reads, can bypass every approval. In
MLflow, creating a version, setting a version tag and setting an alias all need can_update on a registered model (from 3.17, a
model-version grant overrides it for versions), and admins bypass all permissions (MLflow 3.17.1).[14][15] So
the boundaries are structural, as in the MLOps reference implementation: developers register into a candidates
model; one promotion identity edits the production model; the gate reads tier and approval from the inventory, which only the MRM
function and approvers change; admin accounts are break-glass. Alternative: a GRC or AI governance platform as the inventory
(criteria).
End-to-end workflow
Link to section “End-to-end workflow”Diagram source (Mermaid)
%%{init: {"sequence": {"actorMargin": 30, "width": 120}}}%%
sequenceDiagram
participant M as MRM function
participant O as Owner
participant V as Validator
participant A as Approver
participant P as Release gate
O->>M: Intake form
M-->>O: Tier 2 (temporary)
O->>V: Evidence, access
V-->>O: Findings
alt Urgent, validation open
V->>A: Interim view, exception
A->>P: Provisional, expiry
else Normal path
O->>V: Fixes
V->>A: Final report
A->>P: Approval, conditions
end
Note over A,P: Gate checks the record
Note over M,O: Next review date set
Text equivalent: The owner sends an intake form to the MRM function, which returns a temporary tier 2. The owner gives the validator evidence and receives findings. If the need is urgent while validation is open, the validator passes its interim view and the owner’s exception request to the approver, who records a provisional approval expiring within 14 days (this Atlas’s policy). Otherwise the owner sends fixes, the validator a final report, and the approver records an approval with conditions. The release gate reads that record; the MRM function sets the next review date.
Practices, frameworks and tools
Link to section “Practices, frameworks and tools”Core practices and playbooks
Link to section “Core practices and playbooks”Playbook: risk tiering
Link to section “Playbook: risk tiering”The PRA asks for “a risk-based materiality and complexity rating” per model; complexity can include “interpretability, explainability, transparency, and the potential for designer or data bias”.[9] OSFI asks for “clear, measurable criteria for each risk dimension”.[10] This Atlas’s starting rubric, used in the reference implementation:
| Input | High | Medium | Low |
|---|---|---|---|
| Materiality | Drives regulatory figures, credit, prices or safety for many people, or large sums | Supports a decision with human review | Internal convenience |
| Complexity / inherent risk | Opaque method, unstructured or third-party data, autonomy to act | Standard ML or optimisation | Simple, transparent logic |
| Override | Affects individuals’ access to credit, jobs, services or care: tier 2 or stricter | — | — |
A matrix of the two ratings gives the tier (decision tree); tier 4 means “inventory only”. Acceptance: two reviewers tier the same ten models independently and agree on at least eight.
Playbook: independent validation
Link to section “Playbook: independent validation”Validation covers conceptual soundness (is the design fit for purpose?), outcomes analysis (do outputs match reality?) and ongoing monitoring.[8] By model type:
| Model type | Conceptual soundness asks | Outcomes evidence |
|---|---|---|
| Statistical or ML | Is the target the right proxy? Are features stable and lawful? | Back-tests; performance by segment and group |
| Rules | Do thresholds follow from data or policy? Do rules conflict? | Hit rates; false-positive review |
| Optimisation | Do objective and constraints encode intent and legal limits? | Scenario runs; comparison with human plans |
| LLM application | Is the task suited to a generative model? What must it never say or do? | LLMOps evaluation results; red-team findings |
| Agent | Which tools, data, limits and checkpoints? | Task success; unauthorised-action tests |
| Vendor model | Is the design and development data documented enough? | Outcomes on your population |
Depth by tier. The PRA expects validation rigour and intensity “commensurate with the associated model tier”; OSFI’s rating drives the “frequency, intensity, and scope of model review”.[9][10] This Atlas’s starting scopes:
| Tier | Reviewer | Scope |
|---|---|---|
| 1 | Independent validator | Full report: replicate key results; sensitivity analysis (outputs as key assumptions change); a challenger model or benchmark; outcomes by group |
| 2 | Independent validator | Focused report: review developers’ tests and sensitivity evidence; outcomes on recent data; a benchmark if one exists |
| 3 | Peer outside the team | Checklist: purpose, data, sampled outcomes |
| 4 | None | Inventory record; owner attests the use |
Each finding gets a severity, owner and due date; high-severity findings block approval or become conditions.
Playbook: model changes and materiality
Link to section “Playbook: model changes and materiality”The PRA expects policy to set procedures for “when a material change is made to a model” and “the materiality criteria to be used to identify the potential impact of prospective model changes”, with testing of “material changes over a period of time in dynamic models” that compares outputs before and after with actual outcomes.[9] OSFI re-rates models after “a material change in the model’s use, data, or infrastructure”.[10] This Atlas’s starting classes:
| Class | Typical changes | Evidence | Decision |
|---|---|---|---|
| Material | New use, population, method, target or features; another provider model; an agent gains a tool or permission | Re-tier; before/after outcomes; validation | New approval |
| Bounded | Cut-off change; prompt or retrieval change in a tier 1–2 LLM application; recalibration | Before/after on a reference set; LLMOps evaluations | Validator reviews the delta; approver signs |
| In envelope | Scheduled retraining within agreed limits | Pipeline test report | Recorded automatically; owner notified |
| Record only | Documentation; infrastructure with identical outputs | Reference-set check | Logged |
A pre-approved change envelope (this Atlas’s proposal) is approved once, like a use: fixed features, method and population, limits on score shift and segment performance, a retraining cadence. A version inside it reaches the Lab 3 gate with an approval entry written by the MRM function’s automation, not the developer. Re-check the envelope at each periodic review: small steps add up to the drift the PRA warns about.
Playbook: explainability and fairness reporting
Link to section “Playbook: explainability and fairness reporting”Explanations serve audiences. US applicants refused credit must get reasons that are “specific and indicate the principal reason(s) for the adverse action” (Regulation B); the CFPB withdrew its 2022 circular on complex algorithms on 12 May 2025, but the regulation stands (as of October 2026).[16][17] SHAP assigns “each feature an importance value for a particular prediction”;[18] Cynthia Rudin argues that “explainable black boxes should be avoided in high-stakes decisions”.[19] Make the choice between explaining and an interpretable model explicit at tier 1.
Fairness is measured by group, then judged. Model cards propose evaluation “across different cultural, demographic, or
phenotypic groups”;[11] Fairlearn’s MetricFrame computes such metrics.[20] Three cautions:
- Metrics conflict. Kleinberg and colleagues show that calibration within groups and balance for the positive and negative classes cannot all hold: “except in highly constrained special cases, there is no method that can satisfy these three conditions simultaneously”;[21] Chouldechova shows one criterion “may lead to considerable disparate impact when recidivism prevalence differs across groups”.[22] Policy names the leading metric per use.
- The four-fifths rule is a screen. Under US employment-selection guidelines, a group selection rate below four-fifths of the highest “will generally be regarded by the Federal enforcement agencies as evidence of adverse impact”; smaller differences can still matter, larger ones may not with small numbers.[23] Elsewhere it is, in this page’s view, a heuristic.
- Measurement needs group data, often sensitive. The EU’s new Article 4a lets providers of high-risk systems “exceptionally process special categories of personal data” for bias detection under strict safeguards, and extends this to deployers and to other AI systems, but “does not create any obligation” to do so.[24] The lawful basis belongs to PrivacyOps.
New York City bars automated employment decision tools unless the tool “has been subject to a bias audit within one year of the use of the tool”.[25]
Playbook: models you did not build
Link to section “Playbook: models you did not build”- Vendor models. US guidance expects validation “either by internal or outside parties”, plus monitoring and outcomes analysis;[8] OSFI rates external models “on a standalone basis”.[10] Contract for change notices (ProcurementOps).
- Foundation models behind an API. Approve the use and record the model version. Providers retire models on their own schedule: OpenAI promises at least six months’ notice for generally available models (barring safety or compliance concerns), less for previews;[26] Anthropic gives “at least 60 days’ notice” for publicly released models, and partner platforms “set their own retirement schedules” (as of October 2026).[27] A replacement is a material change.
- Agents. Singapore’s framework (January 2026) asks for “placing limits on agents’ powers” and checkpoints “at which human approval is required”.[28] Autonomy raises the tier; tool permissions become approval conditions.
Methods, standards and regulation
Link to section “Methods, standards and regulation”Separate what binds you from what helps you. Status as of October 2026; this is orientation, not legal advice.
| Instrument | Who it applies to | What it asks of model governance | Status |
|---|---|---|---|
| SR 26-2 / OCC Bulletin 2026-13 | US banks; “most relevant” above $30 billion in assets | Risk-based MRM incl. vendor products; GenAI and agentic AI out of scope | Guidance of 17 April 2026 that “does not set forth enforceable standards”; replaced SR 11-7[3][8][29] |
| PRA SS1/23 | UK banks with internal-model approval | Five principles, from tiering to validation and risk mitigants | Effective 17 May 2024; updated April 2026[30] |
| OSFI E-23 | Canadian federally regulated financial institutions | Enterprise-wide MRM incl. AI/ML | Effective 1 May 2027[10] |
| EU AI Act | Providers and deployers of AI systems in the EU | High-risk duties (risk management, data, logs, oversight) | In force 1 Aug 2024; Annex III duties from 2 Dec 2027, Annex I from 2 Aug 2028[31][24][13] |
| NIST AI RMF 1.0 | Anyone (voluntary) | GOVERN 1.6 inventory “resourced according to organizational risk priorities”; GOVERN 1.7 decommissioning | Being revised (no date given)[32][33] |
| ISO/IEC 42001:2023 | Organisations providing or using AI | Requirements for an AI management system | Published 2023-12-18[34] |
| Singapore MGF for Agentic AI | Organisations deploying agents | Bound risks, human checkpoints, lifecycle controls | Government guidance, “a living document”, January 2026[28] |
| OMB M-25-21 | US federal agencies | Inventory AI use cases at least annually; publish a public version | April 2025; not rescinded as of October 2026[35] |
EU details. Prohibitions apply from 2 February 2025 (those added by the Digital Omnibus, Regulation (EU) 2026/1744, from 2 December 2026), GPAI rules from 2 August 2025, transparency rules from August 2026.[31][24] Credit scoring of natural persons is an Annex III use, “with the exception of AI systems used for the purpose of detecting financial fraud”; profiling Annex III systems are always high-risk.[13]
Tooling landscape
Link to section “Tooling landscape”Start with jobs, then products (as of October 2026):
| Job | Typical tools | What to check |
|---|---|---|
| Inventory and workflow | A shared table at first; GRC suites; AI governance platforms such as IBM watsonx.governance and ModelOp[6][7] | OSFI’s inventory fields;[10] an API for the gate; tier and approval edits by MRM roles only, logged; discovery; full-history export |
| Approval state at release | MLflow tags and aliases (the docs’ example: validation_status:approved);[36] SageMaker approval statuses, where Approved “can initiate CI/CD deployment”[37] |
Who may write versions, tags and status (in MLflow, can_update on the model or a model-version grant)[14][15] |
| Documentation | Model cards; SageMaker Model Cards (intended use, risk rating, a new version for every edit except approval status)[38] | Immutability; export |
| Fairness and explainability | Fairlearn (MetricFrame);[20] SHAP[18] |
Metric definitions match policy; group data handling |
Automation and AI
Link to section “Automation and AI”Automate the mechanical: reconciliation with discovery sources, linting records (Lab 1), review reminders, refusing releases without an approval record (Lab 3), report drafts. Keep people for tier overrides, validation judgements, approvals and exceptions. An LLM can draft documentation but cannot provide effective challenge.
ModelOps in practice
Link to section “ModelOps in practice”Reference implementation
Link to section “Reference implementation”The core artefact is an inventory with a policy and a linter: one JSON file holds the tiering policy and a record per model with OSFI’s six minimum fields (building blocks) plus dates;[10] a standard-library script computes tiers, review dates and findings. Assumptions (illustrative): a financial company with eight models of six types; owners are named people (fake IDs); review intervals of 12, 24 and 36 months are this Atlas’s starting values (the PRA asks for a frequency “consistent with the model tier”).[9]
Example status: verified by execution (Python 3.8.10, 2026-10-17) with the script below.
{
"as_of": "2026-10-17",
"policy": {
"tier_matrix": {"H": {"H": 1, "M": 1, "L": 2},
"M": {"H": 2, "M": 2, "L": 3},
"L": {"H": 3, "M": 3, "L": 4}},
"people_impact_floor": 2,
"review_months": {"1": 12, "2": 24, "3": 36},
"warn_days": 60,
"provider_warn_days": 180
},
"models": [
{"id": "credit-pd-retail", "type": "ml", "origin": "internal",
"use": "default risk for retail loan approval", "owner": "a.rossi",
"developer": "credit-analytics", "materiality": "H", "complexity": "H",
"people_impact": true, "status": "production", "recorded_tier": 1,
"approved": "2025-11-03", "last_review": "2025-10-20", "monitoring": true},
{"id": "fraud-rules-cards", "type": "rules", "origin": "internal",
"use": "block suspicious card payments", "owner": "k.mensah",
"developer": "fraud-strategy", "materiality": "H", "complexity": "L",
"people_impact": false, "status": "production", "recorded_tier": 3,
"approved": "2024-06-10", "last_review": "2024-06-01", "monitoring": true},
{"id": "markdown-optimiser", "type": "optimisation", "origin": "internal",
"use": "set clearance discounts", "owner": "l.chen",
"developer": "pricing-science", "materiality": "M", "complexity": "M",
"people_impact": false, "status": "production", "recorded_tier": 2,
"approved": "2025-03-15", "last_review": "2025-03-01", "monitoring": true},
{"id": "aml-vendor-scenarios", "type": "ml", "origin": "vendor",
"use": "flag transactions for AML review", "owner": "p.novak",
"developer": "vendor (example-vendor)", "materiality": "M", "complexity": "H",
"people_impact": true, "status": "production", "recorded_tier": 2,
"approved": "2026-04-01", "conditions_until": "2026-09-30",
"last_review": "2026-03-20", "monitoring": true},
{"id": "support-assistant", "type": "llm-app", "origin": "third-party-api",
"use": "answer customer questions", "owner": "s.haddad",
"developer": "customer-ai", "materiality": "M", "complexity": "H",
"people_impact": false, "status": "production", "recorded_tier": 2,
"approved": "2026-05-12", "last_review": "2026-05-01", "monitoring": true,
"provider_retirement": "2027-01-14"},
{"id": "refund-agent", "type": "agent", "origin": "internal",
"use": "issue refunds up to a limit", "owner": "s.haddad",
"developer": "customer-ai", "materiality": "M", "complexity": "H",
"people_impact": true, "status": "production", "recorded_tier": 2,
"approved": null, "last_review": null, "monitoring": false},
{"id": "churn-propensity", "type": "ml", "origin": "internal",
"use": "target retention offers", "owner": "",
"developer": "marketing-analytics", "materiality": "L", "complexity": "M",
"people_impact": false, "status": "production", "recorded_tier": 3,
"approved": "2024-02-01", "last_review": "2024-01-15", "monitoring": true},
{"id": "branch-forecast-sheet", "type": "spreadsheet", "origin": "internal",
"use": "forecast branch staffing", "owner": "j.berg",
"developer": "finance-planning", "materiality": "L", "complexity": "L",
"people_impact": false, "status": "production", "recorded_tier": 4,
"approved": null, "last_review": null, "monitoring": false}
]
}
Example status: verified by execution (Python 3.8.10, 2026-10-17); the output below is the actual output.
"""Lint a model inventory: compute risk tiers, review due dates and blocking findings.
Usage: python3 modelops_inventory.py model-inventory.json
Standard library only. The tier matrix, review intervals and thresholds live in the
inventory's "policy" block (this Atlas's illustrative policy, not a regulatory rule).
Exit code 1 if any ERROR (unowned, unapproved or out-of-conditions use in production).
"""
import calendar
import json
import sys
from datetime import date
def parse(value):
return date.fromisoformat(value) if value else None
def add_months(d, months):
m = d.month - 1 + months
year, month = d.year + m // 12, m % 12 + 1
return date(year, month, min(d.day, calendar.monthrange(year, month)[1]))
def tier_of(model, policy):
tier = policy["tier_matrix"][model["materiality"]][model["complexity"]]
if model.get("people_impact"):
tier = min(tier, policy["people_impact_floor"])
return tier
def check(model, policy, today):
findings = []
tier = tier_of(model, policy)
live = model["status"] == "production"
if not model.get("owner"):
findings.append(("ERROR", "no accountable owner"))
for field in ("use", "developer"):
if not model.get(field):
findings.append(("WARN", f"missing inventory field {field}"))
if tier != model.get("recorded_tier"):
findings.append(("WARN", f"recorded tier {model.get('recorded_tier')}, "
f"rubric says {tier}: re-tier"))
if tier == 4:
return tier, None, findings # inventory only: owner and attestation
if live and not model.get("approved"):
findings.append(("ERROR", "in production without approval"))
until = parse(model.get("conditions_until"))
if live and until and until < today:
findings.append(("ERROR", f"approval conditions expired {until}"))
due = None
last = parse(model.get("last_review"))
if last:
due = add_months(last, policy["review_months"][str(tier)])
if due < today:
findings.append(("WARN", f"review overdue since {due}"))
elif (due - today).days <= policy["warn_days"]:
findings.append(("INFO", f"review due {due}"))
elif live:
findings.append(("WARN", "never reviewed"))
if live and not model.get("monitoring"):
findings.append(("WARN", "no monitoring plan"))
retire = parse(model.get("provider_retirement"))
if retire and (retire - today).days <= policy["provider_warn_days"]:
findings.append(("WARN", f"provider retires the model {retire}: "
"plan and approve a replacement"))
return tier, due, findings
def main(path):
with open(path, encoding="utf-8") as fh:
inv = json.load(fh)
today, policy = parse(inv["as_of"]), inv["policy"]
counts = {"ERROR": 0, "WARN": 0, "INFO": 0}
tiers = {}
print(f"Model inventory check as of {today}")
for model in inv["models"]:
tier, due, findings = check(model, policy, today)
tiers[tier] = tiers.get(tier, 0) + 1
print(f"{model['id']:<22} {model['type']:<12} tier {tier} "
f"next review {due or '-'}")
for level, text in findings:
counts[level] += 1
print(f" {level:<5} {text}")
summary = ", ".join(f"tier {t}: {n}" for t, n in sorted(tiers.items()))
print(f"{len(inv['models'])} models ({summary})")
print(f"findings: {counts['ERROR']} ERROR, {counts['WARN']} WARN, "
f"{counts['INFO']} INFO")
return 1 if counts["ERROR"] else 0
if __name__ == "__main__":
if len(sys.argv) != 2:
sys.exit("usage: python3 modelops_inventory.py <inventory.json>")
sys.exit(main(sys.argv[1]))
$ python3 modelops_inventory.py model-inventory.json
Model inventory check as of 2026-10-17
credit-pd-retail ml tier 1 next review 2026-10-20
INFO review due 2026-10-20
fraud-rules-cards rules tier 2 next review 2026-06-01
WARN recorded tier 3, rubric says 2: re-tier
WARN review overdue since 2026-06-01
markdown-optimiser optimisation tier 2 next review 2027-03-01
aml-vendor-scenarios ml tier 2 next review 2028-03-20
ERROR approval conditions expired 2026-09-30
support-assistant llm-app tier 2 next review 2028-05-01
WARN provider retires the model 2027-01-14: plan and approve a replacement
refund-agent agent tier 2 next review -
ERROR in production without approval
WARN never reviewed
WARN no monitoring plan
churn-propensity ml tier 3 next review 2027-01-15
ERROR no accountable owner
branch-forecast-sheet spreadsheet tier 4 next review -
8 models (tier 1: 1, tier 2: 5, tier 3: 1, tier 4: 1)
findings: 3 ERROR, 5 WARN, 1 INFO
How to read it. The errors matter most: an agent live without approval, a vendor model used after its conditional approval lapsed, an unowned model. The fraud rules block card payments at scale, so the rubric moves them to tier 2. The assistant’s provider retirement (illustrative date) starts re-approval planning. The spreadsheet stays as tier 4, although US guidance excludes “simple arithmetic calculations, such as those found within spreadsheets”:[8] governance scope is your choice.
Hands-on labs
Link to section “Hands-on labs”Lab 1 (beginner): run and fix an inventory
Link to section “Lab 1 (beginner): run and fix an inventory”Objective: find and resolve blocking findings. Prerequisites: Python 3.8+; no account or cost; 45 minutes.
- Save the reference JSON as
model-inventory.jsonand the script asmodelops_inventory.py. - Run
python3 modelops_inventory.py model-inventory.json; echo $?. - Record four decisions: give
churn-propensitya named owner; setrefund-agentto"suspended"until approved; extend the AML vendor’sconditions_untilto"2026-12-31"only if your approver signs an exception; setfraud-rules-cardstorecorded_tier: 2. - Run again, then add five of your own models.
Expected output (checked by execution). Step 2: the reference output, exit code 1. Step 3: 0 ERROR, 2 WARN, 1 INFO (the
overdue fraud review and the provider retirement remain), exit code 0. Validation: two colleagues agree with every tier.
Troubleshooting: KeyError means a rating other than H, M or L; ValueError: Invalid isoformat string, a date not in
YYYY-MM-DD. Teardown: delete the folder, or commit the inventory.
Lab 2 (intermediate): a disaggregated outcome report
Link to section “Lab 2 (intermediate): a disaggregated outcome report”Objective: produce the fairness evidence a validator reviews, and see two metrics disagree. Prerequisites: Python 3.8+; synthetic counts, no personal data; 45 minutes. Real credit data lacks outcomes for declined applicants; the synthetic file assumes them known.
Example status: verified by execution (Python 3.8.10, 2026-10-17); the output below is the actual output.
{
"model": "credit-pd-retail v7",
"window": "synthetic backtest; outcomes of declined applicants assumed known",
"min_group_size": 100,
"thresholds": {"impact_ratio": 0.8, "tpr_gap": 0.05},
"groups": {
"A": {"applicants": 2400, "approved": 1440, "good": 1900, "good_approved": 1330},
"B": {"applicants": 1100, "approved": 495, "good": 820, "good_approved": 455},
"C": {"applicants": 60, "approved": 33, "good": 45, "good_approved": 31}
}
}
"""Disaggregated outcome report for a binary approve/decline model.
Usage: python3 fairness_report.py outcomes.json
Per group: approval rate, impact ratio against the highest-rate group, true positive
rate (approval rate among applicants who later repaid) and default rate among the
approved. Flags are prompts for investigation, not verdicts of (un)fairness.
"""
import json
import sys
def main(path):
with open(path, encoding="utf-8") as fh:
data = json.load(fh)
limit, th = data["min_group_size"], data["thresholds"]
rows = {}
for name, g in data["groups"].items():
rows[name] = {
"n": g["applicants"],
"rate": g["approved"] / g["applicants"],
"tpr": g["good_approved"] / g["good"],
"bad": (g["approved"] - g["good_approved"]) / g["approved"],
}
usable = {k: v for k, v in rows.items() if v["n"] >= limit}
top_rate = max(v["rate"] for v in usable.values())
top_tpr = max(v["tpr"] for v in usable.values())
print(f"{data['model']} | {data['window']}")
print(f"{'group':<6}{'n':>6}{'approval':>10}{'impact':>8}{'TPR':>7}"
f"{'defaults':>10} flags")
for name, r in rows.items():
flags = []
if r["n"] < limit:
flags.append(f"n<{limit}: too small to conclude")
impact = "-"
else:
ratio = r["rate"] / top_rate
impact = f"{ratio:.2f}"
if ratio < th["impact_ratio"]:
flags.append("impact ratio below screen")
if top_tpr - r["tpr"] > th["tpr_gap"]:
flags.append(f"TPR gap {top_tpr - r['tpr']:.3f}")
print(f"{name:<6}{r['n']:>6}{r['rate']:>10.1%}{impact:>8}{r['tpr']:>7.1%}"
f"{r['bad']:>10.1%} {'; '.join(flags) or 'none'}")
return 0
if __name__ == "__main__":
if len(sys.argv) != 2:
sys.exit("usage: python3 fairness_report.py <outcomes.json>")
sys.exit(main(sys.argv[1]))
$ python3 fairness_report.py outcomes.json
credit-pd-retail v7 | synthetic backtest; outcomes of declined applicants assumed known
group n approval impact TPR defaults flags
A 2400 60.0% 1.00 70.0% 7.6% none
B 1100 45.0% 0.75 55.5% 8.1% impact ratio below screen; TPR gap 0.145
C 60 55.0% - 68.9% 6.1% n<100: too small to conclude
Steps: run the script; set group B to "approved": 560, "good_approved": 510 (a lower cut-off) and rerun.
Expected output (checked by execution): B’s impact ratio becomes 0.85 and passes the screen, its true-positive-rate gap falls
to 0.078 but still exceeds 0.05, and its default rate among the approved rises from 8.1% to 8.9%. Validation: you can name the
policy’s primary metric for this use and the cost in defaults. Troubleshooting: ZeroDivisionError means a group with no
approvals or no good outcomes. Teardown: delete the files.
Lab 3 (advanced): enforce approval at release
Link to section “Lab 3 (advanced): enforce approval at release”Objective: promote a version only when the inventory holds its tier’s evidence, and make sure nobody else can. Prerequisites (the control depends on them):
- An MLflow server you administer, with authentication on (
--app-name basic-auth, default permission READ). Written against the MLflow 3.17.1 docs; permissions changed in 3.13 (roles) and 3.17 (DENY; version-level grants).[14][15] credit-pd-retail-candidates, editable by data scientists, andcredit-pd-retail, created first by the promotion identity, the only non-admin with edit rights on it (creating a registered model makes the creator its manager).[14] No data scientist is an MLflow or workspace admin, or holds EDIT or MANAGE onregistered_model:*orregistered_model_version:*(with default READ, the version grant alone edits the production model’s versions).[15]- Only the MRM function and approvers can change tiers and
approvalsin the inventory (a GRC workflow, or a repository whose approval files need their review). The lab uses a local copy.
The gate uses the stricter of the recorded and rubric tiers, refuses tiers outside the policy, and accepts a provisional approval only with an exception ID, approver, monitoring plan and an expiry at most 14 days out, renewed at most once. Method names follow the MLflow client reference.[39]
Example status: syntax-checked; logic executed with a stub client; not run against MLflow.
"""Promote an approved candidate version into the production registered model.
Usage: python3 promotion_gate.py <inventory.json> <model-id> <version> [alias]
The tier and the approval come from the inventory (changed only by the MRM function and
approvers), never from registry tags that developers can write. On a pass, version
<version> of "<model-id>-candidates" is copied into "<model-id>", the approval is
recorded as tags on the copy and the alias (default "champion") is moved.
Run it as the promotion identity: the only identity with EDIT on the production model.
"""
import json
import sys
from datetime import date
REQUIRED = { # this Atlas's illustrative policy: approval evidence per risk tier
1: ["validation_report", "committee_approval", "monitoring_plan"],
2: ["validation_report", "approver", "monitoring_plan"],
3: ["approver"],
4: [], # inventory only
}
PROVISIONAL = ["exception_id", "approver", "monitoring_plan", "date",
"conditions_until"]
MAX_PROVISIONAL_DAYS, MAX_RENEWALS = 14, 1
def effective_tier(record, policy):
"""The stricter of the recorded tier and the rubric's tier (1 is strictest)."""
tier = policy["tier_matrix"][record["materiality"]][record["complexity"]]
if record.get("people_impact"):
tier = min(tier, policy["people_impact_floor"])
return min(tier, record.get("recorded_tier") or tier)
def missing_evidence(record, version, tier, today):
"""Return a list of problems; an empty list means the gate passes."""
if tier not in REQUIRED:
return [f"tier {tier} is not in the policy"]
if tier == 4:
return []
approval = record.get("approvals", {}).get(str(version))
if not approval:
return [f"no approval record for version {version}"]
decision = approval.get("decision")
if decision == "provisional":
needed = PROVISIONAL
elif decision in ("approved", "approved_with_conditions"):
needed = REQUIRED[tier]
else:
return [f"decision is {decision}"]
problems = [f"missing {key}" for key in needed if not approval.get(key)]
until = approval.get("conditions_until")
if decision == "approved_with_conditions" and not until:
problems.append("conditional approval without conditions_until")
if until and date.fromisoformat(until) < today:
problems.append(f"conditions expired {until}")
if decision == "provisional" and until and approval.get("date"):
days = (date.fromisoformat(until) - date.fromisoformat(approval["date"])).days
if days > MAX_PROVISIONAL_DAYS:
problems.append(f"provisional for {days} days (max {MAX_PROVISIONAL_DAYS})")
if approval.get("renewals", 0) > MAX_RENEWALS:
problems.append(f"renewals {approval['renewals']} (max {MAX_RENEWALS})")
return problems
def main(inventory_path, model_id, version, alias="champion"):
with open(inventory_path, encoding="utf-8") as fh:
inv = json.load(fh)
record = {m["id"]: m for m in inv["models"]}.get(model_id)
if record is None:
print(f"REFUSED {model_id}: not in the inventory")
return 1
tier = effective_tier(record, inv["policy"])
problems = missing_evidence(record, version, tier, date.today())
if problems:
print(f"REFUSED {model_id} v{version} (tier {tier}): " + "; ".join(problems))
return 1
from mlflow import MlflowClient # imported late: the logic is testable without MLflow
client = MlflowClient()
copy = client.copy_model_version(f"models:/{model_id}-candidates/{version}", model_id)
for key, value in record.get("approvals", {}).get(str(version), {}).items():
client.set_model_version_tag(model_id, copy.version, key, str(value))
client.set_registered_model_alias(model_id, alias, copy.version)
print(f"PROMOTED {model_id}-candidates v{version} -> {model_id} "
f"v{copy.version} @{alias} (tier {tier})")
return 0
if __name__ == "__main__":
if len(sys.argv) not in (4, 5):
sys.exit("usage: promotion_gate.py <inventory.json> <model-id> <version> [alias]")
sys.exit(main(*sys.argv[1:]))
Merge this approvals object into the credit-pd-retail record of model-inventory.json; give version 8 today’s date and a
conditions_until 30 days later.
Example status: syntax-checked; used in the stub run.
{
"approvals": {
"7": {"decision": "approved", "date": "2026-10-09",
"validation_report": "VR-2026-031", "committee_approval": "MRC-2026-10-08",
"monitoring_plan": "MP-credit-pd-v7"},
"8": {"decision": "provisional", "date": "2026-10-17",
"conditions_until": "2026-11-16", "exception_id": "EX-2026-044",
"approver": "cro-delegate", "monitoring_plan": "MP-credit-pd-v8",
"renewals": 0},
"9": {"decision": "pending", "validation_report": "VR-2026-037"}
}
}
Steps: as the promotion identity, run python3 promotion_gate.py model-inventory.json credit-pd-retail 7, then versions 8
and 9; set version 8’s conditions_until to ten days after its date and rerun it. Expected output (stub run, 2026-10-17):
v7 PROMOTED credit-pd-retail-candidates v7 -> credit-pd-retail v1 @champion (tier 1), exit 0; v8 REFUSED ... provisional for 30 days (max 14) and v9 REFUSED ... decision is pending, exit 1; v8 after the fix PROMOTED ... v2, exit 0.
Validation: (1) a data scientist’s attempt to create a version in, tag or move an alias of credit-pd-retail must fail, or
the gate is advisory; (2) with recorded_tier 3 and no committee_approval on v7, the gate still applies tier 1 and refuses.
Troubleshooting: a permission error on the copy means the promotion identity lacks rights on one of the two models.
Teardown: delete the test versions, alias and approvals block.
Use cases and scenarios
Link to section “Use cases and scenarios”Case 1: an external validation of a bought clinical model (sourced)
Link to section “Case 1: an external validation of a bought clinical model (sourced)”The Epic Sepsis Model, “implemented at hundreds of US hospitals”, was validated externally at Michigan Medicine on 38,455 hospitalisations: an area under the ROC curve of 0.63 (0.5 is chance), 67% of sepsis patients missed, and alerts for 18% of all hospitalisations; the authors concluded that it “has poor discrimination and calibration”.[40] Lesson: validate a vendor model on your population; alert burden is part of its risk.
Case 2: a convenient proxy becomes a group harm (sourced)
Link to section “Case 2: a convenient proxy becomes a group harm (sourced)”Obermeyer and colleagues found that a widely used care-management algorithm predicted health-care costs rather than illness, so “At a given risk score, Black patients are considerably sicker than White patients”; remedying this would raise the share of Black patients receiving extra help from 17.7% to 46.5%.[41] Lesson: conceptual soundness asks whether the target is the right proxy.
Case 3: model risk appetite, not model quality (sourced)
Link to section “Case 3: model risk appetite, not model quality (sourced)”In November 2021 Zillow wound down Zillow Offers; its CEO said “the unpredictability in forecasting home prices far exceeds what we anticipated” and that continuing “would result in too much earnings and balance-sheet volatility”.[42] It reported a $304 million inventory write-down “as a result of purchasing homes at higher prices than our current estimates of future selling prices”.[43] Lesson (this page’s reading, not Zillow’s): when a model drives large exposure, approval conditions need exposure caps, enforced in DecisionOps.
Case 4: the chatbot’s answer is the company’s answer (sourced)
Link to section “Case 4: the chatbot’s answer is the company’s answer (sourced)”In Moffatt v. Air Canada (British Columbia Civil Resolution Tribunal, 14 February 2024), the airline’s chatbot said bereavement fares could be claimed retroactively; they could not. The tribunal called the suggestion that the chatbot is “a separate legal entity that is responsible for its own actions” “a remarkable submission”, held: “It makes no difference whether the information comes from a static page or a chatbot”, and ordered Air Canada to pay C$812.02.[44] Lesson: customer-facing LLM applications need an owner and approved uses.
Scenario 5: approving the support assistant (illustrative)
Link to section “Scenario 5: approving the support assistant (illustrative)”Measure, govern, pay
Link to section “Measure, govern, pay”Metrics and KPIs
Link to section “Metrics and KPIs”| KPI | Definition / formula | Pitfall |
|---|---|---|
| Inventory coverage | Discovered models in the inventory ÷ discovered models | Self-reported models only |
| Owned share | Models with a named person as owner ÷ inventory | A team name with nobody behind it |
| Validated before use | Tier 1–2 models first used after validation ÷ those put into use | Counting provisional use |
| Review currency | Tier 1–3 production models within review interval ÷ tier 1–3 production models | Re-tiering to a laxer tier to hide overdue reviews |
| Unapproved or lapsed use | Production models with no approval or expired conditions (target 0) | Approvals with no expiry |
| Exception age | Median days open of exceptions; count past expiry | Renewing exceptions indefinitely |
| Finding closure | High-severity findings closed by due date ÷ due | Closing by downgrading severity |
| Time to decision | Median days from intake to approval, per tier | Speed bought by skipping review |
| Monitoring coverage | Tier 1–3 production models with an active monitoring plan ÷ tier 1–3 production models | Plans alerting nobody |
Owned share, review currency and exception age lead; incidents and audit findings lag. Review monthly in the MRM function, quarterly with senior management.
Worked calculation
Link to section “Worked calculation”From the reference implementation (eight models, all in production):
- Owned share: 7 ÷ 8 = 87.5% (
churn-propensityhas no owner). - Review currency: of seven tier 1–3 models,
fraud-rules-cardsis overdue andrefund-agentnever reviewed: 5 ÷ 7 = 71%. - Unapproved or lapsed use: 2 (the agent; the AML vendor model).
- Monitoring coverage for tiers 1–3: 6 ÷ 7 = 86%.
After the Lab 1 fixes, owned share is 100% and unapproved or lapsed use 0. Review currency rises to 5 ÷ 6 = 83% only because the suspended agent left the denominator; the fraud rules are still overdue. Vanity traps: “models approved this quarter”, “share of models with a model card” (empty cards count).
Quality, security, privacy and compliance
Link to section “Quality, security, privacy and compliance”| Risk | Signal | Mitigation | Owner |
|---|---|---|---|
| Shadow models outside intake | AI services in cloud bills; procurement lines | Weekly reconciliation with discovery | MRM function |
| Approval bypass | Alias, version or tag change not made by the promotion identity | Separate candidate and production models; evidence read from the inventory (Lab 3) | Platform team |
| Vendor opacity | No method or data documentation | Contract terms; outcome monitoring; overlays | Owner, procurement |
| Provider changes the model behind an API | Version change; retirement notice | Pin versions; material change; LLMOps regressions | Owner |
| Bias measurement needs sensitive data | No fairness evidence for tier 1 | Lawful basis (PrivacyOps) | Privacy, owner |
| Evidence edited or lost | Changed approvals | Immutable versions (as SageMaker Model Cards keep[38]) | MRM function |
| EU high-risk logs kept too briefly | Retention under six months | Deployers keep logs “of at least six months”[13] | Owner, compliance |
Auditability. The approval records are the trail; collecting evidence across systems belongs to ComplianceOps.
Cost, capacity and sustainability
Link to section “Cost, capacity and sustainability”Illustrative calculation (assumed effort, not a benchmark): initial validation takes 120 hours for tier 1, 40 for tier 2 and 8 for tier 3; a periodic review a third of that. For 15 tier-1, 60 tier-2 and 150 tier-3 models reviewed every 12, 24 and 36 months: 15 × 40 + 60 × 13.3 ÷ 2 + 150 × 2.7 ÷ 3 ≈ 600 + 400 + 135 = 1,135 review hours a year; ten new tier-2 models add 400. At about 1,500 productive hours per validator that is one to 1.5 validators; all 225 at tier-1 depth would take 9,000 hours, six people. Compute and token spend belong to FinOps for AI, carbon to GreenOps; ModelOps’s own cost driver is hand-made evidence.
Assurance of the operating model
Link to section “Assurance of the operating model”- Internal audit evaluates whether the practices “are rigorous and effective” without redoing validation.[8]
- Validate the tiering itself: the PRA expects “periodic validation, or other objective and critical review” of it.[9]
- Reconcile quarterly: trace twenty sampled production endpoints and AI service accounts to the inventory.
- Risk indicators (this Atlas’s thresholds): any unapproved or lapsed use; a tier-1 review 30 days overdue; an exception past expiry; coverage below 95%.
When things go wrong
Link to section “When things go wrong”Common failures and troubleshooting
Link to section “Common failures and troubleshooting”| Symptom | Likely cause and diagnosis | Remediation | Prevention |
|---|---|---|---|
| Audit finds unlisted models | Self-reporting only; check cloud and procurement data | Add, tier and triage them | Automated discovery |
| Everything is tier 1, or nothing is | Vague rubric; incentives to under-tier | Re-tier a sample with two reviewers | Measurable criteria; tier review |
| Validation backlog delays every release | Same depth for all tiers and changes | Tier templates; change envelopes; provisional use | Capacity planning |
| Vendor model drifts with no explanation | No outcome monitoring on your data | Outcomes analysis; overlay; vendor escalation | Contracted change notices |
Worked runbook: a model breaches its limits
Link to section “Worked runbook: a model breaches its limits”An illustrative scenario: a marketing campaign changes the applicant mix, and the tier-1 credit model breaches two approval conditions: population stability (how far applicants have moved from the development sample, a drift measure from MLOps) and an approval-rate band. OSFI expects contingency plans “for model unavailability, deterioration in model performance, or outright failure”.[10]
Diagram source (Mermaid)
flowchart TB
D["Monitoring breach on tier-1 model"] --> S{"Harm ongoing to people or money?"}
S -- "Yes" --> C["Contain: fallback model, tighter cut-off or manual review"]
S -- "No" --> W["Watch: owner reviews within 2 business days"]
C --> N["Notify approver, MRM function, users"]
W --> N
N --> R{"Cause"}
R -- "Data or pipeline defect" --> F["Fix with MLOps; backfill decisions"]
R -- "Population changed" --> O["Overlay with expiry; redevelop"]
R -- "Used outside approved scope" --> U["Stop the out-of-scope use"]
F --> V["Validator reviews the fix"]
O --> V
U --> V
V --> A{"Approver decision"}
A -- "Restore" --> OK["Approved: conditions updated"]
A -- "Not yet" --> X["Restricted or suspended; exception logged"]
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
class W,N,F,O,U,V,OK core
class S,R,A decision
class D,C,X risk
Text equivalent: If harm is ongoing, contain it (fallback model, tighter cut-off or manual review); otherwise the owner reviews within two business days. The approver, MRM function and users are notified. A data defect is fixed with MLOps and decisions backfilled; a changed population gets an expiring overlay and redevelopment; out-of-scope use stops. After the validator’s review, the approver restores approval with new conditions, or keeps the model restricted or suspended.
- Record the breach against the approval conditions; contain if harm is ongoing.
- Notify the approver and users; in the EU, once high-risk duties apply, a deployer reports a serious incident to the provider first, then the authorities (Article 26).[13]
- Diagnose with MLOps: data defect, drift, or use outside the validated population?
- Remediate: fix, expiring overlay, or redevelopment (a material change).
- Re-approve on the validator’s review; add campaigns to the review triggers.
Anti-patterns and myths
Link to section “Anti-patterns and myths”| Anti-pattern or myth | Why it fails | Warning signal | Do instead |
|---|---|---|---|
| “ModelOps is a tool we buy” | A platform stores decisions; it does not make them | Platform live, no rubric | Rubric and inventory first |
| One process for every model and change | Tier-1 depth everywhere creates queues and workarounds | Teams avoid intake | Tiers and change classes |
| “The vendor validated it” | Their population is not yours (Case 1) | No outcomes analysis on your data | Validate your use |
| “Not a model under the regulation, so not governed” | Rules and LLM apps cause harm too (Case 4) | Inventory equals regulatory scope | Record regulatory scope as a field |
| “A fairness metric passed, so it is fair” | Metrics conflict; proxies hide harm (Case 2) | One metric in the report | A primary metric per use, with reasons |
Deciding and adopting
Link to section “Deciding and adopting”When to use and when not to use
Link to section “When to use and when not to use”Build an explicit practice when any of these hold: models inform decisions about people’s access to credit, jobs, insurance, care or public services; your supervisor publishes model risk expectations, or you deploy EU AI Act Annex III systems; models are bought or called through APIs faster than anyone reviews them, or agents can act; nobody can list production models with owners.
Keep it minimal, or wait, when a few low-stakes models have clear owners (an inventory and quarterly review suffice); approvals would have no delivery pipeline to enforce them (fix MLOps first); or the “programme” would be a policy with no inventory.
Hidden responsibilities: independent validators, a vendor-review budget, and someone who can say no to a launch.
Decision framework
Link to section “Decision framework”The tree encodes the policy file’s matrix and override, so hand tiering and the linter agree.
Diagram source (Mermaid)
%%{init: {"flowchart": {"wrappingWidth": 130, "nodeSpacing": 24, "rankSpacing": 34}}}%%
flowchart TB
S["New model or material change"] --> Q1{"Output used in a decision?"}
Q1 -- "No" --> T4A["Tier 4: inventory only"]
Q1 -- "Yes" --> QH{"Materiality high?"}
QH -- "Yes" --> Q3{"Complexity low?"}
Q3 -- "No" --> T1["Tier 1: independent validation, committee approval"]
Q3 -- "Yes" --> T2["Tier 2: independent validation, MRM approval"]
QH -- "No" --> QP{"Affects individuals' access or rights?"}
QP -- "Yes" --> T2
QP -- "No" --> QM{"Materiality medium?"}
QM -- "Yes" --> QC1{"Complexity low?"}
QC1 -- "No" --> T2
QC1 -- "Yes" --> T3["Tier 3: peer review, owner approval"]
QM -- "No, low" --> QC2{"Complexity low?"}
QC2 -- "No" --> T3
QC2 -- "Yes" --> T4B["Tier 4: inventory only"]
classDef core fill:#e8f3f2,stroke:#16756f,color:#122029
classDef decision fill:#fdf3e3,stroke:#c9800f,color:#122029
classDef risk fill:#fbeceb,stroke:#b4332b,color:#122029
classDef neutral fill:#f1f4f6,stroke:#5b7a87,color:#122029
class S neutral
class Q1,QH,Q3,QP,QM,QC1,QC2 decision
class T1 risk
class T2,T3,T4A,T4B core
Text equivalent: A model whose output is not used in a decision is tier 4 (inventory only). Otherwise: high materiality gives tier 1 (committee approval), or tier 2 if complexity is low; a model affecting individuals’ access or rights is tier 2 or stricter; medium materiality gives tier 2, or tier 3 if complexity is low; low materiality gives tier 3, or tier 4 if complexity is low.
How much ModelOps? If three or more conditions above hold, staff a part-time MRM function and an independent reviewer; if a supervisor oversees your models, plan a separate validation function.
Maturity model
Link to section “Maturity model”These levels are this Atlas’s model; no official ModelOps maturity model exists.
| Level | Observable behaviour | Exit criteria |
|---|---|---|
| 0. Unknown portfolio | Models found in incidents; developers approve | An inventory of production models with owners |
| 1. Inventoried | One list, owners named, all model types | Owned share 100%; discovery reconciles monthly |
| 2. Tiered | Documented rubric; tiers and review dates set | Reviewers agree on ≥ 80% of tiers; no tier-1 model unvalidated |
| 3. Enforced | Approval records gate releases; conditions expire; change classes applied | Zero unapproved or lapsed use for two quarters |
| 4. Portfolio-managed | Aggregate risk and capacity steer investment; yearly self-assessment | Sustain; external review |
Adoption roadmap: 30/60/90 days
Link to section “Adoption roadmap: 30/60/90 days”| Window | Goals | Activities | Metrics at the end |
|---|---|---|---|
| Days 1–30: see the portfolio | Inventory | Collect models from registries, cloud usage and procurement; name owners; run Lab 1 | Coverage; owned share |
| Days 31–60: tier and decide | Rubric and roles | Agree rubric and change classes; tier everything; name validators and approvers; approve or suspend unapproved use | Unapproved use = 0 |
| Days 61–90: enforce and report | Gates and reviews | Release gate for tiers 1–2 (Lab 3); exceptions register; first portfolio report | Review currency; time to decision |
Dependencies: a registry to hook into (MLOps); a risk appetite (RiskOps).
Toolkit
Link to section “Toolkit”Checklists
Link to section “Checklists”Intake (every new model or material change)
Link to section “Intake (every new model or material change)”- Purpose, decision supported and approved uses in one paragraph; type and origin recorded.
- Owner is a named person; data sources and regulatory scope set; provisional tier within five working days.
- For a change: class recorded; material changes re-tiered.
Before approval (tiers 1–2)
Link to section “Before approval (tiers 1–2)”- Validation covers conceptual soundness, outcomes analysis and a monitoring plan.
- Performance by group, with the primary fairness metric named; explanations fit each audience.
- Limits, conditions and expiry written into the approval record that the release gate reads.
- Vendor or API models: documentation received; change and retirement notices routed to the owner.
- Agents: tool permissions, action limits and human checkpoints listed.
Periodic review
Link to section “Periodic review”- Used only for approved purposes; consumers current; breaches, overrides and overlays examined.
- Tier still right; change envelope still valid; findings closed or re-dated with reasons.
Retirement
Link to section “Retirement”- Consumers notified with a date; traffic and access stopped; downstream effects watched.
- Model, documentation and approval history retained for the agreed period.
- Third-party contracts and API keys closed (ProcurementOps).
Templates
Link to section “Templates”One-page ModelOps charter
Link to section “One-page ModelOps charter”MODEL GOVERNANCE CHARTER — <organisation> Owner: <name> Review: yearly
Mission: Every model we rely on is known, owned, used within approved limits,
and retired on purpose.
Scope: ML, rules, optimisation, LLM applications, agents, vendor and API models,
spreadsheets used in decisions. Regulatory scope recorded per model.
Principles: Inventory before policy · Rigour follows risk · Independence where it
matters · Approve a use, not a model · Evidence lives with the model ·
Bought is not exempt · Retire on purpose.
Tiers: 1 committee approval · 2 MRM approval · 3 owner approval · 4 inventory only.
Changes: material = new approval · bounded = validator + approver ·
in envelope = automated record · record only = log.
Goals: Owned share 100% · unapproved or lapsed use 0 · review currency >= 95%.
Decision rights: Approvers per tier: <names>. Exceptions: <who>, maximum <n> days.
Non-goals: Approving every spreadsheet; replacing developers' testing; legal advice.
Model intake and inventory record
Link to section “Model intake and inventory record”MODEL RECORD — <model-id> Date: <YYYY-MM-DD>
Name and description: Type: ml | rules | optimisation | llm-app | agent | other
Origin: internal | vendor <name> | API <provider, model version>
Owner (person): Developer: Users:
Purpose and decision supported:
Approved uses: Not approved for:
Materiality (H/M/L) and why: Complexity (H/M/L) and why:
Affects individuals' access or rights? Y/N Can act without a person? Y/N
Regulatory scope: bank MRM Y/N · EU AI Act class <...> · other <...>
Data sources and limitations:
Dependencies (models, data, providers):
Tier: proposed <n> confirmed <n> by <name>
Approval: <date> by <name> · conditions <...> · conditions until <date>
Change envelope: <id, fixed features, limits> Last material change: <date, what>
Last review: <date> Next review: <date> Monitoring plan: <link>
Provider retirement date (if any): <date>
Approval record with conditions
Link to section “Approval record with conditions”APPROVAL — <model-id> v<version> Tier: <n> Date: <YYYY-MM-DD>
Validation report: <link> Validator: <name> Independent of developer: Y/N
Decision: approved | approved_with_conditions | provisional | rejected
Approved uses: <list> Prohibited uses: <list>
Conditions: <limits, monitoring thresholds, manual review rates, exposure caps>
Provisional only: exception ID <id> · expiry <= 14 days · renewals 0 | 1
Open findings and due dates: <id, severity, owner, date>
Expires / next review: <date> Triggers for early review: <list>
Approver: <name, role> Recorded in the inventory by: <approver or MRM function>
Exception request (provisional or out-of-scope use)
Link to section “Exception request (provisional or out-of-scope use)”EXCEPTION — <model-id> Requested: <YYYY-MM-DD>
Type: use before validation | use outside approved scope | performance breach
Business need and why it cannot wait:
Limits while the exception lasts: <volume caps, manual review, overlays>
Extra monitoring and reporting: <metric, frequency, recipient>
Expiry date (maximum <n> days): <date> Renewal allowed: once | never
Compensating controls owner: Approver: Logged in register: Y/N
Deep comparisons
Link to section “Deep comparisons”| Approach | Strength | Weakness | Choose it when |
|---|---|---|---|
| ModelOps (this page) | One inventory and risk language for everything that decides | Unsettled label; can sprawl | Many model types, high stakes |
| Bank MRM (SR 26-2, SS1/23, E-23) | Mature practice, supervisory expectations | Definitions differ by country | You are supervised: extend it |
| AI governance programme (NIST AI RMF, ISO/IEC 42001) | Organisation-wide management system | Can stay at policy level | You need a management-system frame |
| MLOps and LLMOps alone | Automation, evaluations | No authority to say no | Few low-stakes models |
Is ModelOps the same as MLOps? Some use the terms interchangeably;[5] this Atlas separates building and running (MLOps) from deciding allowed uses (ModelOps).
Does a rules engine or a spreadsheet count as a model? It depends on whose definition (what ModelOps is not); inventory anything whose output drives a decision.
We only call a foundation model through an API. What is there to validate? Your use: task, prompts and retrieval, outcomes on your cases, limits, and the provider’s retirement date (Scenario 5). LLMOps supplies the evaluations; ModelOps decides whether they suffice.
Does every retrained version need a committee? No: retraining inside a pre-approved envelope is recorded automatically; a new method, use or provider model is a material change (change classes).
Can an agent be approved at all? Yes, as a bounded use: named tools, data and actions, limits and human checkpoints.[28] An agent with open-ended permissions cannot be tiered meaningfully.
Going further
Link to section “Going further”Advanced topics and emerging direction
Link to section “Advanced topics and emerging direction”- Aggregate model risk. Models sharing a data source, vendor or assumption fail together; US guidance assesses risk “both individually and in aggregate”.[8] Inventory dependency fields make this measurable.
- Generative and agentic AI in banks. The US agencies plan “a request for information” on model risk, “including generative AI and agentic AI” (none in the Federal Register as of 18 October 2026).[29]
Learning path
Link to section “Learning path”- Prerequisites: MLOps basics; a confusion matrix; risk vocabulary (RiskOps).
- One day: this page; SR 26-2 (12 pages) and OSFI E-23’s inventory appendix; Lab 1.[8][10]
- One week: Labs 2 and 3; model cards and datasheets;[11][12] tier ten real models with a colleague.
- Thirty days: the roadmap’s first month for one business unit; one tier-2 validation report; PRA SS1/23.[9]
- Specialise: fairness (Kleinberg et al.; Fairlearn’s user guide[21][45]), EU AI Act work with ComplianceOps, or agent evaluation with LLMOps. Project: inventory, rubric and gate for an open-source model zoo.
Wrap-up
Link to section “Wrap-up”Executive recap and cheat sheet
Link to section “Executive recap and cheat sheet”| Topic | What to remember |
|---|---|
| Definition | Governance and lifecycle management of every model you rely on; a new label for an old banking practice. |
| Artefacts | Inventory, rubric, change classes, validation reports, expiring approvals, exceptions register. |
| Metrics | Owned share, review currency, unapproved or lapsed use (target 0). |
| 2026 changes | SR 26-2 replaced SR 11-7 (17 April); EU Annex III duties from 2 December 2027; OSFI E-23 from 1 May 2027. |
| Watch-outs | One process for all; a gate that trusts developer-written evidence; “the vendor validated it”. |
| Next actions | List models with owners; agree a rubric and change classes; suspend unapproved agents; date every approval. |
A judgement call: launch the refreshed fraud model before validation finishes?
Link to section “A judgement call: launch the refreshed fraud model before validation finishes?”Situation (illustrative). A card issuer’s tier-1 fraud model misses a new attack; losses rise by an estimated 200,000 (currency units) a week. A retrained version is ready; full validation takes six weeks, a focused review two. Option A: wait. Option B: deploy now under a provisional approval.
What the guidance allows. US guidance accepts that “certain circumstances (e.g., an urgent business need) may necessitate using the model before validation is completed”, with controls such as “placing limits on model use or more closely monitoring its performance”.[8] The PRA treats it as a temporary exception supported by senior management.[9]
The attractive choice and why it can be wrong. Option B fails if “provisional” has no teeth: the model may block legitimate customers in a segment the retraining over-weighted (a harm the loss figure ignores), and the exception is renewed while validation never finishes.
Recommendation. Option B, with conditions: (1) 72 hours in shadow, comparing decline rates by segment with the old model;
(2) a score band sent to manual review instead of auto-decline; (3) daily monitoring of declines and complaints by segment; (4) a
provisional record with an exception ID, a senior approver, the monitoring plan and a 14-day expiry, renewable once after the
focused review, as the Lab 3 gate checks; (5) full validation scheduled. Uncertainty: the loss estimate
may be off by half; if one segment’s declines jump in shadow, revert to A with a rule-based patch.
Learning objectives and mastery check
Link to section “Learning objectives and mastery check”You should now be able to explain the meanings of ModelOps, build an inventory and tier models, design approval and change evidence, evaluate fairness reports, and decide exceptions. Self-check:
- A team says its assistant needs no review because “it just calls the provider’s model”. What is wrong?
Show answer for question 1
- Your US bank’s MRM policy covers “all models per SR 11-7”. What should change after April 2026?
Show answer for question 2
First check applicability: SR 26-2, which superseded SR 11-7 on 17 April 2026, is expected to be most relevant above $30 billion in total assets, though it may also be relevant to smaller banks with significant model risk. It narrows the definition (no simple spreadsheet arithmetic or theory-free deterministic rules), leaves out generative and agentic AI, and drops the “at least annually” review.[3][8][2] Keep excluded systems governed: the bank’s practices “should guide the determination of appropriate governance and controls” for them.[8]
- In Lab 2, raising group B’s approvals lifts its impact ratio from 0.75 to 0.85. Is the model now fair?
Show answer for question 3
Not necessarily. The true-positive-rate gap is still 0.078 and B’s defaults among the approved rose to 8.9%. Fairness criteria can be incompatible,[21] the four-fifths screen is a US employment heuristic,[23] and the target may be a biased proxy.[41] Policy must name the primary metric, with reasons.
- The inventory shows 400 models, all tier 1, and a two-year validation backlog. What do you do first?
Show answer for question 4
- An EU bank retrains a third-party credit-scoring system on its own data until its behaviour changes materially. What changes under the AI Act?
Show answer for question 5
Credit scoring is an Annex III high-risk use, and a deployer that substantially modifies a high-risk system becomes a provider under Article 25.[13] Whether this retraining qualifies is a legal question; ModelOps treats it as a material change and escalates it. Annex III duties apply from 2 December 2027.[24]
Conclusion
Link to section “Conclusion”ModelOps is a young name for an old duty. Banks learned that a sound model used in the wrong place is a risk, that someone independent must be able to say no, and that control starts with a list. What changed is the portfolio: rules, vendor scores, LLM applications and agents now shape decisions, and no single rulebook covers them.
The useful version is modest: one inventory, an agreed rubric, approvals that name uses and expire, a gate only approvers can satisfy, and validation where the stakes justify it. Organisations that skip it still have model risk; they find it in an audit, a court or a loss.
Sources and further reading
Link to section “Sources and further reading”Each source was opened on its “Checked” date; other dates are the source’s own. Claim-level support is in
research/modelops-ledger.md.
Further reading: Google Cloud, Practitioners guide to MLOps (2021), “Model governance”; the AI Act Explorer’s Digital Omnibus view.
Changelog. 2026-10-17, r0: first draft. 2026-10-17, r1 (fact check reviews/modelops-r1.md): gate reads approvals from the
inventory; one provisional path; change classes added; three figures redrawn; attributions corrected. 2026-10-18, post-score polish:
SR 26-2 exclusion in full; validation depth by tier; MLflow pin and grant preconditions (reviews/modelops-polish-check.md); tier wording;
Figures 1–2 relaid.
ModelOps — Gartner IT Glossary (archived) — Gartner, snapshot of 2025-05-17 (live page blocks automated access). Checked 2026-10-17. ↩︎ ↩︎ ↩︎ ↩︎
Supervisory Guidance on Model Risk Management (SR 11-7 attachment, Internet Archive snapshot) — Federal Reserve and OCC, 2011-04-04; superseded 2026-04-17 (live URL now 404). Checked 2026-10-17. ↩︎ ↩︎ ↩︎
SR 26-2: Revised Guidance on Model Risk Management — Board of Governors of the Federal Reserve System, 2026-04-17. Checked 2026-10-17. ↩︎ ↩︎ ↩︎
ModelOps: Cloud-based lifecycle management for reliable and trusted AI — W. Hummer et al., IEEE IC2E 2019 (IBM Research), 2019-06-01. Checked 2026-10-17. ↩︎ ↩︎
MLOps and ModelOps: What’s the Difference and Why it Matters — Stu Bailey (ModelOp co-founder), KDnuggets, 2021-09-28. Checked 2026-10-17. ↩︎ ↩︎
IBM watsonx.governance — IBM product page, as of October 2026 (vendor claims). Checked 2026-10-17. ↩︎ ↩︎
ModelOp home page — ModelOp, as of October 2026 (vendor claims). Checked 2026-10-17. ↩︎ ↩︎
Supervisory Guidance on Model Risk Management (SR 26-2 attachment) — Federal Reserve, FDIC, OCC, 2026-04-17. Checked 2026-10-18. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Supervisory Statement 1/23 – April 2026 (PDF) — PRA, April 2026. Checked 2026-10-18. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Guideline E-23 – Model Risk Management (2027) — OSFI Canada, 2025-09-11, effective 2027-05-01. Checked 2026-10-18. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Model Cards for Model Reporting — M. Mitchell et al., FAT* 2019 (arXiv:1810.03993). Checked 2026-10-17. ↩︎ ↩︎ ↩︎ ↩︎
Datasheets for Datasets — T. Gebru et al., arXiv:1803.09010, 2018 (Communications of the ACM, December 2021). Checked 2026-10-17. ↩︎ ↩︎
Regulation (EU) 2024/1689 (Artificial Intelligence Act) — Official Journal of the EU, 2024-07-12 (as adopted; amended by the Digital Omnibus). Checked 2026-10-17. ↩︎ ↩︎ ↩︎ ↩︎ ↩︎ ↩︎
Authentication with Username and Password — MLflow 3.17.1 documentation, living page. Checked 2026-10-18. ↩︎ ↩︎ ↩︎ ↩︎
Role-Based Access Control (RBAC) — MLflow 3.17.1 documentation, living page. Checked 2026-10-18. ↩︎ ↩︎ ↩︎ ↩︎
12 CFR 1002.9 — Notifications (Regulation B) — eCFR, up to date as of 2026-10-15. Checked 2026-10-17. ↩︎
Interpretive Rules, Policy Statements, and Advisory Opinions; Withdrawal — CFPB, Federal Register, 2025-05-12. Checked 2026-10-17. ↩︎
A Unified Approach to Interpreting Model Predictions — S. Lundberg, S.-I. Lee, arXiv:1705.07874, 2017. Checked 2026-10-17. ↩︎ ↩︎
Stop Explaining Black Box Machine Learning Models for High Stakes Decisions and Use Interpretable Models Instead — C. Rudin, Nature Machine Intelligence 1, 2019 (arXiv version). Checked 2026-10-17. ↩︎
Assessment — Fairlearn user guide — Fairlearn project, living documentation (development version). Checked 2026-10-17. ↩︎ ↩︎
Inherent Trade-Offs in the Fair Determination of Risk Scores — J. Kleinberg et al., arXiv:1609.05807, 2016. Checked 2026-10-17. ↩︎ ↩︎ ↩︎
Fair prediction with disparate impact: A study of bias in recidivism prediction instruments — A. Chouldechova, arXiv:1610.07524, 2016. Checked 2026-10-17. ↩︎
29 CFR 1607.4 — Information on impact (Uniform Guidelines on Employee Selection Procedures) — eCFR, up to date as of 2026-10-15. Checked 2026-10-17. ↩︎ ↩︎
Regulation (EU) 2026/1744 (Digital Omnibus on AI) — Official Journal of the EU, adopted 2026-07-08, published 2026-07-24, in force 2026-07-27. Checked 2026-10-17. ↩︎ ↩︎ ↩︎ ↩︎
Automated Employment Decision Tools (AEDT) — NYC DCWP, living page (enforcement since 2023-07-05). Checked 2026-10-17. ↩︎
Deprecations — OpenAI API documentation, living page (latest entry 2026-10-14). Checked 2026-10-17. ↩︎ ↩︎
Model deprecations — Anthropic, Claude Platform documentation, living page (latest entry 2026-09-30). Checked 2026-10-17. ↩︎ ↩︎
Singapore Launches New Model AI Governance Framework for Agentic AI — Singapore MDDI, 2026-01-22. Checked 2026-10-17. ↩︎ ↩︎ ↩︎
OCC Bulletin 2026-13: Model Risk Management: Revised Guidance — Office of the Comptroller of the Currency, 2026-04-17. Checked 2026-10-17. ↩︎ ↩︎
SS1/23 – Model risk management principles for banks — Bank of England PRA; 2023-05-17, effective 2024-05-17, current version 2026-04-23. Checked 2026-10-17. ↩︎
AI Act: regulatory framework for AI — European Commission, updated 2026-08-03. Checked 2026-10-17. ↩︎ ↩︎
AI Risk Management Framework — NIST, living page (AI RMF 1.0 of 2023-01-26; under revision). Checked 2026-10-17. ↩︎
Artificial Intelligence Risk Management Framework (AI RMF 1.0), NIST AI 100-1 — NIST, 2023-01. Checked 2026-10-17. ↩︎
ISO/IEC 42001:2023 Information technology — Artificial intelligence — Management system — ISO/IEC (IEC Webstore listing), 2023-12-18. Checked 2026-10-17. ↩︎
M-25-21: Accelerating Federal Use of AI through Innovation, Governance, and Public Trust — US OMB, 2025-04-03 (scanned PDF); no rescission in OMB’s memoranda list. Checked 2026-10-18. ↩︎
MLflow Model Registry — MLflow documentation, living page (MLflow 3 docs). Checked 2026-10-17. ↩︎
Update the Approval Status of a Model — Amazon SageMaker AI Developer Guide, living page. Checked 2026-10-17. ↩︎
Amazon SageMaker Model Cards — Amazon SageMaker AI Developer Guide, living page. Checked 2026-10-17. ↩︎ ↩︎
mlflow.client API reference — MLflow 3.17.1 documentation, living page. Checked 2026-10-18. ↩︎
External Validation of a Widely Implemented Proprietary Sepsis Prediction Model in Hospitalized Patients — A. Wong et al., JAMA Internal Medicine, 2021 (abstract via Europe PMC). Checked 2026-10-17. ↩︎
Dissecting racial bias in an algorithm used to manage the health of populations — Z. Obermeyer et al., Science, 2019 (abstract via Europe PMC). Checked 2026-10-17. ↩︎ ↩︎
Zillow Group Reports Third-Quarter 2021 Financial Results (Form 8-K, Exhibit 99.1) — Zillow Group, 2021-11-02. Checked 2026-10-17. ↩︎
Q3 2021 Shareholder Letter (Form 8-K, Exhibit 99.3) — Zillow Group, 2021-11-02. Checked 2026-10-17. ↩︎
Moffatt v. Air Canada, 2024 BCCRT 149 — British Columbia Civil Resolution Tribunal, 2024-02-14. Checked 2026-10-17. ↩︎ ↩︎
Fairness in Machine Learning — Fairlearn user guide — Fairlearn project, living documentation. Checked 2026-10-17. ↩︎