Skip to content

System design

AgentHound separates foothold-time collection from full-graph analysis.

collection host                         analysis host

agenthound scan [scope]                agenthound-server ingest scan.json
  local evidence                         validate and normalize
  guarded discovery                      publish raw graph
  service collection                     rebuild composite analysis
  local planner                          persist findings and history
  immediate restoration                  serve API and dashboard
  one scan.json

Collector

The collector is a static Go binary with no database or server dependency. A scan owns local configuration and instruction collection, contact-policy enforcement, network and protocol discovery, service collection, credential handling, deterministic candidate planning, access proof, recovery, and artifact checkpointing.

The planner uses in-memory indexes over nodes, edges, targets, credentials, capabilities, and completed candidate keys. New evidence can unlock work during the same scan. Read-only work may run concurrently; a reversible mutation holds an exclusive lease through confirmed restoration.

Every AgentHound-owned HTTP request and TCP connection passes through the scan's contact policy. The guard is applied during target admission and again after DNS resolution at the final dial boundary.

Artifact

The collector writes ingest V1 as {meta, graph}. meta.extra.scan_execution stores mode, exclusions, status, action outcomes, and recovery records. The destination is replaced with a complete JSON document after each meaningful transition.

Raw credential material lives on Credential nodes in properties.value. value_hash provides stable identity and deduplication without becoming executable material itself.

Analysis server

The server validates and scopes collector input, writes raw observations to Neo4j, rebuilds composite relationships, stores scan and finding state in PostgreSQL, and publishes one coherent analysis revision. PostgreSQL and Neo4j are bound as one storage pair.

The REST API and embedded React application read the published projection for operator analysis. Raw administrative Cypher remains available through the server CLI and query API.

See Server Analysis for the publication lifecycle and Graph Model for the data contract.