NewAgentic pen testing doesn't just find one bug. It chains them the way an attacker would.See how →
Agentic pen testing

A scanner finds a bug.
Trojan finds where it leads.

Every scanner can tell you a secret is hardcoded somewhere in your code. Trojan's pen-test agent remembers that secret, then goes and tries it, against every login it finds while it's testing your live app. That's the difference between a finding and proof.

Static findings feed the live agentSAST · CodeSecretsSCA · Dependencies→Agentic DAST · Live web
How a chain actually happens

One credential, found once, tried everywhere.

Here's a representative run. Nothing about this is hypothetical; it's the same static-to-live handoff that runs every time an agentic pen test starts.

01
The static scan finds a secret

Trojan's secrets engine flags a hardcoded password in a config file, a plain SAST/secrets finding, exactly like any scanner would report on its own.

02
The agent remembers it as a Fact

Instead of closing the finding, the pen-test agent calls its remember_fact tool: kind “credential,” value the password, from the file it came from. This is the one thing a static scanner never does: carry a finding forward.

03
It looks for somewhere to use it

While crawling the live target, the agent finds a login form (maybe an admin panel, maybe a second service entirely) and checks its memory of facts against what it's looking at.

04
It tries the credential, live

Inside the engagement's safe-mode bounds, the agent sends the login attempt itself, the same move a real attacker makes after finding a leaked password.

05
It's in, and that becomes a new Fact too

A successful login isn't just “confirmed.” It's remembered as a new Fact (an authenticated session), which the agent can chain again: what does this account expose access to?

06
You get the whole chain, not one line item

The report doesn't say “hardcoded secret, medium severity” five times over. It shows the path: this file leaked a password, which opened this login, which reached this data, ranked by what it actually proved, not just what it noticed.

Simplified: the live attack graph looks like this in the app
SAST · SECRETSHardcodedcredentialremember_factkind: credentialDAST · LIVE PROBETries thecredential on/admin/loginenablesCHAINEDAdminsession
The building block

Everything the agent learns is a Fact.

Not every finding is a credential. A Fact is anything worth carrying forward, and it's what separates a pen test from a checklist.

credential
a password, API key, or hardcoded secret
token
a session or auth token captured from a response
identifier
an object ID that might work for another user's record
endpoint
an admin route or internal API the crawl turned up
trust
a relationship, this service trusts that one, unauthenticated
observation
anything else worth carrying forward

A Fact records where it came from and what it might unlock: from and enables. Those links are what render as the kill-chain edges on the live attack graph while a run is in progress.

Why this matters

A checklist stops at the first line. An attacker doesn't.

A scanner (and most pen-test tools)Trojan's agent
Finds a hardcoded secretReports it. Done.Reports it, then tries it
Finds an exposed admin routeFlags the route existsChecks what that credential (or a leaked token) gets you there
Two findings, relatedTwo line items, same severity math applied to eachOne chain, ranked by what it actually proved is reachable
What you getA list to triageA path an attacker would take, with each step's evidence attached
For the curious

The agent has an explicit tool call for this; it isn't inferred after the fact:

remember_fact({
  kind:    "credential",
  summary: "hardcoded password found in config.py:14",
  value:   "••••••••••",       // retained for reuse, never shown in the UI
  from:    "config.py:14",
})

Every probe the agent sends afterward runs inside the engagement's safe-mode bounds: rate-limited, scoped to what you allow-listed, never a destructive request. Chaining finds the path further; it doesn't take the engagement further than you consented to.

See it on your own code

Find out what a finding
actually leads to.

Run a scan, then let the agent take what it found and go further, on your terms, inside bounds you set.

Run your first scanSee a real report →