Omniculus — Architecture Blueprint

Data flow

                 ┌────────────┐
  authorized →   │  INGEST    │  synthetic generator (default) + connectors
  sources        └─────┬──────┘  + public threat-intel feeds
                       │ events (labeled in lab)
                       ▼
                 ┌────────────┐
                 │   GRAPH    │  entity resolution → NetworkX knowledge graph
                 └─────┬──────┘  (the data-fusion core)
                       │ entities + observations
                       ▼
                 ┌────────────┐
                 │  DETECT    │  rules (Sigma-style) + statistical anomaly
                 └─────┬──────┘  + (roadmap) graph analytics + ML + game theory
                       │ explainable Alerts (rule + evidence + confidence)
                       ▼
                 ┌────────────┐
                 │ INVESTIGATE│  rank, route consequential alerts to a HUMAN
                 └─────┬──────┘  audit log; recommends only — acts on nothing
                       │ analyst dispositions
                       ▼
                 ┌────────────┐
                 │  FEEDBACK  │  retune thresholds; bounded + logged
                 └─────┬──────┘
                       │ updated config
                       └──────────────► back to DETECT (the vigilance loop)

Modules

ingest/

  • synthetic.py — generates a benign behavioral baseline plus injected, ground-truth-labeled attack scenarios (brute_force, lateral_movement, c2_beacon). This is what makes the platform safe to develop on.
  • connectors.py (roadmap) — adapters for real telemetry (network flow, endpoint/auth logs, cloud audit) and public feeds (MITRE ATT&CK, CVE/NVD, abuse.ch, MISP, OTX). Authorization-gated.

graph/

  • model.py — entity typing / canonicalization (user, host, ip).
  • knowledge_graph.py — a networkx.MultiDiGraph where nodes are entities and edges are observed events. Query helpers (edges_to, edges_from, out_degree_by_node, nodes_of_type) are the substrate detections build on.
  • Why a graph: correlation, attack-path tracing, and "who touched what" questions are natural as graph queries and awkward as flat-log scans.
  • Backend choice: NetworkX for research simplicity. Swappable for Neo4j at production scale (roadmap) — keep query helpers as the abstraction seam.

detect/

  • alert.py — the Alert: rule, severity, confidence, entities, evidence, recommended action, and (lab-only) ground truth for evaluation.
  • engine.py — runs all detections:
  • brute_force — sliding-window failed-auth burst per (src, dst); severity escalates if a success follows.
  • lateral_movement — a user authenticating to ≥ N distinct hosts.
  • known_bad_contact — network contact with a threat-intel-listed IP.
  • connection_anomaly — z-score outlier on outbound connection volume.
  • Every detection returns evidence; nothing is a black box.

investigate/

  • decision_support.py — ranks alerts by (severity, confidence), marks critical/high as requires human review, and records an audit trail. The DecisionSupport class has no method that executes a response. This is the architectural embodiment of human-in-the-loop.

feedback/

  • learning.py — converts analyst dispositions (true/false positive) into bounded, logged threshold adjustments. Low precision on a rule raises its bar; this is the "learn to be more vigilant" loop, kept auditable.

Configuration

  • config.py centralizes thresholds so the feedback loop has one place to retune and so behavior is inspectable.

Extension seams (where new work plugs in)

  • New detection: add a _detect_* method to DetectionEngine returning Alerts with evidence.
  • New data source: emit events in the ingest schema; the graph and detections are source-agnostic.
  • New backend: implement the KnowledgeGraph query helpers over Neo4j.
  • Correlation/alert dedup: sits between detect and investigate.