contract_id: CONTRACT-DORA-MAJOR-INCIDENT-REPORT-V1-025 schema_version: dora-major-incident-report.v1 status: Draft owner: Notify platform schema_reviewer: maintainer-of-record review_cadence: per-stella-minor-release-and-on-official-schema-change legal_sources:
- Commission Delegated Regulation (EU) 2024/1772
- Commission Delegated Regulation (EU) 2025/301
- Commission Implementing Regulation (EU) 2025/302 legal_template_version: dora-major-incident-report-eu-2025-302 local_taxonomy_package_version: dora-major-incident-report-eu-2025-302-local-contract-v1 eba_taxonomy_package_version: not-applicable-no-upstream-package-2026-05-02-product-decision eba_xsd_conformance_claim: false eba_xsd_conformance_claim_rationale: >- Per the 2026-05-02 product-scope decision recorded in docs-archive/implplan/SPRINT_20260430_112_Notify_dora_rts_encoder.md (D1-112-1; sprint now archived) and the asset-scope re-verification finding in docs/legal/decisions/REG-20260502-eba-dora-incident-framework-4-3.md (“Gate 1”), no upstream EBA machine-validation package exists for DORA-IR. Stella Ops does NOT claim EBA XSD conformance for DORA-IR. The encoder validates only against the local-contract ruleset dora-major-incident-report-local-validation-v1, which is canonical for this output shape until and unless an upstream EBA package ships. fixture_location: docs/samples/dora-incident-report/ runtime_library: src/Notify/__Libraries/StellaOps.Notify.Connectors.Dora/ adjacent_tests: src/Notify/__Tests/StellaOps.Notify.Connectors.Dora.Tests/ last_updated: 2026-05-30
DORA Major Incident Report Contract v1
Part of the Stella Ops Contracts index. Audience: implementers and reviewers working on the Notify DORA major-incident report encoder, its outbound channel, the CLI verbs, and the Export Center assurance profile. Related: DORA Incident Classification v1 supplies the seven classification criteria consumed here.
Purpose
This contract defines the deterministic Stella Ops export shape for DORA major ICT-related incident reports. The v1 encoder (DoraMajorIncidentReportEncoder.EncodePackage) emits:
- XBRL XML instance artifacts (
*.xbrl.xml) forinitial_report,intermediate_report, andfinal_report. - iXBRL XHTML renderings (
*.ixbrl.xhtml) for the same three variants. - A compact JSON envelope (
*.envelope.json) binding file names, media types, SHA-256 hashes, schema pins, local validation status, and EBA-published schema validation status.
The produce-and-sign handoff (DoraMajorIncidentOutboundChannel.ProduceAsync) additionally emits, alongside the above:
- A DSSE-signed envelope (
*.envelope.dsse.json) over the unsigned envelope content. - A handoff manifest (
*.handoff-manifest.json) listing every artifact with its hash, for offline verification.
The contract is a produce-and-sign handoff surface. It does not submit directly to a competent authority and does not call live regulator endpoints; an optional, default-off, fails-closed auto-submit path is available only through a caller-supplied submitter (see Outbound Channel And Optional Auto-Submit).
Evidence scope is split:
operator-observed-estatefor incident facts Stella can observe from monitored/deployed ICT software, releases, integrations, runtime host agents, policy events, evidence bundles, and notification timeline records.operator-suppliedfor financial-entity identity, competent authority, approval, legal review, filing, root-cause narrative, and remediation narrative where Stella cannot prove the fact directly.
Schema Pinning
- Classification legal basis:
EU 2024/1772. - Reporting content legal basis:
EU 2025/301. - Reporting template legal basis:
EU 2025/302. - EU signing payload registry id:
dora-major-incident-report-v1(docs/contracts/eu-signing-payload-registry-v1.md). - Stella legal template version:
dora-major-incident-report-eu-2025-302. - Local taxonomy package marker:
dora-major-incident-report-eu-2025-302-local-contract-v1. - Local validation ruleset:
dora-major-incident-report-local-validation-v1.
The local taxonomy package marker is not an EBA DPM/XBRL package. EBA-published schema validation is blocked until the exact EBA DPM/XBRL taxonomy package is vendored in-repo or in an offline runtime-assets location, with version and license review recorded. The encoder must not fetch schemas at runtime or test time.
Report Variants
| Variant | File prefix | Intended cadence |
|---|---|---|
initial_report | initial-report | Hours-class initial DORA report |
intermediate_report | intermediate-report | No later than 72 hours |
final_report | final-report | No later than one month |
Each variant carries the same core report context:
contractVersionlegalTemplateVersiontaxonomyPackageVersion(envelope/XBRL attribute name; sourced fromDoraMajorIncidentReportInput.TaxonomyPackageVersion)reportIdtenantIdgeneratedAtreportVariant(initial_report/intermediate_report/final_report)operatorApprovalRefreportingContentLegalBasis(EU 2025/301) andreportingTemplateLegalBasis(EU 2025/302) as report-context facts- reporting entity LEI, legal name, jurisdiction, competent authority, and compliance profile reference (
reporter.complianceProfileRef) - incident id, title, severity, status, summary, lifecycle timestamps (
startedAt,detectedAt,endedAt), status summary, root cause summary, and remediation summary - shared reporting timeline reference and DORA milestone due times (
initialReportDueAt,intermediateReportDueAt,finalReportDueAt) - seven DORA classification criteria from
stella.ops/doraIncidentClassification@v1 - sorted evidence references (at least one is mandatory; see Local Validation)
Severity and status are normalised to lower-case; the LEI, jurisdiction code, competent-authority code, and currency codes are normalised to upper-case during encoding (DoraMajorIncidentReportValidator.NormalizeReporter / NormalizeIncident).
Final reports require endedAt, rootCauseSummary, and remediationSummary. Initial and intermediate reports may carry empty final fields while the investigation is active.
XBRL Shape
The local XBRL artifact root is:
<xbrli:xbrl
xmlns:xbrli="http://www.xbrl.org/2003/instance"
xmlns:dora="urn:stellaops:dora:major-incident-report:v1"
contractVersion="dora-major-incident-report.v1"
legalTemplateVersion="dora-major-incident-report-eu-2025-302"
taxonomyPackageVersion="dora-major-incident-report-eu-2025-302-local-contract-v1">
...
</xbrli:xbrl>
The deterministic child order is:
dora:reportContextdora:reportingEntitydora:incidentdora:timelinedora:classificationdora:evidence
dora:reportContext carries reportId, tenantId, reportVariant, generatedAt, operatorApprovalRef, reportingContentLegalBasis, and reportingTemplateLegalBasis. dora:reportingEntity carries lei, jurisdictionCode, and isFinancialEntity as attributes plus legalEntityName, competentAuthorityCode, and complianceProfileRef facts. dora:classification carries schemaVersion, legalBasis, and isMajorIncident attributes, the classifiedAt/classifiedBy facts, seven dora:criterion elements (each with a name and thresholdMet attribute and its criterion-specific dora:field children), and a dora:classificationEvidenceRefs block. Empty optional values are emitted as empty elements/attributes rather than being omitted.
Note: the local-validation pass only asserts the presence of reportContext, reportingEntity, incident, classification, and evidence (see DoraMajorIncidentReportValidator.ValidateXbrl); dora:timeline is always emitted by the encoder but is not separately re-checked by the post-encode validation.
The local iXBRL artifact is XHTML with ix:nonNumeric facts for the primary report context (reportId, reportVariant, generatedAt, tenantId, LEI, legal name, incident id, incident title, isMajorIncident) and the seven criterion thresholdMet facts.
Envelope Shape
Each generated envelope is compact JSON with deterministic property order. The envelope file itself is served with media type application/vnd.stellaops.dora-major-incident-report.v1+json (DoraMajorIncidentReportConstants.EnvelopeMediaType); the mediaType values inside the envelope describe the referenced artifacts. evidenceRefs is sorted ordinally and is never empty (at least one immutable reference is mandatory — see Local Validation). The ebaPublishedSchemaValidation.evidence array is populated with the fixed checklist below, not left empty:
{
"contractVersion": "dora-major-incident-report.v1",
"legalTemplateVersion": "dora-major-incident-report-eu-2025-302",
"taxonomyPackageVersion": "dora-major-incident-report-eu-2025-302-local-contract-v1",
"reportVariant": "initial_report",
"reportId": "dora-report-20260430-001-initial-report",
"tenantId": "tenant-bank-de",
"incidentId": "incident-dora-payments-001",
"generatedAt": "2026-04-30T10:15:00.000Z",
"operatorApprovalRef": "approval://tenant-bank-de/dora/incident-dora-payments-001/initial-report",
"xbrl": {
"fileName": "initial-report.xbrl.xml",
"mediaType": "application/xbrl+xml",
"sha256": "sha256:<64 lowercase hex>"
},
"inlineXbrl": {
"fileName": "initial-report.ixbrl.xhtml",
"mediaType": "application/xhtml+xml",
"sha256": "sha256:<64 lowercase hex>"
},
"evidenceRefs": [
"cas://evidence/dora/incident-dora-payments-001/classification.json",
"ledger://authority/audit/dora-approval-001",
"ledger://notify/dora/opened/incident-dora-payments-001"
],
"localValidation": {
"status": "passed",
"ruleSetVersion": "dora-major-incident-report-local-validation-v1"
},
"ebaPublishedSchemaValidation": {
"status": "blocked",
"reason": "No pinned EBA DPM/XBRL taxonomy or XSD package is present in the local repository scope; external schema fetches are disabled for this sprint.",
"evidence": [
"Checked local sprint paths: docs/contracts, devops/runtime-assets, src/Notify, docs/samples/dora-incident-report.",
"Deterministic local contract validation uses dora-major-incident-report-local-validation-v1 until the exact EBA package is pinned and licensed.",
"No EBA-published DORA major-incident report taxonomy package or XSD is vendored locally."
]
}
}
Note on
localValidation: in the encoded envelope this object exposes onlystatusandruleSetVersion. The in-memoryDoraMajorIncidentLocalValidationResultalso carries anErrorslist, but that list is not serialised into the envelope (it is only thrown as aDoraMajorIncidentReportValidationExceptionwhen validation fails).
DSSE Signing And Handoff Manifest
The “produce-and-sign” surface wraps the unsigned envelope in a DSSE envelope and emits a handoff manifest so the bundle can be verified offline.
DoraMajorIncidentReportDsseService.SignEnvelopeAsyncbuilds the DSSE pre-authentication encoding (DSSEv1 <typelen> <type> <payloadlen> <payload>) over the unsigned envelope content, calls anIDoraMajorIncidentReportSigner, and writes a*.envelope.dsse.jsonfile.- DSSE
payloadTypeisapplication/vnd.stellaops.dora-major-incident-report-envelope.v1+json(DsseEnvelopePayloadType). - The signed file’s media type is
application/vnd.dsse.envelope+json(DsseEnvelopeMediaType). - DSSE JSON shape:
{ "payloadType", "payload" (base64), "signatures": [{ "keyid"?, "sig" }] }.
- DSSE
DoraMajorIncidentOutboundChannel.BuildHandoffManifestemits a*.handoff-manifest.json(media typeapplication/vnd.stellaops.dora-major-incident-handoff-manifest.v1+json,contractVersion=dora-major-incident-outbound-channel.v1). It liststenantId,channelId,channelPurpose(dora-incident),reportVariant,reportId,incidentId,producedAt,submissionMode(auto_submit|filesystem_drop),autoSubmitRequested, optionalautoSubmitBlockedReason/approvalRef, and anartifactsarray referencing the XBRL, iXBRL, unsigned envelope, and DSSE envelope files byfileName,mediaType, andsha256.
The internal DSSE MAC is computed through the central ICryptoHmac abstraction so a GOST/SM tenant can verify its own region-correct wrapper; the regulator-bound qualified (eIDAS) signature is a separate plugin step and is not produced here.
Outbound Channel And Optional Auto-Submit
DoraMajorIncidentOutboundChannel.ProduceAsync is the filesystem-drop / optional-submit orchestrator (StellaOps.Notify.Connectors.Dora):
- Requires a
NotifyChannelwithPurpose == NotifyChannelPurpose.DoraIncident, enabled, with a tenant matching the report tenant. - Resolves the output root from the request, the channel properties (
notify.channel.dora.outputDirectory/outputDirectory), or the channel configTarget, then writes artifacts under<root>/<tenantId>/<incidentId>/<variant-file-segment>/(path segments are sanitised; files are UTF-8 without BOM). - Auto-submit is default-off and fails closed.
EvaluateAutoSubmitreturnsBlockedwith a reason code (for exampleauto-submit-disabled,missing-channel-endpoint,missing-authorized-approvers,missing-tenant-approval,approval-scope-mismatch,approver-not-authorized,missing-approval-ref,fresh-auth-required,auto-submit-client-unavailable) unless every gate passes; only then is the statusSubmitted. The default fresh-auth window is 5 minutes (configurable vianotify.channel.dora.freshAuthWindowMinutes). - Emits deterministic audit events (
DoraMajorIncidentAuditEvent):notify.dora.report.produced, plusnotify.dora.report.auto_submittedornotify.dora.report.auto_submit_blocked.
This contract does not call live regulator endpoints; an actual submission is delegated to a caller-supplied IDoraMajorIncidentReportSubmitter.
CLI Surface
The CLI (StellaOps.Cli, DoraIncidentCommandGroup) exposes:
stella incident classify <id> --input <classification.json> [--output] [--overwrite] [--json]— deterministic local classification of frozen incident facts.dora-incident-reportexport —<id> --variant <initial|intermediate|final> --input <report.json> --output <dir> --signing-key-file <path> [--signing-key-id] [--produced-at] [--overwrite] [--json]. Produces the signed filesystem handoff viaDoraMajorIncidentOutboundChannel, HMAC-signing throughICryptoHmac.dora-incident-reportverify —<path> --signing-key-file <path> [--signing-key-id] [--json]. Resolves the handoff manifest, re-hashes every listed artifact, and verifies the DSSE signature offline; exit codeVerificationFailedwhen invalid.
(The exact parent-command wiring for the dora-incident-report export/verify subcommands is defined where BuildDoraIncidentReportExportCommand / BuildDoraIncidentReportVerifyCommand are registered.)
Export Center Assurance Profile
Export Center registers a DORA major-incident assurance profile (AssuranceExportProfileRegistry, profile id dora.major-incident-report, schema dora-major-incident-report.v1, CLI verbs stella export dora-incident-report / stella verify dora-incident-report). Signed export readiness is gated by reason codes (dora-major-incident-report-source-missing, dora-major-incident-report-owner-approval-missing, dora-major-incident-report-schema-mapping-missing) until source inputs, owner approval, and the official EBA schema mapping are supplied.
POST /v1/exports/assurance/profiles/dora.major-incident-report/runs is registered on the shared Assurance produce surface. While readiness is blocked, it returns HTTP 409 assurance_export_readiness_blocked with the reason codes above. A readiness-satisfying request supplies { "doraMajorIncidentReport": { "report": <DoraMajorIncidentReportInput>, "channel": <AssuranceProduceNotifyChannelInput>, "producedAt": "..." } }. ExportCenter maps the JSON-friendly channel DTO into the real Notify NotifyChannel contract, invokes the Notify DORA major-incident encoder and outbound-channel handoff, and stores a deterministic wrapper bundle with media type application/vnd.stellaops.dora-major-incident-report.http-bundle.v1+json. Signing material is still sealed operator configuration under Export:Assurance:DoraMajorIncidentReport (SigningKeyFile / SigningKey and SigningKeyId) and is never accepted from the request body.
Local Validation
Validation runs in two phases. DoraMajorIncidentReportValidator.Validate (invoked via NormalizeAndValidate at the top of EncodePackage) fails closed on the input before any artifact is built; ValidatePackage re-checks the encoded artifacts after they are produced. Both phases throw DoraMajorIncidentReportValidationException (an ArgumentException) carrying the collected Errors.
The input phase fails closed when:
- the variant is not a defined
DoraMajorIncidentReportVariant - contract, legal template, or local taxonomy package versions do not match the v1 pins (ordinal exact match)
reportId,tenantId,generatedAt, oroperatorApprovalRefis absent- reporting entity LEI fails the ISO 17442 regex (
[A-Z0-9]{18}[0-9]{2}) or the mod-97 checksum - reporting entity is not marked as a DORA financial entity (
reporter.isFinancialEntitymust betrue) - reporting entity legal name, competent-authority code, or compliance-profile reference is absent
- the reporter jurisdiction code, any
geographicalSpread.affectedJurisdictionCodesentry, or a criterion currency code fails ISO 3166-1 alpha-2 / ISO 4217 alpha-3 normalization - the incident is missing id/title/severity/status/summary/statusSummary or
startedAt incident.detectedAtorincident.endedAtis earlier thanincident.startedAt- timeline references/instants are absent, or the due-time ordering (
openedAt≤initialReportDueAt≤intermediateReportDueAt≤finalReportDueAt) is violated classification.schemaVersion/classification.legalBasisdo not match the v1 pins- the report is not classified as a major incident (
classification.isMajorIncidentmust betrue) classification.evidenceRefsis empty, or any of the seven DORA criteria objects is missingclassification.duration.endedAtis earlier than itsstartedAt, or acriticalityOfServices.affectedCriticalServicesentry has no service id- top-level
evidenceRefsis empty (at least one immutable reference required) - final report root cause, remediation, or end time is absent
The artifact phase (ValidatePackage) additionally fails closed when:
- generated artifacts are not well-formed XML/XHTML/JSON
- an artifact’s
sha256does not match the SHA-256 of its UTF-8 content - the XBRL root is not
xbrli:xbrl, the root version attributes do not match the package, or any ofreportContext/reportingEntity/incident/classification/evidenceis missing - the iXBRL root is not XHTML
htmlor carries noix:nonNumericfacts - the envelope
contractVersion,xbrl.sha256, orinlineXbrl.sha256does not match the package
EBA Schema Validation Status
Blocked for sprint docs-archive/implplan/SPRINT_20260430_112_Notify_dora_rts_encoder.md (now archived). The blocked status is surfaced in every envelope as ebaPublishedSchemaValidation.status = "blocked" (DoraMajorIncidentReportConstants.EbaPublishedSchemaValidationStatus).
Evidence: no pinned EBA DPM/XBRL taxonomy or XSD package is present in the local sprint scope checked for this implementation (docs/contracts, devops/runtime-assets, src/Notify, and docs/samples/dora-incident-report). The implementation ships deterministic local XBRL/iXBRL/envelope validation, DSSE signing, handoff manifest, offline CLI verify, and adjacent tests. A follow-up must vendor the exact EBA package, record its version and license review, and add offline schema-validation tests before the EBA-published schema validation criterion can move to DONE.
Determinism And Offline Replay
- No wall-clock time, random IDs, live web fetches, or regulator endpoints are used by the encoder or the outbound channel.
- Inputs use caller-supplied UTC timestamps and stable ids.
- Evidence references, jurisdictions, service lists, and audit/receipt metadata maps are sorted ordinally before encoding.
- Dates are formatted as
yyyy-MM-dd'T'HH:mm:ss.fff'Z'(renderedyyyy-MM-ddTHH:mm:ss.fffZ) with invariant culture. - Decimal amounts use invariant culture with two fractional digits (
0.00format). - SHA-256 values are lowercase and prefixed with
sha256:; the CLI verify path treats a digest as valid only when it is exactlysha256:+ 64 lowercase hex. - Output files are written UTF-8 without a BOM.
- Golden fixtures live in
docs/samples/dora-incident-report/. - Adjacent tests compare every generated variant against the committed golden XBRL, iXBRL, and envelope fixtures.
