Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Threat modeling and attack surface analysis. Use when assessing security boundaries, modeling threat actors, or generating threat scenarios.
.claude/skills/hashgraph-online-threat-model/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-13 | ✗→✓ | ▲ Improved | -39% | 0% |
| case-16 | ✗→✓ | ▲ Improved | 2% | 0% |
| case-19 | ✗→✓ | ▲ Improved | 1% | 0% |
| case-22 | ✓→✗ | ▼ Worse | 160% | 0% |
| case-11 | ✓→✓ | = Same ✓ | 41% | 0% |
Every system has an attack surface. If you haven't identified it, you haven't secured it.
Check for .harness/engagement.md in the project root. If present, load the scope (in-scope/out-of-scope) and constraints. Skip threat modeling for explicitly out-of-scope components.
Without engagement context, proceed with full-surface analysis.
Map every boundary where data crosses a trust level:
For each boundary, document:
| Actor | Motivation | Capability | Target | |-------|-----------|------------|--------| | Anonymous user | Exploration | Low | Public endpoints | | Authenticated user | Data access | Medium | Own data + IDOR targets | | Malicious insider | Data exfiltration | High | All internal systems | | Compromised dependency | Supply chain | Variable | Build/deploy pipeline |
For each trust boundary × threat actor combination, generate:
Write THREAT_MODEL.md:
markdown# Threat Model — {project} ## Scope - In-scope: {from engagement.md or full codebase} - Out-of-scope: {from engagement.md or none} - Date: {ISO date} ## Trust Boundaries | # | Boundary | Direction | Validation | Auth | Encryption | |---|----------|-----------|------------|------|------------| | 1 | ... | ... | ... | ... | ... | ## Threat Scenarios | ID | Boundary | Actor | Vector | Impact | Likelihood | Mitigated | Gap | |----|----------|-------|--------|--------|------------|-----------|-----| | T1 | ... | ... | ... | ... | ... | Partial | ... | ## Priority Remediation 1. [CRITICAL] {highest risk gap} 2. [HIGH] {next gap} 3. [MEDIUM] {remaining gaps} ## Assumptions - {list all assumptions made during analysis}
After producing the threat model, suggest: "Run /vuln-scan to validate threat scenarios against the codebase."
| Excuse | Rebuttal | What to do instead | |--------|----------|-------------------| | "We don't have any external-facing components" | Internal trust boundaries are attack surfaces too. Lateral movement starts inside. | Model internal boundaries with the same rigor. | | "Threat modeling is overkill for a small project" | Small projects get breached too. The model is proportional to the codebase. | Run the process. It takes 10 minutes. A breach takes months. | | "We already have a threat model" | Threat models expire. Every code change can invalidate assumptions. | Update the model when significant changes land. | | "The framework handles security" | Frameworks don't model YOUR business logic threats. | Add application-layer threat scenarios on top of framework defaults. |
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-11 | pass→pass | 11,883 | 13,232 | +11% | 1 | 1 | 0% | 1,529 | 2,156 | +41% | 0 | 0 | — |
case-01 | fail→fail | 32,303 | 31,401 | -3% | 1 | 1 | 0% | 3,803 | 3,222 | -15% | 0 | 0 | — |
case-02 | fail→fail | 63,708 | 21,071 | -67% | 1 | 1 | 0% | 5,159 | 3,439 | -33% | 0 | 0 | — |
case-03 | fail→fail | 51,514 | 43,293 | -16% | 1 | 1 | 0% | 8,244 | 3,987 | -52% | 0 | 0 | — |
case-04 | pass→pass | 18,105 | 18,831 | +4% | 1 | 1 | 0% | 1,716 | 2,947 | +72% | 0 | 0 | — |
case-05 | pass→pass | 15,747 | 7,953 | -49% | 1 | 1 | 0% | 2,002 | 2,180 | +9% | 0 | 0 | — |
case-06 | pass→pass | 13,015 | 5,618 | -57% | 1 | 1 | 0% | 1,706 | 1,768 | +4% | 0 | 0 | — |
case-07 | pass→pass | 18,170 | 11,736 | -35% | 1 | 1 | 0% | 2,038 | 2,780 | +36% | 0 | 0 | — |
case-08 | pass→pass | 23,761 | 14,409 | -39% | 1 | 1 | 0% | 2,551 | 2,913 | +14% | 0 | 0 | — |
case-09 | pass→pass | 16,669 | 16,700 | +0% | 1 | 1 | 0% | 1,842 | 2,683 | +46% | 0 | 0 | — |
case-10 | pass→pass | 20,591 | 9,575 | -53% | 1 | 1 | 0% | 2,291 | 2,237 | -2% | 0 | 0 | — |
case-12 | pass→pass | 20,340 | 13,845 | -32% | 1 | 1 | 0% | 2,444 | 3,171 | +30% | 0 | 0 | — |
case-13 | fail→pass | 19,620 | 2,085 | -89% | 1 | 1 | 0% | 2,090 | 1,268 | -39% | 0 | 0 | — |
case-14 | pass→pass | 11,241 | 10,437 | -7% | 1 | 1 | 0% | 1,613 | 1,625 | +1% | 0 | 0 | — |
case-15 | pass→pass | 17,919 | 5,449 | -70% | 1 | 1 | 0% | 2,122 | 1,960 | -8% | 0 | 0 | — |
case-21 | pass→pass | 23,362 | 26,325 | +13% | 1 | 1 | 0% | 3,612 | 4,495 | +24% | 0 | 0 | — |
case-16 | fail→pass | 15,945 | 15,437 | -3% | 1 | 1 | 0% | 2,599 | 2,654 | +2% | 0 | 0 | — |
case-17 | pass→pass | 22,904 | 15,978 | -30% | 1 | 1 | 0% | 2,390 | 3,525 | +47% | 0 | 0 | — |
case-18 | pass→pass | 25,291 | 20,601 | -19% | 1 | 1 | 0% | 3,123 | 3,320 | +6% | 0 | 0 | — |
case-19 | fail→pass | 15,853 | 8,083 | -49% | 1 | 1 | 0% | 2,217 | 2,230 | +1% | 0 | 0 | — |
case-20 | pass→pass | 20,603 | 37,899 | +84% | 1 | 1 | 0% | 3,226 | 6,223 | +93% | 0 | 0 | — |
case-22 | pass→fail | 8,377 | 26,385 | +215% | 1 | 1 | 0% | 1,557 | 4,045 | +160% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +9 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.