2026-06-08·5 min read·sota.io Team

EU AI Act Post-Market Monitoring Automation: Building the Art.72 ML Observability Stack

Post #1582 in the sota.io EU AI Act Compliance Automation Series (1/5)

EU AI Act Art.72 post-market monitoring automation observability stack

Most compliance discussions around EU AI Act focus on what you must do before you ship: the risk management plan, the technical documentation, the conformity assessment. But Article 72 introduces an obligation that begins after your system goes live and never stops: post-market monitoring. For high-risk AI systems, this is not a quarterly review — it is a continuous operational requirement that must be designed into your infrastructure from day one.

This is the first post in a five-part series on automating EU AI Act compliance. Each post targets a specific operational obligation that teams frequently attempt to satisfy with manual processes, then shows how to build reliable automation that generates audit-ready evidence without human intervention. This post covers Art.72 post-market monitoring. Subsequent posts cover Art.73 incident detection automation, automated Annex IV documentation generation, Art.50 GPAI watermarking pipelines, and the full compliance automation stack finale.

What Art.72 Actually Requires

Article 72 of Regulation (EU) 2024/1689 (EU AI Act) imposes four distinct obligations on providers of high-risk AI systems:

Active data collection. Post-market monitoring must "actively and systematically collect, document and analyse relevant data" — the word actively distinguishes this from passive logging. You cannot wait for users to report problems. Your system must proactively gather performance signals.

Continuous coverage throughout the system's lifetime. The monitoring obligation applies from market placement until the system is decommissioned. Compliance is not a snapshot at release; it is a sustained operational state.

Proportionality to risk. Monitoring intensity must match the risk level of the Annex III category your system falls into. A biometric identification system (Annex III, Point 1) requires more intensive monitoring than an employment AI system (Annex III, Point 4), though both are high-risk and both require monitoring programs.

Deployer data integration. Art.72 explicitly requires that monitoring systems be capable of incorporating data provided by deployers — the organisations that integrate your high-risk AI system into their products. This means your monitoring architecture must include a data-sharing interface for downstream operators.

The practical consequence: your ML infrastructure needs an observability layer that is compliance-aware, not just operationally useful.

The Four-Layer Art.72 Observability Stack

A minimal Art.72-compliant monitoring stack consists of four interconnected layers:

Layer 1: Model Performance Tracking

The most basic obligation is continuous performance monitoring. For a high-risk AI system, this means tracking:

For Python-based ML systems, Evidently AI generates HTML and JSON reports across all of these dimensions:

# post_market_monitor.py
from evidently.report import Report
from evidently.metric_preset import DataDriftPreset, ClassificationPreset, DataQualityPreset
import json
from datetime import datetime

def run_art72_monitoring_report(
    reference_data,
    current_data,
    predictions,
    actuals,
    output_path: str,
    system_id: str
) -> dict:
    """
    Generates Art.72-compliant monitoring report with audit metadata.
    Returns structured findings for downstream incident detection.
    """
    report = Report(metrics=[
        DataDriftPreset(num_stattest="ks", cat_stattest="chi2"),
        ClassificationPreset(),
        DataQualityPreset(),
    ])

    report.run(
        reference_data=reference_data,
        current_data=current_data,
    )

    result = report.as_dict()
    
    # Embed Art.72 compliance metadata
    audit_record = {
        "system_id": system_id,
        "monitoring_timestamp": datetime.utcnow().isoformat() + "Z",
        "regulation_reference": "Regulation (EU) 2024/1689, Art.72",
        "report_type": "post_market_monitoring",
        "drift_detected": result["metrics"][0]["result"]["dataset_drift"],
        "accuracy": result["metrics"][1]["result"]["current"]["accuracy"],
        "data_quality_issues": result["metrics"][2]["result"]["current"]["number_of_missing_values"],
        "raw_report_path": output_path,
    }
    
    with open(output_path.replace(".html", "-audit.json"), "w") as f:
        json.dump(audit_record, f, indent=2)
    
    report.save_html(output_path)
    return audit_record

The audit_record JSON output is your Art.72 monitoring evidence. Store it in your technical documentation repository alongside each monitoring run.

Layer 2: Operational Metrics Collection

Beyond model-specific metrics, Art.72 monitoring must capture the operational context in which your AI system runs. These signals feed into the Art.73 serious incident assessment (covered in Part 2 of this series):

For infrastructure metrics, Prometheus + Grafana is the standard stack. Add AI-specific metrics via a custom exporter:

# ai_compliance_metrics.py
from prometheus_client import Counter, Histogram, Gauge, start_http_server
import numpy as np

class AIComplianceMetrics:
    def __init__(self, system_id: str):
        prefix = f"ai_act_{system_id.replace('-', '_')}"
        
        self.prediction_confidence = Histogram(
            f"{prefix}_prediction_confidence",
            "Model prediction confidence distribution",
            buckets=[0.5, 0.6, 0.7, 0.8, 0.9, 0.95, 0.99, 1.0]
        )
        self.drift_score = Gauge(
            f"{prefix}_drift_score",
            "Current dataset drift score (PSI)",
            ["feature_name"]
        )
        self.fairness_disparity = Gauge(
            f"{prefix}_fairness_disparity",
            "Demographic parity disparity across protected groups",
            ["protected_attribute"]
        )
        self.monitoring_cycles = Counter(
            f"{prefix}_monitoring_cycles_total",
            "Total Art.72 monitoring cycles completed"
        )
        self.art72_violations = Counter(
            f"{prefix}_art72_violations_total",
            "Monitoring threshold violations requiring review",
            ["violation_type"]
        )

Grafana dashboards built on these metrics become your living post-market monitoring evidence. Export dashboard snapshots on a weekly basis and store them with your technical documentation.

Layer 3: Deployer Data Integration

Art.72 requires that providers establish mechanisms to receive performance data from deployers. In practice, this means building an API or event stream that downstream organisations can push operational data into:

# deployer_data_ingestion.py
from fastapi import FastAPI, HTTPException
from pydantic import BaseModel
from typing import Optional
import datetime

app = FastAPI(title="Art.72 Deployer Data Endpoint")

class DeployerMonitoringReport(BaseModel):
    deployer_id: str
    system_id: str
    reporting_period_start: datetime.datetime
    reporting_period_end: datetime.datetime
    total_predictions: int
    user_complaints_received: int
    override_events: int  # Times a human overruled the AI decision (Art.14 human oversight)
    near_miss_incidents: int
    error_descriptions: Optional[list[str]] = None

@app.post("/v1/monitoring/deployer-report")
async def receive_deployer_report(report: DeployerMonitoringReport):
    """
    Art.72-compliant endpoint for deployers to submit operational monitoring data.
    Stores to time-series DB and triggers assessment if thresholds exceeded.
    """
    # Store for Art.72 longitudinal analysis
    await store_deployer_report(report)
    
    # Trigger immediate assessment if serious incident indicators present
    if report.user_complaints_received > COMPLAINT_THRESHOLD:
        await trigger_art73_assessment(report, "complaint_threshold_exceeded")
    
    return {"status": "received", "audit_id": generate_audit_id(report)}

Your contracts with deployers should include an obligation to submit monthly deployer reports via this endpoint. This contractual data-sharing requirement satisfies both Art.72 (provider must collect data from deployers) and Art.26 (deployer obligations to cooperate with provider monitoring).

Layer 4: Automated Threshold Alerting and Evidence Generation

The final layer connects monitoring signals to compliance actions. Define monitoring thresholds in a configuration file that becomes part of your Art.9 risk management documentation:

# art72-monitoring-thresholds.yaml
# Art.9 Risk Management System — Monitoring Threshold Configuration
system_id: "high-risk-credit-scoring-v2"
regulation: "EU AI Act Art.72 + Art.9"
review_date: "2026-08-01"

thresholds:
  # Performance degradation
  accuracy_minimum: 0.87          # Below this triggers Art.73 pre-assessment
  accuracy_alert: 0.90            # Below this triggers internal review
  
  # Distribution shift
  drift_score_alert: 0.15         # PSI above this requires data governance review
  drift_score_critical: 0.25      # PSI above this triggers Art.9 risk reassessment
  
  # Fairness (Art.10(5) bias monitoring)
  demographic_parity_maximum: 0.05    # Maximum allowed disparity
  equalized_odds_maximum: 0.07
  
  # Operational
  error_rate_alert_pct: 2.0       # % of requests resulting in errors
  
  # Deployer-reported
  complaint_rate_per_1000: 5.0    # Complaints per 1000 predictions
  override_rate_pct: 15.0         # Human override rate ceiling

monitoring_frequency: "continuous"
evidence_retention_years: 10  # Art.72 lifetime + post-decommission obligation
reporting_to_nca_trigger: "critical_threshold_exceeded"

When a threshold is crossed, your system should automatically:

  1. Generate a timestamped violation report with all relevant metrics
  2. Store the report in your Art.12 record-keeping system
  3. Notify the responsible team via your incident management system
  4. If a critical threshold is crossed, initiate the Art.73 serious incident pre-assessment pipeline

Setting Up the Monitoring Pipeline in CI/CD

Art.72 monitoring should be validated at deployment time to catch configuration regressions:

# .github/workflows/art72-monitoring-validation.yml
name: Art.72 Monitoring Validation

on:
  push:
    paths:
      - 'models/**'
      - 'serving/**'
      - 'art72-monitoring-thresholds.yaml'

jobs:
  validate-monitoring:
    runs-on: ubuntu-latest
    steps:
      - name: Validate monitoring configuration
        run: |
          python scripts/validate_art72_config.py \
            --config art72-monitoring-thresholds.yaml \
            --schema schemas/art72-monitoring-schema.json
      
      - name: Test monitoring endpoints
        run: |
          python scripts/test_monitoring_endpoints.py \
            --deployer-endpoint $MONITORING_ENDPOINT \
            --auth-token $MONITORING_TOKEN
      
      - name: Verify evidence retention configuration
        run: |
          python scripts/verify_retention_policy.py \
            --required-years 10 \
            --storage-bucket $MONITORING_STORAGE_BUCKET
      
      - name: Generate Art.72 compliance attestation
        run: |
          python scripts/generate_art72_attestation.py \
            --system-id $SYSTEM_ID \
            --output reports/art72-monitoring-attestation-$(date +%Y%m%d).json
      
      - name: Upload attestation to technical documentation
        uses: actions/upload-artifact@v3
        with:
          name: art72-monitoring-attestation
          path: reports/art72-monitoring-attestation-*.json
          retention-days: 3650  # 10 years in days

The attestation artifact from every deployment becomes part of your Art.11 technical documentation. When an NCA inspector requests evidence of your post-market monitoring system, you have a cryptographically timestamped record of every deployment's monitoring configuration.

Evidence Retention: The Art.72 10-Year Requirement

Article 72 monitoring obligations extend throughout the "entire lifetime" of the system. For many Annex III high-risk categories, regulators expect 10 years of monitoring records to be available post-decommission. Plan your storage accordingly:

# retention_policy.py
import boto3
from datetime import datetime, timedelta

def configure_art72_retention_bucket(bucket_name: str, region: str):
    """
    Configure S3 lifecycle policy for 10-year Art.72 evidence retention.
    Equivalent configuration exists for GCS, Azure Blob, and EU-native object storage.
    """
    s3 = boto3.client("s3", region_name=region)
    
    lifecycle_config = {
        "Rules": [{
            "ID": "art72-10year-retention",
            "Status": "Enabled",
            "Filter": {"Prefix": "monitoring-evidence/"},
            "Transitions": [
                # Move to infrequent access after 1 year
                {"Days": 365, "StorageClass": "STANDARD_IA"},
                # Move to archive after 3 years
                {"Days": 1095, "StorageClass": "GLACIER"},
            ],
            # Hard delete after 11 years (1 year grace beyond 10-year minimum)
            "Expiration": {"Days": 4015}
        }]
    }
    
    s3.put_bucket_lifecycle_configuration(
        Bucket=bucket_name,
        LifecycleConfiguration=lifecycle_config
    )

Note on EU data sovereignty: For most Annex III high-risk AI categories, your monitoring evidence includes predictions on individuals — a credit score, a job screening decision, a medical risk assessment. This data is subject to GDPR, and your evidence retention bucket must be on EU-jurisdiction infrastructure. Storing 10 years of monitoring records on AWS S3 in us-east-1, subject to CLOUD Act reach, creates a compliance contradiction: you are retaining Art.72 monitoring evidence in a location where EU law cannot protect it from US law enforcement access. Use EU-native object storage (Hetzner Object Storage, OVHcloud, Scaleway Object Storage) or at minimum an EU region of a provider with an EU-only contractual commitment.

Integrating with the Art.73 Incident Pipeline

Post-market monitoring and serious incident reporting are two sides of the same compliance system. Your Art.72 monitoring stack should automatically trigger the Art.73 assessment workflow when critical conditions are detected. The next post in this series covers the full Art.73 automation pipeline; at minimum, your monitoring layer must:

  1. Classify violations by severity: Distinguish monitoring alerts (internal review required) from serious incident candidates (Art.73 assessment required)
  2. Preserve context at trigger time: When a threshold is crossed, snapshot the full state — input distribution, model version, deployment config, recent prediction sample — before it rotates out of your rolling window
  3. Timestamp with legal precision: Art.73 timelines are measured in days from when a provider "becomes aware" of a serious incident. Your monitoring system's detection timestamp becomes the legal clock-start for NCA notification obligations

The 25-Point Art.72 Implementation Checklist

Architecture (must have before August 2, 2026)

Evidence Generation

Deployer Integration

Incident Linkage

EU-Native Infrastructure

What Comes Next: The Full Compliance Automation Series

This post covers Part 1 of the EU AI Act Compliance Automation Series:

August 2, 2026 is 55 days away. Engineering teams that build their compliance automation now will enter enforcement with continuous, auditable monitoring already running. Teams that rely on manual quarterly reviews will face the same problem that Art.72 is designed to prevent: compliance evidence that is always stale by the time it is needed.


sota.io is EU-native managed PaaS — Hetzner Germany, no CLOUD Act exposure. Compliance-by-design infrastructure for teams building high-risk AI systems under EU AI Act.

EU-Native Hosting

Ready to move to EU-sovereign infrastructure?

sota.io is a German-hosted PaaS — no CLOUD Act exposure, no US jurisdiction, full GDPR compliance by design. Deploy your first app in minutes.