Pentest
Black-box security audit of a running web application, from the outside, via HTTP.
Default language: match the user's request language (Russian or English). Pass --lang ru|en to override. Reports live in {cwd}/pentest-output/{target-slug}-{YYYY-MM-DD}/.
Assumption: the user has authorization from the target's owner. Do not ask for legalese — trust the user. But never run this skill against a target the user hasn't explicitly named.
Workflow
Phase 0 — Scope
Before touching the target, confirm:
- Target URL — full
https://… URL of the deployed app (the mini app entry URL, not t.me/...).
- Aggression level — default
L1. Let the user override:
L0 passive: public metadata only, zero probes of the app itself
L1 safe (default): single-request probes, read-only, no mutations
L2 authorized: mutations on the auditor's own test account (profile updates, intros, etc.)
L3 destructive: real injection payloads, cross-tenant access attempts, rate-limit probing without load testing
- Target type hint —
telegram-miniapp | nextjs-vercel | supabase | generic. Auto-detect from headers if not provided.
- Language —
ru or en (default: match user's language).
- Credentials needed? — if the target needs auth to explore (most apps do), ask the user to paste the auth artifact once:
- Telegram mini apps: the launch URL fragment (
https://…/#tgWebAppData=…) captured from DevTools when the app opens
- Cookie-based apps: a session cookie or token from the user's logged-in session
- Store it in
secrets.txt under the workspace, add .gitignore to exclude it
- Never include the raw auth artifact in any report file.
Phase 1 — Workspace
slug=$(echo "<target host>" | tr -cd 'a-z0-9-')
day=$(date +%Y-%m-%d)
workdir="${PWD}/pentest-output/${slug}-${day}"
mkdir -p "${workdir}"/{recon,bundle,scripts,findings,fixes}
echo 'secrets.txt
*.local.*
cookies.txt' > "${workdir}/.gitignore"
Write ${workdir}/README.md with: target URL, scope, level, language, start time, operator.
Phase 2 — Recon (L0 — always run)
Read ${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/checklist-generic.md for the full command list. Minimum:
- DNS (
A, AAAA, CNAME, NS) and provider fingerprint
curl -D headers_root.txt -o body_root.html <target> — save headers + body
- Probe well-known paths:
robots.txt, sitemap.xml, /.well-known/security.txt, favicon.ico, manifest.json
- Grep the root HTML for asset references → full JS/CSS chunk inventory
- Extract
og:* meta, <script src>, <link href>, any inline data
- Check security headers on both root and sample API endpoint: HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, CORS
Fingerprint the stack from response headers:
server: Vercel + x-matched-path + x-nextjs-* → Next.js on Vercel → load references/nextjs-vercel.md
- URLs like
…supabase.co → Supabase backend → load references/supabase.md
https://telegram.org/js/telegram-web-app.js or tgWebAppData fragment → Telegram mini app → load references/telegram-miniapp.md
Apply stack-specific reference only when fingerprint matches. Don't read all references upfront.
Phase 3 — Bundle analysis
Download all JS chunks referenced from the root HTML to bundle/. For each:
for f in bundle/*.js; do
curl -sS -o "$f.map" "https://<host>/path/to/$(basename $f).map?<dpl>"
[ -s "$f.map" ] && echo "source map exposed: $f"
done
Grep the bundle for:
- API routes:
/api/[^"]+
fetch( / axios( call sites
- Absolute URLs of third-party services
- Secrets patterns:
eyJ[a-zA-Z0-9_-]{40,}, sk_[a-z]+_[a-zA-Z0-9]{20,}, NEXT_PUBLIC_[A-Z_]+, SUPABASE_[A-Z_]*, api_key, service_role
- Auth header name (
Authorization, x-telegram-init-data, X-Api-Key, etc.) and how it's injected
/directory/${...}, /profile/${...} — templated app-level routes
Save the full inventory to recon/api-inventory.md — this becomes the map for Phase 4.
Client wiring audit. Once the auth header is identified (say x-telegram-init-data), grep for fetch( calls that hit /api/ endpoints but do NOT go through the app's auth wrapper (typically apiFetch or similar). Example: a fetch("/api/referrals/attribute", {method:"POST", ...}) with no x-telegram-init-data header, while the server demands it, means the feature is functionally broken on the client. That's a reportable bug (info severity, «broken feature») even if it's not a security vulnerability. Flag these:
# find raw fetch() calls to /api
grep -hoE 'fetch\([^)]{0,300}/api/[^)]{0,300}\)' bundle/*.js | head -20
# compare: which ones go through apiFetch (auth wrapper)?
grep -hoE 'apiFetch\([^)]{0,300}\)' bundle/*.js | head -20
If a route appears in plain fetch( but is also listed as requiring auth in your Phase 4 map, note «client-wiring mismatch: server requires auth, client sends none — feature broken».
Phase 4 — Endpoint probing (L1 default)
For every /api/* endpoint found:
- Unauthenticated GET — record status code, size, body preview
- Authenticated GET (with user's auth artifact) — record the same
- Compare: endpoints that return 200 unauth AND contain PII are privacy leaks
Then for any auth/login endpoint (/api/auth/*, /api/session, etc.):
- Empty body → expected 400, flag 500 as an input-validation bug
- Missing credentials → expected 401
- Bad credentials → expected 401
- Credentials with tampered fields but valid signature → expected 401 (this tests the signature actually covers the tampered field)
If stack = telegram-miniapp, run the full auth test matrix from references/telegram-miniapp.md (empty initData, no hash, fake hash, tampered user_id, stale auth_date replay).
Phase 5 — Authorization / IDOR (L1 default)
Collect any IDs visible in Phase 4 responses (userId, memberId, eventId, intro_id, etc.) and try:
GET /api/members/{otherUserId} with your own auth — do you see their data? Expected: 200 (if public) or 404/403 (if protected)
GET /api/{thing}?userId={otherUserId} — does the filter actually filter? Or is it silently ignored?
GET /api/{thing}?limit=999999, ?limit=-1, ?offset=abc — input validation smoke. Note 500s as bugs.
?role=admin, ?membershipStatus=banned — does passing a privilege filter return different data?
- Path confusion:
/api/{thing}/..%2F..%2Fetc%2Fpasswd, /api/{thing}/%00.json
Do not fetch another real user's sensitive data past proof-of-access. Stop at the first 200 that proves the vulnerability and record just the structure of the response, not the content. Redact names/emails/ids of real users in the report.
Phase 6 — L2 (mutations on own account, only if user asked for L2)
On the auditor's own test account:
POST endpoints: profile update, intro send, referral attribute, upload
- Test: server-side validation vs client-side. Can you send fields not shown in the client form?
- Test: are reserved/internal fields accepted? (
is_admin, role, membership_status, credits, tier)
- Test: can you change another user's resource by sending their ID in the body? (IDOR on mutations)
- Test: file upload — MIME sniffing, path traversal in filename, SVG-with-script upload, oversize file
Always label each mutation request in EVIDENCE.md with what it did and which object it touched, so it's easy to clean up afterward.
Phase 7 — L3 (destructive, only if user asked for L3)
- SQL/NoSQL injection payloads (
' OR 1=1--, '; DROP --, {"$ne": null}) on fields that hit the DB
- SSRF via URL parameters (
url=http://169.254.169.254/latest/meta-data/)
- XSS in stored fields (
<script>alert(1)</script>, javascript:alert(1) in avatarUrl) — check where it reflects
- Prototype pollution via JSON body (
{"__proto__":{"isAdmin":true}})
- Cross-tenant: attempt to read/modify a non-test user's data. Stop at proof-of-access, don't exfiltrate.
Single requests only. No load / brute-force / enumeration loops. If a finding needs automation to be proven, write it up as a theoretical finding with the single-request PoC and note the limitation.
Phase 8 — Generate deliverables
Three artifacts, two locations:
${workdir}/findings/REPORT.md — human-readable, for the target's owner. Use references/report-template.md as the skeleton. Order findings by severity descending. Each finding has: description, why it matters, PoC steps, recommended fix (with code snippet). End with "What works well ✅" and "What I didn't test" sections.
${workdir}/findings/EVIDENCE.md — raw request/response log, one section per finding. Use references/evidence-template.md. Redact real user PII. Keep auth artifacts out (they're in secrets.txt, .gitignored).
${workdir}/fixes/ (sibling of findings/, NOT nested) — machine-actionable per-finding fix plan, designed to be consumed by another coding agent:
${workdir}/fixes/INDEX.md — markdown table of all fixes sorted by priority with a one-line summary each
${workdir}/fixes/NN-slug.md — one file per finding, two-digit priority prefix (e.g. 01-auth-date-ttl.md, 02-public-member-list.md)
- Template:
references/fix-template.md
After writing, print the three absolute paths in chat: ${workdir}/findings/REPORT.md, ${workdir}/findings/EVIDENCE.md, ${workdir}/fixes/INDEX.md. Don't dump report contents into chat.
Consuming fixes/ with another agent
The per-finding fix files are self-contained. To apply fixes in a different session, user can say:
"Read fixes/INDEX.md and apply the fixes one by one, running tests between each."
Each fix file has:
severity, title, location (URL/file), summary
patch — concrete code change (or pseudo-patch if the repo is not available)
verification — commands or HTTP probes that confirm the fix landed
Rules
- Never run load / stress tests here — route the user to
loadtest instead. A burst of 100 requests in a tight loop is load testing, not probing.
- Redact every human name, email, phone, and telegram handle by default before writing to
REPORT.md or EVIDENCE.md. Even if a name appears in the target's own public listing (e.g., the owner's name in their own member directory), redact. The only exception is a name explicitly named by the user as «OK to keep»: «you can keep Aleksey's name» — otherwise mask to <redacted-name>, <redacted-email>, <redacted-uuid>. Default wins; opt-out is per-name.
- Never write the raw auth artifact to any file outside
secrets.txt. Never paste it in chat.
- Never exploit a finding past proof-of-access. If you prove
GET /api/admin/* returns 200, stop — don't iterate through the list.
- Every mutation (L2+) must be labeled in EVIDENCE.md with (a) endpoint, (b) body sent, (c) object affected, (d) reversibility note.
- Never escalate levels without a fresh user confirmation in the current turn. If the user invoked L1 and mid-run you find something that looks «L2-interesting», record it as an L1 finding with the single-request PoC and a note «L2 probe needed to confirm». Do not escalate on your own initiative even when the next probe would obviously land.
- Stop and ask the user before running L2 on any endpoint marked «mutation» if it looks like it touches billing/payment/external service integration.
- Never use the Claude-only
AskUserQuestion, TeamCreate, TaskCreate APIs — this skill runs in both Claude Code and Codex.
Stack-specific references
Load only when the fingerprint from Phase 2 matches:
| Stack |
Reference |
When |
| Telegram mini app |
${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/telegram-miniapp.md |
initData / HMAC / Ed25519 / replay / TTL / self-referral / referral fraud |
| Next.js on Vercel |
${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/nextjs-vercel.md |
chunks, source maps, env exposure, /api/* conventions, edge vs serverless, x-vercel-* headers |
| Supabase backend |
${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/supabase.md |
anon key, RLS, storage buckets, PostgREST |
| Any web app |
${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/checklist-generic.md |
headers, well-known paths, CORS, method confusion |
Templates:
| File |
Purpose |
references/levels.md |
Definitions of L0-L3 with examples of what's in/out of scope |
references/report-template.md |
REPORT.md skeleton with severity table + section order |
references/evidence-template.md |
EVIDENCE.md skeleton with per-finding sections |
references/fix-template.md |
Single fix file template for coding agents |
1---2name: pentest3description: Outside-in black-box security audit of a running web application. Use when the user asks to check a web app / Telegram mini app for vulnerabilities, find security issues, audit an app from the outside, do a pentest / security review of a deployed app. Keywords: pentest, проверь на уязвимости, security audit, найди дыры, vulnerability scan, mini app audit, Telegram mini app, vercel app security, Next.js security, Supabase RLS check. Produces a human-readable report, an evidence log, and per-finding fix files that a coding agent can consume. Four aggression levels L0-L3. NOT for load testing (use loadtest instead) and NOT for hardening the user's own server (use security-hardening instead).4---56# Pentest78Black-box security audit of a running web application, from the outside, via HTTP.910**Default language:** match the user's request language (Russian or English). Pass `--lang ru|en` to override. Reports live in `{cwd}/pentest-output/{target-slug}-{YYYY-MM-DD}/`.1112**Assumption:** the user has authorization from the target's owner. Do not ask for legalese — trust the user. But never run this skill against a target the user hasn't explicitly named.1314---1516## Workflow1718### Phase 0 — Scope1920Before touching the target, confirm:2122- **Target URL** — full `https://…` URL of the deployed app (the mini app entry URL, not `t.me/...`).23- **Aggression level** — default `L1`. Let the user override:24 - `L0` passive: public metadata only, zero probes of the app itself25 - `L1` safe (default): single-request probes, read-only, no mutations26 - `L2` authorized: mutations on the auditor's own test account (profile updates, intros, etc.)27 - `L3` destructive: real injection payloads, cross-tenant access attempts, rate-limit probing *without* load testing28- **Target type hint** — `telegram-miniapp` | `nextjs-vercel` | `supabase` | `generic`. Auto-detect from headers if not provided.29- **Language** — `ru` or `en` (default: match user's language).30- **Credentials needed?** — if the target needs auth to explore (most apps do), ask the user to paste the auth artifact once:31 - Telegram mini apps: the launch URL fragment (`https://…/#tgWebAppData=…`) captured from DevTools when the app opens32 - Cookie-based apps: a session cookie or token from the user's logged-in session33 - Store it in `secrets.txt` under the workspace, add `.gitignore` to exclude it34 - **Never** include the raw auth artifact in any report file.3536### Phase 1 — Workspace3738```bash39slug=$(echo "<target host>" | tr -cd 'a-z0-9-')40day=$(date +%Y-%m-%d)41workdir="${PWD}/pentest-output/${slug}-${day}"42mkdir -p "${workdir}"/{recon,bundle,scripts,findings,fixes}43echo 'secrets.txt44*.local.*45cookies.txt' > "${workdir}/.gitignore"46```4748Write `${workdir}/README.md` with: target URL, scope, level, language, start time, operator.4950### Phase 2 — Recon (L0 — always run)5152Read `${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/checklist-generic.md` for the full command list. Minimum:53541. DNS (`A`, `AAAA`, `CNAME`, `NS`) and provider fingerprint552. `curl -D headers_root.txt -o body_root.html <target>` — save headers + body563. Probe well-known paths: `robots.txt`, `sitemap.xml`, `/.well-known/security.txt`, `favicon.ico`, `manifest.json`574. Grep the root HTML for asset references → full JS/CSS chunk inventory585. Extract `og:*` meta, `<script src>`, `<link href>`, any inline data596. Check security headers on both root and sample API endpoint: HSTS, CSP, X-Frame-Options, X-Content-Type-Options, Referrer-Policy, CORS6061Fingerprint the stack from response headers:6263- `server: Vercel` + `x-matched-path` + `x-nextjs-*` → Next.js on Vercel → load `references/nextjs-vercel.md`64- URLs like `…supabase.co` → Supabase backend → load `references/supabase.md`65- `https://telegram.org/js/telegram-web-app.js` or `tgWebAppData` fragment → Telegram mini app → load `references/telegram-miniapp.md`6667Apply stack-specific reference only when fingerprint matches. Don't read all references upfront.6869### Phase 3 — Bundle analysis7071Download all JS chunks referenced from the root HTML to `bundle/`. For each:7273```bash74for f in bundle/*.js; do75 curl -sS -o "$f.map" "https://<host>/path/to/$(basename $f).map?<dpl>"76 [ -s "$f.map" ] && echo "source map exposed: $f"77done78```7980Grep the bundle for:8182- API routes: `/api/[^"]+`83- `fetch(` / `axios(` call sites84- Absolute URLs of third-party services85- Secrets patterns: `eyJ[a-zA-Z0-9_-]{40,}`, `sk_[a-z]+_[a-zA-Z0-9]{20,}`, `NEXT_PUBLIC_[A-Z_]+`, `SUPABASE_[A-Z_]*`, `api_key`, `service_role`86- Auth header name (`Authorization`, `x-telegram-init-data`, `X-Api-Key`, etc.) and how it's injected87- `/directory/${...}`, `/profile/${...}` — templated app-level routes8889Save the full inventory to `recon/api-inventory.md` — this becomes the map for Phase 4.9091**Client wiring audit.** Once the auth header is identified (say `x-telegram-init-data`), grep for `fetch(` calls that hit `/api/` endpoints but do NOT go through the app's auth wrapper (typically `apiFetch` or similar). Example: a `fetch("/api/referrals/attribute", {method:"POST", ...})` with no `x-telegram-init-data` header, while the server demands it, means the feature is functionally broken on the client. That's a reportable bug (info severity, «broken feature») even if it's not a security vulnerability. Flag these:9293```bash94# find raw fetch() calls to /api95grep -hoE 'fetch\([^)]{0,300}/api/[^)]{0,300}\)' bundle/*.js | head -2096# compare: which ones go through apiFetch (auth wrapper)?97grep -hoE 'apiFetch\([^)]{0,300}\)' bundle/*.js | head -2098```99100If a route appears in plain `fetch(` but is also listed as requiring auth in your Phase 4 map, note «client-wiring mismatch: server requires auth, client sends none — feature broken».101102### Phase 4 — Endpoint probing (L1 default)103104For every `/api/*` endpoint found:1051061. **Unauthenticated GET** — record status code, size, body preview1072. **Authenticated GET** (with user's auth artifact) — record the same1083. Compare: endpoints that return 200 unauth AND contain PII are privacy leaks109110Then for any auth/login endpoint (`/api/auth/*`, `/api/session`, etc.):111112- Empty body → expected 400, flag 500 as an input-validation bug113- Missing credentials → expected 401114- Bad credentials → expected 401115- Credentials with tampered fields but valid signature → expected 401 (this tests the signature actually covers the tampered field)116117If stack = `telegram-miniapp`, run the full auth test matrix from `references/telegram-miniapp.md` (empty initData, no hash, fake hash, tampered user_id, stale auth_date replay).118119### Phase 5 — Authorization / IDOR (L1 default)120121Collect any IDs visible in Phase 4 responses (userId, memberId, eventId, intro_id, etc.) and try:122123- `GET /api/members/{otherUserId}` with your own auth — do you see their data? Expected: 200 (if public) or 404/403 (if protected)124- `GET /api/{thing}?userId={otherUserId}` — does the filter actually filter? Or is it silently ignored?125- `GET /api/{thing}?limit=999999`, `?limit=-1`, `?offset=abc` — input validation smoke. Note 500s as bugs.126- `?role=admin`, `?membershipStatus=banned` — does passing a privilege filter return different data?127- Path confusion: `/api/{thing}/..%2F..%2Fetc%2Fpasswd`, `/api/{thing}/%00.json`128129**Do not** fetch another real user's sensitive data past proof-of-access. Stop at the first 200 that proves the vulnerability and record just the structure of the response, not the content. Redact names/emails/ids of real users in the report.130131### Phase 6 — L2 (mutations on own account, only if user asked for L2)132133On the auditor's own test account:134135- `POST` endpoints: profile update, intro send, referral attribute, upload136- Test: server-side validation vs client-side. Can you send fields not shown in the client form?137- Test: are reserved/internal fields accepted? (`is_admin`, `role`, `membership_status`, `credits`, `tier`)138- Test: can you change another user's resource by sending their ID in the body? (IDOR on mutations)139- Test: file upload — MIME sniffing, path traversal in filename, SVG-with-script upload, oversize file140141Always label each mutation request in `EVIDENCE.md` with what it did and which object it touched, so it's easy to clean up afterward.142143### Phase 7 — L3 (destructive, only if user asked for L3)144145- SQL/NoSQL injection payloads (`' OR 1=1--`, `'; DROP --`, `{"$ne": null}`) on fields that hit the DB146- SSRF via URL parameters (`url=http://169.254.169.254/latest/meta-data/`)147- XSS in stored fields (`<script>alert(1)</script>`, `javascript:alert(1)` in avatarUrl) — check where it reflects148- Prototype pollution via JSON body (`{"__proto__":{"isAdmin":true}}`)149- Cross-tenant: attempt to read/modify a non-test user's data. **Stop at proof-of-access, don't exfiltrate.**150151Single requests only. **No load / brute-force / enumeration loops.** If a finding needs automation to be proven, write it up as a theoretical finding with the single-request PoC and note the limitation.152153### Phase 8 — Generate deliverables154155Three artifacts, two locations:156157- `${workdir}/findings/REPORT.md` — human-readable, for the target's owner. Use `references/report-template.md` as the skeleton. Order findings by severity descending. Each finding has: description, why it matters, PoC steps, recommended fix (with code snippet). End with "What works well ✅" and "What I didn't test" sections.158- `${workdir}/findings/EVIDENCE.md` — raw request/response log, one section per finding. Use `references/evidence-template.md`. Redact real user PII. Keep auth artifacts out (they're in `secrets.txt`, .gitignored).159- `${workdir}/fixes/` (sibling of `findings/`, NOT nested) — machine-actionable per-finding fix plan, designed to be consumed by another coding agent:160 - `${workdir}/fixes/INDEX.md` — markdown table of all fixes sorted by priority with a one-line summary each161 - `${workdir}/fixes/NN-slug.md` — one file per finding, two-digit priority prefix (e.g. `01-auth-date-ttl.md`, `02-public-member-list.md`)162 - Template: `references/fix-template.md`163164After writing, print the three absolute paths in chat: `${workdir}/findings/REPORT.md`, `${workdir}/findings/EVIDENCE.md`, `${workdir}/fixes/INDEX.md`. Don't dump report contents into chat.165166---167168## Consuming `fixes/` with another agent169170The per-finding fix files are self-contained. To apply fixes in a different session, user can say:171172> "Read `fixes/INDEX.md` and apply the fixes one by one, running tests between each."173174Each fix file has:175176- `severity`, `title`, `location` (URL/file), `summary`177- `patch` — concrete code change (or pseudo-patch if the repo is not available)178- `verification` — commands or HTTP probes that confirm the fix landed179180---181182## Rules1831841. **Never** run load / stress tests here — route the user to `loadtest` instead. A burst of 100 requests in a tight loop is load testing, not probing.1852. **Redact every human name, email, phone, and telegram handle by default** before writing to `REPORT.md` or `EVIDENCE.md`. Even if a name appears in the target's own public listing (e.g., the owner's name in their own member directory), redact. The only exception is a name explicitly named by the user as «OK to keep»: «you can keep Aleksey's name» — otherwise mask to `<redacted-name>`, `<redacted-email>`, `<redacted-uuid>`. Default wins; opt-out is per-name.1863. **Never** write the raw auth artifact to any file outside `secrets.txt`. Never paste it in chat.1874. **Never** exploit a finding past proof-of-access. If you prove `GET /api/admin/*` returns 200, stop — don't iterate through the list.1885. **Every** mutation (L2+) must be labeled in EVIDENCE.md with (a) endpoint, (b) body sent, (c) object affected, (d) reversibility note.1896. **Never escalate levels without a fresh user confirmation in the current turn.** If the user invoked L1 and mid-run you find something that looks «L2-interesting», record it as an L1 finding with the single-request PoC and a note «L2 probe needed to confirm». Do **not** escalate on your own initiative even when the next probe would obviously land.1907. **Stop and ask** the user before running L2 on any endpoint marked «mutation» if it looks like it touches billing/payment/external service integration.1918. **Never** use the Claude-only `AskUserQuestion`, `TeamCreate`, `TaskCreate` APIs — this skill runs in both Claude Code and Codex.192193---194195## Stack-specific references196197Load only when the fingerprint from Phase 2 matches:198199| Stack | Reference | When |200|-------|-----------|------|201| Telegram mini app | `${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/telegram-miniapp.md` | initData / HMAC / Ed25519 / replay / TTL / self-referral / referral fraud |202| Next.js on Vercel | `${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/nextjs-vercel.md` | chunks, source maps, env exposure, `/api/*` conventions, edge vs serverless, x-vercel-* headers |203| Supabase backend | `${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/supabase.md` | anon key, RLS, storage buckets, PostgREST |204| Any web app | `${CLAUDE_PLUGIN_ROOT:-.}/skills/pentest/references/checklist-generic.md` | headers, well-known paths, CORS, method confusion |205206Templates:207208| File | Purpose |209|------|---------|210| `references/levels.md` | Definitions of L0-L3 with examples of what's in/out of scope |211| `references/report-template.md` | REPORT.md skeleton with severity table + section order |212| `references/evidence-template.md` | EVIDENCE.md skeleton with per-finding sections |213| `references/fix-template.md` | Single fix file template for coding agents |