Skip to content
SDB
Responsible AI

Chapter 04 · intermediate · 32 min

Accountability & Governance

AI governance structures, RACI matrices, audit frameworks, incident response, and ISO 42001 organizational controls

Subhendu Datta BhowmikAI Tutorials

The Accountability Gap

When an AI system causes harm, who is responsible? This question is deceptively difficult:

  • The data scientist who trained the model?
  • The product manager who approved deployment?
  • The executive who set business objectives?
  • The vendor who supplied the training data?
  • The organization that deployed the system?

Without explicit accountability structures, the answer is often "no one" — responsibility diffuses across the organization and nobody takes corrective action. ISO 42001 Clause 5 (Leadership) and Clause 8 (Operation) exist precisely to prevent this.

The Accountability Hierarchy

Board / Executive Leadership
  ├─ AI Ethics Board / AI Risk Committee
  │    ├─ Chief AI Officer (or equivalent)
  │    ├─ Chief Privacy Officer
  │    └─ Legal / Compliance Representative
  │
  ├─ AI Governance Function
  │    ├─ AI Policy Development
  │    ├─ Impact Assessment Reviews
  │    └─ Third-party AI Oversight
  │
  └─ Product / Development Teams
       ├─ Product Owner (use case accountability)
       ├─ ML Engineer (technical implementation)
       ├─ Data Steward (data quality and provenance)
       └─ QA / Safety Tester (evaluation and red-teaming)

ISO 42001 Clause 5 — Leadership Requirements

Clause 5.2 requires top management to:

  • Establish and communicate an AI policy (aligned with organizational context)
  • Ensure AI objectives are compatible with the organization's strategic direction
  • Ensure the AI management system is integrated into business processes
  • Direct and support persons contributing to the effectiveness of the AIMS

Clause 5.3 requires documented roles and responsibilities for:

  • Who ensures the AIMS conforms to ISO 42001 requirements
  • Who reports AI system performance to top management
  • Who has accountability for specific AI systems throughout their lifecycle

AI Governance RACI Matrix

AI Lifecycle RACI

Lifecycle ActivityProduct OwnerML EngineerData StewardLegal / ComplianceAI Ethics BoardCTO/CPO
Define use caseARCCCI
AI Impact AssessmentRCCARI
Data collection & labelingIRACII
Model training & selectionCAIICI
Bias & fairness testingCRICAI
Security reviewIRRCIA
Deployment approvalRRICCA
Production monitoringRAIIII
Incident responseRRIACI
Model retirementARRCII

A = Accountable (one per row), R = Responsible, C = Consulted, I = Informed

AI Ethics Board Charter

An effective AI Ethics Board (or AI Risk Committee) should:

  1. Membership: diverse — technical AI experts, legal/compliance, social scientists, business representatives, and ideally external members or civil society representatives
  2. Mandate: review and approve high-risk AI systems before deployment; investigate AI-related incidents; set and update AI policy
  3. Meeting cadence: monthly review of new AI systems; quarterly policy review; ad-hoc for incidents
  4. Escalation trigger: any AI system with an Impact Assessment score above threshold, or any system involving health, employment, credit, law enforcement, or education
  5. Authority: veto power over AI deployments that violate ethical standards or policy
AI Governance Toolkit: Audit Trails, RACI, and Incident Responsepython
# ─── 1. AI Model Registry with Audit Trail ───────────────────
from dataclasses import dataclass, field
from datetime import datetime
from typing import List, Optional, Dict
from enum import Enum
import json

class ModelStatus(Enum):
    DEVELOPMENT = "development"
    REVIEW = "under_review"
    APPROVED = "approved"
    DEPLOYED = "deployed"
    DEPRECATED = "deprecated"
    RETIRED = "retired"

class RiskLevel(Enum):
    LOW = "low"
    MEDIUM = "medium"
    HIGH = "high"
    CRITICAL = "critical"

@dataclass
class AuditEvent:
    timestamp: str
    actor: str
    actor_role: str
    action: str
    details: str
    status_before: Optional[str] = None
    status_after: Optional[str] = None

@dataclass
class ModelRecord:
    model_id: str
    name: str
    version: str
    use_case: str
    risk_level: RiskLevel
    eu_ai_act_class: str
    owner: str          # Product Owner — Accountable for deployment
    developer: str      # ML Engineer — Responsible for technical quality
    data_steward: str   # Accountable for data quality
    status: ModelStatus = ModelStatus.DEVELOPMENT
    audit_trail: List[AuditEvent] = field(default_factory=list)
    impact_assessment_id: Optional[str] = None
    deployment_approver: Optional[str] = None
    deployment_date: Optional[str] = None
    monitoring_dashboard: Optional[str] = None

    def log_event(self, actor: str, role: str, action: str, details: str,
                   new_status: Optional[ModelStatus] = None):
        event = AuditEvent(
            timestamp=datetime.utcnow().isoformat() + "Z",
            actor=actor,
            actor_role=role,
            action=action,
            details=details,
            status_before=self.status.value,
            status_after=new_status.value if new_status else None,
        )
        if new_status:
            self.status = new_status
        self.audit_trail.append(event)
        return event

    def submit_for_review(self, submitter: str, impact_assessment_id: str):
        self.impact_assessment_id = impact_assessment_id
        return self.log_event(
            submitter, "ML Engineer",
            "SUBMIT_FOR_REVIEW",
            f"Submitted with impact assessment {impact_assessment_id}",
            ModelStatus.REVIEW,
        )

    def approve_deployment(self, approver: str, notes: str = ""):
        self.deployment_approver = approver
        self.deployment_date = datetime.utcnow().isoformat() + "Z"
        return self.log_event(
            approver, "CTO/CPO",
            "APPROVE_DEPLOYMENT",
            f"Approved for production. {notes}",
            ModelStatus.APPROVED,
        )

    def reject(self, reviewer: str, reason: str):
        return self.log_event(
            reviewer, "AI Ethics Board",
            "REJECT",
            f"Rejected: {reason}",
            ModelStatus.DEVELOPMENT,
        )

    def deploy(self, deployer: str, dashboard_url: str):
        self.monitoring_dashboard = dashboard_url
        return self.log_event(
            deployer, "DevOps",
            "DEPLOY",
            f"Deployed to production. Dashboard: {dashboard_url}",
            ModelStatus.DEPLOYED,
        )

    def print_audit_trail(self):
        print(f"\nAudit Trail — {self.name} v{self.version}")
        print(f"{'─'*70}")
        for event in self.audit_trail:
            print(f"  [{event.timestamp}] {event.actor} ({event.actor_role})")
            print(f"    Action: {event.action}")
            print(f"    Details: {event.details}")
            if event.status_before:
                print(f"    Status: {event.status_before} → {event.status_after}")

# Simulate a model governance lifecycle
loan_model = ModelRecord(
    model_id="LM-2025-001",
    name="LoanApprovalAI",
    version="3.2.0",
    use_case="Consumer loan application scoring",
    risk_level=RiskLevel.HIGH,
    eu_ai_act_class="HIGH RISK — financial services",
    owner="Sarah Chen (Product)",
    developer="Alex Kumar (ML)",
    data_steward="Maria Santos (Data)",
)

# Log the development lifecycle
loan_model.log_event("alex.kumar", "ML Engineer", "MODEL_TRAINING",
    "Trained XGBoost model on 250k samples, accuracy=87.3%, AUC=0.92")
loan_model.log_event("alex.kumar", "ML Engineer", "FAIRNESS_TEST",
    "Disparate Impact Ratio: 0.91 (PASS). DPD: 0.03 (ACCEPTABLE). Certified by AI Ethics Board member.")
loan_model.log_event("maria.santos", "Data Steward", "DATA_QUALITY_SIGN_OFF",
    "Data lineage verified. No PII leakage. GDPR consent documented for all training samples.")
loan_model.submit_for_review("alex.kumar", "AIIA-2025-007")
loan_model.log_event("ethics.board", "AI Ethics Board", "ETHICS_REVIEW",
    "Reviewed AIIA-2025-007. Approved with condition: SHAP explanations must be provided for all rejections.")
loan_model.approve_deployment("cto@company.com", "Conditional: adverse action notices required.")
loan_model.deploy("devops.team", "https://grafana.company.com/d/loan-model-v3")

loan_model.print_audit_trail()

# ─── 2. AI Incident Response System ──────────────────────────
class IncidentSeverity(Enum):
    P1_CRITICAL = "P1"   # Halt deployment; immediate escalation to C-suite
    P2_HIGH = "P2"       # 24h response; AI Ethics Board notification
    P3_MEDIUM = "P3"     # 72h response; team lead notification
    P4_LOW = "P4"        # 1-week response; logged for audit

@dataclass
class AIIncident:
    incident_id: str
    model_id: str
    detected_at: str
    reported_by: str
    description: str
    severity: IncidentSeverity
    affected_users: int
    resolution_status: str = "OPEN"
    remediation_steps: List[str] = field(default_factory=list)
    root_cause: Optional[str] = None
    post_mortem_date: Optional[str] = None

    def classify_sla(self) -> str:
        sla_map = {
            IncidentSeverity.P1_CRITICAL: "Acknowledge within 15min; resolve within 4h; halt model",
            IncidentSeverity.P2_HIGH: "Acknowledge within 1h; resolve within 24h",
            IncidentSeverity.P3_MEDIUM: "Acknowledge within 4h; resolve within 72h",
            IncidentSeverity.P4_LOW: "Acknowledge within 24h; resolve within 7 days",
        }
        return sla_map[self.severity]

    def add_remediation(self, step: str):
        self.remediation_steps.append(step)

    def close(self, root_cause: str, post_mortem_date: str):
        self.root_cause = root_cause
        self.post_mortem_date = post_mortem_date
        self.resolution_status = "CLOSED"

    def to_report(self) -> dict:
        return {
            "incident_id": self.incident_id,
            "model": self.model_id,
            "severity": self.severity.value,
            "sla": self.classify_sla(),
            "affected_users": self.affected_users,
            "status": self.resolution_status,
            "remediation": self.remediation_steps,
            "root_cause": self.root_cause,
        }

# Example incident
incident = AIIncident(
    incident_id="INC-2025-0142",
    model_id="LM-2025-001",
    detected_at="2025-06-15T14:32:00Z",
    reported_by="monitoring.alert@company.com",
    description="Fairness monitoring alert: Disparate Impact Ratio dropped to 0.71 for Hispanic applicants over past 7 days — below legal threshold of 0.8",
    severity=IncidentSeverity.P1_CRITICAL,
    affected_users=2847,
)

incident.add_remediation("IMMEDIATE: Model rolled back to LM-2025-001 v3.1.0 (14:45 UTC)")
incident.add_remediation("INVESTIGATION: Data team analyzing input drift in zip code distribution")
incident.add_remediation("LEGAL: Compliance team notified; affected applicants flagged for manual review")
incident.add_remediation("ROOT CAUSE ANALYSIS: New data pipeline introduced geographic recoding error")
incident.close(
    root_cause="ETL pipeline bug recoded zip codes incorrectly after postcode database update, introducing measurement bias in the geographic features correlated with ethnicity.",
    post_mortem_date="2025-06-22",
)

print("\nAI Incident Report:")
print(json.dumps(incident.to_report(), indent=2))

# ─── 3. Governance Scorecard ──────────────────────────────────
governance_domains = {
    "Policy & Strategy": {
        "AI policy documented": True,
        "AI policy reviewed in past 12 months": True,
        "Board-level AI risk oversight": False,
        "AI Ethics Board established": True,
    },
    "Risk Management": {
        "AI Impact Assessments for all high-risk systems": True,
        "Third-party AI vendor assessments": False,
        "AI incident tracking system": True,
        "Post-incident root cause analysis process": True,
    },
    "Transparency": {
        "Model cards for all production models": False,
        "Datasheets for training datasets": False,
        "User-facing AI disclosure notices": True,
        "Appeals/redress process for AI decisions": False,
    },
    "Monitoring": {
        "Automated drift detection in production": True,
        "Fairness monitoring dashboards": True,
        "Quarterly model performance reviews": True,
        "Annual third-party AI audit": False,
    },
}

print("\nAI Governance Scorecard:")
total, implemented = 0, 0
for domain, controls in governance_domains.items():
    domain_yes = sum(v for v in controls.values())
    domain_total = len(controls)
    pct = 100 * domain_yes // domain_total
    print(f"\n  {domain} ({domain_yes}/{domain_total} = {pct}%)")
    for ctrl, status in controls.items():
        print(f"    {'✓' if status else '✗'} {ctrl}")
    total += domain_total
    implemented += domain_yes

print(f"\nOverall Governance Score: {implemented}/{total} = {100*implemented//total}%")

AI Audit Framework

Three Audit Types

1. Pre-deployment Audit (Mandatory for high-risk)

  • Technical review: code quality, testing coverage, model documentation
  • Fairness review: bias metrics across protected groups, disparate impact analysis
  • Security review: adversarial robustness, data poisoning risk
  • Compliance review: AIIA completion, legal sign-off, model card finalized
  • Gate: deployment blocked until all critical findings resolved

2. In-production Audit (Continuous + Periodic)

  • Automated monitoring: performance drift, fairness drift, input distribution shift
  • Monthly sampling audit: random sample of predictions reviewed by humans
  • Quarterly detailed review: full re-evaluation against all KPIs and fairness metrics
  • Annual external audit: third-party assessment for high-risk systems

3. Post-incident Audit (Triggered by incidents)

  • Root cause analysis (5 Whys, fishbone diagram)
  • Timeline reconstruction from audit logs
  • Impact assessment: how many users affected, severity of harm
  • Systemic review: are other models affected by the same issue?
  • Remediation verification: confirm fix works before redeployment

Documentation Requirements (ISO 42001 Clause 7.5)

All AI systems must maintain:

DocumentRetentionOwner
AI Impact AssessmentLifetime of system + 5 yearsLegal / Compliance
Model cardLifetime of system + 5 yearsML Team
Training data documentationLifetime of system + 5 yearsData Steward
Fairness test resultsPer model versionML Team
Deployment approvalLifetime of systemProduct Owner
Incident reports10 yearsAI Governance
Audit reports10 yearsAI Ethics Board

Knowledge check

In a RACI matrix for an AI system's deployment approval decision, how many people should be listed as "Accountable" (A)?

Summary

  • The accountability gap is the core problem governance solves — diffused responsibility means no one acts when AI systems cause harm
  • ISO 42001 Clauses 5 and 8 mandate top management commitment, documented AI policy, and clear role assignments
  • A RACI matrix ensures exactly one accountable owner per AI lifecycle decision — avoiding responsibility diffusion
  • An AI Ethics Board provides cross-functional oversight with veto power over high-risk deployments
  • Three-tier audit framework: pre-deployment gates, continuous in-production monitoring, and post-incident root cause analysis
  • Audit trails must be maintained for the full system lifetime plus retention period — they are the evidence base for regulatory investigations
  • Incident response must include severity classification (P1–P4), SLAs, affected user assessment, and post-mortem analysis

Next: Reliability & Safety — ensuring AI systems are robust, secure, and fail safely.

Responsible AI