SPEAKMAN.AI · Pentest Platform
SDLC Pipeline · Penetration Test Gate

We built a pentest platform. Then we broke into it.

An AI orchestrator runs real recon, scanning, exploitation, and post-exploitation tools against an approved scope. A companion app holds four human sign-off gates in the middle of that automation. Nothing ships without a person reviewing it first, not a scan, not a finding, not a report, not a gate.

report_draft.md · FIND-003 · Critical · CVSS 9.1
The most severe risk is the combination of a world-readable environment
file exposing the JWT_SECRET with the absence of role-based access
control on protected API routes. Together these allow any network-connected
attacker to forge a JWT of any role, advance engagement workflows, overwrite
report content, and consume backend resources, all without legitimate
credentials.Written by the orchestrator, from its own findings, during the validation run below.
10
findings in the validation run, 4 Critical
<5 MIN
leaked secret to full account access
100%
of seeded passwords cracked, stdlib only
1,982
lines of markdown running the entire test
The Problem

Pentests are slow and expensive, and most run once a year.

Two pressures collide: a shortage of specialized security staff able to run manual assessments at release speed, and regulatory requirements that call for frequent, auditable validation instead of an annual PDF. Port scanning, CVE template matching, endpoint enumeration, and header audits are mechanical, well-specified work. Automation handles that part well. Deciding what's in scope, judging whether a finding is real, weighing how severe it actually is, and signing off on a client deliverable still need a human who can be held accountable for the call.

The platform is built around that split. It does not remove the human.

The System

Three pieces. One shared record of truth.

The companion app is the control surface that keeps Claude Code, the intelligence layer, from running an engagement by itself.

/pentest

Orchestrator

Reads the approved scope, resolves cloud provider constraints, dispatches workers, and analyzes every raw result itself, no external workflow engine in the loop. It polls the companion app for each gate but never approves one on its own.

/pentest-execute

Worker

A single-task agent dispatched per phase: recon, port scan, vuln scan, logic probe, exploit, post-exploit. It runs real tools over Bash, respects rate limits, stays off restricted subnets, and returns one structured JSON result.

Companion App

Governance layer

FastAPI and React. Owns scope, the finding set, the report, and the audit trail. Every gate transition is a human clicking a button in this app, never an API call the skill makes on its own.

Data Flow
Claude executes a step writes structured output to the app app surfaces it to the right human at the right gate human reviews, edits, approves Claude resumes with the updated, human-reviewed context
Four Gates, Zero Autopilot

The skill polls. It never pushes.

The completion routes for Gates 2 through 4 exist in the API, and the orchestrator is explicitly forbidden from calling them. Only a click inside the app advances the engagement.

GATE 1

Scope & Cloud Verification

Targets are classified as AWS, GCP, Azure, or on-premises before a single tool runs. The human sees the mapping and the banned categories, then approves.

Lead
GATE 2

Execution Audit

Every phase's raw log is uploaded the moment that worker finishes, not batched at the end, and reviewed before analysis proceeds.

Analyst
GATE 3

Findings Review

The finding set is editable in place: severity, CVSS, remediation. Manual findings from human testing get added here too.

Lead
GATE 4

Report Approval

The report is generated after Gate 3 closes, from whatever is in the app at that moment, so manual additions are never left out.

QA
Compliance Before The First Packet

It reads each provider's rules so you don't have to.

Every target is resolved against a locally cached CIDR database, no outbound lookups, before dispatch. Anything a provider's terms of service forbid is skipped and logged, not attempted and hoped for.

ProviderRestrictedAuto-blockedPorts/sHTTP req/s
AWS169.254.169.254DoS, DNS flooding, control-plane bruteforce10010
Azure168.63.129.16 +1DoS, hypervisor exploitation, shared-compute scans15015
GCPmetadata.google.internalDoS, spam campaigns, infra bruteforce10010
On-PremisesSOW exclusions onlyUnlimitedUnlimited

Every skip gets a reason, a target, and a provider, and lands in the report's Compliance Exclusions appendix.

The Proof

We didn't demo it. We turned it on ourselves.

The companion app doubles as its own validation target: a local build seeded with real, disclosed weaknesses, run through a full white-box engagement to confirm the platform finds what it's supposed to find.

This is the intentionally-vulnerable validation build, not a disclosure against the public release. The shipped app documents this in its own README before you run it. The point of the exercise was to prove detection, end to end, against a target with known answers.
FIND-001 — Orchestration /quit endpoint, unauthenticated Critical · 9.0

Kill the test run with one curl.

FIND-002 — RBAC bypass on pipeline routes Critical · 9.1

Any authenticated user overwrites the report.

FIND-003 — JWT forgery via leaked signing secret Critical · 9.1

Forge any role, reach every engagement.

FIND-006 — Default credentials, all accounts Critical · 9.8

100% password reuse, cracked straight from the database.

FIND-007 — Cache store reachable with no auth High · 7.5

Read and write every cached key.

FIND-008 — Local database world-readable and writable High · 8.8

Read hashes, bypass the state machine directly.

FIND-009 — Document store reachable with no auth High · 7.5

Full read and write, zero credentials.

FIND-010 — World-readable env file exposing JWT secret High · 7.5

The root cause behind FIND-003.

FIND-004 — Report content injection Medium · 6.5

Overwrite the client deliverable with arbitrary text.

FIND-005 — Local inference reachable with no auth Medium · 5.3

Unbilled compute use at the owner's expense.

51 logic-probe commands

Every discovered endpoint, tested against every credential role: auth enforcement, IDOR, RBAC escalation, business-logic bypass, injection, boundary values.

36 exploit commands

Each one traced to a specific confirmed finding: JWT algorithm-confusion forgery, direct database access, cache-protocol writes, live inference abuse.

1 attack path, <5 minutes

Leaked signing secret, forged Lead-role token, every engagement and report writable. One chained narrative, not ten isolated bugs.

The Engineering Call

We cut an AI layer out of our own pipeline.

The first real run routed worker output through an external analysis workflow before it reached the report. The raw data was excellent. What came back was not.

Decision — Remove the external analysis workflow from the runtime path
Status
Accepted
Driver
Nuclei-classified informational findings and passing checks were being dropped before they reached the report. CVSS and severity formats produced by the analysis layer didn't match what the companion app validated, so finding uploads failed outright.
Decision
Claude, already holding the full worker output in context, analyzes it directly: builds the test-coverage table, structures findings, traces attack chains, and uploads the result itself. No intermediate workflow engine.
Alt. rejected
Fix the external workflow's output schema to preserve informational findings and passing checks. Rejected: the underlying issue was a second LLM re-summarizing already-correct data and discarding what didn't fit its schema.
Consequence
Reports now include every PASS alongside every FAIL, CVSS format matches the API contract on the first attempt, coverage gaps get documented instead of silently dropped, and the analysis step runs at zero extra latency because there's no second model call to wait on.
No Black Box

The entire test logic is a text file you can read.

Not a compiled binary, not a hosted service with a private ruleset. Two markdown files, one orchestrator and one worker, contain every rule this platform follows.

Part Of A Bigger Machine

One gate in a pipeline that runs idea to production.

This is the pentest gate inside the SPEAKMAN.AI SDLC pipeline: the same set of Claude Code skills that architects, writes requirements, generates working code, and provisions infrastructure before anything reaches this gate.

Architecture /generate-sad

Business description in, a draft Solution Architecture Document out, ready for human review before it goes in front of an ARB.

Requirements /generate-requirements

Domain model, naming dictionary, use cases, API and DB schema, test strategy.

Code Generation /generate-speakmanai-code

A working, milestone-gated, git-committed codebase. A router picks the JavaScript, Go, or Python variant.

Infrastructure /generate-infrastructure

Terraform for whichever cloud you're targeting, GCP, AWS, or Azure, plus pre-pentest hardening applied straight to the codebase.

Promote /promote-environment 1

local → DEV. Code quality gate. Pass/block report, nothing fixed automatically.

Promote /promote-environment 2

DEV → STG. Security and reliability gate.

Pentest & UAT /pentest + /generate-uat-tests

This platform, plus human-executed UAT. Both run against the live STG environment.

Promote /promote-environment 3

STG → PROD. Hardening gate, scored against pentest results and UAT pass rate.

Who It's For

Built for the gate, not the exception.

Teams shipping continuously need a pentest before every promotion to production, not once a year, because the code under test changes weekly and the last assessment stops describing it the moment it does.

Security-conscious builders get a real toolchain, nmap, nuclei, nikto, gobuster, testssl.sh, searchsploit, run by an agent that documents what it couldn't check as carefully as what it found.

Compliance-driven organizations get an audit trail that can't be edited after the fact: a database trigger blocks UPDATE and DELETE on the log, backed by a parallel append-only file.

Runs On Your Machine

Nothing about an active engagement leaves your network.

Per-engagement isolation

Physical separation, not row-level filtering. A finding from one engagement structurally cannot surface in another.

Fully local by default

No cloud dependency for the companion app itself, though Claude Code may call its own model API elsewhere. The app never does.

Kali-based Docker image

Or run natively: Debian/Ubuntu, Fedora/Arch, macOS via Homebrew, and Windows through WSL2 are all documented paths.

Open Source · MIT

Read the two files that run the whole engagement.

The companion app and both skills are public. Clone it, read the markdown, run it locally, and point it at a scope you're authorized to test.

Written by David Speakman. Speakman Consulting designs and builds this kind of system for growing organizations: agent workflows with the governance that keeps humans in the loop.