When an AI system causes harm, the hard part of regulatory reporting is rarely writing one report. It is that a single incident can trigger several regimes at once, each with its own definition of what counts, its own recipient, its own event that starts the clock, and its own sequence of initial, intermediate and final reports. A prompt-injection attack that exfiltrates customer data through an assistant's tool can be a personal data breach, a significant incident for a cybersecurity regime, a material event for securities disclosure, and in some cases a serious incident under AI-specific law, all within the same week.

This article treats reporting as an engineering problem: model the regimes as data, record the timestamps that start each clock, compute deadlines mechanically, keep one fact sheet that feeds every report, and preserve evidence from the first hour. It is not legal advice. Figures below reflect the texts as understood in October 2026 and you should have counsel confirm which regimes apply to you and how your regulators interpret them.

The regime matrix

The table lists regimes that commonly touch AI incidents. The point is the shape of the data, which is what your system must encode: a trigger, a recipient, a clock-starting event and a sequence of stages.

RegimeWho and whatClock startsStages and limits
EU AI Act Art. 73Providers of high-risk AI systems; serious incidentsEstablishing a causal link (or its reasonable likelihood); awarenessImmediately once the link is established, and in any event no later than 15 days after awareness; 10 days if a person died; 2 days for a widespread infringement or serious disruption of critical infrastructure
EU AI Act Art. 55Providers of general-purpose models with systemic riskAwarenessThe Act says without undue delay; the voluntary Code of Practice commits signatories to 2, 5, 10 or 15 days by severity, updates at least every four weeks, final report within 60 days of resolution
GDPR Art. 33Controllers; personal data breachesAwareness of the breach72 hours where feasible, reasons for any delay; processors notify the controller without undue delay
NIS2 Art. 23Essential and important entities; significant incidentsAwarenessEarly warning within 24 hours, notification within 72 hours, final report within one month of the notification
DORAEU financial entities; major ICT-related incidentsClassification as major (and awareness)Initial notification within 4 hours of classification and no later than 24 hours of awareness; intermediate within 72 hours of the initial notification; final within one month of the latest intermediate report (per the implementing technical standards; verify)
SEC Form 8-K Item 1.05US-listed companies; material cybersecurity incidentsMateriality determination4 business days
California SB 53Frontier developers; critical safety incidentsDiscovery15 days to the Office of Emergency Services; 24 hours to an appropriate authority if there is imminent risk of death or serious injury
New York RAISE ActLarge frontier developers; safety incidentsDetermination that an incident occurred72 hours as enacted with amendments; confirm the effective date and current text before relying on it

Two timing facts about the EU AI Act deserve care. Article 73 duties attach to high-risk systems, and the Digital Omnibus on AI, formally adopted in mid-2026, deferred high-risk obligations to 2 December 2027 for stand-alone Annex III systems and 2 August 2028 for systems embedded in Annex I products. Your applicability rules should carry those dates rather than assuming the duty is live. Second, the day counts usually quoted for general-purpose models come from the Code of Practice, which binds only signatories; the Act itself says without undue delay. Keep the two distinct in your data so a non-signatory does not inherit commitments it never made, and a signatory does not forget them.

When clocks start

Notice that the clock-starting events differ: awareness, discovery, classification, materiality determination. These are distinct moments that can be days apart, and each needs its own timestamp in the incident record, captured when it happens, by a named person. Awareness in particular is not the time the root cause was understood. Regulators generally read it as the point at which you had a reasonable degree of certainty that a qualifying event occurred, so an on-call engineer confirming that customer records left the system is often the start, even if nobody yet knows how.

This is why incident tooling must record decisions, not just events. A record that says 2026-10-01 09:40 UTC: confirmed exfiltration of records from tenant A, decided by on-call lead is evidence for the timing of every later report. A chat log from which someone later infers the moment is not.

Architecture of a reporting pipeline

The pipeline has five components. The incident record holds facts and timestamped decisions. The applicability engine evaluates each regime's trigger against the record. The clock engine turns triggered regimes into dated stages. The fact sheet is the single agreed statement of what happened, versioned, with every claim linked to evidence. Report drafts are rendered per regime and stage from that fact sheet, and the submission receipt of one stage starts the clock of the next.

Incident-to-report pipeline: one fact sheet, many regimesDetectionalerts, reportsIncident recordtimestamps, scopeApplicability engineregime rules as dataClock enginedeadlines per stageEvidence storehold, hashesFact sheetone version of the factsReport draftsone per regime and stageLegal review + submitreceipt storednext stage clockFollow-up stagesintermediate, finalEvery draft is generated from the same fact sheet, so the regulators receive consistent facts on different forms.
The incident record drives applicability and clocks; the fact sheet drives every draft, so different forms carry the same facts.

Computing deadlines

Encode regimes as data so counsel can review them without reading control flow. Each stage names the event that starts it and an offset in hours or business days. The sketch below computes deadlines and sorts them, so the earliest obligation is always at the top of the dashboard.

from dataclasses import dataclass
from datetime import datetime, timedelta, timezone
from typing import Callable

NOT_YET = datetime.max.replace(tzinfo=timezone.utc)   # all timestamps are UTC-aware

@dataclass
class Stage:
    name: str
    starts_at: str              # key into incident["events"]
    hours: int | Callable[[dict], int] = 0
    business_days: int = 0

def add_business_days(t: datetime, n: int) -> datetime:
    while n > 0:                 # weekends only; load public holidays per regulator
        t += timedelta(days=1)
        if t.weekday() < 5:
            n -= 1
    return t

REGIMES = {
    "gdpr_art33": dict(
        applies=lambda i: i["personal_data"] and i["role"] == "controller",
        recipient="lead supervisory authority",
        stages=[Stage("notification", "aware", hours=72)]),
    "nis2_art23": dict(
        applies=lambda i: i["nis2_entity"] and i["significant"],
        recipient="CSIRT or competent authority",
        stages=[Stage("early warning", "aware", hours=24),
                Stage("notification", "aware", hours=72),
                # one calendar month; 28 days is the safe floor
                Stage("final report", "nis2_notification_sent", hours=28 * 24)]),
    "sec_8k_105": dict(
        applies=lambda i: i["us_listed"] and i["events"].get("material"),
        recipient="SEC (Form 8-K)",
        stages=[Stage("8-K", "material", business_days=4)]),
    "eu_ai_act_art73": dict(
        applies=lambda i: i["eu_high_risk"] and i["serious"]
                          and i["events"]["aware"] >= i["art73_applies_from"],
        recipient="market surveillance authority",
        stages=[Stage("report", "aware",
                      hours=lambda i: 48 if i["widespread_or_critical_infra"]
                      else 240 if i["death"] else 360)]),
}

def deadlines(incident: dict) -> list[tuple[datetime, str, str]]:
    out = []
    for name, r in REGIMES.items():
        if not r["applies"](incident):
            continue
        for st in r["stages"]:
            start = incident["events"].get(st.starts_at)
            if start is None:
                out.append((NOT_YET, name, f"{st.name}: waiting for '{st.starts_at}'"))
                continue
            hours = st.hours(incident) if callable(st.hours) else st.hours
            due = add_business_days(start, st.business_days) if st.business_days \
                else start + timedelta(hours=hours)
            out.append((due, name, f"{st.name} to {r['recipient']}"))
    return sorted(out)

Two details carry the design. Stages whose starting event has not happened yet are listed as waiting rather than dropped, so the dashboard shows that the final NIS2 report exists as an obligation before the notification is sent. And the Article 73 entry shows the awkward part of severity-dependent limits: its offset is a function of the incident, because the window depends on facts (a death, a critical-infrastructure disruption) that may emerge after the first assessment. Recompute on every record update, since a later fact can shorten a deadline that was already running.

One fact sheet for every report

The commonest self-inflicted problem in multi-regime reporting is inconsistency: the data protection notice says 4,100 people were affected, the securities filing says about 4,000, and the cybersecurity notification describes a different entry point because a different team drafted it on a different day. Each statement was defensible when written; together they look evasive.

Prevent this with a versioned fact sheet: a short structured document with fields for what happened, when, which systems and model versions, how many people and which data categories, the cause as currently understood, and the mitigations taken. Every field carries a confidence label (confirmed, preliminary, unknown) and links to evidence items. Report drafts are rendered from a specific fact sheet version, and the submitted report stores that version number. When the facts change, you know exactly which submitted reports now need an update.

LLM assistance is reasonable for turning the fact sheet into each regulator's prose format, with a strict rule: the draft may only restate fact-sheet fields, and a check rejects any number, date or system name in the draft that does not appear in the fact sheet. A human with authority to sign reads every draft before submission.

The evidence pack

AI incidents have evidence that conventional incident tooling does not capture by default. Put these under legal hold in the first hour:

  • Model identifiers and versions, including fine-tune and adapter versions, and the prompt or prompt-template versions in effect.
  • Request and response logs for the affected window, with tool calls and their arguments; retrieval logs showing which documents entered the context.
  • Guardrail and classifier decisions with their thresholds at the time.
  • Configuration and feature-flag history, so you can show what changed and when.
  • Evaluation results for the deployed version, which bear on whether the risk was known and tested.
  • The decision log described above: who decided what, at what time.

Hash each exported artefact and record the hash in the incident record. Retention jobs are a real threat here: a 30-day log expiry policy will happily delete the evidence for a report whose final stage is due in six weeks, so the hold must suspend deletion rather than copy a sample.

Worked example: an injected support assistant

A US-listed software company runs a customer-support assistant for business customers in the EU. The assistant can look up account records through a tool. On Thursday 1 October 2026 at 09:40 UTC the on-call lead confirms that a prompt injection planted in a support ticket made the assistant fetch and echo records from another customer's tenant. That is the aware timestamp.

The applicability engine evaluates each regime. For the business customers' end-user data the company is a processor, so GDPR Article 33 duties fall on its customers; its own duty is to notify each affected controller without undue delay, which the clock engine shows as an immediate task. For its own account-holder data it is a controller, so a 72-hour notification is due by Sunday 4 October 09:40 UTC; weekends do not pause it. The company falls under NIS2 as a cloud computing service provider, and theincident is assessed as significant, so an early warning is due by Friday 09:40 and a notification by Sunday 09:40, with the final report waiting on the notification timestamp. The support assistant is not a high-risk system, so Article 73 does not apply; on the deferred timeline it would not be live for Annex III systems before December 2027 in any case. The disclosure committee determines materiality on Monday 5 October; the 8-K stage becomes due on Friday 9 October.

The fact sheet at version 3 states 1,240 records exposed, preliminary; version 5, after log analysis, states 1,187, confirmed. The clock engine flags that the GDPR notification was submitted from version 3 and needs a follow-up, and the 8-K draft renders from version 5. Every regulator gets the same number for the same date.

Failure modes

  • Awareness recorded late. Teams backdate the start to when the root cause was found. Record the decision when it is made, and let counsel argue timing from accurate data.
  • One regime only. Security teams think in breach terms and miss the AI-specific or sector regime, or the reverse. Run every regime's trigger on every incident and record a reasoned not applicable.
  • Forgotten follow-up stages. Intermediate and final reports are where deadlines are most often missed, because the incident has gone quiet. The clock engine must track them as open obligations.
  • Inconsistent numbers. Solved by the fact sheet; caused by drafting in parallel from memory.
  • Over-reporting speculation. Stating a suspected cause as fact. Label confidence, and say what is still being investigated.
  • Rules frozen in code. Application dates move, as the omnibus showed. Keep regime data versioned and owned by a named reviewer.

Trade-offs

ChoiceBenefitCost
Regimes as reviewed dataCounsel can audit rules; dates update without deploysNeeds an owner and a review cadence
Report early and updateMeets the tightest clockMore filings to keep consistent
Wait for root causeFewer correctionsRisks missing statutory windows
LLM-drafted proseFaster, consistent formatsRequires a fact-check gate and human sign-off
Broad legal holdNothing lostStorage cost and privacy exposure of retained logs

What to do next

  1. List the regimes that could apply to each AI system, with counsel, and encode each as trigger, recipient, clock-start event and stages.
  2. Add timestamped decision fields to your incident record for awareness, classification, discovery and materiality.
  3. Build or adapt a clock engine that recomputes deadlines on every record update and shows waiting stages.
  4. Create a fact sheet template with confidence labels and evidence links, and render every draft from a fact sheet version.
  5. Write a legal-hold runbook covering model, prompt, retrieval and guardrail logs, and test that it suspends retention jobs.
  6. Run a tabletop exercise with one incident that triggers at least three regimes, and time each stage.
Key takeaway: Treat AI incident reporting as a data problem: encode each regime's trigger, recipient, clock-start event and stages; record decisions with timestamps; compute deadlines mechanically, including follow-up stages; and draft every report from one versioned fact sheet. For the surrounding process see <a href="llm_sec_incident_response.html">LLM incident response</a>, <a href="llm_sec_ai_incident_playbooks.html">AI incident playbooks</a>, <a href="llm_sec_ai_incidents.html">AI incident databases</a> and <a href="llm_sec_eu_ai_act.html">the EU AI Act after the omnibus</a>.