/finding-discipline
Use when about to record, claim, rate the severity of, or report any security finding — before marking anything [CONFIRMED] or writing it into the report
$ npx -y skills add hypnguyen1209/offensive-claude --skill finding-discipline --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
- Fires itselfAuto-invocation. Claude auto-loads it when your prompt matches the work.Auto-invocation is when the right skill fires by itself at the right moment, driven by a FLOW.md router and a hook, instead of you invoking it by name. It is the difference between a skill being installed and a skill actually getting used.Read the full definition →
- You can call itInvoke it directly when you want it.
- Slash command
/finding-discipline
Context preview
The summary Claude sees to decide when to auto-load this skill.
Use when about to record, claim, rate the severity of, or report any security finding — before marking anything [CONFIRMED] or writing it into the report
SKILL.md
finding-discipline.SKILL.mdname: finding-discipline
description: Use when about to record, claim, rate the severity of, or report any security finding — before marking anything [CONFIRMED] or writing it into the report
Finding Discipline
Overview
**The Iron Law: No `[CONFIRMED]` without proof.** A finding is a claim about real, demonstrated impact — not a status code, a reflected string, or a hunch. This is the offensive equivalent of test-driven development: the proof is the test, and the finding does not exist until it passes.
**Violating the letter of this rule is violating its spirit.**
The three tiers
- **`[CONFIRMED]`** — impact demonstrated AND grounded in an evidence artifact that exists on disk.
- **`[POSSIBLE]`** — reachable but the class proof bar is not yet met. Keep digging; do not report as real.
- **`[INFO]`** — true but no security impact at the claimed severity.
The proof bar (per class)
A status code is not impact. See `skills/references/finding-evidence-standards.md`: SSRF needs the internal response; IDOR needs *another principal's* data; RCE needs command output; XSS needs script execution; open redirect needs an external destination.
Required mechanical gate
Before any finding is recorded or reported:
1. Set the structured proof signal and run `python skills/vulnerability-analysis/scripts/validate_findings.py --findings f.json --evidence ./evidence` — it rejects ungrounded findings and per-class false positives. 2. Pass it through the **REQUIRED** `finding-validator` agent (PASS / KILL / DOWNGRADE). 3. Only a `[CONFIRMED]` survivor goes in the report. Severity must match what was demonstrated (CVSS honest).
See `skills/references/finding-validation-runtime.md` for the 7-question gate.
Read-first, never name-guess
If a function calls another, **read the callee** — do not infer what it does from its name. `sanitize()`, `is_safe()`, `validate_input()` are exactly where vulnerabilities hide; a name is a claim by the author, not evidence. The same applies to a config key, a decorator, or a CVE title: open the thing before you reason about it. An unread dependency in a data-flow claim is a hole.
Quote-grounded confidence tiers
Every claim in a finding carries a confidence grounded in *what you can quote*, not in how it feels:
- **High** — a **direct quote** from the artifact (the exact source line, the response body, the
decompiled instruction) supports the claim.
- **Medium** — an **explicitly stated assumption** bridges a gap you could not directly observe.
State the assumption; do not hide it.
- **Low** — an **inference** you are flagging as unverified. Acceptable to record, never to report as
fact.
This is orthogonal to the `[CONFIRMED]/[POSSIBLE]/[INFO]` tier (which is about *impact*); confidence is about *how well-grounded the claim is*. A High-confidence claim of a Low-impact bug is still Low.
Red Flags — STOP, downgrade to `[POSSIBLE]`
- "I'm sure it's exploitable" (but haven't shown impact)
- "The payload reflected, so it's XSS" / "I got a 200, so it works"
- "The DNS callback fired" (SSRF with no internal response)
- "I changed the id and got data" (but it was my own — self-IDOR)
- "It probably works on a real target" (default-deployment unproven)
**All of these mean: it is `[POSSIBLE]`, not `[CONFIRMED]`. Get the evidence.**
Rationalizations
| Excuse | Reality | |--------|---------| | "Pattern-matched, clearly vulnerable" | Pattern ≠ exploit. Demonstrate impact or it's POSSIBLE. | | "I'll attach evidence later" | No artifact on disk = ungrounded = REJECTED now. | | "Blind RCE counts" | No output / no OOB confirmation = POSSIBLE, not CONFIRMED. | | "Severity is obviously Critical" | CVSS must reflect demonstrated impact, not the worst case. | | "The validator is overkill here" | Untested findings are how false positives ship. Run it. | | "The function is called `sanitize`, so it's safe" | A name is the author's claim, not proof. Read the callee. | | "The solver timed out, so it's not exploitable" | A tool limit is `feasibility:null` (manual), never `false`. |
A short list of CONFIRMED findings beats a long list of POSSIBLEs. Killing a false positive is success.
Read more
name: finding-discipline description: Use when about to record, claim, rate the severity of, or report any security finding — before marking anything [CONFIRMED] or writing it into the report
Finding Discipline
Overview
**The Iron Law: No `[CONFIRMED]` without proof.** A finding is a claim about real, demonstrated impact — not a status code, a reflected string, or a hunch. This is the offensive equivalent of test-driven development: the proof is the test, and the finding does not exist until it passes.
**Violating the letter of this rule is violating its spirit.**
The three tiers
- **`[CONFIRMED]`** — impact demonstrated AND grounded in an evidence artifact that exists on disk.
- **`[POSSIBLE]`** — reachable but the class proof bar is not yet met. Keep digging; do not report as real.
- **`[INFO]`** — true but no security impact at the claimed severity.
The proof bar (per class)
A status code is not impact. See `skills/references/finding-evidence-standards.md`: SSRF needs the internal response; IDOR needs *another principal's* data; RCE needs command output; XSS needs script execution; open redirect needs an external destination.
Required mechanical gate
Before any finding is recorded or reported:
1. Set the structured proof signal and run `python skills/vulnerability-analysis/scripts/validate_findings.py --findings f.json --evidence ./evidence` — it rejects ungrounded findings and per-class false positives. 2. Pass it through the **REQUIRED** `finding-validator` agent (PASS / KILL / DOWNGRADE). 3. Only a `[CONFIRMED]` survivor goes in the report. Severity must match what was demonstrated (CVSS honest).
See `skills/references/finding-validation-runtime.md` for the 7-question gate.
Read-first, never name-guess
If a function calls another, **read the callee** — do not infer what it does from its name. `sanitize()`, `is_safe()`, `validate_input()` are exactly where vulnerabilities hide; a name is a claim by the author, not evidence. The same applies to a config key, a decorator, or a CVE title: open the thing before you reason about it. An unread dependency in a data-flow claim is a hole.
Quote-grounded confidence tiers
Every claim in a finding carries a confidence grounded in *what you can quote*, not in how it feels:
- **High** — a **direct quote** from the artifact (the exact source line, the response body, the
decompiled instruction) supports the claim.
- **Medium** — an **explicitly stated assumption** bridges a gap you could not directly observe.
State the assumption; do not hide it.
- **Low** — an **inference** you are flagging as unverified. Acceptable to record, never to report as
fact.
This is orthogonal to the `[CONFIRMED]/[POSSIBLE]/[INFO]` tier (which is about *impact*); confidence is about *how well-grounded the claim is*. A High-confidence claim of a Low-impact bug is still Low.
Red Flags — STOP, downgrade to `[POSSIBLE]`
- "I'm sure it's exploitable" (but haven't shown impact)
- "The payload reflected, so it's XSS" / "I got a 200, so it works"
- "The DNS callback fired" (SSRF with no internal response)
- "I changed the id and got data" (but it was my own — self-IDOR)
- "It probably works on a real target" (default-deployment unproven)
**All of these mean: it is `[POSSIBLE]`, not `[CONFIRMED]`. Get the evidence.**
Rationalizations
| Excuse | Reality | |--------|---------| | "Pattern-matched, clearly vulnerable" | Pattern ≠ exploit. Demonstrate impact or it's POSSIBLE. | | "I'll attach evidence later" | No artifact on disk = ungrounded = REJECTED now. | | "Blind RCE counts" | No output / no OOB confirmation = POSSIBLE, not CONFIRMED. | | "Severity is obviously Critical" | CVSS must reflect demonstrated impact, not the worst case. | | "The validator is overkill here" | Untested findings are how false positives ship. Run it. | | "The function is called `sanitize`, so it's safe" | A name is the author's claim, not proof. Read the callee. | | "The solver timed out, so it's not exploitable" | A tool limit is `feasibility:null` (manual), never `false`. |
A short list of CONFIRMED findings beats a long list of POSSIBLEs. Killing a false positive is success.
A spec-driven offensive security framework for Claude Code — structured engagement workflows based on the Cyber Kill Chain, 31 kill-chain skills (multi-file progressive-disclosure) plus a discipline layer (a SessionStart dispatcher + 6 process/discipline
Repo: hypnguyen1209/offensive-claude
Other skills on offensive-claude.
- /active-directory-attack
Use when attacking a Windows Active Directory domain — Kerberos roasting/delegation, coercion + NTLM/Kerberos relay (CVE-2025-33073), ADCS ESC1-16 (EKUwu), ticket forgery & DCSync, dMSA BadSuccessor (CVE-2025-53779), BloodHound attack-path enumeration, domain dominance
Open skill - /advanced-redteam
--- name: advanced-redteam-ops description: Use when designing C2 infrastructure or OPSEC for a long-haul red-team op — redirectors, malleable profiles, tiered/segregated infra, living-off-the-land, data exfiltration metadata: type: offensive phase: operations kill_chain: phase:
Open skill - /ai-agent-redteam
Use when red-teaming an agentic AI / LLM application — indirect & zero-click prompt injection, MCP tool poisoning, persistent memory poisoning, excessive-agency tool abuse, multi-turn jailbreaks, PyRIT/Garak/Promptfoo harnesses
Open skill - /ai-security
Use when attacking an AI/ML system or model — prompt injection & jailbreaks (Crescendo, Skeleton Key, Best-of-N), RAG/vector poisoning, agentic/MCP exploitation (CVE-2025-54136), ML supply-chain RCE (pickle CVE-2025-32434), model extraction / membership inference / adversarial
Open skill - /browser-exploitation
Use when building a client-side browser exploit — V8/JSC JIT type confusion to renderer R/W, V8 heap-sandbox escape, renderer-to-browser sandbox escape (Mojo IPC, GPU/Dawn/ANGLE), Electron/webview IPC abuse, 1-click RCE chains
Open skill - /cicd-supply-chain
Use when attacking or auditing a CI/CD pipeline or software supply chain — pwn requests, poisoned pipeline execution, compromised/mutable-tag actions, dependency confusion, registry worms, runner backdoors, OIDC trust abuse, SLSA/provenance
Open skill

