HOW IT WORKS

How it works

You don't learn commands or call skills by name. You say what you want in plain English. The agent finds the skill that fits, follows it, proves the bug, then moves to the next lead on its own. This page shows exactly what that looks like — what you say, what comes back, how it moves from one step to the next, and what it leaves on disk.

# The mental model

1 · You describe

State the target, that it's authorized, and what you want ("test this API for access-control bugs"). No skill names, no flags.

2 · It matches & loads

Each skill's description is a trigger line packed with signals. The agent loads the one that fits and works its Method section.

3 · It proves & pivots

It confirms impact with the least action, writes it down, and the finding becomes the lead that loads the next skill.

Scope is always first. Before anything touches a target, the agent loads tradecraft-scope-roe and confirms authorization. If scope is unclear it stops and asks. See Authorized Use.

# How to talk to it

Good requests carry three things: the target, that it's authorized, and the goal. The more concrete the signals (URL, tech, vuln class), the more precisely the right skill loads.

Reaches the right skill

› test https://api.acme.tld (I'm authorized) for BOLA / IDOR on the orders API › recon acme.tld — subdomains, live hosts, tech stack › review ./src for injection sinks before we ship › is this JWT forgeable? eyJhbGci…

Too vague — it'll ask first

› hack this # which target? authorized how? › find all bugs # on what? in scope? # it will load tradecraft-scope-roe and ask you to # confirm the target and authorization before acting

You can also name a skill if you want to force it — "use web-ssrf on the import feature" — but you rarely need to. Describing the situation is enough.

# A full session, annotated

Here is one authorized engagement from first message to report. Each block is what you'd actually see; the notes explain what happened and where it pivots.

› assess api.acme.tld — I'm authorized (HackerOne: acme). Look for broken access control.
You describe the task. Target + authorization + goal. Nothing else needed.
● tradecraft-scope-roe scope confirmed · *.acme.tld in program · rate-limited wrote engagements/acme/scope.txt + roe.md
Scope first, every time. It records the authorization envelope before touching anything. If *.acme.tld weren't in the program, it would refuse here.
● recon-techstack-fingerprinting Django + DRF · Cloudflare WAF · /api/v1 ● recon-content-discovery found /api/v1/orders, /api/v1/users, /api/v1/admin
Recon output becomes the map. Django REST Framework + numeric IDs in /api/v1/orders is a strong BOLA signal — that lead is what loads the next skill.
● api-bola two test accounts · swapping object IDs ✓ GET /api/v1/orders/1041 with account B's token → returns account A's order ✓ IDs are sequential → 20k orders enumerable (not hoarded)
This is the proof, minimally. It confirms cross-tenant read with two accounts and stops — it sizes impact without hoarding real data. The confirmed bug is now a lead to escalate and to validate.
● web-idor same class on PATCH /api/v1/users/{id} → can change another user's email ● exploit-chaining email change → password-reset takeover (account takeover path)
Pivot: small bug → bigger impact. A read IDOR plus a write IDOR chains into account takeover. exploit-chaining is loaded when several findings combine into something worse than any one alone.
● reporting-triage-validation reproduced from a clean session · CVSS 8.1 (High) · not a duplicate ● reporting-bug-bounty-writeup wrote the report with steps + evidence ✔ report → engagements/acme/findings/idor-orders-ato.md
Validate, then report. Before writing it up, it re-proves the bug from scratch, kills false-positive/duplicate risk, and assigns a defensible severity — then produces the writeup.

# How pivoting works

A "pivot" is just: a result becomes the trigger for the next skill. The agent works one lead at a time and loads the next skill as the evidence points to it. The routing is signal-driven:

What it just saw (the lead)What loads next
A new in-scope domain, nothing mapped yetrecon-* → recon-techstack-fingerprinting
Numeric/UUID object IDs in an APIapi-bola, web-idor
App fetches a URL you control (webhook, "import")web-ssrf
A parameter names a file/templateweb-lfi-path-traversal, web-ssti
Two small bugs that combineexploit-chaining
Valid creds / a foothold on an internal netprivesc-*, ad-*, network-pivoting-tunneling
A captured hash or handshakenetwork-credential-cracking
A confirmed finding, ready to write upreporting-triage-validation → reporting-*

The overall shape is always the same loop — scope → recon → attack → foothold → escalate → report → (defend) — but which skills fire, and in what order, is driven entirely by what the target reveals.

# What an engagement produces

Everything is kept in a per-target workspace — run ./secskills new <target> to scaffold it — so notes and loot never mix between engagements. These paths are git-ignored, so they never end up in the repo.

engagements/acme/
  scope.txt     # the authorized targets — the hard boundary
  roe.md        # rate limits, don'ts, disclosure terms
  notes.md      # timestamped running log — the source of truth
  findings/     # one file per confirmed finding + evidence
  loot/         # captured artifacts (kept minimal)

A notes.md entry reads like the mechanism, not just a command:

# 14:32  goal: confirm cross-tenant read on /api/v1/orders
cmd:    GET /api/v1/orders/1041   (account B token)
result: 200 — returns account A's order (name, address, total)
why:    object id trusted; ownership never re-checked at the data layer
next:   test PATCH /users/{id} for write-IDOR → possible ATO chain

Because the log records why it worked and the next lead, the report almost writes itself — and you can hand the workspace to a teammate and they can continue.

# Steering it

Modes

Each skill is tagged pentest, bugbounty, and/or defense. Say which you're doing — a destructive step safe in a lab won't run against a live bug-bounty target, and human-factor (social-eng-*) is pentest-only.

Keep it in bounds

It refuses out-of-scope and third-party targets, honors rate limits, and proves impact with the least data. Tell it to "stop at proof" or "don't touch X" and it will.

Force or skip a skill

"Use web-ssti here" loads it directly; "skip cracking, just report the weak PSK" steers past a step you don't want.

Go defensive

The same library turns findings into detections and hardening — "convert this into a Sigma rule" loads defense-detection-sigma.

# Using one skill on its own

You don't need a whole engagement. Any single SKILL.md is readable on its own — open it, or paste it into any agent, to get the mechanism, the exact commands, the gotchas, and how to verify success for that one technique.

# read a skill directly
cat skills/web/web-ssrf/SKILL.md

# or ask the agent for just that technique
› walk me through testing this import feature for SSRF
← BackGetting Started Next →Skills