Skip to content
Security
Skill

/learn

Post-engagement knowledge harvest AND harness retrospective - after a box/bugbounty/pentest/CTF is completed, first diff how the engagement was EXECUTED against the skills/hooks that governed it (what discipline was skipped) and improve the harness, then sweep the whole

BOOST
From plugin
torch
33356 skills
Install
$ npx -y skills add Encod3d-Sec/TORCH --skill learn --agent claude-code

How 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/learn

Context preview

The summary Claude sees to decide when to auto-load this skill.

Post-engagement knowledge harvest AND harness retrospective - after a box/bugbounty/pentest/CTF is completed, first diff how the engagement was EXECUTED against the skills/hooks that governed it (what discipline was skipped) and improve the harness, then sweep the whole

SKILL.md

learn.SKILL.md
name: learn
description: Post-engagement knowledge harvest AND harness retrospective - after a box/bugbounty/pentest/CTF is completed, first diff how the engagement was EXECUTED against the skills/hooks that governed it (what discipline was skipped) and improve the harness, then sweep the whole engagement for GENERIC reusable knowledge NOT already in wiki/ and land it via the leak-gated stage->promote pipeline. Use at close-out or when asked to "extract learnings", "what did we learn", "harvest lessons into wiki", "distill this engagement", "post-mortem into the wiki", "what did we do wrong", "improve the harness from this box".

Learn: harness retrospective + wiki knowledge harvest

The close-out retrospective, in two phases:

  • **Phase 0 (process):** diff how the engagement was EXECUTED against the discipline the

skills/hooks prescribe, find where the operator (you) or the harness drifted, and fix the harness so the next box does not repeat it. This is the "improve the harness on it" half.

  • **Phases 1-7 (knowledge):** read the WHOLE finished engagement, diff it against the existing

wiki, and promote only the DELTA as durable, generic knowledge. The safety net that catches everything not captured live during the box.

The client-data boundary is enforced by code, not by this prose: engagement-derived content reaches `wiki/` ONLY through `wiki-stage.py` -> `wiki-promote.py`, which runs `check-leaks.sh` and fails closed. This skill READS the engagement and WRITES only generic knowledge; it never edits the engagement's own files.

When it fires

  • At close-out: run `Skill(learn)` once the engagement is marked

`## STATUS: SOLVED` (OWNED/ROOTED/COMPLETE) AND its `walkthrough.md` is assembled (the CLAUDE.md execution-loop close-out step). It self-clears the moment this skill writes `<eng>/.learn-done`.

  • On demand: "extract learnings", "what did we learn", "harvest lessons", "distill",

"post-mortem into the wiki" - the same steps apply.

Phase 0: Process retrospective (harness self-improvement) - DO FIRST

Before harvesting knowledge, ask: **did we execute the way the skills/hooks told us to, and where we did not, whose fault is it - mine, or the harness's for not catching me?** The point is not self-flagellation; it is to turn each drift into a concrete harness change so the next engagement cannot repeat it.

0a. Diff execution against discipline

Re-read the skills that governed this engagement (`ctf-box`, the `hunt-*` used, the CLAUDE.md execution loop) and check each mandated step against what actually happened on disk:

| Discipline it prescribes | How to check it was (not) done | Common drift | |---|---|---| | Recon tooling complete (nmap AND ffuf AND nuclei-read for web) | `ls targets/$ENG/recon/*.png`, `.recon-tools` marker, tmux window names, `log.md` | ffuf never run; nuclei launched but output never read | | Screenshot EVERY finding as it lands | count deliberate `poc/*.png` vs findings in `Killchain.md`; `.screenshot-nudged` | shots only at the very end; transient states lost | | Wiki-first before exploiting each fingerprinted service | wiki queries in transcript / `log.md` | jumped to exploitation from memory | | A hook nudge fired -> was it acted on? | grep the transcript for a nudge (e.g. "switch to ffuf") whose action never followed | nudge ignored under momentum | | State-first / capture-as-you-go | `state.md`/`loot.md` updated mid-box vs all-at-end | prose-in-chat lost |

**If the engagement ran under the campaign driver** (`bb/pt/ctf-workflow`), pull its own numbers - they say precisely where the driver fought the operator, no guessing:

python3 scripts/campaign.py --eng <ENG> ledger --json

`drift` = network calls the driver never emitted (improvisation off the board); `dry_rounds` / `reframe_lenses_used` = how hard the campaign had to reframe to find anything; `paused_hosts` = hosts that banned us; `board.dead` vs `board.closed` = the exhaustion-to-finding ratio. A high drift or a long lens list is the retro's starting point.

For each drift, name the **root cause** honestly: a *skill* that under-specified, a *hook* that should have fired a reflex but did not (or fired and was ignorable), or a *me* failure the harness had no mechanism to catch.

0b. Turn each drift into a harness change

Route each finding to its fix TARGET and make the change (small+clear -> apply now with the normal edit+test loop; larger -> record as a proposed item for operator approval):

  • **Reflex gap** (a capture/coverage signal the harness could have caught) -> add/extend a hook

in `skills/hooks/` (stay within "reflexes = capture/route", NOT methodology), with a test in `tests/`. Run `python3 -m pytest tests/ -q` green before moving on.

  • **Discipline under-specified** -> tighten the governing skill (`ctf-box`/`hunt-*`): make the

step an explicit ordered checklist item, not buried prose. Skill bodies carry lesson PROSE + `[[wikilink]]` ONLY - never inline runnable exploit/rootkit/PoC code (magic-signal dumps, syscall PoCs, CVE exploits, reversing walks). That code is the KNOWLEDGE half: promote it to a `wiki/` page through the Phase 5-6 gate and point the skill at it with a one-line "try X (see [[page]])". A skill body loads wholesale into model/API context on EVERY invocation, so raw offensive code there trips the Claude API safety classifier (real: ctf-box's LKM-rootkit + CVE-PoC lessons got flagged on load, forcing a manual purge) and bloats context. Prose that says WHAT to try in WHAT order belongs in the skill; the code that does it belongs in the wiki.

  • **Script/analyzer gap** -> extend `scripts/` (coverage, next_move, find-lint) to surface it.

0c. Log the retrospective (generic, tracked)

Append a dated section to `docs/superpowers/harness-retro.md` (create if missing): the drifts found, their root cause, and the harness change made or proposed. This doc is about the HARNESS, so it is generic and tracked - describe failur

Read more
Ships withtorch

An AI-powered penetration testing and bug-bounty knowledge base and automation harness for Claude Code.

Get the whole plugin

Other skills on torch.

hunt-burp
Skill

hunt-burp

Drive Burp Suite over its MCP server as an AI triage + attack layer - review proxy history for signals, replay via Repeater/send,…

hunt-ad
Skill

hunt-ad

Active Directory attack hunting - enumeration to domain dominance. Spray-safe (lockout gate), AS-REP/Kerberoast, ACL + ADCS…

hunt-api
Skill

hunt-api

API attack hunting (REST / GraphQL / gRPC) - BOLA/IDOR, BFLA, mass assignment, excessive data exposure, auth/JWT, introspection +…