LuaN1aoAgent rejects blind exploration and LLM hallucinations. Instead, every testing decision is grounded in an explicit causal graph — a directed graph that records how raw observations lead to hypotheses, how hypotheses lead to confirmed vulnerabilities, and how vulnerabilities lead to exploit attempts.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/SanMuzZzZz/LuaN1aoAgent/llms.txt
Use this file to discover all available pages before exploring further.
The causal graph is separate from the task planning DAG. The task graph tracks what to do; the causal graph tracks what was learned and why.
Why Causal Graphs Prevent Hallucinations
Without a causal graph, an LLM agent can:- Jump to exploit an SQLi vulnerability it invented without any supporting evidence.
- Repeatedly retry a failed technique because it forgot why the previous attempt failed.
- Report a finding it never actually observed.
- Evidence first — a
Hypothesisnode cannot exist without at least oneEvidencenode thatSUPPORTSit. - Confidence quantification — every causal edge carries a numeric confidence score, preventing advancement on weak guesses.
- Full traceability — every node records the
source_step_idof the execution step that produced it, creating an auditable reasoning chain.
Node Types
All causal node types are defined as dataclasses incore/data_contracts.py, inheriting from BaseCausalNode:
Evidence
Evidence
Raw facts from tool execution. Anchors the entire reasoning chain.Example: nmap reports
3306/tcp open mysql.Hypothesis
Hypothesis
An inference drawn from evidence. Carries a dynamic confidence score and verification lifecycle.Example: “Target is running MySQL and may accept unauthenticated connections.”
Vulnerability / PossibleVulnerability / ConfirmedVulnerability
Vulnerability / PossibleVulnerability / ConfirmedVulnerability
Represents an identified security weakness, at varying levels of certainty.
ConfirmedVulnerability nodes receive special treatment — they get confidence: 0.99 and status: "CONFIRMED" automatically, and the bulletin board broadcasts them to all parallel subtasks immediately.Exploit
Exploit
An executable attack vector targeting a specific vulnerability.Example:
mysql -h target -u root -p '' against a MySQL weak-password vulnerability.KeyFact
KeyFact
A factual observation that does not fit the Evidence-Hypothesis chain but is worth tracking (e.g., a server version string, a discovered admin URL).KeyFact nodes with confidence ≥ 0.5 are broadcast to the shared bulletin board for parallel subtasks.
Edge Types
Edges represent the logical relationship between two causal nodes. TheGraphManager normalizes all edge labels to a canonical set:
| Edge Label | Semantics |
|---|---|
SUPPORTS | Source evidence or hypothesis strengthens confidence in target |
CONTRADICTS | Source evidence or hypothesis weakens or falsifies target |
REVEALS | Source step or evidence exposes the existence of target |
EXPLOITS | An Exploit node targets a Vulnerability node |
MITIGATES | A protection mechanism reduces confidence in an Exploit path |
The Evidence-Hypothesis-Validation Chain
The canonical reasoning chain that LuaN1aoAgent builds for every attack path: Concrete example from README:Confidence Propagation
Theupdate_hypothesis_confidence method in core/graph_manager.py implements non-monotonic logic propagation — meaning evidence can both raise and lower confidence, and decisive evidence overrides accumulated weak evidence.
- NECESSARY evidence
- CONTINGENT evidence
A single decisive piece of evidence that conclusively confirms or refutes a hypothesis. The LLM can flag evidence as
"necessary", "decisive", "conclusive", or "definitive".SUPPORTS→ confidence set to1.0, status becomesCONFIRMEDCONTRADICTS→ confidence set to0.0, status becomesFALSIFIED
The LLM’s explicit
evidence_strength parameter takes priority. If not provided, the system defaults to CONTINGENT (conservative).Staged Nodes and Node Promotion
The Executor does not write directly to the causal graph. Instead, it stages proposed nodes on its subtask node:core/graph_manager.py):
- Promotes them into the causal graph via
causal_graph_updates - Vetoes them using
rejected_staged_nodes, which removes them from the task graph entirely
The query_causal_graph Tool
The Executor can query the live causal graph without going through MCP. This is implemented as a local tool handler with zero latency:
How the Planner Uses the Causal Graph
At every planning cycle,GraphManager.get_causal_graph_summary() produces a text snapshot of the causal graph that is injected directly into the Planner’s prompt:
analyze_attack_paths(), which ranks full Evidence → Hypothesis → Vulnerability chains by combined confidence score and CVSS severity: