DORA Compliance-Officer End-to-End Scenarios

Pack: DORA Operational Resilience Pack — claim boundary operator-support

Audience: QA / Test Automation agents executing live-stack verification of the DORA Operational Resilience Pack, written from the perspective of a financial-entity operator’s compliance officer.

Claim boundary — read first. Stella’s DORA pack is operator-support. Stella helps the operator collect evidence, prepare signed handoff artifacts, track deadlines, retain artifacts, and run offline verification. It does not make the operator “DORA compliant”, does not submit anything to a competent authority, and is not legal advice. The operator remains the regulated/reporting party. Never write or assert copy of the form “Stella is DORA compliant” or “turn on DORA-compliant mode” (see docs/compliance/README.md → Forbidden product copy). Every scenario below ends with an explicit claim-boundary note describing what stays operator-supplied.

These scenarios are deliberately split by runtime surface:

SurfaceWhat is live in the docker stack todayWhat is CLI/offline-only
Reporting timeline (Notify)GET /api/v1/regulatory/reporting-timelines?regime=dora, GET/POST advanced-assurance fixture import, GET /api/v1/assurance/reporting-timeline-profiles[...]
Assurance discovery (ExportCenter)GET /v1/exports/assurance/profiles[...] (metadata + fail-closed readiness, GET-only)RoI/incident/info-sharing/TLPT bundle production
Console UI/assurance shell + /assurance/dora/review workspace
RoI / incident report / info-sharing / TLPT bundle production + EBA XSD validationstella export … / stella verify … / stella tlpt … (deterministic, offline)

The single most important live forcing function for DORA is the advanced-assurance-golden QA fixture import (POST /api/v1/qa/fixtures/advanced-assurance-golden/notify-import, scope notify.operator). It builds and persists a real DORA Article 19 incident timeline (open → classify → initial_reportintermediate_report) that is then queryable through the read-only regulatory timeline API. This is the same path the compliance golden-path script (devops/compose/scripts/compliance-golden-path.sh) uses for NIS2.


Live-stack facts (verified against src/)


Scenario DORA-S1 — Major ICT incident: classify, report milestones, signed handoff

Compliance-officer narrative. A core payment-authorisation outage is opened. As compliance officer I must (a) classify it against the seven DORA criteria (EU 2024/1772), (b) hit the Article 19 reporting milestones — initial report within 4h, intermediate within 72h, final within 1 month — and © produce a signed, replayable handoff artifact for each variant that I can verify offline before my legal team files it with the competent authority.

Live surface (Notify timeline).

  1. Drive a DORA timeline into the stack via the golden fixture: POST /api/v1/qa/fixtures/advanced-assurance-golden/notify-import (header X-StellaOps-TenantId: default, body seedManifest with fixtureId: advanced-assurance-golden and stableIds.doraIncidentId).
  2. Query the persisted DORA timeline: GET /api/v1/regulatory/reporting-timelines?regime=dora&incidentId=<doraIncidentId>.
  3. Read the profile + deadline policy: GET /api/v1/assurance/reporting-timeline-profiles/dora.article19.incident.

Expected assertions.

CLI/offline leg (signed handoff — execute only when the stella CLI is built and a DORA report fixture input is available; otherwise record as a documented gap, do not fake). stella export dora-incident-report <id> --variant initial → XBRL + inline-XBRL + envelope + DSSE + handoff-manifest; then stella verify dora-incident-report <dir> asserts isValid: true, artifact-hash match, DSSE payload binding, and reproducible local HMAC. The seven-criteria classifier (stella incident classify) emits a stable classification hash across two clean runs.

Claim-boundary note. Stella classifies frozen facts and produces a local-contract handoff (local HMAC tamper check, not CAdES/KMS signing and not a regulator receipt). Official EBA incident XBRL validation is still blocked pending the eba-dora-incident-reporting-framework-4.3 pin. LEI, jurisdiction, financial-entity status, operator approvals, and the act of filing remain operator-supplied.


Scenario DORA-S2 — Register of Information: annual B.01–B.14 bundle + official EBA validation

Compliance-officer narrative. Once a year I must submit the Register of Information describing every ICT third-party arrangement supporting a critical or important function. I produce the B.01–B.14 bundle, validate the EBA-canonical templates (B.01–B.07) against the official EBA RoI 4.0 errata5 taxonomy, bind it to last year’s bundle hash, set retention, sign it, and verify the whole thing offline. If the EBA package is missing or tampered, the bundle must fail closed to a local-contract posture rather than over-claim.

Live surface (ExportCenter discovery — GET-only).

Expected assertions (live).

CLI/offline leg (RoI bundle production + EBA flip — the load-bearing behavioural proof). stella export dora-roi --year … --tenant … --input <register.json> --signing-key-file <hmac> --offline produces a deterministic ZIP (index.json, manifest.json, signature.json, templates/*.xml). When the vendored EBA package resolves and B.01–B.07 each map to a canonical b_NN.NN.xsd, the manifest.json regulatoryConformance flips to claimed-against:eba-reporting-framework-4.0-taxo-package-4.0-errata5; with the package absent / SHA-mismatched the export fails closed (DoraRoiTaxonomyLoadException) and the bundle stays on its-eu-2024-2956-local-contract-v1. stella verify dora-roi <zip> re-derives template + bundle hashes, the canonical-index DSSE binding, prior-year hash, and local HMAC, returning isValid: true.

Expected offline assertions. bundle/template hashes are byte-stable across two clean runs; manifest.json.ebaTaxonomyPin == eba-reporting-framework-4.0-taxo-package-4.0-errata5; ebaTaxonomyOuterSha256 == sha256:2cf8a0fe…e2e2fb; conformance label flips on present-pin and stays not-claimed on absent/mismatched pin; verify reports isValid: true.

Claim-boundary note. Validation is XSD-structural (template→XSD mapping + XML well-formedness against the SHA-pinned package) — not full XBRL DPM/dimensional/formula conformance, which stays a residual follow-up. Stella does not alter the EBA package and does not represent that EBA has certified or endorsed Stella. Financial-entity identity, contract terms, deeper subcontracting-chain ranks (operator-filled, must carry provenance), and the filing decision remain operator-supplied.


Scenario DORA-S3 — TLPT evidence: scope → baseline → signed EvidenceLocker capsule handoff

Compliance-officer narrative. For Threat-Led Penetration Testing I (white team) must hand the TLPT testers a frozen, approved scope and a replay baseline, then seal a signed EvidenceLocker capsule of the test evidence that an auditor can verify offline — without Stella ever running offensive tooling or choosing targets for me.

Live surface. None today for TLPT scope/baseline/pack production: the TLPT flow is CLI/offline-only (stella tlpt scope|baseline|pack, stella replay, stella verify tlpt-pack). The Assurance export profile dora.tlpt-evidence-pack is discoverable via GET /v1/exports/assurance/profiles?frameworkId=dora (metadata only). Live Graph asset-registry query mode and EvidenceLocker TLPT audit-action emission are service-owned follow-ups (not yet wired).

CLI/offline leg. stella tlpt scope (asset-registry + reachability subgraph → tlpt-scope.v1) → stella tlpt baseline (binds scope, writes tlpt-baseline.v1, self-verifies hash) → stella replay <baseline> (offline hash verify; tampered baseline fails closed baseline-hash-mismatch) → stella tlpt pack (Ed25519-signed tlpt-pack-cli-bundle.v1) → stella verify tlpt-pack (schema + canonical content hash + TLPT DSSE payload type + Ed25519 signature).

Expected assertions. scope hash + baseline hash are stable; tampered baseline yields VerificationFailed / baseline-hash-mismatch; pack verify reports valid for a clean pack and VerificationFailed for a mutated manifest or wrong key.

Live assertion for the spec. Assert that dora.tlpt-evidence-pack is present in the live Assurance export profile list (proves the pack surface is discoverable) and record the scope/baseline/pack production as CLI-only.

Claim-boundary note. Stella never launches offensive tooling, never infers the legally-required TLPT scope without operator approval, and never presents CLI output as a regulator receipt. Scope approval, execution, findings treatment, and reporting are operator-supplied.


Scenario DORA-S4 — Article 45 information sharing: STIX/TAXII batch via the dora-info-sharing channel

Compliance-officer narrative. Under our sharing arrangement I send a minimised, signed cyber-threat batch to a peer bank. It must go through a dedicated dora-info-sharing purpose channel (never an ordinary notification channel), be STIX 2.1 / TAXII 2.1-aligned, be PII-minimised by default, be DSSE-signed, and only deliver after subscriber approval and trust material are in place.

Live surface (Notify channels).

Expected assertions (live).

CLI/offline leg. stella export dora-info-sharing --input <batch.json> --signing-key-file <hmac> builds the STIX bundle + TAXII manifest + DSSE envelope + receipt, with strict minimisation dora-info-sharing-strict-v1; stella verify dora-info-sharing verifies the DSSE envelope offline.

Claim-boundary note. Notify stores only references/public metadata — never raw credentials, private keys, or broad PII allowlists. Delivery fails closed if the channel purpose is wrong, the channel is disabled/endpoint-less, subscriber approval is missing/expired, the DSSE envelope does not verify, egress is not allowlisted, or redaction would include non-allowlisted PII. The sharing arrangement, subscriber authorisation, transfer basis, and the decision to deliver each batch are operator-supplied.


Scenario DORA-S5 (Console UI) — Compliance officer reviews DORA readiness in /assurance

Compliance-officer narrative. Before any export I open the Console Assurance shell to confirm the DORA pack is enabled as operator-support, see its readiness (e.g. retention-policy review required), and drill into the dedicated DORA review workspace.

Live surface (UI). /assurance shell (route guarded by requireComplianceGuard) and /assurance/dora/review. This requires the UI-session token (real OIDC login as admin), which carries the notify.viewer / export.viewer scopes + correct audiences (the stella-ops-ui client). The spec performs a real OIDC login (clearing the stale pre-filled password) and asserts the rendered DORA card + claim boundary.

Expected assertions. the DORA pack card renders “DORA Operational Resilience Pack” with claim-boundary operator-support; a “Review workspace” link points to /assurance/dora/review; the review workspace renders the DORA review heading. No forbidden “DORA compliant” copy appears.

Claim-boundary note. The shell is a discovery/readiness surface only; enabling the pack does not file anything and does not assert compliance.


Execution order recommendation

  1. DORA-S1 (timeline) and DORA-S2 live discovery and DORA-S4/S3 profile discovery are pure API and the fastest, most reliable live proofs — run first. They share one notify.viewer/export.viewer token.
  2. DORA-S5 (UI) needs a browser OIDC login — run after the API legs.
  3. The CLI/offline legs (S2 RoI EBA flip, S1 signed handoff, S3 TLPT, S4 info-sharing batch) are the deepest behavioural proofs but require the stella CLI to be built and fixture inputs; a later wave should execute them against the .csproj test suites (StellaOps.Findings.DoraRoi.Tests, StellaOps.Cli.Tests, StellaOps.Notify.Connectors.Dora(.InfoSharing).Tests) per QA Tier 2d, or via the built CLI .exe. They are documented here for completeness and are not driven by the Playwright specs (Playwright cannot meaningfully drive the offline CLI signing flow).

Gaps surfaced (do NOT fix — report only)