The README gives the kill chain as recon, exploit, and report. The steps below follow the code that enforces each stage. Each step is a control or a record.
- Set the scope. When a target is added, the server rebuilds the arsenal's egress scope from the mission's targets. The scope admits those target hosts and their subdomains, plus loopback and private addresses.
- Request approval for an action. An approval request names an action class and a target. Wildcard targets are refused for active actions, and a whole-subdomain wildcard needs explicit opt-in.
- Approve for a set time. An approval records who approved it and when it expires. The default window is 30 minutes.
- Gate risky tools. A tool in a gated risk tier cannot run until it is approved, either interactively or from a pre-authorized list. Built-in probes are ungated by default and rely on the egress gate.
- Refuse out-of-scope hosts. Before any tool handler runs, the arsenal checks the run's tool allowlist and then the egress scope. An out-of-scope target returns a SCOPE DENIED result.
- Run recon. The recon engine performs network discovery, DNS lookups, and HTTP fingerprinting. The README says each finding traces to real tool output.
- Save evidence. Evidence entries link to a mission, an operation, or a finding. Reads of the evidence list pass through a redaction step.
- Mirror findings without duplicates. Each mission finding is mirrored into the findings ledger. Matching uses title and target, so a finding that appears again on a later pass updates the existing record.
- Retest before confirming. A retest record starts as queued and can end as passed, failed, or blocked.
- Report in draft. Coordinated-disclosure output and bounty-platform connectors prepare drafts only. A human must review and confirm before anything is submitted.
Example workflow (illustrative scenario)
This scenario is invented to show how the steps connect. It does not describe a real engagement.
A practitioner has written permission to test a staging web application at staging.example.com. She opens the War Room, describes the application to Op Admiral in plain English, and adds the host as the mission target. The server rebuilds the egress scope from that target (step 1).
During a run, an agent proposes a networked action against a host the owner did not list. The arsenal refuses it before the handler runs and returns SCOPE DENIED (step 5). She then requests approval for a networked action against the staging host and approves it for 30 minutes (steps 2 and 3). Recon output is saved as evidence linked to the mission (step 7). One finding is mirrored into the findings ledger (step 8).
After the owner ships a fix, she opens a retest on that finding. The retest starts as queued. She saves fresh evidence and records whether the retest passed or failed (step 9). The report is a draft, and she reviews it before anything is sent (step 10).
Agents and models
Purple Team connects to five local agents: Claude Code, Codex, Hermes, OpenCode, and Oh My Pi. Connecting one in Settings needs no API key.
Slow local agents can be given more time. Three settings, in milliseconds, control the time allowed for each agent call (T3MP3ST_LOCAL_AGENT_TIMEOUT_MS), each mission task (T3MP3ST_TASK_TIMEOUT_MS), and each planning request (T3MP3ST_GENERAL_TIMEOUT_MS).
Session reuse for Claude Code is off by default. A resumed session may keep provider-side context and tool authority outside the Arsenal's receipt boundary. An operator who trusts the local Claude Code configuration can set T3MP3ST_TRUST_CLAUDE_SESSION=1. The README says that choice must not be treated as an Arsenal-enforced sandbox.
Hosted providers use API keys. The README names OPENROUTER_API_KEY, VENICE_API_KEY, ANTHROPIC_API_KEY, and OPENAI_API_KEY. It also names XAI_API_KEY for Grok Build and NOVITA_API_KEY for Novita AI.
Novita is an opt-in third-party provider. Its requests send the selected model id, prompts and context, generated output, and request metadata to Novita. The README advises reviewing Novita's privacy policy and terms before sending sensitive target data. Purple Team does not claim independent assurance for sensitive workloads.
For a fully offline run, the operator points Purple Team at a local model. The default is Ollama at a local address, and any OpenAI-compatible server works, such as LM Studio, vLLM, or llama.cpp. Tool calls are driven over text, so the built-in tools work on models without native function calling.