Clusterfuzzlite
InternationalColorConsortium/iccDEV
Build, test, or update the iccDEV ClusterFuzzLite libFuzzer integration across ASan, UBSan, and MSan.
Reference vocabulary for designing instrumented harnesses that drive vulnerability discovery — design classes (trigger-driven vs coverage-driven), tiered scope (T1 isolated function / T2…
$ npx skills add provos/ironcurtain --skill harness-design-fuzzing -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install provos/ironcurtain harness-design-fuzzing --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/provos/ironcurtain.git skills-src && mkdir -p .claude/skills && cp -r skills-src/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing .claude/skills/harness-design-fuzzing && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "harness-design-fuzzing" agent skill from https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing into .claude/skills/harness-design-fuzzing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "harness-design-fuzzing", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzingType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add provos/ironcurtain --skill harness-design-fuzzing -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install provos/ironcurtain harness-design-fuzzing --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/provos/ironcurtain.git skills-src && mkdir -p .agents/skills && cp -r skills-src/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing .agents/skills/harness-design-fuzzing && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "harness-design-fuzzing" agent skill from https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing into .agents/skills/harness-design-fuzzing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "harness-design-fuzzing", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add provos/ironcurtain --skill harness-design-fuzzing -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install provos/ironcurtain harness-design-fuzzing --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/provos/ironcurtain.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing .cursor/skills/harness-design-fuzzing && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "harness-design-fuzzing" agent skill from https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing into .cursor/skills/harness-design-fuzzing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "harness-design-fuzzing", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/provos/ironcurtain.git --path src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add provos/ironcurtain --skill harness-design-fuzzing -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install provos/ironcurtain harness-design-fuzzing --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/provos/ironcurtain.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing .gemini/skills/harness-design-fuzzing && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "harness-design-fuzzing" agent skill from https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing into .gemini/skills/harness-design-fuzzing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "harness-design-fuzzing", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install provos/ironcurtain harness-design-fuzzingInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add provos/ironcurtain --skill harness-design-fuzzing -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/provos/ironcurtain.git skills-src && mkdir -p .github/skills && cp -r skills-src/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing .github/skills/harness-design-fuzzing && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "harness-design-fuzzing" agent skill from https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing into .github/skills/harness-design-fuzzing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "harness-design-fuzzing", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add provos/ironcurtain --skill harness-design-fuzzing -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install provos/ironcurtain harness-design-fuzzing --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/provos/ironcurtain.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing .opencode/skills/harness-design-fuzzing && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "harness-design-fuzzing" agent skill from https://github.com/provos/ironcurtain/tree/master/src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing into .opencode/skills/harness-design-fuzzing/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "harness-design-fuzzing", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
harness-design-fuzzingReference vocabulary for designing instrumented harnesses that drive vulnerability discovery — design classes (trigger-driven vs coverage-driven), tiered scope (T1 isolated function / T2…
Harness Design Fuzzing is an agent skill from provos/ironcurtain. Reference vocabulary for designing instrumented harnesses that drive vulnerability discovery — design classes (trigger-driven vs coverage-driven), tiered scope (T1 isolated function / T2 multi-component / T3 full build), systematic input exploration, the two-coverage distinction (fuzzer-feedback vs audit), existing-fuzzer selection (libFuzzer / AFL++ / Jazzer / atheris / go test -fuzz), seed-corpus discipline, diagnostic checkpoints, common pitfalls, and design-document scope. Read when designing or reviewing a…
Its SKILL.md is about 5.7k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.
It sits in Security, covering Fuzzing. It works with C++ and Model Context Protocol. The repository describes itself as: A secure runtime for autonomous AI agents. Policy from plain-English constitutions. (https://ironcurtain.dev). The licence is Apache-2.0.
2 steps, taken from the step headings in SKILL.md.
Read from SKILL.md and the folder at commit d51a346. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
gocargoFrom the folder's file list and the shell code blocks in SKILL.md.
No URLs in SKILL.md.
From URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Harness Design Fuzzing loads about 5.7k tokens when it runs. Until then it costs about 173 tokens; SKILL.md has 2,974 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from provos/ironcurtain at commit d51a346, republished under its Apache-2.0 licence (© provos). 2,974 words, ~5,664 tokens.
.claude/skills/harness-design-fuzzing/SKILL.md (or your agent's skills folder).Reference vocabulary for designing instrumented harnesses that drive vulnerability discovery. Catalogs the classes, scopes, instrumentation choices, and pitfalls a harness design needs to reason about.
A harness is not a unit test. The point of a harness is to systematically explore an input space against an oracle that fires on a violation — not to confirm a few hand-picked cases. Hand-picked scenarios miss boundary values; the boundary is where the bug lives.
Every harness has exactly one of two design classes. The class drives the sweep variables and the oracle. Tier (below) is orthogonal — any tier can be either class.
Trigger-driven. The directive supplies a falsifiable claim with a named violation site — a specific function, value range, and expected oracle (a bounds check fires, a type narrows lossily, a sentinel collides, a state-machine transition is reached out of order). The harness sweeps the hypothesis input variables. The oracle is the named violation pattern firing.
Coverage-driven. The directive supplies an under-exercised dispatch surface — a code region the project's existing fuzzers don't reach, with named dispatch axes (option flags, message types, opcode tables, mode bits, format variants) the input space hasn't crossed. The harness sweeps the dispatch axes. The oracle is any sanitizer error within the named region. The named region must be a concrete file/function set, not "somewhere in the target."
Pick coverage-driven when prior trigger-driven rounds against the same region have been mitigated by upstream guards but the region itself is untested by the existing fuzz infrastructure. Pick trigger-driven when there is a specific theory to falsify.
Three tiers of infrastructure scope. Match tier to hypothesis scope; never use Tier 1 for a cross-component target.
Extract the relevant function(s) into a standalone, self-contained program. Copy the exact types, macros, and helper functions verbatim from the source. Stub only I/O, networking, and allocation.
Critical: the test must faithfully preserve ALL code paths that interact with the violation site. If the hypothesis involves a value computed in function A being consumed in function B, BOTH functions must be included — do not test A in isolation and assume B's behavior.
Use Tier 1 when the hypothesis is about a single function: arithmetic boundary, type narrowing, off-by-one, a self-contained parsing routine. Runs millions of trials per second.
Link multiple real source files from the project. Preserve actual data structures, type definitions, inter-function calls, and state that accumulates across calls. Specify:
Use Tier 2 when the hypothesis involves cross-function interaction — a value computed in one function being consumed or compared in another, sentinel collisions across components, state accumulated across multiple call sites, or dispatch tables linked across compilation units.
Compile the actual project (or a substantial subset) with sanitizers and coverage. A driver feeds crafted input files, protocol messages, or CLI invocations through real entry points. Specify:
Use Tier 3 when the bug depends on initialization sequences, global state, runtime configuration, or protocol-level framing that can't be faithfully stubbed.
The harness must FUZZ, not unit-test. For each swept variable (hypothesis inputs for trigger-driven, dispatch axes for coverage-driven), the design must specify:
2^N - 1 for each relevant N, sign-flip points) plus sparse sampling elsewhere. When the variable feeds an allocation size through a product or other multi-term arithmetic, also sample values whose wrapped result is small but positive: these keep the consumer's loop/index bound large while the undersized allocation succeeds, whereas the value that wraps exactly to zero is usually intercepted by a separate zero-size guard. For coverage-driven dispatch axes, the range is the full set of dispatch values plus their realistic combinations.<file>:<line>, return value of the target function, sanitizer error, canary state, dispatch arm hit. Be specific by site.<file>:<line> evaluates true when the input value exceeds the buffer's allocated size." For coverage-driven: "any sanitizer error within the named code region" is acceptable, but the region must be concrete.The design specifies input variables and ranges. The implementer drives the sweep. Do NOT prescribe individual "Test A / Test B / Test C" scenarios with fixed values — that's unit testing and will miss the actual boundary.
Per-input cost bound. A coverage-guided fuzzer needs many iterations per second to work. The design must keep per-input cost bounded: cap input size (libFuzzer -max_len, AFL++ -G), and keep the fuzz entry point free of full re-initialization, process spawns, or multi-connection sweeps — move one-time setup behind a call_once / singleton. If an oracle genuinely needs a many-connection or many-iteration measurement (e.g. RSS amplification), that is a separate harness, not per-input work folded into the sweep.
A trigger-driven design may scope a single hypothesis or a related set when they share input space and code region. Bundle when consolidating doesn't dilute the sweep (e.g., three integer-overflow hypotheses on the same allocator → one harness). Keep separate when input distributions conflict (one wants huge dimensions, another wants small) or observation points differ enough that one harness can't see both.
When bundling, the sweep range is the union of input-variable ranges, the positive-finding condition is the disjunction of named violation patterns, and observables must cover all named sites. Briefly justify the bundling — bundled designs only pay off when the hypotheses share enough input space and code region that one harness can exercise them coherently. More than three hypotheses bundled in one harness is a signal of an unfocused design.
Fuzzing requires two instrumentation decisions that are easy to confuse. The design must address both.
Instrumentation the fuzzer consumes at runtime to guide mutation. Tool-specific, falls into three categories:
-fsanitize=fuzzer (which enables -fsanitize-coverage=trace-cmp by default), often combined with -fsanitize=address,undefined. Additional coverage knobs: trace-pc-guard, trace-cmp, trace-div, trace-gep.afl-clang-fast, afl-clang-lto (LTO mode, generally preferred when usable), or afl-gcc-fast.go test -fuzz.The design must name the exact mechanism AND the exact metric field name the validator will read from the fuzzer's status output. Without the metric name, downstream verification cannot gate on "the fuzzer's feedback chain reached the target." Canonical field names:
| Fuzzer | Field for "edges/blocks hit by feedback" |
|---|---|
| libFuzzer | cov: (also ft: for features) |
| AFL++ | edges_found |
| Jazzer | reports via libFuzzer (cov:) |
Go go test -fuzz | new interesting count |
| atheris | reports via libFuzzer (cov:) |
Post-run reporting of which lines executed: llvm-cov, gcov, Python coverage.py, JaCoCo, Go's -cover, and stack-equivalents. This is an audit tool, not a feedback signal. A harness can have audit coverage without fuzzer-feedback coverage — that is the forgot-to-instrument-the-target pitfall: the run reports lines hit in the wrapper but the fuzzer was driving randomly because no feedback signal reached it.
Fuzzer-feedback coverage MUST reach the target code, not just the harness wrapper. Name the unit (library, package, module, class) that must carry it. Prebuilt artifacts from elsewhere — system libraries, distribution wheels, .node files, pre-built binary crates — do NOT carry instrumentation retroactively. The design must call for the target to be rebuilt under the fuzzer-feedback toolchain, or a pre-instrumented artifact to be located. If the project's build cannot accommodate that, say so — it is a signal to switch tools.
Specify an alternative tool that uses a different instrumentation mechanism — not just a different frontend on the same one. A fallback on the same mechanism inherits the same failure mode. Canonical pairing: libFuzzer ↔ AFL++ (sanitizer-coverage vs. compile-wrapper). Cross-stack pairings (Jazzer ↔ Kelinci on JVM, atheris ↔ python-afl on Python) work the same way.
For large input spaces, structured inputs, or whenever coverage-guided exploration would outperform a hand-rolled loop, design the harness around an existing fuzzer rather than reinventing one. The build agent installs the tool; the design specifies WHICH tool, WHY, and the entry-point shape.
| Stack | Canonical fuzzer | Entry-point shape |
|---|---|---|
| C / C++ | libFuzzer (in-process) | extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) |
| C / C++ | AFL++ (out-of-process) | Standard main reading from stdin or a file path; coverage via compile wrap |
| JVM | Jazzer | static void fuzzerTestOneInput(byte[] data) or FuzzedDataProvider form |
| Python | atheris | atheris.Setup([...], TestOneInput) with def TestOneInput(data: bytes) |
| Go | go test -fuzz | func FuzzXxx(f *testing.F) { f.Fuzz(func(t *testing.T, ...) { ... }) } |
| Rust | cargo fuzz (libFuzzer) | `fuzz_target!( |
For small discrete spaces, bounded enumeration (a typed for loop) is fine — but the design must state the choice and why.
A coverage-guided fuzzer is only as good as its starting corpus. The corpus must reach the dispatch surface — otherwise feedback-driven mutation never explores the variants behind the dispatcher.
Every design must specify three verification steps that the implementer can execute before declaring the harness usable:
cov: > N covering the target unit, AFL++ edges_found > M attributable to the target). If not met, the feedback chain is broken — the fuzzer is mutating but no signal from the target reaches it.The harness MUST test against UNMODIFIED source code. Stripping a guard, weakening a check, or replacing a sanitizer-armed allocator with a permissive one tells you nothing about the production binary's behavior. If the hypothesized condition doesn't trigger within the swept range, document which code intercepts it and whether that code covers ALL relevant paths.
A Tier-1 harness with hardening stripped tells you nothing about production outcomes. Triage anchors on what the harness demonstrated under production-equivalent conditions.
Default the value-producing integer checks (overflow, shift, truncation) to recover / warn-only mode: aborting at the arithmetic site stops execution before any downstream undersized-allocation or out-of-bounds sink, masking the real impact and inviting a false "mitigated" verdict. Recover mode lets execution continue with the wrapped value (production behavior), so one run surfaces both the root-cause diagnostic and the sink.
Mitigation discipline applies at the link layer too. A harness that links against a project-internal stub of an upstream library produces evidence about the stub, not about production. Every stub the design introduces must be classified.
VALIDATE_INPUT to a no-op. The violation site may be reachable in the harness while in production the upstream library rejects the trigger before it lands.The design must enumerate every stub it introduces and classify each. Any Class B stub or Class C build-flag mismatch is a redesign trigger, not a tradeoff. If the violation site is unreachable through the real upstream library because the library's own validation pre-empts the trigger, the bug is a latent code smell — not an exploitable vulnerability — and the hypothesis should be re-evaluated rather than papered over with a permissive stub.
If integrating the real upstream library requires a higher tier than the design currently states, escalate the tier. Class B stubbing is not an acceptable shortcut to keep a Tier 1 design viable.
List every external dependency (sanitizer toolchain, fuzzer binary, coverage tool, decoder library, container image, kernel feature like KASAN, hypervisor mode) and what the design falls back to if any are unavailable. An assumption that goes unstated becomes a bug in the build phase.
cov: plateaus quickly; the target is barely exercised.for loop over rand(). Coverage-guided fuzzers exist because feedback-driven mutation finds boundary values that uniform random does not.A design IS a specification. A design IS NOT an implementation.
Include:
Exclude:
Test A / Test B / Test C scenarios with fixed valuesThe design is read by an implementer who must turn it into running code. Be concrete enough that they don't have to guess at the spec; abstract enough that they aren't transcribing your code. If the design's body could compile, it has drifted into implementation.
© provos, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
Just SKILL.md in src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing of provos/ironcurtain.
Open the folder on GitHubat commit d51a346
Harness Design Fuzzing next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Harness Design Fuzzing this skillprovos/ironcurtain | 612 | — | ~5.7k | Automated safety check: Pass | Apache-2.0 | |
| ClusterfuzzliteInternationalColorConsortium/iccDEV | 183 | — | ~1.5k | Automated safety check: Pass | BSD-3-Clause | |
| Fuzzing Harness Designtrailofbits/skills | 7.5k | 1 repos | ~5.3k | Automated safety check: Pass | CC-BY-SA-4.0 | |
| Fuzzing Obstacle Patchertrailofbits/skills | 7.5k | — | ~4k | Automated safety check: Pass | CC-BY-SA-4.0 | |
| Aflpptrailofbits/skills | 7.5k | — | ~5.6k | Automated safety check: Pass | CC-BY-SA-4.0 | |
| Libfuzzertrailofbits/skills | 7.5k | — | ~6.1k | Automated safety check: Pass | CC-BY-SA-4.0 |
InternationalColorConsortium/iccDEV
Build, test, or update the iccDEV ClusterFuzzLite libFuzzer integration across ASan, UBSan, and MSan.
trailofbits/skills
Guides writing and improving fuzzing harnesses for C, C++ and Rust so random byte input gets translated into structured, reproducible test cases for the target code.
trailofbits/skills
Patches checksums, hash checks, time-based seeds and other non-deterministic state out of fuzzing builds so the fuzzer reaches deeper code, with production behavior intact.
trailofbits/skills
Sets up and runs AFL++ for multi-core fuzzing of C/C++ projects built with afl-clang-fast or afl-gcc-fast.
trailofbits/skills
Sets up and runs libFuzzer, the coverage-guided fuzzer built into LLVM, on C/C++ code that compiles with Clang.
nwjs/chromium.src
Implements, registers, and verifies fuzz tests in Chromium. An agent skill from nwjs/chromium.src.
provos/ironcurtain
Markdown formatting conventions for email summary documents — heading depth, list style, line length, emoji policy, and a mandatory provenance footer.
provos/ironcurtain
Reference for Gmail's search query syntax — operators like is:sent, newerthan:, from:, has:attachment, label:, and how they compose.
provos/ironcurtain
Canonical shape of the .workflow/emails/emails.json file passed between the fetch and summarize states — required fields (sender, recipient, subject, date, body), types, and field semantics.
provos/ironcurtain
Tone and length conventions for email summaries — voice, verb tense, what to include vs omit, and target sentence count.
provos/ironcurtain
Reference vocabulary for memory-safety vulnerabilities in native C/C++ code — bug-class taxonomy, common arithmetic patterns that lead to corruption, dispatch-family discipline, type-confusion…
provos/ironcurtain
Reference vocabulary for interpreting vulnerability findings — detector-vs-impact distinction, severity anchoring on demonstrated evidence, the eleven-item interpretation rubric, delegation…
Works with
Categories
Reference vocabulary for designing instrumented harnesses that drive vulnerability discovery — design classes (trigger-driven vs coverage-driven), tiered scope (T1 isolated function / T2…. Harness Design Fuzzing is an agent skill from provos/ironcurtain. Reference vocabulary for designing instrumented harnesses that drive vulnerability discovery — design classes (trigger-driven vs coverage-driven), tiered scope (T1 isolated function / T2 multi-component / T3 full build), systematic input exploration, the two-coverage distinction (fuzzer-feedback vs audit), existing-fuzzer selection (libFuzzer / AFL++ / Jazzer / atheris / go test -fuzz), seed-corpus discipline, diagnostic checkpoints, common pitfalls, and design-document scope.
Harness Design Fuzzing fits situations like: tasks that involve Fuzzing.
Run `npx skills add provos/ironcurtain --skill harness-design-fuzzing -a claude-code`. Or copy the skill folder (src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing in provos/ironcurtain) into .claude/skills/harness-design-fuzzing in your project. Claude Code loads it when a task matches its description.
Run `npx skills add provos/ironcurtain --skill harness-design-fuzzing -a codex`. Or copy the skill folder (src/workflow/workflows/vuln-discovery/skills/harness-design-fuzzing in provos/ironcurtain) into .agents/skills/harness-design-fuzzing in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add provos/ironcurtain --skill harness-design-fuzzing -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/harness-design-fuzzing, .gemini/skills/harness-design-fuzzing, .github/skills/harness-design-fuzzing and .opencode/skills/harness-design-fuzzing in your project.
Going by SKILL.md and its folder, Harness Design Fuzzing needs the command-line tools its instructions call (go and cargo). Our summary lists: Python 3.
SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Harness Design Fuzzing is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 5.7k tokens (SKILL.md is roughly 23k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Harness Design Fuzzing: Clusterfuzzlite (InternationalColorConsortium/iccDEV, 183 stars), Fuzzing Harness Design (trailofbits/skills, 7.5k stars), Fuzzing Obstacle Patcher (trailofbits/skills, 7.5k stars) and Aflpp (trailofbits/skills, 7.5k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
provos (a GitHub user) maintains it in provos/ironcurtain, which has 612 GitHub stars. The repository holds 7 skills in this directory. The repository was last updated on October 7, 2026.
Source: provos/ironcurtain on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.