Threat model recon
Skill alpha-omega-security/threat-model/skills/threat-model-recon
Agent skill for producing threat models for open-source projects
npx -y skills add alpha-omega-security/threat-model --skill threat-model-reconAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
2 things to look at
- 28 days oldThe repository was created 28 days ago. New is not bad, but a brand new repository carrying a familiar-sounding name is the shape a typosquat arrives in, and there has been no time for anyone else to find a problem with it.
- 5 stars5 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
What its author says it does
Copied from the file, not written here
Orient and mine an open-source repository for threat-model production phases 3.1–3.2. USE WHEN starting a threat model or surveying security posture before modeling. Reads README, top-level docs, SECURITY/THREAT docs, maintainer issue rulings, and changelog rationale; carves component families; flags shipped-but-unsupported code; classifies project type; and absorbs an existing embedded threat model as a strict superset with a prior-policy back-map. Produces an orientation brief. Read-only. DO NOT USE FOR: deep code-surface analysis (use threat-model-surface), drafting, bug hunting, code fixes, or triage.
SKILL.md
6.4 KB, as published. Nobody here has run it
Threat Model — Recon (orient + mine)
Phases 3.1–3.2. The cheap reading that lets every later phase ask informed
questions. Minutes, not hours — the detailed code reading is
threat-model-surface's job. This is read-only: form hypotheses, do not
produce findings, do not edit code.
Read principles.md first.
Step 1 — Orient (3.1)
Do a light pass and record hypotheses:
- Read
README, top-level docs, and any existingSECURITY*,THREAT*, ordocs/content. If a document titled "threat model" is structurally an audit/risk-register/findings-list (likelihood×impact scoring, "recommended mitigations", owner/due-date columns), do not silently supersede it. Mine only statements explicitly presented as maintainer policy or contract; findings and recommendations are not contract evidence. Raise a coexistence question for §1.18. - Mine for maintainer positions already on the record — the highest-yield
sources are where maintainers explained a decision or declined to do
something: FAQ files, header-file commentary,
NOTES/CAVEATS/LIMITATIONSdocs, issue closures labeled "wontfix"/"by design"/"not a bug", changelog entries explaining why. These often answer threat-model questions before they are asked. Tag what you find (documented, exact source). - Mine for contract edge decisions, not bug lists: release-note or issue rationale about overflow boundaries, partial mutation after exceptions, cyclic inputs, callback trust, deserialization reconstruction, weak-reference lifecycle, recursion depth, and complexity expectations. Record the maintainer's general rule and route it to the contract-dimension matrix; do not copy individual findings into the model.
- Identify the primary public API surface (entry points, exported symbols, CLI commands, network protocols, file formats consumed/produced).
- Carve component families that may have different threat profiles — a pure- computation core, a convenience layer that touches the OS (files, sockets, env), ancillary utilities. Model each at its own trust level, not averaged.
- Identify shipped-but-unsupported code (
contrib/,examples/,vendor/,third_party/,test/, demos, generated bindings). Decide in/out explicitly. - Identify languages, runtimes, and obvious trust boundaries (process, FFI, network, filesystem).
- Note what the project clearly is not ("a parser, not a network service") — it shapes the model.
- Apply the split rule (see principles): if a family does not share the release cadence, maintainer set, or adversary model of the rest, flag it for a sibling model rather than one averaged document.
Step 2 — Mine the existing SECURITY.md / embedded model (3.2)
Many projects ship a SECURITY.md that is part disclosure process (out of
scope) and part embedded threat model — the single highest-authority
(documented) source, since it is maintainer policy that already survived
public review. When such content exists:
- Do not re-derive it. Lift every trust statement, vuln/non-vuln example,
and resource threshold directly into the matching section with a citation, tagged
(documented). Tagging something (inferred) that
SECURITY.mdalready states means the orient pass was skipped. - The output must be a strict superset. Nothing the existing document asserts about scope may be silently dropped, weakened, or contradicted. A claim you believe is wrong or stale becomes a §1.18 question, not a unilateral edit.
- Build a back-map — an appendix table "
SECURITY.mdstatement → threat-model §", one row per claim, proving coverage. - Raise the coexistence question in wave 1 — does the new document (a)
replace that section, (b) become the canonical model
SECURITY.mdlinks to, or (c) sit alongside? Resolve before publishing.
The same treatment applies to any artifact stating maintainer security policy in
the project's own voice: docs/security-model.md, a "Security Considerations"
section of an implemented RFC, a bug-bounty scope page, or a wiki page the issue
tracker cites when closing reports.
Output — orientation brief
Hand back to the orchestrator:
- Project-type classification — in-process library / CLI / daemon / network service / distributed system (drives whether roles split and whether §1.4 needs a diagram and §1.10 a Byzantine actor).
- Component-family table (draft of §1.2) — family, representative entry point, touches-outside-process?, in/out of model.
- Out-of-scope inventory (draft of §1.3) — shipped-but-unsupported code + reason.
- Mined maintainer positions — each tagged (documented, exact source), routed to its target section.
SECURITY.mdback-map + the coexistence question for wave 1.- Split recommendation — one model or several, with reason.
Everything not lifted from a document is a hypothesis for the surface pass and interview to confirm — leave it (inferred, QN) with the matching question ID, or (assumption, QN) where a conservative default is clearly safe.
Mine before you infer. Every fact you can attribute to a maintainer-authored
source (README, Javadoc/package-info, header comments, manpage, FAQ, changelog
rationale, issue rulings) is (documented) and does not escalate. The recon
pass is the cheapest place to convert would-be inferences into documented
claims; a draft that is mostly (inferred) usually means this mining was thin,
not that the project is genuinely undocumented. Where the docs verifiably make
no guarantee (no thread-safety statement, no resource bound), that absence is
itself (documented) — carry it forward as a §1.12 disclaimer, not an open
question.