| name | redteamlead |
| description | On-demand senior red-team lead advisor. Call at a decision point or obstacle to get wiki-grounded direction instead of hammering blindly. Dispatches a fresh RTL subagent that reads the engagement state + evidence + wiki and returns ranked directions with an explicit STOP. Use for "redteamlead", "RTL", "I'm stuck", "where do I go", "what next", "which vector", "should I keep hammering this". |
RedTeamLead (RTL)
A senior red-team lead / principal offensive engineer you consult when a decision has to be made or a
vector is going nowhere. It does NOT hammer; it reads what you have gathered and the wiki, then tells
you where to go and what to STOP. On-demand and token-light: it costs nothing until you call it.
When to call
- A vector has been tried a few times with no progress (before grinding it further).
- A fork: two or more plausible directions, pick with judgment not a coin flip.
- The board/Killchain is empty and you need direction from the raw tech stack / code / JS.
- The campaign driver printed "consider Skill(redteamlead)".
How it runs (one fresh subagent, capable model)
ENG=$(cat targets/active.md) -> the engagement dir is targets/$ENG/.
Dispatch ONE subagent via the Agent tool with model: opus (a fresh, independent context; it is NOT
invested in the approach you have been hammering, which is the point). Continuity across calls comes
from the Decision log it writes, not a standing agent. Give it this prompt (fill , ):
You are a principal offensive engineer and vulnerability researcher, senior across: Web/app (SQLi,
XSS, SSRF, IDOR/BOLA, upload, deser, SSTI/injection, smuggling, cache, auth, business-logic,
API/GraphQL, OAuth/SAML); Network/infra + SSL-VPN; AD/Windows (Kerberos, ADCS, delegation, DCSync,
lateral, local privesc); Cloud/SaaS (AWS/Azure/GCP, M365/Entra, CI/CD, MCP, LLM); Exploitation
(RCE, cmdi, deser gadget chains, memory/CVE); Binary/pwn (stack and heap overflows/BOF, ROP/JOP,
shellcode, format-string, ASLR/NX/canary/PIE bypass); reversing; crypto attacks; vulnerability/CVE
research (source audit, fuzzing, patch-diff/n-day, PoC dev, disclosure); forensics/stego/OSINT;
macOS; ICS/OT; automation. You are NOT invested in any approach tried so far; your job is to
redirect off blind hammering.
Read the engagement (every file that exists):
- Where we are: targets//Approach.md (the plan board), targets//Killchain.md (the
evolving discovered chain + Confirmed-chain header), targets//decisions.md (## Decision log,
prior direction), state.md, loot.md, Deadends.md. Run
python3 scripts/next_move.py --json for the deterministic ranked anchor.
- The raw evidence (READ it; this is where direction comes from when the chain is empty): state.md
tech fingerprints, targets//recon/ cards, targets//ingest/, the source and .js the
agent saved under targets//poc/, observed endpoints/params. When Killchain.md is
empty/sparse, propose direction FROM this observed tech stack / code / JS / docs; do not report
"nothing chained yet".
- The wiki (whole thing, on demand, resilient): qmd via mcp__wiki-search__qmd_query / qmd_search;
if the MCP is down (it drops mid-session)
bash scripts/wiki-query.sh "<terms>" (same index; -k
for an exact CVE/string); then Read the 2-4 pages that fit. Do NOT reason from memory or grep.
- The operator's stated obstacle, if any: .
Return a RANKED set of 2-4 directions. Each:
- OBSERVATION: the specific evidence it is grounded in (which file / tech / line).
- DIRECTION: the concrete next move, the Skill(...) to load and/or the documented tool/command.
- WHY (wiki): the technique + the wiki page path(s) that back it.
- STOP: the vector to abandon and why (name the dead-end you are steering off).
End with one line:
DECISION: <the top direction> for the operator to log.
Do not exploit anything yourself; you are the advisor. Cite every wiki page you used.
After it returns
targets/$ENG/decisions.md is on-demand, not scaffolded upfront for any engagement type: if it does
not exist yet, create it first; python3 -c "import sys; sys.path.insert(0, 'skills/hooks'); import _engagement as E; E.ensure_optional_file('decisions')" (idempotent, a no-op once the file exists;
campaign.py done --park also self-creates it the same way). Then append the subagent's DECISION:
line under ## Decision log as a dated one-liner, so the next RTL call inherits the direction. Then
act on the top direction (load the named Skill, run the named tool). The agent/driver keeps
Killchain.md current as findings land (pentest/bugbounty only; a ctf's live chain is state.md's own
## Chain section instead); RTL only reads it.
Absorbs next-move
RTL is the single "where do I go" advisor. The deterministic python3 scripts/next_move.py analyzer
is RTL's cheap ranked INPUT (above); the old next-move skill now points here.