Skip to content

Commit 4c203b7

Browse files
Add tenant incident runbook templates
1 parent 9ab9c05 commit 4c203b7

7 files changed

Lines changed: 701 additions & 6 deletions

File tree

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ Das Backend stellt serverseitige Weboberflaechen und APIs fuer die migrierten Pr
9595
- `/cves/`
9696
- `/admin/users/`
9797

98-
Incidents werden als Rust-Fallakten unter `/incidents/` gefuehrt. Detailseiten unter `/incidents/{id}` erlauben die Bearbeitung von Typ, Runbook, Status, Severity, Meldezeitpunkten und Behoerdenreferenz; Statuswechsel, Anlage und incidentbezogene Evidence-Uploads werden als Timeline-/Audit-Events in der Fallakte dokumentiert. Verknuepfte Evidence wird direkt in der Fallakte angezeigt und kann dort hochgeladen werden. Das NIS2-Meldepaket inklusive Audit-Timeline kann als Markdown, HTML oder PDF ueber `/incidents/{id}/nis2-export`, `/incidents/{id}/nis2-export.html`, `/incidents/{id}/nis2-export.pdf` sowie die entsprechenden `/api/v1/incidents/{id}/...` Endpunkte exportiert werden.
98+
Incidents werden als Rust-Fallakten unter `/incidents/` gefuehrt. Detailseiten unter `/incidents/{id}` erlauben die Bearbeitung von Typ, Runbook, Status, Severity, Meldezeitpunkten und Behoerdenreferenz; Statuswechsel, Anlage und incidentbezogene Evidence-Uploads werden als Timeline-/Audit-Events in der Fallakte dokumentiert. Tenantbezogene Runbook-Vorlagen stehen ueber `/api/v1/incidents/runbook-templates` und im Incident-Formular bereit. Verknuepfte Evidence wird direkt in der Fallakte angezeigt und kann dort hochgeladen werden. Das NIS2-Meldepaket inklusive Audit-Timeline kann als Markdown, HTML oder PDF ueber `/incidents/{id}/nis2-export`, `/incidents/{id}/nis2-export.html`, `/incidents/{id}/nis2-export.pdf` sowie die entsprechenden `/api/v1/incidents/{id}/...` Endpunkte exportiert werden.
9999

100100
## Zero-Trust Agent
101101

docs/ISCY_Handbuch.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -551,7 +551,7 @@ Hier wird aus einer technischen Schwachstellenmeldung eine geschaeftlich nutzbar
551551

552552
### 6.5 Incident- und NIS2-Meldeworkflow
553553

554-
Die Rust-Webroute `/incidents/` fuehrt operative Sicherheitsvorfaelle als mandantenfaehige Fallakten. Ein Incident kann Reporter, Owner, Risiko, Asset und Prozess referenzieren und enthaelt Typ, Runbook, Status, Severity, Stakeholder-Zusammenfassung sowie Behoerden- oder Case-Referenz.
554+
Die Rust-Webroute `/incidents/` fuehrt operative Sicherheitsvorfaelle als mandantenfaehige Fallakten. Ein Incident kann Reporter, Owner, Risiko, Asset und Prozess referenzieren und enthaelt Typ, Runbook, Status, Severity, Stakeholder-Zusammenfassung sowie Behoerden- oder Case-Referenz. Tenantbezogene Runbook-Vorlagen werden in `incidents_runbooktemplate` gepflegt, per `/api/v1/incidents/runbook-templates` ausgeliefert und koennen beim Anlegen eines Incidents direkt als bearbeitbare Startvorlage uebernommen werden.
555555

556556
Wenn ein Incident als NIS2-meldepflichtig markiert wird, berechnet ISCY die relevanten Fristen aus dem Erkennungszeitpunkt:
557557

@@ -561,7 +561,7 @@ Wenn ein Incident als NIS2-meldepflichtig markiert wird, berechnet ISCY die rele
561561

562562
Die Uebersicht zeigt offene Faelle, NIS2-relevante Faelle und ueberfaellige Meldeschritte. Gesendete Meldungen koennen ueber die API als Zeitstempel gepflegt werden.
563563

564-
Die Detailseite `/incidents/{id}` dient als operative Fallakte. Dort koennen berechtigte Rollen Typ, Runbook, Status, Severity, Behoerdenreferenz, Zeitlinie und Meldezeitpunkte pflegen. ISCY dokumentiert die Anlage der Fallakte, Statuswechsel und incidentbezogene Evidence-Uploads als Timeline-/Audit-Events mit Actor, Zeitpunkt, Ereignisart und Detailtext. Evidence-Uploads koennen ueber `incident_id` direkt an einen Incident gekoppelt werden und erscheinen in der Fallakte; fuer berechtigte Rollen steht der Upload direkt auf der Incident-Detailseite bereit. Das Meldepaket unter `/incidents/{id}/nis2-export` buendelt Fallakte, Runbook, verknuepfte Evidence, Audit-Timeline, betroffene Bezuege, 24h-/72h-/30-Tage-Fristen, Stakeholder-Zusammenfassung und Lessons Learned; zusaetzlich stehen HTML und PDF ueber `/incidents/{id}/nis2-export.html` und `/incidents/{id}/nis2-export.pdf` bereit.
564+
Die Detailseite `/incidents/{id}` dient als operative Fallakte. Dort koennen berechtigte Rollen Typ, Runbook, Status, Severity, Behoerdenreferenz, Zeitlinie und Meldezeitpunkte pflegen; die Runbook-Bibliothek wird als Referenz direkt neben der Fallakte angezeigt. ISCY dokumentiert die Anlage der Fallakte, Statuswechsel und incidentbezogene Evidence-Uploads als Timeline-/Audit-Events mit Actor, Zeitpunkt, Ereignisart und Detailtext. Evidence-Uploads koennen ueber `incident_id` direkt an einen Incident gekoppelt werden und erscheinen in der Fallakte; fuer berechtigte Rollen steht der Upload direkt auf der Incident-Detailseite bereit. Das Meldepaket unter `/incidents/{id}/nis2-export` buendelt Fallakte, Runbook, verknuepfte Evidence, Audit-Timeline, betroffene Bezuege, 24h-/72h-/30-Tage-Fristen, Stakeholder-Zusammenfassung und Lessons Learned; zusaetzlich stehen HTML und PDF ueber `/incidents/{id}/nis2-export.html` und `/incidents/{id}/nis2-export.pdf` bereit.
565565

566566
### 6.6 SOC-Playbook fuer Phishing- und aehnliche Incident-Faelle
567567

docs/RUST_CUTOVER_STATUS.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ ISCY startet produktiv und lokal ueber den Rust-Axum-Service in `rust/iscy-backe
2424
- Assessments
2525
- Organizations
2626
- Risks
27-
- Incidents inklusive NIS2-Meldefristen, Fallakten, Detailbearbeitung, Runbooks, Timeline-/Audit-Events und Markdown-/HTML-/PDF-Meldepaket mit Audit-Timeline
27+
- Incidents inklusive NIS2-Meldefristen, Fallakten, Detailbearbeitung, tenantbezogener Runbook-Template-Bibliothek, Timeline-/Audit-Events und Markdown-/HTML-/PDF-Meldepaket mit Audit-Timeline
2828
- Evidence inklusive Upload, Incident-Verknuepfung, direktem Fallakten-Upload und automatischem Timeline-Ereignis
2929
- Reports
3030
- Roadmap

rust/iscy-backend/src/db_admin.rs

Lines changed: 239 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,11 @@ const MIGRATIONS: &[Migration] = &[
8787
sqlite_sql: SQLITE_INCIDENT_TIMELINE_SCHEMA,
8888
postgres_sql: POSTGRES_INCIDENT_TIMELINE_SCHEMA,
8989
},
90+
Migration {
91+
version: "0012_rust_incident_runbook_template_library",
92+
sqlite_sql: SQLITE_INCIDENT_RUNBOOK_TEMPLATE_SCHEMA,
93+
postgres_sql: POSTGRES_INCIDENT_RUNBOOK_TEMPLATE_SCHEMA,
94+
},
9095
];
9196

9297
const SQLITE_CATALOG_REQUIREMENTS_SEED: &str =
@@ -473,6 +478,167 @@ CREATE INDEX IF NOT EXISTS idx_incident_events_incident ON incidents_incidenteve
473478
CREATE INDEX IF NOT EXISTS idx_incident_events_actor ON incidents_incidentevent(tenant_id, actor_id);
474479
"#;
475480

481+
const SQLITE_INCIDENT_RUNBOOK_TEMPLATE_SCHEMA: &str = r#"
482+
CREATE TABLE IF NOT EXISTS incidents_runbooktemplate (
483+
id INTEGER PRIMARY KEY AUTOINCREMENT,
484+
tenant_id INTEGER NOT NULL,
485+
slug varchar(80) NOT NULL,
486+
title varchar(255) NOT NULL,
487+
description TEXT NOT NULL DEFAULT '',
488+
incident_type varchar(32) NOT NULL DEFAULT 'GENERAL',
489+
severity varchar(16) NOT NULL DEFAULT 'MEDIUM',
490+
body TEXT NOT NULL,
491+
is_active bool NOT NULL DEFAULT 1,
492+
sort_order INTEGER NOT NULL DEFAULT 0,
493+
created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
494+
updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP,
495+
UNIQUE (tenant_id, slug)
496+
);
497+
CREATE INDEX IF NOT EXISTS idx_incident_runbook_templates_tenant ON incidents_runbooktemplate(tenant_id, is_active, sort_order);
498+
INSERT OR IGNORE INTO incidents_runbooktemplate (
499+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
500+
)
501+
SELECT
502+
tenant.id,
503+
'general-response',
504+
'Allgemeine Incident Response',
505+
'Baseline-Runbook fuer neue oder noch unklare Sicherheitsvorfaelle.',
506+
'GENERAL',
507+
'MEDIUM',
508+
'1. Scope: betroffene Systeme, Prozesse, Personen und Zeitraum erfassen.
509+
2. Eindaemmung: unmittelbare Schutzmassnahmen und Verantwortliche festlegen.
510+
3. Bewertung: Schweregrad, NIS2-Relevanz, Datenbezug und Business Impact pruefen.
511+
4. Kommunikation: Owner, Management, Legal und externe Stellen abstimmen.
512+
5. Abschluss: Root Cause, Evidence, Lessons Learned und Massnahmen dokumentieren.',
513+
1,
514+
10,
515+
CURRENT_TIMESTAMP,
516+
CURRENT_TIMESTAMP
517+
FROM organizations_tenant tenant;
518+
INSERT OR IGNORE INTO incidents_runbooktemplate (
519+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
520+
)
521+
SELECT
522+
tenant.id,
523+
'phishing-response',
524+
'Phishing Response',
525+
'SOC-Runbook fuer Credential-Phishing und verdachtige Mailkampagnen.',
526+
'PHISHING',
527+
'HIGH',
528+
'1. Scope: betroffene Postfaecher, URLs, Absender und Zeitfenster erfassen.
529+
2. Eindaemmung: URLs blocken, Mails zurueckrufen, kompromittierte Sessions widerrufen.
530+
3. Identitaet: MFA/Passwort-Reset, Token-Review und privilegierte Konten pruefen.
531+
4. Meldung: Betroffenheit, Datenarten und NIS2-Fristen bewerten.
532+
5. Abschluss: Awareness-, Mail-Gateway- und Detection-Regeln aktualisieren.',
533+
1,
534+
20,
535+
CURRENT_TIMESTAMP,
536+
CURRENT_TIMESTAMP
537+
FROM organizations_tenant tenant;
538+
INSERT OR IGNORE INTO incidents_runbooktemplate (
539+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
540+
)
541+
SELECT
542+
tenant.id,
543+
'vulnerability-response',
544+
'Vulnerability Response',
545+
'Runbook fuer CVE-getriebene Notfallbewertung und Eindaemmung.',
546+
'VULNERABILITY',
547+
'HIGH',
548+
'1. Scope: betroffene Produkte, Versionen, Assets und Exposure erfassen.
549+
2. Priorisierung: CVSS, EPSS, KEV, Exploit-Reife und Business-Kontext bewerten.
550+
3. Eindaemmung: Workarounds, WAF/EDR-Regeln und Netzwerkbegrenzung setzen.
551+
4. Behebung: Patch, Upgrade oder Konfigurationsfix mit Evidence verknuepfen.
552+
5. Abschluss: Risiko, SBOM/Product-Security und Detection-Content aktualisieren.',
553+
1,
554+
30,
555+
CURRENT_TIMESTAMP,
556+
CURRENT_TIMESTAMP
557+
FROM organizations_tenant tenant;
558+
"#;
559+
560+
const POSTGRES_INCIDENT_RUNBOOK_TEMPLATE_SCHEMA: &str = r#"
561+
CREATE TABLE IF NOT EXISTS incidents_runbooktemplate (
562+
id BIGSERIAL PRIMARY KEY,
563+
tenant_id BIGINT NOT NULL,
564+
slug varchar(80) NOT NULL,
565+
title varchar(255) NOT NULL,
566+
description TEXT NOT NULL DEFAULT '',
567+
incident_type varchar(32) NOT NULL DEFAULT 'GENERAL',
568+
severity varchar(16) NOT NULL DEFAULT 'MEDIUM',
569+
body TEXT NOT NULL,
570+
is_active BOOLEAN NOT NULL DEFAULT TRUE,
571+
sort_order INTEGER NOT NULL DEFAULT 0,
572+
created_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP)::text,
573+
updated_at TEXT NOT NULL DEFAULT (CURRENT_TIMESTAMP)::text,
574+
UNIQUE (tenant_id, slug)
575+
);
576+
CREATE INDEX IF NOT EXISTS idx_incident_runbook_templates_tenant ON incidents_runbooktemplate(tenant_id, is_active, sort_order);
577+
INSERT INTO incidents_runbooktemplate (
578+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
579+
)
580+
SELECT
581+
tenant.id,
582+
'general-response',
583+
'Allgemeine Incident Response',
584+
'Baseline-Runbook fuer neue oder noch unklare Sicherheitsvorfaelle.',
585+
'GENERAL',
586+
'MEDIUM',
587+
'1. Scope: betroffene Systeme, Prozesse, Personen und Zeitraum erfassen.
588+
2. Eindaemmung: unmittelbare Schutzmassnahmen und Verantwortliche festlegen.
589+
3. Bewertung: Schweregrad, NIS2-Relevanz, Datenbezug und Business Impact pruefen.
590+
4. Kommunikation: Owner, Management, Legal und externe Stellen abstimmen.
591+
5. Abschluss: Root Cause, Evidence, Lessons Learned und Massnahmen dokumentieren.',
592+
TRUE,
593+
10,
594+
(CURRENT_TIMESTAMP)::text,
595+
(CURRENT_TIMESTAMP)::text
596+
FROM organizations_tenant tenant
597+
ON CONFLICT (tenant_id, slug) DO NOTHING;
598+
INSERT INTO incidents_runbooktemplate (
599+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
600+
)
601+
SELECT
602+
tenant.id,
603+
'phishing-response',
604+
'Phishing Response',
605+
'SOC-Runbook fuer Credential-Phishing und verdachtige Mailkampagnen.',
606+
'PHISHING',
607+
'HIGH',
608+
'1. Scope: betroffene Postfaecher, URLs, Absender und Zeitfenster erfassen.
609+
2. Eindaemmung: URLs blocken, Mails zurueckrufen, kompromittierte Sessions widerrufen.
610+
3. Identitaet: MFA/Passwort-Reset, Token-Review und privilegierte Konten pruefen.
611+
4. Meldung: Betroffenheit, Datenarten und NIS2-Fristen bewerten.
612+
5. Abschluss: Awareness-, Mail-Gateway- und Detection-Regeln aktualisieren.',
613+
TRUE,
614+
20,
615+
(CURRENT_TIMESTAMP)::text,
616+
(CURRENT_TIMESTAMP)::text
617+
FROM organizations_tenant tenant
618+
ON CONFLICT (tenant_id, slug) DO NOTHING;
619+
INSERT INTO incidents_runbooktemplate (
620+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
621+
)
622+
SELECT
623+
tenant.id,
624+
'vulnerability-response',
625+
'Vulnerability Response',
626+
'Runbook fuer CVE-getriebene Notfallbewertung und Eindaemmung.',
627+
'VULNERABILITY',
628+
'HIGH',
629+
'1. Scope: betroffene Produkte, Versionen, Assets und Exposure erfassen.
630+
2. Priorisierung: CVSS, EPSS, KEV, Exploit-Reife und Business-Kontext bewerten.
631+
3. Eindaemmung: Workarounds, WAF/EDR-Regeln und Netzwerkbegrenzung setzen.
632+
4. Behebung: Patch, Upgrade oder Konfigurationsfix mit Evidence verknuepfen.
633+
5. Abschluss: Risiko, SBOM/Product-Security und Detection-Content aktualisieren.',
634+
TRUE,
635+
30,
636+
(CURRENT_TIMESTAMP)::text,
637+
(CURRENT_TIMESTAMP)::text
638+
FROM organizations_tenant tenant
639+
ON CONFLICT (tenant_id, slug) DO NOTHING;
640+
"#;
641+
476642
const SQLITE_AUTH_RBAC_SCHEMA: &str = r#"
477643
CREATE TABLE IF NOT EXISTS accounts_role (
478644
id INTEGER PRIMARY KEY AUTOINCREMENT,
@@ -2306,6 +2472,42 @@ INSERT OR IGNORE INTO incidents_incident (
23062472
'Credential phishing affects the customer portal operating process.',
23072473
'', '2026-04-22T10:00:00Z', '2026-04-22T11:00:00Z'
23082474
);
2475+
INSERT OR IGNORE INTO incidents_runbooktemplate (
2476+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
2477+
) VALUES
2478+
(
2479+
1, 'general-response', 'Allgemeine Incident Response',
2480+
'Baseline-Runbook fuer neue oder noch unklare Sicherheitsvorfaelle.',
2481+
'GENERAL', 'MEDIUM',
2482+
'1. Scope: betroffene Systeme, Prozesse, Personen und Zeitraum erfassen.
2483+
2. Eindaemmung: unmittelbare Schutzmassnahmen und Verantwortliche festlegen.
2484+
3. Bewertung: Schweregrad, NIS2-Relevanz, Datenbezug und Business Impact pruefen.
2485+
4. Kommunikation: Owner, Management, Legal und externe Stellen abstimmen.
2486+
5. Abschluss: Root Cause, Evidence, Lessons Learned und Massnahmen dokumentieren.',
2487+
1, 10, '2026-04-22T10:00:00Z', '2026-04-22T10:00:00Z'
2488+
),
2489+
(
2490+
1, 'phishing-response', 'Phishing Response',
2491+
'SOC-Runbook fuer Credential-Phishing und verdachtige Mailkampagnen.',
2492+
'PHISHING', 'HIGH',
2493+
'1. Scope: betroffene Postfaecher, URLs, Absender und Zeitfenster erfassen.
2494+
2. Eindaemmung: URLs blocken, Mails zurueckrufen, kompromittierte Sessions widerrufen.
2495+
3. Identitaet: MFA/Passwort-Reset, Token-Review und privilegierte Konten pruefen.
2496+
4. Meldung: Betroffenheit, Datenarten und NIS2-Fristen bewerten.
2497+
5. Abschluss: Awareness-, Mail-Gateway- und Detection-Regeln aktualisieren.',
2498+
1, 20, '2026-04-22T10:00:00Z', '2026-04-22T10:00:00Z'
2499+
),
2500+
(
2501+
1, 'vulnerability-response', 'Vulnerability Response',
2502+
'Runbook fuer CVE-getriebene Notfallbewertung und Eindaemmung.',
2503+
'VULNERABILITY', 'HIGH',
2504+
'1. Scope: betroffene Produkte, Versionen, Assets und Exposure erfassen.
2505+
2. Priorisierung: CVSS, EPSS, KEV, Exploit-Reife und Business-Kontext bewerten.
2506+
3. Eindaemmung: Workarounds, WAF/EDR-Regeln und Netzwerkbegrenzung setzen.
2507+
4. Behebung: Patch, Upgrade oder Konfigurationsfix mit Evidence verknuepfen.
2508+
5. Abschluss: Risiko, SBOM/Product-Security und Detection-Content aktualisieren.',
2509+
1, 30, '2026-04-22T10:00:00Z', '2026-04-22T10:00:00Z'
2510+
);
23092511
INSERT OR IGNORE INTO wizard_assessmentsession (
23102512
id, tenant_id, started_by_id, assessment_type, status, current_step, applicability_result,
23112513
applicability_reasoning, executive_summary, progress_percent, completed_at, created_at, updated_at
@@ -2628,6 +2830,43 @@ INSERT INTO incidents_incident (
26282830
'Credential phishing affects the customer portal operating process.',
26292831
'', '2026-04-22T10:00:00Z', '2026-04-22T11:00:00Z'
26302832
) ON CONFLICT (id) DO NOTHING;
2833+
INSERT INTO incidents_runbooktemplate (
2834+
tenant_id, slug, title, description, incident_type, severity, body, is_active, sort_order, created_at, updated_at
2835+
) VALUES
2836+
(
2837+
1, 'general-response', 'Allgemeine Incident Response',
2838+
'Baseline-Runbook fuer neue oder noch unklare Sicherheitsvorfaelle.',
2839+
'GENERAL', 'MEDIUM',
2840+
'1. Scope: betroffene Systeme, Prozesse, Personen und Zeitraum erfassen.
2841+
2. Eindaemmung: unmittelbare Schutzmassnahmen und Verantwortliche festlegen.
2842+
3. Bewertung: Schweregrad, NIS2-Relevanz, Datenbezug und Business Impact pruefen.
2843+
4. Kommunikation: Owner, Management, Legal und externe Stellen abstimmen.
2844+
5. Abschluss: Root Cause, Evidence, Lessons Learned und Massnahmen dokumentieren.',
2845+
TRUE, 10, '2026-04-22T10:00:00Z', '2026-04-22T10:00:00Z'
2846+
),
2847+
(
2848+
1, 'phishing-response', 'Phishing Response',
2849+
'SOC-Runbook fuer Credential-Phishing und verdachtige Mailkampagnen.',
2850+
'PHISHING', 'HIGH',
2851+
'1. Scope: betroffene Postfaecher, URLs, Absender und Zeitfenster erfassen.
2852+
2. Eindaemmung: URLs blocken, Mails zurueckrufen, kompromittierte Sessions widerrufen.
2853+
3. Identitaet: MFA/Passwort-Reset, Token-Review und privilegierte Konten pruefen.
2854+
4. Meldung: Betroffenheit, Datenarten und NIS2-Fristen bewerten.
2855+
5. Abschluss: Awareness-, Mail-Gateway- und Detection-Regeln aktualisieren.',
2856+
TRUE, 20, '2026-04-22T10:00:00Z', '2026-04-22T10:00:00Z'
2857+
),
2858+
(
2859+
1, 'vulnerability-response', 'Vulnerability Response',
2860+
'Runbook fuer CVE-getriebene Notfallbewertung und Eindaemmung.',
2861+
'VULNERABILITY', 'HIGH',
2862+
'1. Scope: betroffene Produkte, Versionen, Assets und Exposure erfassen.
2863+
2. Priorisierung: CVSS, EPSS, KEV, Exploit-Reife und Business-Kontext bewerten.
2864+
3. Eindaemmung: Workarounds, WAF/EDR-Regeln und Netzwerkbegrenzung setzen.
2865+
4. Behebung: Patch, Upgrade oder Konfigurationsfix mit Evidence verknuepfen.
2866+
5. Abschluss: Risiko, SBOM/Product-Security und Detection-Content aktualisieren.',
2867+
TRUE, 30, '2026-04-22T10:00:00Z', '2026-04-22T10:00:00Z'
2868+
)
2869+
ON CONFLICT (tenant_id, slug) DO NOTHING;
26312870
INSERT INTO wizard_assessmentsession (
26322871
id, tenant_id, started_by_id, assessment_type, status, current_step, applicability_result,
26332872
applicability_reasoning, executive_summary, progress_percent, completed_at, created_at, updated_at

0 commit comments

Comments
 (0)