K0NSULT // ai-truth/ipIII
k0nsult.cloud / ai-truth / ipIII / model-danych

Model danych (wersja dev)

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ą.

Status: szkic kontraktu danych. Schemat jest projektem referencyjnym (dev). Implementacja produkcyjna ma status GAP do czasu wdrożenia i migracji. Typy zgodne z PostgreSQL 15+ (UUID, JSONB, ENUM, GENERATED).

Diagram relacji

incidents 1─N → evidence 1─N → response_actions N─1 ← assets N─1 ← agents

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).

1 · incidents — rdzeń zdarzenia

Centralna 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.

2 · evidence — warstwa dowodów

Wiele 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.

3 · response_actions — działania reakcji

Kroki 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.

4 · assets — zasoby chronione

Systemy, 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.

5 · agents — agenci AI i reputacja

Rejestr 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).

Podsumowanie relacji

Z tabeliKolumna FKDo tabeliON DELETE
evidenceincident_idincidentsCASCADE
response_actionsincident_idincidentsCASCADE
response_actionsvalidation_refevidenceSET NULL
incidentsasset_idassetsRESTRICT
incidentsagent_idagentsRESTRICT
Schemat jako egzekwowanie doktryny. Evidence-first nie jest tu opcją interfejsu — jest w typach: domyślny gap, wymagany validation_ref do zamknięcia, chain_of_custody nieusuwalny. Baza nie pozwala udawać faktu bez dowodu. Kontrakt API opisany na stronie API.