Testing Handbook Skill Generator Generate and maintain Claude Code skills from the Trail of Bits Testing Handbook. When to Use Invoke this skill when: - Creating new security testing skills from handbook content - User mentions "testing handbook", "appsec.guide", or asks about generating skills - Bulk skill generation or refresh is needed Do NOT use for: - General security testing questions (use the generated skills) - Non-handbook skill creation Handbook Location The skill needs the Testing Handbook repository. See discovery.md for full details. Quick reference: Check , , → ask user → clone…

&& echo \"Name: OK\" || echo \"Name: INVALID\"\n\n# Validate description length\nDESC=$(yq '.description' \"$SKILL\")\n[ ${#DESC} -le 1024 ] && [ ${#DESC} -gt 0 ] && echo \"Description: OK\" || echo \"Description: INVALID\"\n```\n\n**Required fields:**\n| Field | Requirement | Validation |\n|-------|-------------|------------|\n| `name` | Present, lowercase, max 64 chars | Pattern: `^[a-z0-9-]{1,64} testing-handbook-generator — Skillopedia |\n| `type` | Recommended, one of: tool, fuzzer, technique, domain | Determines required sections |\n| `description` | Present, non-empty, max 1024 chars | Length: 1-1024 chars |\n\n**Validation rules:**\n- No XML/HTML tags in name or description (pattern: `\u003c[^>]+>`)\n- No reserved words (\"anthropic\", \"claude\") in name\n- `type` field ensures correct section validation (if missing, type is inferred from content)\n- Description leads with what the skill does for the reader, not a definition of the tool,\n names the concrete commands, flags, and API symbols it covers, and closes with two or\n more situations in the words a user would type. \"Coverage-guided fuzzer built into LLVM.\n Use for fuzzing C/C++ code\" has a what and a when and still routes to nothing — see\n \"Description quality\" in `agent-prompt.md` for the bar.\n- No Hugo shortcodes in frontmatter (pattern: `\\{\\{[\u003c%]`)\n\n**Trigger phrase validation:**\n\nThe description MUST include a trigger phrase (\"Use when\" or \"Use for\"):\n\n```bash\n# Check for trigger phrase in description\nDESC=$(yq '.description' \"$SKILL\")\necho \"$DESC\" | grep -qE 'Use when|Use for' && echo \"Trigger: OK\" || echo \"Trigger: MISSING\"\n```\n\n### 2. Required Sections\n\n**Check:** Skill contains essential sections\n\n| Section | Required | Purpose |\n|---------|----------|---------|\n| `# Title` | Yes | Main heading |\n| `## When to Use` | Yes | Trigger conditions |\n| `## Quick Reference` or `## Quick Start` | Yes | Fast access to key info |\n| Core workflow/content sections | Yes | Main skill content |\n| `## Resources` | If handbook has resources | External links |\n\n**Template-specific required sections:**\n\n| Skill Type | Required Sections |\n|------------|-------------------|\n| Tool | When to Use, Quick Reference, Installation, Core Workflow |\n| Fuzzer | When to Use, Quick Start, Writing a Harness, Related Skills |\n| Technique | When to Apply, Quick Reference, Tool-Specific Guidance, Related Skills |\n| Domain | Background, Quick Reference, Testing Workflow, Related Skills |\n\n**Section validation command:**\n\n```bash\n# Validate required sections for a tool skill\nSKILL=\"../semgrep/SKILL.md\"\nREQUIRED=(\"When to Use\" \"Quick Reference\" \"Installation\" \"Core Workflow\")\n\nfor section in \"${REQUIRED[@]}\"; do\n grep -q \"^## $section\" \"$SKILL\" && echo \"✓ $section\" || echo \"✗ Missing: $section\"\ndone\n```\n\n**Related Skills validation:**\n\nFor Fuzzer, Technique, and Domain skills, verify that the Related Skills section exists and references valid skills:\n\n```bash\n# Check Related Skills section exists\ngrep -q \"^## Related Skills\" \"$SKILL\" || echo \"✗ Missing: Related Skills section\"\n\n# Extract skill references and check they exist\ngrep -oE '\\*\\*[a-z0-9-]+\\*\\*' \"$SKILL\" | tr -d '*' | sort -u | while read ref; do\n [ -d \"../$ref\" ] && echo \"✓ $ref exists\" || echo \"⚠ $ref not found (may be planned)\"\ndone\n```\n\n### 3. Line Count\n\n**Check:** SKILL.md under 500 lines\n\n```bash\nwc -l ../libfuzzer/SKILL.md # Replace 'libfuzzer' with target skill\n# Should be \u003c 500\n```\n\n**If over 500 lines:**\n- Split into supporting files\n- Keep SKILL.md as overview with decision tree\n- Reference supporting files with relative links\n\n### 4. Internal Reference Resolution\n\n**Check:** All internal links resolve\n\n```bash\nSKILL=\"../libfuzzer/SKILL.md\" # Replace 'libfuzzer' with target skill\nSKILL_DIR=$(dirname \"$SKILL\")\n\n# Find markdown links and verify they exist\ngrep -oE '\\[.+\\]\\(([^)]+)\\)' \"$SKILL\" | grep -oE '\\([^)]+\\)' | tr -d '()' | while read link; do\n # Skip external URLs\n [[ \"$link\" =~ ^https?:// ]] && continue\n # Check if file exists\n [ -f \"$SKILL_DIR/$link\" ] && echo \"✓ $link\" || echo \"✗ $link (not found)\"\ndone\n```\n\n**Common issues:**\n| Issue | Fix |\n|-------|-----|\n| Link to non-existent file | Create file or remove link |\n| Broken anchor | Update anchor or content |\n| Absolute path used | Convert to relative path |\n\n### 5. Code Block Preservation\n\n**Check:** Code blocks preserved from handbook\n\nCompare code blocks in generated skill vs source handbook section:\n- Indentation preserved\n- Language specifier present\n- No truncation\n\n### 6. Hugo Shortcode Removal\n\n**Check:** No Hugo shortcodes remain\n\n```bash\n# Should return nothing (exit code 1 = pass, exit code 0 = shortcodes found)\ngrep -E '\\{\\{[\u003c%]' ../libfuzzer/SKILL.md # Replace 'libfuzzer' with target skill\n```\n\n**Shortcodes to remove:**\n- `{{\u003c hint >}}...{{\u003c /hint >}}`\n- `{{\u003c tabs >}}...{{\u003c /tabs >}}`\n- `{{\u003c customFigure >}}`\n- `{{% relref \"...\" %}}`\n\n## Activation Testing\n\nVerify Claude activates the skill correctly.\n\n### Test 1: Direct Invocation\n\n**Prompt:** \"Use the [skill-name] skill\"\n\n**Expected:**\n- Claude loads SKILL.md\n- Claude references skill content\n- Claude follows skill workflow\n\n### Test 2: Implicit Trigger\n\n**Sample prompts by skill type:**\n\n| Skill Type | Test Prompt |\n|------------|-------------|\n| Tool (semgrep) | \"Scan this Python code for security issues\" |\n| Tool (codeql) | \"Set up CodeQL for my Java project\" |\n| Fuzzer (libfuzzer) | \"Help me fuzz this C function\" |\n| Fuzzer (aflpp) | \"Set up AFL++ for multi-core fuzzing\" |\n| Technique (harness) | \"Write a fuzzing harness for this parser\" |\n| Technique (coverage) | \"Analyze coverage of my fuzzing campaign\" |\n| Domain (wycheproof) | \"Test my ECDSA implementation\" |\n| Domain (constant-time) | \"Check if this crypto code has timing leaks\" |\n\n**Expected:**\n- Skill description matches prompt intent\n- Claude selects this skill over alternatives\n- Claude uses skill content appropriately\n\n### Test 3: Decision Tree Navigation\n\n**Test:** Claude navigates to supporting files correctly\n\n**Prompts:**\n1. General query → Should use SKILL.md overview\n2. Specific topic → Should read appropriate supporting file\n3. Advanced topic → Should follow decision tree to detailed doc\n\n## Iteration Loop\n\n```\n┌─────────────────────────────────────────────────────┐\n│ Generate Skill │\n└─────────────────────────────────────────────────────┘\n │\n ▼\n┌─────────────────────────────────────────────────────┐\n│ Run Validator Script │\n│ uv run scripts/validate-skills.py --skill [name] │\n│ │\n│ Checks: YAML, sections, line count, shortcodes, │\n│ cross-refs, internal links │\n└─────────────────────────────────────────────────────┘\n │\n ┌──────────┴──────────┐\n │ │\n All Pass Failed\n │ │\n ▼ ▼\n┌─────────────────────┐ ┌─────────────────────┐\n│ Activation Test │ │ Fix Issues │\n│ - Direct invoke │ │ - Edit skill │\n│ - Implicit trigger │ │ - Re-run validator│\n│ - Decision tree │ └─────────────────────┘\n└─────────────────────┘ │\n │ │\n ▼ │\n┌─────────────────────┐ │\n│ Pass? │ │\n└─────────────────────┘ │\n │ │\n ┌────┴────┐ │\n Yes No │\n │ │ │\n │ └────────────────────┘\n ▼\n┌─────────────────────────────────────────────────────┐\n│ Mark Complete │\n│ - Report success to user │\n│ - List any warnings from validator │\n└─────────────────────────────────────────────────────┘\n```\n\n## Quality Checklist\n\nBefore delivering each generated skill:\n\n```markdown\n## Skill: [name]\n\n### Automated Validation\n- [ ] Validator passes: `uv run scripts/validate-skills.py --skill [name]`\n- [ ] No errors in output\n- [ ] Warnings reviewed and addressed (or documented as acceptable)\n\n### Content Quality (manual review)\n- [ ] Description leads with the task, names concrete anchors, and gives two or more situations\n- [ ] Every command, flag, file name, and API symbol the description advertises appears in the skill body\n- [ ] When to Use section has clear triggers\n- [ ] Quick Reference is actionable\n- [ ] Code examples are complete and runnable\n- [ ] Resources section has titles and URLs\n\n### Activation Testing\n- [ ] Direct invocation works\n- [ ] Implicit trigger matches expected prompts\n- [ ] Decision tree navigation correct\n```\n\n## Bulk Generation Report\n\nWhen generating multiple skills, use the validator JSON output:\n\n```bash\n# Generate JSON report\nuv run scripts/validate-skills.py --json > validation-report.json\n\n# Or view in terminal\nuv run scripts/validate-skills.py\n```\n\nExample validator output:\n```\n==================================================\nVALIDATION REPORT\n==================================================\n✓ libfuzzer\n✓ semgrep ⚠\n WARNING: Line count 480 approaching limit of 500\n✗ wycheproof\n ERROR: Missing required sections for domain skill: ['Background']\n\n--------------------------------------------------\nTotal: 3\nPassed: 2\nFailed: 1\nWarnings: 1\n--------------------------------------------------\n✗ 1 skill(s) failed validation\n```\n\nAfter validation, document results:\n\n```markdown\n# Skill Generation Report\n\n## Validator Results\n- Total: X\n- Passed: Y\n- Failed: Z\n- With warnings: W\n\n## Actions Needed\n\n### Failed Skills\n1. **wycheproof**: Add Background section\n\n### Warnings\n1. **semgrep**: Line count 480 - consider splitting\n\n## Next Steps\n- [ ] Fix failed skills\n- [ ] Address warnings\n- [ ] Run activation tests\n```\n\n## Common Issues and Fixes\n\n| Issue | Cause | Fix |\n|-------|-------|-----|\n| YAML parse error | Unquoted description containing `: ` or ` #` | Put the description on one double-quoted line |\n| Missing section | Template not fully populated | Fill from handbook |\n| Over 500 lines | Too much detail in main file | Split to supporting files |\n| Broken reference | Supporting file not created | Create file or remove link |\n| Shortcode remains | Incomplete conversion | Apply shortcode stripping |\n| Activation fails | Poor description | Improve trigger keywords |\n\n## Post-Generation Checklist\n\nAfter all skills pass validation, complete the tasks in [SKILL.md Post-Generation Tasks](SKILL.md#post-generation-tasks).\n\n**Summary of required actions:**\n1. Update main `README.md` with generated skills table\n2. Capture self-improvement notes\n\n## Self-Improvement Framework\n\nAfter each generation run, systematically review and improve the generator.\n\n### Review Questions\n\n| Category | Question | If Yes, Update |\n|----------|----------|----------------|\n| Content extraction | Did any handbook content not extract cleanly? | `discovery.md` (section 3.2) |\n| Shortcodes | Were there shortcodes or formats not handled? | `discovery.md` (section 3.2) |\n| Manual fixes | Did any skills require manual fixes after generation? | Templates or agent prompt |\n| Detection | Are there patterns in the handbook not detected? | `discovery.md` (section 1.3) |\n| Activation | Did activation testing reveal description issues? | `agent-prompt.md` (\"Description quality\") and the templates |\n| Validation | Did a bug slip through validation? | `testing.md` (add new check) |\n\n### Improvement Log Format\n\nWhen making improvements, document them:\n\n```markdown\n## Self-Improvement Log\n\n### YYYY-MM-DD: {Brief title}\n\n**Issue:** {What went wrong during generation}\n**Example:** {Specific skill/section affected}\n**Root cause:** {Why the current logic failed}\n**Fix:** {What was changed}\n**Files modified:**\n- `{file1}`: {what changed}\n- `{file2}`: {what changed}\n**Verification:** {How to confirm the fix works}\n```\n\n### Improvement Priority\n\n| Priority | Criteria | Action |\n|----------|----------|--------|\n| P0 - Critical | Generated skill is broken/unusable | Fix immediately, re-generate affected skills |\n| P1 - High | Content missing or incorrect | Fix before next generation run |\n| P2 - Medium | Suboptimal but functional | Add to backlog, fix when convenient |\n| P3 - Low | Minor formatting/style issues | Optional improvement |\n","content_type":"text/markdown; charset=utf-8","language":"markdown","size":16692,"content_sha256":"3f7b53df6bb98679a7da30420d9e85b1f5fbb728faa425d1b176753870935c64"}],"content_json":{"type":"doc","content":[{"type":"heading","attrs":{"level":1},"content":[{"text":"Testing Handbook Skill Generator","type":"text"}]},{"type":"paragraph","content":[{"text":"Generate and maintain Claude Code skills from the Trail of Bits Testing Handbook.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"When to Use","type":"text"}]},{"type":"paragraph","content":[{"text":"Invoke this skill when:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Creating new security testing skills from handbook content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"User mentions \"testing handbook\", \"appsec.guide\", or asks about generating skills","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Bulk skill generation or refresh is needed","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Do NOT use for:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"General security testing questions (use the generated skills)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Non-handbook skill creation","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Handbook Location","type":"text"}]},{"type":"paragraph","content":[{"text":"The skill needs the Testing Handbook repository. See ","type":"text"},{"text":"discovery.md","type":"text","marks":[{"type":"link","attrs":{"href":"discovery.md","title":null}}]},{"text":" for full details.","type":"text"}]},{"type":"paragraph","content":[{"text":"Quick reference:","type":"text","marks":[{"type":"strong"}]},{"text":" Check ","type":"text"},{"text":"./testing-handbook","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"../testing-handbook","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"~/testing-handbook","type":"text","marks":[{"type":"code_inline"}]},{"text":" → ask user → clone as last resort.","type":"text"}]},{"type":"paragraph","content":[{"text":"Repository:","type":"text","marks":[{"type":"strong"}]},{"text":" ","type":"text"},{"text":"https://github.com/trailofbits/testing-handbook","type":"text","marks":[{"type":"code_inline"}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Workflow Overview","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Phase 0: Setup Phase 1: Discovery\n┌─────────────────┐ ┌─────────────────┐\n│ Locate handbook │ → │ Analyze handbook│\n│ - Find or clone │ │ - Scan sections │\n│ - Confirm path │ │ - Classify types│\n└─────────────────┘ └─────────────────┘\n ↓ ↓\nPhase 3: Generation Phase 2: Planning\n┌─────────────────┐ ┌─────────────────┐\n│ TWO-PASS GEN │ ← │ Generate plan │\n│ Pass 1: Content │ │ - New skills │\n│ Pass 2: X-refs │ │ - Updates │\n│ - Write to gen/ │ │ - Present user │\n└─────────────────┘ └─────────────────┘\n ↓\nPhase 4: Testing Phase 5: Finalize\n┌─────────────────┐ ┌─────────────────┐\n│ Validate skills │ → │ Post-generation │\n│ - Run validator │ │ - Update README │\n│ - Test activation│ │ - Update X-refs │\n│ - Fix issues │ │ - Self-improve │\n└─────────────────┘ └─────────────────┘","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Scope Restrictions","type":"text"}]},{"type":"paragraph","content":[{"text":"ONLY modify these locations:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"plugins/testing-handbook-skills/skills/[skill-name]/*","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Generated skills (as siblings to testing-handbook-generator)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"plugins/testing-handbook-skills/skills/testing-handbook-generator/*","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Self-improvement","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Repository root ","type":"text"},{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Add generated skills to table","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"NEVER modify or analyze:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Other plugins (","type":"text"},{"text":"plugins/property-based-testing/","type":"text","marks":[{"type":"code_inline"}]},{"text":", ","type":"text"},{"text":"plugins/static-analysis/","type":"text","marks":[{"type":"code_inline"}]},{"text":", etc.)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Other skills outside this plugin","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Do not scan or pull into context any skills outside of ","type":"text"},{"text":"testing-handbook-skills/","type":"text","marks":[{"type":"code_inline"}]},{"text":". Generate skills based solely on handbook content and resources referenced from it.","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quick Reference","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Section → Skill Type Mapping","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Handbook Section","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skill Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Template","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/static-analysis/[tool]/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool Skill","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tool-skill.md","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/fuzzing/[lang]/[fuzzer]/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fuzzer Skill","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"fuzzer-skill.md","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/fuzzing/techniques/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Technique Skill","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"technique-skill.md","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/crypto/[tool]/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Domain Skill","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"domain-skill.md","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"/web/[tool]/","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool Skill","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"tool-skill.md","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Skill Candidate Signals","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signal","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Indicates","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"_index.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" with ","type":"text"},{"text":"bookCollapseSection: true","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Major tool/topic","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Numbered files (00-, 10-, 20-)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Structured content","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"techniques/","type":"text","marks":[{"type":"code_inline"}]},{"text":" subsection","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Methodology content","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"99-resources.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" or ","type":"text"},{"text":"91-resources.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Has external links","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Exclusion Signals","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Signal","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Action","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"draft: true","type":"text","marks":[{"type":"code_inline"}]},{"text":" in frontmatter","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skip section","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Empty directory","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skip section","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Template/placeholder file","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skip section","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"GUI-only tool (e.g., ","type":"text"},{"text":"web/burp/","type":"text","marks":[{"type":"code_inline"}]},{"text":")","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Skip section (Claude cannot operate GUI tools)","type":"text"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Decision Tree","type":"text"}]},{"type":"paragraph","content":[{"text":"Starting skill generation?","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"├─ Need to analyze handbook and build plan?\n│ └─ Read: discovery.md\n│ (Handbook analysis methodology, plan format)\n│\n├─ Spawning skill generation agents?\n│ └─ Read: agent-prompt.md\n│ (Full prompt template, variable reference, validation checklist)\n│\n├─ Generating a specific skill type?\n│ └─ Read appropriate template:\n│ ├─ Tool (Semgrep, CodeQL) → templates/tool-skill.md\n│ ├─ Fuzzer (libFuzzer, AFL++) → templates/fuzzer-skill.md\n│ ├─ Technique (harness, coverage) → templates/technique-skill.md\n│ └─ Domain (crypto, web) → templates/domain-skill.md\n│\n├─ Validating generated skills?\n│ └─ Run: scripts/validate-skills.py\n│ Then read: testing.md for activation testing\n│\n├─ Finalizing after generation?\n│ └─ See: Post-Generation Tasks below\n│ (Update main README, update Skills Cross-Reference, self-improvement)\n│\n└─ Quick generation from specific section?\n └─ Use Quick Reference above, apply template directly","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Two-Pass Generation (Phase 3)","type":"text"}]},{"type":"paragraph","content":[{"text":"Generation uses a ","type":"text"},{"text":"two-pass approach","type":"text","marks":[{"type":"strong"}]},{"text":" to solve forward reference problems (skills referencing other skills that don't exist yet).","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Pass 1: Content Generation (Parallel)","type":"text"}]},{"type":"paragraph","content":[{"text":"Generate all skills in parallel ","type":"text"},{"text":"without","type":"text","marks":[{"type":"strong"}]},{"text":" the Related Skills section:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Pass 1 - Generating 5 skills in parallel:\n├─ Agent 1: libfuzzer (fuzzer) → skills/libfuzzer/SKILL.md\n├─ Agent 2: aflpp (fuzzer) → skills/aflpp/SKILL.md\n├─ Agent 3: semgrep (tool) → skills/semgrep/SKILL.md\n├─ Agent 4: harness-writing (technique) → skills/harness-writing/SKILL.md\n└─ Agent 5: wycheproof (domain) → skills/wycheproof/SKILL.md\n\nEach agent uses: pass=1 (content only, Related Skills left empty)","type":"text"}]},{"type":"paragraph","content":[{"text":"Pass 1 agents:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate all sections EXCEPT Related Skills","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Leave a placeholder: ","type":"text"},{"text":"## Related Skills\\n\\n\u003c!-- PASS2: populate after all skills exist -->","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Output report includes ","type":"text"},{"text":"references: DEFERRED","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Pass 2: Cross-Reference Population (Sequential)","type":"text"}]},{"type":"paragraph","content":[{"text":"After all Pass 1 agents complete, run Pass 2 to populate Related Skills:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Pass 2 - Populating cross-references:\n├─ Read all generated skill names from skills/*/SKILL.md\n├─ For each skill, determine related skills based on:\n│ ├─ related_sections from discovery (handbook structure)\n│ ├─ Skill type relationships (fuzzers → techniques)\n│ └─ Explicit mentions in content\n└─ Update each SKILL.md's Related Skills section","type":"text"}]},{"type":"paragraph","content":[{"text":"Pass 2 process:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Collect all generated skill names: ","type":"text"},{"text":"ls -d skills/*/SKILL.md","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"For each skill, identify related skills using the mapping from discovery","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Edit each SKILL.md to replace the placeholder with actual links","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate cross-references exist (no broken links)","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Agent Prompt Template","type":"text"}]},{"type":"paragraph","content":[{"text":"See ","type":"text"},{"text":"agent-prompt.md","type":"text","marks":[{"type":"link","attrs":{"href":"agent-prompt.md","title":null}},{"type":"strong"}]},{"text":" for the full prompt template with:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Variable substitution reference (including ","type":"text"},{"text":"pass","type":"text","marks":[{"type":"code_inline"}]},{"text":" variable)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Pre-write validation checklist","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Hugo shortcode conversion rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Line count splitting rules","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Error handling guidance","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Output report format","type":"text"}]}]}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Collecting Results","type":"text"}]},{"type":"paragraph","content":[{"text":"After Pass 1: Aggregate output reports, verify all skills generated. After Pass 2: Run validator to check cross-references.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Handling Agent Failures","type":"text"}]},{"type":"paragraph","content":[{"text":"If an agent fails or produces invalid output:","type":"text"}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Failure Type","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Detection","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Recovery Action","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Agent crashed","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"No output report","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Re-run single agent with same inputs","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Validation failed","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Output report shows errors","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check gaps/warnings, manually patch or re-run","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Wrong skill type","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Content doesn't match template","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Re-run with corrected ","type":"text"},{"text":"type","type":"text","marks":[{"type":"code_inline"}]},{"text":" parameter","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Missing content","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Output report lists gaps","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Accept if minor, or provide additional ","type":"text"},{"text":"related_sections","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Pass 2 broken ref","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Validator shows missing skill","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Check if skill was skipped, update reference","type":"text"}]}]}]}]},{"type":"paragraph","content":[{"text":"Important:","type":"text","marks":[{"type":"strong"}]},{"text":" Do NOT re-run the entire parallel batch for a single agent failure. Fix individual failures independently.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Single-Skill Regeneration","type":"text"}]},{"type":"paragraph","content":[{"text":"To regenerate a single skill without re-running the entire batch:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"# Regenerate single skill (Pass 1 - content only)\n\"Use testing-handbook-generator to regenerate the {skill-name} skill from section {section_path}\"\n\n# Example:\n\"Use testing-handbook-generator to regenerate the libfuzzer skill from section fuzzing/c-cpp/10-libfuzzer\"","type":"text"}]},{"type":"paragraph","content":[{"text":"Regeneration workflow:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-read the handbook section for fresh content","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Apply the appropriate template","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Write to ","type":"text"},{"text":"skills/{skill-name}/SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" (overwrites existing)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Re-run Pass 2 for that skill only to update cross-references","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Run validator on the single skill: ","type":"text"},{"text":"uv run scripts/validate-skills.py --skill {skill-name}","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Output Location","type":"text"}]},{"type":"paragraph","content":[{"text":"Generated skills are written to:","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"skills/[skill-name]/SKILL.md","type":"text"}]},{"type":"paragraph","content":[{"text":"Each skill gets its own directory for potential supporting files (as siblings to testing-handbook-generator).","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Quality Checklist","type":"text"}]},{"type":"paragraph","content":[{"text":"Before delivering generated skills:","type":"text"}]},{"type":"checkbox_list","attrs":{"id":null},"content":[{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"All handbook sections analyzed (Phase 1)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Plan presented to user before generation (Phase 2)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Parallel agents launched - one per skill (Phase 3)","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Templates applied correctly per skill type","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Validator passes: ","type":"text"},{"text":"uv run scripts/validate-skills.py","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Activation testing passed - see ","type":"text"},{"text":"testing.md","type":"text","marks":[{"type":"link","attrs":{"href":"testing.md","title":null}}]}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Main ","type":"text"},{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" updated with generated skills table","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" Skills Cross-Reference graph updated","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"Self-improvement notes captured","type":"text"}]}]},{"type":"checkbox_item","attrs":{"checked":false},"content":[{"type":"paragraph","content":[{"text":"User notified with summary","type":"text"}]}]}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Post-Generation Tasks","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"1. Update Main README","type":"text"}]},{"type":"paragraph","content":[{"text":"After generating skills, update the repository's main ","type":"text"},{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" to list them.","type":"text"}]},{"type":"paragraph","content":[{"text":"Format:","type":"text","marks":[{"type":"strong"}]},{"text":" Add generated skills to the same \"Available Plugins\" table, directly after ","type":"text"},{"text":"testing-handbook-skills","type":"text","marks":[{"type":"code_inline"}]},{"text":". Use plain text ","type":"text"},{"text":"testing-handbook-generator","type":"text","marks":[{"type":"code_inline"}]},{"text":" as the author (no link).","type":"text"}]},{"type":"paragraph","content":[{"text":"Example:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":"markdown"},"content":[{"text":"| Plugin | Description | Author |\n|--------|-------------|--------|\n| ... other plugins ... |\n| [testing-handbook-skills](plugins/testing-handbook-skills/) | Meta-skill that generates skills from the Testing Handbook | Paweł Płatek |\n| [libfuzzer](plugins/testing-handbook-skills/skills/libfuzzer/) | Coverage-guided fuzzing with libFuzzer for C/C++ | testing-handbook-generator |\n| [aflpp](plugins/testing-handbook-skills/skills/aflpp/) | Multi-core fuzzing with AFL++ | testing-handbook-generator |\n| [semgrep](plugins/testing-handbook-skills/skills/semgrep/) | Fast static analysis for finding bugs | testing-handbook-generator |","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"2. Update Skills Cross-Reference","type":"text"}]},{"type":"paragraph","content":[{"text":"After generating skills, update the ","type":"text"},{"text":"README.md","type":"text","marks":[{"type":"code_inline"}]},{"text":"'s ","type":"text"},{"text":"Skills Cross-Reference","type":"text","marks":[{"type":"strong"}]},{"text":" section with the mermaid graph showing skill relationships.","type":"text"}]},{"type":"paragraph","content":[{"text":"Process:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Read each generated skill's ","type":"text"},{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" and extract its ","type":"text"},{"text":"## Related Skills","type":"text","marks":[{"type":"code_inline"}]},{"text":" section","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Build the mermaid graph with nodes grouped by skill type (Fuzzers, Techniques, Tools, Domain)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Add edges based on the Related Skills relationships:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Solid arrows (","type":"text"},{"text":"-->","type":"text","marks":[{"type":"code_inline"}]},{"text":") for primary technique dependencies","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Dashed arrows (","type":"text"},{"text":"-.->","type":"text","marks":[{"type":"code_inline"}]},{"text":") for alternative tool suggestions","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Replace the existing mermaid code block in README.md","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Edge classification:","type":"text","marks":[{"type":"strong"}]}]},{"type":"table","attrs":{"layout":null},"content":[{"type":"tr","content":[{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Relationship","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Arrow Style","type":"text"}]}]},{"type":"th","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Example","type":"text"}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fuzzer → Technique","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-->","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"libfuzzer --> harness-writing","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Tool → Tool (alternative)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-.->","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"semgrep -.-> codeql","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Fuzzer → Fuzzer (alternative)","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-.->","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"libfuzzer -.-> aflpp","type":"text","marks":[{"type":"code_inline"}]}]}]}]},{"type":"tr","content":[{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"Technique → Technique","type":"text"}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"-->","type":"text","marks":[{"type":"code_inline"}]}]}]},{"type":"td","attrs":{"colspan":1,"rowspan":1,"colwidth":null,"alignment":""},"content":[{"type":"paragraph","content":[{"text":"harness-writing --> coverage-analysis","type":"text","marks":[{"type":"code_inline"}]}]}]}]}]},{"type":"paragraph","content":[{"text":"Validation:","type":"text","marks":[{"type":"strong"}]},{"text":" After updating, run ","type":"text"},{"text":"validate-skills.py","type":"text","marks":[{"type":"code_inline"}]},{"text":" to verify all referenced skills exist.","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"3. Self-Improvement","type":"text"}]},{"type":"paragraph","content":[{"text":"After each generation run, reflect on what could improve future runs.","type":"text"}]},{"type":"paragraph","content":[{"text":"Capture improvements to:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Templates (missing sections, better structure)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Discovery logic (missed patterns, false positives)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Content extraction (shortcodes not handled, formatting issues)","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Update process:","type":"text","marks":[{"type":"strong"}]}]},{"type":"ordered_list","attrs":{"order":1,"listStyle":"number"},"content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Note issues encountered during generation","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Identify patterns that caused problems","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Update relevant files:","type":"text"}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"SKILL.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Workflow, decision tree, quick reference updates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"templates/*.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Template improvements","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"discovery.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - Detection logic updates","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"testing.md","type":"text","marks":[{"type":"code_inline"}]},{"text":" - New validation checks","type":"text"}]}]}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Document the improvement in commit message","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Example self-improvement:","type":"text","marks":[{"type":"strong"}]}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"Issue: libFuzzer skill missing sanitizer flags table\nFix: Updated templates/fuzzer-skill.md to include ## Compiler Flags section","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Example Usage","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Full Discovery and Generation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"User: \"Generate skills from the testing handbook\"\n\n1. Locate handbook (check common locations, ask user, or clone)\n2. Read discovery.md for methodology\n3. Scan handbook at {handbook_path}/content/docs/\n4. Build candidate list with types\n5. Present plan to user\n6. On approval, generate each skill using appropriate template\n7. Validate generated skills\n8. Update main README.md with generated skills table\n9. Update README.md Skills Cross-Reference graph from Related Skills sections\n10. Self-improve: note any template/discovery issues for future runs\n11. Report results","type":"text"}]},{"type":"heading","attrs":{"level":3},"content":[{"text":"Single Section Generation","type":"text"}]},{"type":"code_block","attrs":{"wrap":false,"language":""},"content":[{"text":"User: \"Create a skill for the libFuzzer section\"\n\n1. Read /testing-handbook/content/docs/fuzzing/c-cpp/10-libfuzzer/\n2. Identify type: Fuzzer Skill\n3. Read templates/fuzzer-skill.md\n4. Extract content, apply template\n5. Write to skills/libfuzzer/SKILL.md\n6. Validate and report","type":"text"}]},{"type":"heading","attrs":{"level":2},"content":[{"text":"Tips","type":"text"}]},{"type":"paragraph","content":[{"text":"Do:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Always present plan before generating","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Use appropriate template for skill type","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Preserve code blocks exactly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Validate after generation","type":"text"}]}]}]},{"type":"paragraph","content":[{"text":"Don't:","type":"text","marks":[{"type":"strong"}]}]},{"type":"bullet_list","content":[{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Generate without user approval","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skip fetching non-video external resources (use WebFetch)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Fetch video URLs (YouTube, Vimeo - titles only)","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Include handbook images directly","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Skip validation step","type":"text"}]}]},{"type":"list_item","content":[{"type":"paragraph","content":[{"text":"Exceed 500 lines per SKILL.md","type":"text"}]}]}]},{"type":"hr","attrs":{"markup":"---"}},{"type":"paragraph","content":[{"text":"For first-time use:","type":"text","marks":[{"type":"strong"}]},{"text":" Start with ","type":"text"},{"text":"discovery.md","type":"text","marks":[{"type":"link","attrs":{"href":"discovery.md","title":null}}]},{"text":" to understand the handbook analysis process.","type":"text"}]},{"type":"paragraph","content":[{"text":"For template reference:","type":"text","marks":[{"type":"strong"}]},{"text":" See ","type":"text"},{"text":"templates/","type":"text","marks":[{"type":"link","attrs":{"href":"templates/","title":null}}]},{"text":" directory for skill type templates.","type":"text"}]},{"type":"paragraph","content":[{"text":"For validation:","type":"text","marks":[{"type":"strong"}]},{"text":" See ","type":"text"},{"text":"testing.md","type":"text","marks":[{"type":"link","attrs":{"href":"testing.md","title":null}}]},{"text":" for quality assurance methodology.","type":"text"}]}]},"metadata":{"date":"2026-11-02","name":"testing-handbook-generator","author":"@skillopedia","source":{"stars":7957,"repo_name":"skills","origin_url":"https://github.com/trailofbits/skills/blob/HEAD/plugins/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md","repo_owner":"trailofbits","body_sha256":"84d2022bff1675f77f71a219aa3999b01dc3fcfeff1666965177195ecf808aaa","cluster_key":"479cf5eac6aa7f4e187e89c29488c0ba9cdf56b211309debaa33077ec0feb86d","clean_bundle":{"format":"clean-skill-bundle-v1","source":"trailofbits/skills/plugins/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md","text_bytes":94672,"source_commit":"d016e08cc7408ecb1853a299d06d4a56e363ad5e","skills_sh_rank":4128,"attachment_count":8,"text_attachments":8,"attachment_storage":"skill_attachments","binary_attachments":0},"cluster_size":1,"skill_md_path":"plugins/testing-handbook-skills/skills/testing-handbook-generator/SKILL.md","import_metadata":{"date":"2026-11-02","author":"@skillopedia","version":"v1","category":"testing-qa","category_label":"Testing"},"exact_dupes_collapsed_into_this":0},"version":"v1","category":"testing-qa","import_tag":"skills-sh-top20k-2026-11","description":"Generates Claude Code skills from the Trail of Bits Testing Handbook (appsec.guide), analyzing handbook pages and emitting SKILL.md files with the structure each skill type requires. Use when creating or refreshing a skill from handbook content, or when the user names the testing handbook or appsec.guide. Not for answering security testing questions — the generated skills cover those."}},"renderedAt":1793671540615}

Testing Handbook Skill Generator Generate and maintain Claude Code skills from the Trail of Bits Testing Handbook. When to Use Invoke this skill when: - Creating new security testing skills from handbook content - User mentions "testing handbook", "appsec.guide", or asks about generating skills - Bulk skill generation or refresh is needed Do NOT use for: - General security testing questions (use the generated skills) - Non-handbook skill creation Handbook Location The skill needs the Testing Handbook repository. See discovery.md for full details. Quick reference: Check , , → ask user → clone…