A ground-up rebuild. v1 was a code-*reader* that pattern-matched known bug shapes, drifted to low-severity IDOR/BAC/SSRF, never proved RCE, and only ever found sibling-CVEs. v2 is built on one law: only an execution artifact may declare a finding - an ASan crash, a popped shel...
A ground-up rebuild. v1 was a code-reader that pattern-matched known bug shapes, drifted to low-severity IDOR/BAC/SSRF, never proved RCE, and only ever found sibling-CVEs. v2 is built on one law: only an execution artifact may declare a finding - an ASan crash, a popped shell, a retrieved secret. Never an LLM's opinion.
| Pillar | What | Where | Fixes |
|---|---|---|---|
| 1 - Memory | KuzuDB graph (targets→hypotheses→proofs→findings + cleared-axes) + Chroma (semantic recall) + Redis (queue/cache) + Obsidian vault/ |
memory/, vault/ |
drift, tunnel-vision, re-screening |
| 2 - Brain | Semgrep fast-pass → Joern CPG dataflow (reachable source→sink) → CodeQL deep | brain/ |
sibling-CVE-only; finds novel unexplored sinks |
| 3 - Oracle | libFuzzer/AFL++ + ASan/UBSan → crash triage (GEF) → Docker/CT detonation | oracle/ |
never proved RCE; the only thing that creates a finding |
The severity gate (vault/00-doctrine/SEVERITY-GATE.md) is a refusal engine:
8 P1 impact families, each with its exact oracle and its v1 overclaim traps
("injection reachable" ≠ "ATO completes"; "read DoS" ≠ "RCE"). Anything below the
gate goes to the cleared-axes log, never to a finding. Enforced in code:
memory.promote_to_finding() raises unless a non-DISPROVEN Proof exists.
Everything runs on the forge box (CT 236, REDACTED-IP) - it holds the heavy
tools (Joern, CodeQL, AFL++, clang/ASan, Ghidra, KLEE, SymCC) and the venv
(/opt/cyclops-venv). Redis + KuzuDB are forge-local (Redis bound to localhost -
never LAN, that's a gate family). The repo + human-readable vault/ live on CT 215
(/shared/projects/cyclops-v2, Samba-readable so Zion opens the vault in Obsidian).
Sync: rsync -az cyclops-v2/ root@REDACTED-IP:/opt/cyclops-v2/.
# on forge (CYCLOPS_HOME=/opt/cyclops-v2, PY=/opt/cyclops-venv/bin/python)
$PY orchestrator/seed_graph.py # seed archetypes + sink classes + gate
$PY orchestrator/feed.py 21 # poll fresh releases (<=21d) -> targets queue
$PY orchestrator/orchestrator.py drain-targets # brain pass on each fresh target
$PY orchestrator/orchestrator.py drain-oracle # route hypotheses to proof
$PY orchestrator/orchestrator.py status # graph + queues + GATED findings
Configuration is via environment variables, each with an in-code default: copy
.env.example to .env and set only the values that differ from your box.
The loop: feed → brain (hypotheses) → oracle (proof) → gate (finding) → vault.
Novelty by construction: hunt days-old code (feed.py), CPG finds unexplored
source→sink paths, sibling-CVE gate runs before deep work.
orchestrator/e2e_proof.sh runs the whole chain on real cJSON source (brain CPG →
oracle fuzz → ASan crash → triage → gated finding). memory/selftest.py proves the
gate refuses findings without proof and honors DISPROVEN (9/9 pass).
perf_event_paranoid=4, no HW
perf counters). Crash→exploit triage uses GEF + the ASan report instead./dev/kvm in the LXC. Detonation uses
Docker on forge + the isolated detonation CT (302) for risky targets.