Schemat relacyjny (PostgreSQL) pięciu tabel rdzenia: incidents, evidence, response_actions, assets, agents. Doktryna evidence-first jest wpisana w typy kolumn — status dowodowy, poziom pewności i łańcuch nadzoru są polami, nie konwencją.
evidence.incident_id → incidents.id · response_actions.incident_id → incidents.id · incidents.asset_id → assets.id · incidents.agent_id → agents.id. Kasowanie incydentu kaskaduje na dowody i działania (ON DELETE CASCADE); powiązania do assets/agents są restrykcyjne (ON DELETE RESTRICT).
incidents — rdzeń zdarzeniaCentralna tabela. Nosi identyfikator publiczny, typ i poziom (L1–L4), severity, status dowodowy, priorytet oraz komplet flag prawnych sterujących obowiązkami raportowymi.
CREATE TYPE evidence_status AS ENUM
('confirmed','media_signal','public_claim','gap','disputed','simulation','internal');
CREATE TYPE incident_priority AS ENUM ('P0','P1','P2','P3');
CREATE TYPE incident_level AS ENUM ('L1_cyber','L2_ai','L3_legal','L4_resilience');
CREATE TABLE incidents (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
public_id TEXT UNIQUE NOT NULL, -- np. INC-2026-0042
title TEXT NOT NULL,
summary TEXT,
source_type TEXT NOT NULL, -- form | osint | siem_log | cert | vendor | api
level incident_level NOT NULL,
category TEXT NOT NULL, -- phishing | ransomware | prompt_injection ...
evidence_status evidence_status NOT NULL DEFAULT 'gap',
severity SMALLINT NOT NULL DEFAULT 0 CHECK (severity BETWEEN 0 AND 10),
priority incident_priority,
-- flagi prawne (sterują Legal/Compliance Engine)
ai_act_relevant BOOLEAN NOT NULL DEFAULT false,
ai_high_risk BOOLEAN NOT NULL DEFAULT false,
ai_serious_incident BOOLEAN NOT NULL DEFAULT false, -- AI Act art. 73
gdpr_personal_data BOOLEAN NOT NULL DEFAULT false,
gdpr_breach BOOLEAN NOT NULL DEFAULT false, -- RODO art. 33/34
nis2_relevant BOOLEAN NOT NULL DEFAULT false, -- 24h/72h/final
ksc_relevant BOOLEAN NOT NULL DEFAULT false,
critical_infra BOOLEAN NOT NULL DEFAULT false,
law_enforcement BOOLEAN NOT NULL DEFAULT false,
-- ocena wpływu
impact_confidentiality SMALLINT DEFAULT 0 CHECK (impact_confidentiality BETWEEN 0 AND 3),
impact_integrity SMALLINT DEFAULT 0 CHECK (impact_integrity BETWEEN 0 AND 3),
impact_availability SMALLINT DEFAULT 0 CHECK (impact_availability BETWEEN 0 AND 3),
impact_scope TEXT, -- opis zasięgu
affected_users INTEGER,
-- powiązania i cykl życia
asset_id UUID REFERENCES assets(id) ON DELETE RESTRICT,
agent_id UUID REFERENCES agents(id) ON DELETE RESTRICT,
status_lifecycle TEXT NOT NULL DEFAULT 'open', -- open | triage | contained | resolved | closed
detected_at TIMESTAMPTZ,
reported_at TIMESTAMPTZ NOT NULL DEFAULT now(),
sla_due_at TIMESTAMPTZ, -- wg priorytetu
closed_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now(),
updated_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_incidents_priority ON incidents(priority) WHERE status_lifecycle <> 'closed';
CREATE INDEX idx_incidents_flags ON incidents(nis2_relevant, gdpr_breach, ai_serious_incident);
Opis. evidence_status domyślnie gap — nowy incydent nie jest faktem, dopóki dowody nie awansują statusu. sla_due_at wyliczany z priorytetu (P0 → +4h, P1 → +24h, P2 → +72h, P3 → +7–30 dni). Flagi prawne są wejściem do Legal Board i zegarów raportowych.
evidence — warstwa dowodówWiele dowodów na jeden incydent. Hash SHA-256, poziom pewności 0–100, łańcuch nadzoru jako JSONB, kontrola widoczności.
CREATE TYPE evidence_kind AS ENUM
('url','screenshot','file_hash','log','ioc','cve','cert_bulletin','enisa_report',
'vendor_advisory','upo_edelivery','model_prompt','model_output','agent_trace','hitl_decision');
CREATE TABLE evidence (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
incident_id UUID NOT NULL REFERENCES incidents(id) ON DELETE CASCADE,
kind evidence_kind NOT NULL,
status evidence_status NOT NULL DEFAULT 'gap',
source TEXT, -- url / system / autor
content_ref TEXT, -- wskaźnik do artefaktu / blob
hash_sha256 CHAR(64), -- integralność materiału
confidence SMALLINT NOT NULL DEFAULT 0 CHECK (confidence BETWEEN 0 AND 100),
chain_of_custody JSONB NOT NULL DEFAULT '[]', -- [{ts,actor,action,hash_before,hash_after,note}]
visibility TEXT NOT NULL DEFAULT 'internal', -- public | restricted | internal
collected_by UUID, -- users.id
collected_at TIMESTAMPTZ NOT NULL DEFAULT now(),
verified_by UUID,
verified_at TIMESTAMPTZ,
created_at TIMESTAMPTZ NOT NULL DEFAULT now()
);
CREATE INDEX idx_evidence_incident ON evidence(incident_id);
CREATE INDEX idx_evidence_hash ON evidence(hash_sha256);
Opis. Agregat statusów dowodów wyznacza incidents.evidence_status (najmocniejszy potwierdzony dowód podnosi incydent do confirmed). Rozbieżność hash_sha256 przy weryfikacji przenosi dowód do disputed. visibility egzekwuje ekspozycję wg roli — internal nigdy nie trafia do widoku publicznego.
response_actions — działania reakcjiKroki playbooka wykonane na incydencie. Rejestrują wykonawcę, zatwierdzenie human-in-the-loop i wynik walidacji.
CREATE TABLE response_actions ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), incident_id UUID NOT NULL REFERENCES incidents(id) ON DELETE CASCADE, playbook_type TEXT NOT NULL, -- phishing | ransomware | prompt_injection ... step_no SMALLINT NOT NULL, action TEXT NOT NULL, -- opis kroku action_type TEXT NOT NULL, -- contain | eradicate | recover | notify | validate status TEXT NOT NULL DEFAULT 'pending', -- pending | in_progress | done | failed | skipped requires_hitl BOOLEAN NOT NULL DEFAULT false, -- wymaga zatwierdzenia człowieka (P0/P1) approved_by UUID, -- users.id (human-in-the-loop) approved_at TIMESTAMPTZ, performed_by UUID, performed_at TIMESTAMPTZ, validation_ref UUID REFERENCES evidence(id), -- dowód walidacji kroku result_note TEXT, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_actions_incident ON response_actions(incident_id, step_no);
Opis. requires_hitl=true blokuje wykonanie kroku destrukcyjnego bez approved_by (zasada human-in-the-loop dla P0/P1 — patrz Role i priorytety). validation_ref wiąże krok z dowodem naprawy — bez niego incydent nie może przejść do closed.
assets — zasoby chronioneSystemy, usługi i dane objęte ochroną. Klasyfikacja krytyczności i przynależność do infrastruktury krytycznej.
CREATE TABLE assets ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, asset_type TEXT NOT NULL, -- app | service | db | endpoint | network | data_store owner TEXT, -- właściciel biznesowy environment TEXT NOT NULL DEFAULT 'prod', -- prod | staging | sandbox | simulation criticality SMALLINT NOT NULL DEFAULT 1 CHECK (criticality BETWEEN 1 AND 5), critical_infra BOOLEAN NOT NULL DEFAULT false, handles_personal_data BOOLEAN NOT NULL DEFAULT false, cvss_exposure NUMERIC(3,1), -- najwyższe exploitowalne CVSS segment TEXT, -- segment sieci created_at TIMESTAMPTZ NOT NULL DEFAULT now() );
Opis. environment egzekwuje segregację (prod / staging / sandbox / symulacja). Incydent na zasobie z critical_infra=true automatycznie proponuje flagi nis2_relevant i ksc_relevant. handles_personal_data → propozycja gdpr_personal_data.
agents — agenci AI i reputacjaRejestr agentów AI z tożsamością DID i modelem reputacji (baseline / current / delta) oraz listą dozwolonych narzędzi — podstawa kwarantanny przy przejęciu.
CREATE TABLE agents ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, did TEXT UNIQUE, -- zdecentralizowany identyfikator agenta model_ref TEXT, -- model / wersja owner TEXT, baseline_score SMALLINT NOT NULL DEFAULT 100 CHECK (baseline_score BETWEEN 0 AND 100), current_score SMALLINT NOT NULL DEFAULT 100 CHECK (current_score BETWEEN 0 AND 100), trust_delta SMALLINT GENERATED ALWAYS AS (current_score - baseline_score) STORED, allowed_tools JSONB NOT NULL DEFAULT '[]', -- lista dozwolonych narzędzi/uprawnień status TEXT NOT NULL DEFAULT 'active', -- active | quarantined | revoked quarantined_at TIMESTAMPTZ, last_seen_at TIMESTAMPTZ, created_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX idx_agents_status ON agents(status);
Opis. trust_delta jest kolumną wyliczaną (STORED): spadek reputacji względem baseline sygnalizuje anomalię. Wykrycie prompt injection lub agent hijack ustawia status='quarantined' i opróżnia efektywne uprawnienia niezależnie od allowed_tools. did wiąże tożsamość agenta z warstwą zaufania (por. playbook agent hijack).
| Z tabeli | Kolumna FK | Do tabeli | ON DELETE |
|---|---|---|---|
| evidence | incident_id | incidents | CASCADE |
| response_actions | incident_id | incidents | CASCADE |
| response_actions | validation_ref | evidence | SET NULL |
| incidents | asset_id | assets | RESTRICT |
| incidents | agent_id | agents | RESTRICT |
gap, wymagany validation_ref do zamknięcia, chain_of_custody nieusuwalny. Baza nie pozwala udawać faktu bez dowodu. Kontrakt API opisany na stronie API.