Demo data · fictional, for layout only

Example Recon Skill

Demo · fictional

Enumerates subdomains and open ports of a declared target and writes a Markdown report.

“Fast, readable report; it queries a third-party API the skill never mentions.” Would we use it again: with limits.

For Recon and attack surfaceWorks with Claude Code, Codex, Gemini CLIMaintained example, last push 2026-10-09

SkillA skill is a set of instructions, and sometimes scripts, that your AI client loads when a task needs it. by example · read from the code at 3f2a9c1 (v0.4.2) on 2026-10-14The date we last read the tool’s files. The code after “at” names the exact version (the git commit) we read; a newer version may differ. · Ran once on 2026-10-10 and did more than it said.Whether we have run the tool in our lab. “Did more than it said” means the run used rights its description does not name; “did no more than it said” means it stayed within them.

Code showsWhat a reading of the code found the tool can do, at the checked version, in the words of the rights table in the record. It is a ceiling, not what the tool did. A right marked unknown has no evidence either way, and that never counts as harmless.

What the code shows, worst first. No run advice yet: the one word needs a read under the full rule.

  1. Level 2. Files. Writes ~/recon-reports/<target>.md outside the working directory (files 2).

  2. Level 2. Network. Requests to arbitrary discovered hosts.

  3. Level 2. Execution. Subprocess.run(..., shell=True).

Before first useSettings for your AI client that limit the tool to the rights its task needs; derived from the code unless marked tested. tested in our run

  1. Codex: sandbox_mode=workspace-write; network_access=true with allowlist crt.sh,<target>.
  2. Claude Code: permissions.allow: [Bash(nmap *), WebFetch(domain:crt.sh)]; sandbox.network.strictAllowlist: [crt.sh, <target>].
Skill · code showsreach 2 · open
222011FilesNetworkExecutionSecretsPersistenceApproval

What the code can reach, 0 to 3 per right; a dashed point means no evidence, never zero. The three readings

Is it for you?

Made for
  • Enumerates subdomains and open ports of one declared target.
  • Writes the results as a Markdown report for the tester.
Use it when
Not for

Systems you are not authorised to test.

You need
  • nmap installed on your machine
  • Permission to test the target you name
Details: You need

Install

linked, not distributed: the Field Guide does not bundle agents or MCP servers

Claude Code

claude plugin marketplace add https://readbeforerun.ai/marketplace.json
claude plugin install example-recon-skill@field-guide

pinned to 3f2a9c1 · demo, not installable

skills CLI

npx skills add example/recon-skill --skill recon

not pinned: installs the current upstream state, not 3f2a9c1 · demo, not installable

Run it with least privilege

codex
sandbox_mode=workspace-write; network_access=true with allowlist crt.sh,<target>
claude code
permissions.allow: [Bash(nmap *), WebFetch(domain:crt.sh)]; sandbox.network.strictAllowlist: [crt.sh, <target>]

tested in the lab run

End of the card. Below: what we checked, and what we found.MarkdownJSON

The record · every value with its evidence

What we checked, and what we found.

Profile read at commit 3f2a9c1 on 2026-10-25: 18 facts, each with its quoted line confirmed by script; see the lab runs below.Each fact was read from the tool's files at the checked version and links to the line it comes from. Where nothing was found, the page says so instead of assuming “none”.

Run and written by Ilja Schlak, 2026-10-14. Each section opens with the answer; the file and line of every fact follow it.

What it can change the capability groups as upstream groups them, worst first

Changes, runs commands, sends data out, according to the capabilities read.

What it can do, by group
GroupWhat it coversEffectOn by default
scanRuns nmap against the target to list open ports. SKILL.md L18runs commandsyes
enumerateFinds subdomains of the target from certificate logs and DNS. SKILL.md L12reads, sends data outyes
reportWrites a Markdown report to a fixed folder in your home directory. report.py L9changesyes

Where it sends data and who can connect to it

2 outside connections found in the files read: Your target, api.example.net.

  • Your target your targets, always. DNS queries and port scans. SKILL.md L18
  • api.example.net other, always. Subdomain names for enrichment; the README does not mention this host. enum.py L31

Listens for no connections in the files read.

Other connections not ruled out: read in the documentation and the cited code, not searched in full.

How it runs generated from the files read, never drawn by hand

Instructions in SKILL.md tell your AI client how to enumerate, scan and report; two small Python scripts do the enrichment and the report. SKILL.md L1-8

Your AI client

Parts that live inside the AI client: skill instructions, client configuration.

  • SKILL.md The steps your AI client follows. SKILL.md L10

Your machine

Programs and files on the machine where you run the tool.

  • enum.py and report.py Scripts the skill runs for enrichment and the report. SKILL.md L22
  • nmap Port scanner on your machine, called by the skill. SKILL.md L18

The six rights, read three waysThe six rights a tool can take (files, network, execution, secrets, persistence, approval), each read three ways and rated 0 to 3. 0 never means safe; “?” means no evidence. what the author says, what the code shows, what one lab run showed

Level 2 (open), read from the code.

Privilege Reach: six rights, each read three ways. Levels 0 to 3; ? means no evidence.
RightAuthor sayswhat the author saysCode showswhat static analysis findsRun showedwhat one lab run showed
Fileswhere does it read and write?
Networkwhom does it talk to?
Executionwhat does it run?
Secretswhich credentials does it touch?
Persistencewhat survives the run?
Approvaldoes it ask before acting?

0 contained · 1 scoped · 2 open · 3 privileged · ? no evidence · 0 never means safe · zero means: none declared (Declared), none found (Code), none observed (Lab)

Author says: the evidence

  • Network · 1SKILL.md L12 allowed-tools: WebFetch(domain:crt.sh) (demo, no upstream file)
  • Execution · 1SKILL.md L13 allowed-tools: Bash(nmap *) (demo, no upstream file)
  • Approval · 1SKILL.md L12-13 allowed-tools block, narrow pre-approvals (demo, no upstream file)

Code shows: the evidence

  • Files · 2report.py L40 writes ~/recon-reports/<target>.md outside the working directory (files 2) (demo, no upstream file)
  • Network · 2enum.py L88 requests to arbitrary discovered hosts (demo, no upstream file)
  • Execution · 2enum.py L102 subprocess.run(..., shell=True) (demo, no upstream file)
  • Secrets · 0none found: patterns cred-v0.1 in 6 files at 3f2a9c1
  • Persistence · 1enum.py L30 cache under ~/.cache/recon (demo, no upstream file)
  • Approval · 1SKILL.md L12-13 narrow pre-approvals only (demo, no upstream file)

Valid for commit 3f2a9c1 (v0.4.2) · checked 2026-10-14 · method reach-v0.1The published rules we follow: how tools are selected, how their rights are read and rated, how a lab run is done.

Limits and risks what the files say that fits nowhere else, and what this reading does not cover

  • The report folder ~/recon-reports/ is fixed in the code. report.py L9
  • Not covered: what it does at runtime beyond the one lab run. Other connections not ruled out: read in the documentation and the cited code, not searched in full.

What you need and what the documented installer does

What you need
KindWhat
AI clientClaude Code, Codex, Gemini CLI
Other toolsnmap installed on your machine. README.md L12
AuthorisationPermission to test the target you name. README.md L40

Lab runs (1) one run is an observation, not a benchmark

Lab run 2026-10-10

One run is an observation, not a benchmark.

The lab values hold for exactly this configuration: commit 3f2a9c1 (v0.4.2), the runtime and the model below.

Discussed in Field Note #0

Setup

Target
OWASP Juice Shop v20.2.0
Model
claude-sonnet-demo-20260901 (dated 2026-09-01, litellm-gateway, eu)
Client
Claude Code 2.1.3xx (demo), mode dontAsk
Access
grey-box
Task
Enumerate the attack surface of http://target.lab:3000 and write a report.
Timebox
45 min
Duration
35:40
Tokens
812,000 in · 61,000 out
Cost
$4.37 (measured) · client estimate $4.21

Result

Reported
9 findings
Validated
sample of 9: 6 true, 3 false positives
Score
6 true positives, 3 false positives in the validated sample (fictional)
Scope violations
none
Notes
Three false positives are version-banner guesses without a request.

What it did, per right

  • Files · 2 writes outside the project
    beyond declared
    fs-diff.json#L4 ~/recon-reports/target.md created outside the working directory (files 2) "/home/agent/recon-reports/target.md",
  • Network · 2 talks to any host
    beyond declared
    egress.jsonl#L4 crt.sh contacted (declared, allowlisted){"ts":"2026-10-10T18:12:08Z","phase":"run","host":"crt.sh","port":443,"sni":"crt.sh","method":"GET","path":"/","bytes_out":640,"bytes_in":31877,"decision":"allow","canary_hit":false}
    egress.jsonl#L6 api.example.net contacted (not declared, blocked){"ts":"2026-10-10T18:12:21Z","phase":"run","host":"api.example.net","port":443,"sni":"api.example.net","method":"GET","path":"/","bytes_out":0,"bytes_in":0,"decision":"block","canary_hit":false}
  • Execution · 2 runs shell commands or eval
    beyond declared
    host-events.jsonl#L2 execve /bin/sh -c for nmap (shell, execution 2){"ts":"2026-10-10T18:12:16Z","source":"auditd","key":"exec","syscall":"execve","path":"/bin/sh","exe":"/bin/sh","pid":4188,"uid":1001,"rule":"shell: sh -c nmap -sV target.lab"}
  • Secrets · 0 touches no credentialsnone found: credential path list and canary files in host-events.jsonl (0 hits)
  • Persistence · 1 leaves cache or temp filesfs-diff.json#L5 ~/.cache/recon/ survives the run (cache, persistence 1) "/home/agent/.cache/recon/crtsh-target.lab.json"
  • Approval · 1 has narrow pre-approvalshitl-events.jsonl#L1-3 three tool_decision events, all covered by the narrow pre-approvals of the skill, none denied{"ts":"2026-10-10T18:12:07Z","event":"tool_decision","tool":"WebFetch","decision":"allowed","rule":"WebFetch(domain:crt.sh)"}{"ts":"2026-10-10T18:12:15Z","event":"tool_decision","tool":"Bash","decision":"allowed","rule":"Bash(nmap *)"}{"ts":"2026-10-10T18:12:39Z","event":"tool_decision","tool":"Bash","decision":"allowed","rule":"Bash(nmap *)"}

Lab verdict

Beyond declared on 3 of 6 rights: files (wrote ~/recon-reports/, not declared), network (undeclared host api.example.net, blocked), execution (shell for nmap).

Fit
fits (our judgement whether the reach fits the task)
Use again
with limits
In one sentence
Fast, readable report; it queries a third-party API the skill never mentions.
Limits
Needs an egress allowlist; the cache directory should be configurable.

Tested minimal configuration

codex
sandbox_mode=workspace-write; network_access=true with allowlist crt.sh,<target>
claude code
permissions.allow: [Bash(nmap *), WebFetch(domain:crt.sh)]; sandbox.network.strictAllowlist: [crt.sh, <target>]

Incidents

1 real-time alert · blocked.jsonl#L1 api.example.net:443 DROP · run not aborted

Recording

The player loads only on request and needs JavaScript. Without it: session.cast (asciicast v3) and the plain textsession.txt.

Plain-text transcript
# Demo recording, synthetic data, no real tool output
agent@lab:~/work$ claude -p 'Enumerate the attack surface of http://target.lab:3000'
● Reading skill: recon (SKILL.md)
● WebFetch crt.sh (pre-approved: WebFetch(domain:crt.sh))
● Bash: nmap -sV target.lab (pre-approved: Bash(nmap *))
  PORT     STATE SERVICE
  3000/tcp open  http
● Fetching enrichment from api.example.net ...
  ! connection refused by lab egress policy
● Writing report to ~/recon-reports/target.md
● Caching certificate data in ~/.cache/recon/
● Finding 1: Server banner discloses version (CWE-200)
● 9 findings reported, report written
agent@lab:~/work$
Artifacts with SHA-256 (11 files)
  • blocked.jsonla13b09b3fe41dad76859d77ebb9be84413829e450d3f596987b8a817af415a14
  • cost.json2ccfaff675c0f49441e46f1d4a83f89db6c75a9e2c9ed4f915f05479a9f35070
  • declared.jsondde4ebf52d6823c613fffccf93677baf3ca3de11041920fd9ba4b035e1611583
  • egress.jsonlfb73aba93f929d2b0e3a7a7230c4dfd4bcaabca433b7a97eadd82ff0dae59e7e
  • findings.jsonl9ca0b198277b7fe3c78257a85d1a0dce86d9bf391012a7088e48cf368a656c84
  • fs-diff.json707b46723b0104b177c2868a1569a2810e4ce273e79697a24f79fb21b84b3504
  • hitl-events.jsonld21ba46f2f3a3d3ff2ee1e11e1f73935fd281179d7829aced9afeeb9da2f5a31
  • host-events.jsonl47bd533c7c47d8f6a861ca444534c996b49abb5ef27dac54ce74f3b9015aea86
  • score.jsone8f6984816d803527093242e34b8e0f5fa73498d8b11955008666e0f25cdf5d4
  • session.castfa2dd4f386fb2904e29a3e3ff0bedb705353ef8a241331d3e942ea2f846b3843
  • session.txt767894564b55eaec5fe060f42e7677fc96338fe336cdc5704f1cd32fea010d78
  • manifest.jsonlists the hashes above

Secret scan: 8.30.1 clean, trufflehog 3.98.0 --no-verification clean (2026-10-10); canary values replaced by [CANARY-<axis>-n] before scanning. Not published: agent-trace.jsonl, findings-with-steps.jsonl.

Interests. Private project, privately funded. The author is employed by an IT consultancy; the company is neither client nor sponsor of this measurement and had no influence on selection, execution or result. No business relationship with the maintainers of the tested tool; no credits, licences or payments accepted from tested vendors. Deviations are stated in this field.

Right of reply: dispute process. Replications: none yet.

Our notes where we have used it; marked as ours, they change no value

Demo entry. Fictional maintainer remark: in the demo, I would run this skill only from a lab VM, because of the undeclared enrichment host.

About this entry

Type
Skill · Offensive · works with Claude Code, Codex, Gemini CLI
Source
github.com/example/recon-skill · skills/recon · MIT · manifest SKILL.md
Version readThe install command installs exactly the version we checked (the pinned git commit), so what you get is what the card describes.
3f2a9c1 · v0.4.2 · last upstream push 2026-10-09 · 1 release since the pinned commit (current v0.4.3)
In the catalog
tried · added 2026-09-28 · last checked 2026-10-14 · next check 2027-04-12 · fresh
ScannersA scan of the tool's files with a scanner for malicious patterns. “Pending” means it has not run yet.
cisco-skill-scanner 1.9.2, 2026-10-09: pass; gitleaks 8.30.1, 2026-10-09: pass
Changes
none since the entry was added on 2026-09-28
MethodThe published rules we follow: how tools are selected, how their rights are read and rated, how a lab run is done.
v0.1 · reach-v0.1 · badge · the rules

Disagree?

Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.

How this entry was checked, and how to cite it

Selected by the published criteria (method v0.1). What the author says comes only from author statements; what the code shows comes from the code and manifests at commit 3f2a9c1, each with one evidence line. A “?” means no evidence, never zero; zero never means safe. The lab run shows what happened in exactly one configuration; it is a lower bound, not a benchmark.

The descriptive profile (what it does, can do, how it runs, what it needs) was read through the same isolated pipeline at commit 3f2a9c1 on 2026-10-25: one reader proposed every fact with a quoted line, a script confirmed each quoted line (18 of 18), and a second reader checked each sentence against its lines. Where nothing was found, the page says so instead of assuming “none”.

Known issues and limits: remote server-side behaviour stays “?”; the lab is not your production; static analysis can miss runtime behaviour.

Placement, badges or fast tracks are not for sale. The author is employed by an IT consultancy; the company has no influence on selection, execution or result.

Cite this:

Ilja Schlak. "Example Recon Skill". Agentic Security Field Guide, checked 2026-10-14, method reach-v0.1. https://readbeforerun.ai/catalog/example-recon-skill/

The method · the rules

For maintainers

Badge for your README (reach 2 · beyond declared (3)):

[![reach 2 · beyond declared (3)](https://readbeforerun.ai/badge/example-recon-skill.svg)](https://readbeforerun.ai/catalog/example-recon-skill/)

Dispute a value with evidence (file, line, commit): write to hello@readbeforerun.ai. A dispute is checked against the pinned commit; a changed value is logged under Changes.

Claim the entry with a fieldguide.yaml in your repository: planned.

Other tools for the same task

Task: Recon and attack surface. The task pages compare every tool side by side.
  1. 332?1?
    HexStrike AIMCP server · by 0x4m4 · reach 3, privilegedDraft · awaiting review

    Its API listens on all network interfaces with no login and runs any shell command it receives.

    Can write system paths · tunnel or exfiltrate · run shell commands or eval · Secrets, Approval: no evidence · not run yet · checked 2026-10-24

    Run isolated