Phase 8: Residual Risk Analysis
Objective
Assess what risk remains after all mitigations are applied. Make explicit risk acceptance decisions and document justifications.
Tools Reference
Review Tools
manage_threats(action="list", section="all") -- Get all threats and mitigations
manage_threats(action="get", section="threats", item_id=ID) -- Threat details and links
manage_threats(action="get", section="mitigations", item_id=ID) -- Mitigation details and links
Decision Tools
manage_threats(action="assess", section="threats", values=ASSESSMENT) -- Record one decision
manage_threats(action="assess", section="threats", items=ASSESSMENTS) -- Record an atomic batch
manage_assumptions(action="add", values=ASSUMPTION) -- Document risk acceptance
Risk Assessment Framework
For each threat, consider:
- Mitigations in place: What controls address this threat?
- Mitigation effectiveness: How well do the controls work?
- Residual likelihood: After controls, how likely is the threat?
- Residual impact: If it still occurs, what's the damage?
- Business tolerance: Can the business accept this level of risk?
An assessment contains threat_id, decision, residual_severity,
residual_likelihood, and a non-empty rationale. Severity and likelihood are
required except for Not Applicable.
Residual Risk Decisions
| Decision |
Criteria |
Threat Composer status |
Mitigated |
Controls reduce risk to the required level |
threatResolved |
Accepted |
The business formally accepts the remaining risk |
threatResolved |
Open |
Controls are absent or insufficient |
threatIdentified |
Not Applicable |
The scenario does not apply to this system |
threatResolvedNotUseful |
Decision Guide
Choose Mitigated when:
- Preventive controls fully address the threat vector
- Detective + corrective controls provide adequate response
- Code validation confirmed implementation
- Industry-standard controls are in place
Choose Not Applicable when:
- The threat scenario is unrealistic for this system
- The threat is blocked by architectural constraints
Choose Accepted when:
- The remaining severity and likelihood are understood
- The accountable business owner accepts that residual exposure
- The rationale records why no further control is required
Choose Open when:
- Controls are planned but not implemented
- Partial mitigation leaves significant residual risk
- No cost-effective mitigation exists yet
Workflow
- Call
manage_workflow(action="guidance", phase="8")
- Call
manage_threats(action="list", section="threats") to get the full inventory
- For each threat:
a. Call
manage_threats(action="get", section="threats", item_id=ID) to see linked mitigations
b. Assess residual risk considering mitigation effectiveness
c. Build an assessment with the decision, residual ratings, and rationale
- Save decisions atomically with
manage_threats(action="assess", section="threats", items=ASSESSMENTS)
- Document broader risk assumptions with
manage_assumptions(action="add", values=ASSUMPTION):
- "Risk of DDoS accepted: CDN and auto-scaling provide adequate protection"
- "SQL injection risk resolved: all database queries use parameterized statements"
- Review summary with
manage_threats(action="list", section="threats"); every assessment must show Assessment State: Current
Completion Criteria
Common Pitfalls
- Marking all threats as resolved without justification
- Not documenting WHY a risk is accepted
- Forgetting to consider combined/cascading risks
- Ignoring threats that lack mitigations
1---2name: phase-8-residual-risk3description: Phase 8 Residual Risk Analysis guide. Use when assessing remaining risk after mitigations and recording explicit risk decisions.4---56# Phase 8: Residual Risk Analysis78## Objective9Assess what risk remains after all mitigations are applied. Make explicit risk acceptance decisions and document justifications.1011## Tools Reference1213### Review Tools14- `manage_threats(action="list", section="all")` -- Get all threats and mitigations15- `manage_threats(action="get", section="threats", item_id=ID)` -- Threat details and links16- `manage_threats(action="get", section="mitigations", item_id=ID)` -- Mitigation details and links1718### Decision Tools19- `manage_threats(action="assess", section="threats", values=ASSESSMENT)` -- Record one decision20- `manage_threats(action="assess", section="threats", items=ASSESSMENTS)` -- Record an atomic batch21- `manage_assumptions(action="add", values=ASSUMPTION)` -- Document risk acceptance2223## Risk Assessment Framework2425For each threat, consider:26271. **Mitigations in place**: What controls address this threat?282. **Mitigation effectiveness**: How well do the controls work?293. **Residual likelihood**: After controls, how likely is the threat?304. **Residual impact**: If it still occurs, what's the damage?315. **Business tolerance**: Can the business accept this level of risk?3233An assessment contains `threat_id`, `decision`, `residual_severity`,34`residual_likelihood`, and a non-empty `rationale`. Severity and likelihood are35required except for `Not Applicable`.3637## Residual Risk Decisions3839| Decision | Criteria | Threat Composer status |40|---|---|---|41| `Mitigated` | Controls reduce risk to the required level | `threatResolved` |42| `Accepted` | The business formally accepts the remaining risk | `threatResolved` |43| `Open` | Controls are absent or insufficient | `threatIdentified` |44| `Not Applicable` | The scenario does not apply to this system | `threatResolvedNotUseful` |4546## Decision Guide4748### Choose `Mitigated` when:49- Preventive controls fully address the threat vector50- Detective + corrective controls provide adequate response51- Code validation confirmed implementation52- Industry-standard controls are in place5354### Choose `Not Applicable` when:55- The threat scenario is unrealistic for this system56- The threat is blocked by architectural constraints5758### Choose `Accepted` when:59- The remaining severity and likelihood are understood60- The accountable business owner accepts that residual exposure61- The rationale records why no further control is required6263### Choose `Open` when:64- Controls are planned but not implemented65- Partial mitigation leaves significant residual risk66- No cost-effective mitigation exists yet6768## Workflow69701. **Call `manage_workflow(action="guidance", phase="8")`**712. **Call `manage_threats(action="list", section="threats")`** to get the full inventory723. **For each threat**:73 a. Call `manage_threats(action="get", section="threats", item_id=ID)` to see linked mitigations74 b. Assess residual risk considering mitigation effectiveness75 c. Build an assessment with the decision, residual ratings, and rationale764. **Save decisions atomically** with `manage_threats(action="assess", section="threats", items=ASSESSMENTS)`775. **Document broader risk assumptions** with `manage_assumptions(action="add", values=ASSUMPTION)`:78 - "Risk of DDoS accepted: CDN and auto-scaling provide adequate protection"79 - "SQL injection risk resolved: all database queries use parameterized statements"806. **Review summary** with `manage_threats(action="list", section="threats")`; every assessment must show `Assessment State: Current`8182## Completion Criteria83- [ ] Every threat reviewed for residual risk84- [ ] Every threat has a current assessment with a decision and rationale85- [ ] Residual severity and likelihood recorded except for Not Applicable threats86- [ ] Risk acceptance assumptions documented with business justification87- [ ] No missing or stale assessments remain88- [ ] Call `manage_workflow(action="advance")` to proceed to Phase 98990## Common Pitfalls91- Marking all threats as resolved without justification92- Not documenting WHY a risk is accepted93- Forgetting to consider combined/cascading risks94- Ignoring threats that lack mitigations