datadog/map-threat-intel-coverage
> Analyze a threat-intel blog post or report against Stratus Red Team coverage. Extract cloud TTPs, classify each as Covered / Partial / Open issue / Not covered, produce a markdown coverage report, and suggest GitHub issue drafts for the gaps. Use when the user pastes a threat-intel URL (Microsoft, Mandiant, CrowdStrike, Unit 42, etc.) and asks for a coverage report, gap analysis, TTP extraction, or "what does Stratus cover from this report". Also use when given a local report file (.md, .txt, .pdf) or pasted text.
npx skills add https://github.com/DataDog/stratus-red-team --skill map-threat-intel-coverage
Turn a threat-intel article into a saved markdown coverage report plus a list of *suggested* (never auto-created) GitHub issue drafts for any uncovered cloud TTPs.
WebFetch with prompt "Return the full article text verbatim, including any IOC/TTP tables and section headings.".Read.Derive a short slug from the title/URL (e.g. storm-2949) for the output filename.
#, Phase (the source's narrative phase, not MITRE tactic), Technique, MITRE ATT&CK ID, Cloud/Surface, one-sentence What the attacker did. Preserve the order described by the source. Do not delegate this step to a subagent — the article is already in context.git rev-parse --show-toplevel if cwd isn't the repo root):ls docs/attack-techniques/{AWS,azure,GCP,entra-id,EKS,kubernetes}/ — note the inconsistent casing.v2/internal/attacktechniques/<platform>/<tactic>/<name>/main.go — directories here are all lowercase (aws, azure, eks, entra-id, gcp, k8s).The doc files give a one-paragraph description; the Go code shows the exact SDK calls and resources touched. When verifying a candidate match, the subagent must read the Go file to confirm — the doc alone can be ambiguous.
kind/new-technique issues.gh issue list --repo DataDog/stratus-red-team --state open --label kind/new-technique --limit 200 --json number,title,labels
references/matching-heuristics.md. Ask for a JSON array [{ttp_index, status, evidence_id, other_platforms, justification}, ...] where other_platforms is a list of {platform, technique_id} for same-concept techniques on other clouds (empty list if none). The subagent must:v2/internal/attacktechniques/<platform>/<tactic>/<name>/main.go to confirm the implementation actually matches the TTP — doc descriptions are sometimes vague.coverage-<slug>-<YYYY-MM-DD>.md in the current working directory. Print the absolute path.Not covered row using references/issue-template.md. Run the approval flow (below).A TTP is in scope if and only if the attacker action is performed against a cloud-provider control plane (AWS, Azure, GCP, Entra ID, M365 admin, Kubernetes / EKS API server). On-host / endpoint actions inside a VM, container, or workstation are out of scope, even when the host runs in the cloud.
IN (cloud control plane):
microsoft.web/sites/publishxml/action to retrieve publishing credentials (ARM API)169.254.169.254/metadata/identity/oauth2/token (cloud identity surface)OUT (endpoint / on-host):
wevtutil cl (host-level)kind/new-technique issue (cite #NNN).Other platforms column instead.Full rubric and worked examples: references/matching-heuristics.md.
# Coverage report: <Report title>
- **Source:** <URL or file path>
- **Published:** <date if known>
- **Analyzed:** <YYYY-MM-DD>
- **Scope:** Cloud / cloud-identity TTPs only
## Summary
- In-scope TTPs: N
- Covered: X · Partial: X · Open issue: X · Not covered: X
## Kill chain
<3–6 sentence prose summary in attacker order>
## Coverage table
| # | Phase | TTP | MITRE | Cloud | Status | Stratus reference | Other platforms | Notes |
- `Stratus reference` — for **Covered** / **Partial**, a markdown link to the technique page using `[<technique-id>](https://stratus-red-team.cloud/attack-techniques/<PLATFORM_DIR>/<technique-id>/)`. `<PLATFORM_DIR>` matches the docs directory casing (`AWS`, `azure`, `GCP`, `entra-id`, `EKS`, `kubernetes`). For **Open issue**, link `[#NNN](https://github.com/DataDog/stratus-red-team/issues/NNN)`. For **Not covered**, `—`.
Example: `[aws.credential-access.ec2-steal-instance-credentials](https://stratus-red-team.cloud/attack-techniques/AWS/aws.credential-access.ec2-steal-instance-credentials/)`
- `Other platforms` — same link format for same-concept techniques on other clouds, prefixed with the platform: e.g. `aws: [aws.credential-access.ec2-steal-instance-credentials](...)`. `—` if none. Informational only.
## Suggested new issues
### 1. New attack technique: <title>
**Labels:** `kind/new-technique`, `platform/<x>`, [`priority/seen-in-the-wild`]
<body using references/issue-template.md>
---
## Out of scope (endpoint-only)
- <TTP> — <one-line reason>
Issue title pattern, body template, and label rules: references/issue-template.md.
After saving the report, print a compact preview (numbered titles + labels), then ask the user via AskUserQuestion with four options:
gh issue create --repo DataDog/stratus-red-team (HEREDOC body to preserve markdown). Print each created URL.AskUserQuestion with Create / Skip / Edit-then-create.gh issue create without explicit user approval.kind/new-technique, platform/aws, platform/azure, platform/gcp, platform/entra-id, platform/eks, platform/k8s, priority/seen-in-the-wild.azure.execution.vm-run-command).Take datadog/map-threat-intel-coverage from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.