名称: 预死亡分析 描述: 使用结构化风险分析在发生前识别失败模式 允许工具: [读取, 搜索, 全局, 任务, 询问用户问题, 待办事项写入]
预死亡分析
通过系统地质询计划、设计和实现,在失败模式发生前识别它们。基于Gary Klein的技术,由Shreyas Doshi(Stripe)推广。
用法
/预死亡分析 # 自动检测上下文,选择深度
/预死亡分析 快速 # 强制快速分析(计划、PR)
/预死亡分析 深度 # 强制深度分析(实现前)
/预死亡分析 <文件> # 分析特定计划或代码
核心理念
“想象现在是3个月后,这个项目已经灾难性地失败了。为什么会失败?”
风险类别(Shreyas框架)
| 类别 | 符号 | 含义 |
|---|---|---|
| 老虎 | [老虎] |
明显的威胁,如果不解决会伤害我们 |
| 纸老虎 | [纸老虎] |
看起来威胁但可能没问题 |
| 大象 | [大象] |
没人想谈论的事情 |
关键:标记前验证
不要仅基于模式匹配标记风险。 每个潜在老虎必须通过验证。
误报问题
常见错误导致误报老虎:
- 看到硬编码路径,但没有检查
if exists():后备 - 发现缺少功能X,但没有问"X是否在范围内?"
- 标记行N的代码,但没有读取行N±20的上下文
- 假设错误情况未处理,但没有跟踪代码
验证清单(必需)
标记任何老虎前,验证:
潜在发现:
什么: "行42处的硬编码路径"
验证:
上下文已读: true # 我是否阅读了发现周围±20行?
后备检查: true # 是否有try/except、if exists()或else分支?
范围检查: true # 这甚至在这段代码的范围内吗?
仅开发检查: true # 这是在__main__、tests/或仅开发代码中吗?
结果: 老虎 | 纸老虎 | 误报
如果任何验证检查为"否"或"未知",不要标记为老虎。
必需证据格式
每个老虎必须包括:
老虎:
风险: "<描述>"
位置: "file.py:42"
严重性: 高|中
# 必需 - 检查了什么缓解措施且未找到:
缓解措施已检查: "无exists()检查、无try/except、无后备分支"
如果无法用具体证据填写 mitigation_checked,则不是已验证老虎。
工作流程
步骤1:检测上下文与深度
# 基于上下文自动检测
if 在计划创建中:
深度 = "快速" # 局部范围
elif 实现前:
深度 = "深度" # 全局范围
elif PR审查中:
深度 = "快速" # 局部范围
else:
# 询问用户
询问用户问题(
问题="预死亡分析的深度是什么?",
标题="深度",
选项=[
{"标签": "快速(2-3分钟)", "描述": "计划、PR、局部变更"},
{"标签": "深度(5-10分钟)", "描述": "实现前、全局范围"}
]
)
步骤2:运行适当清单
快速清单(计划、PR)
心理上运行这些,记录任何适用项:
核心问题:
- 可能出错的最单一事情是什么?
- 任何可能失败的外部依赖?
- 如果中断,是否可能回滚?
- 测试中未覆盖的边缘情况?
- 可能引起返工的不清楚要求?
输出格式:
预死亡分析:
模式: 快速
上下文: "<正在分析的计划/PR>"
# 两遍过程:首先收集潜在风险,然后验证每个
潜在风险: # 第1遍:模式匹配发现
- "行42处的硬编码路径"
- "对X缺少错误处理"
# 第2遍:验证后
老虎:
- 风险: "<描述>"
位置: "file.py:42"
严重性: 高|中
类别: 依赖|集成|要求|测试
缓解措施已检查: "<未找到什么>" # 必需
大象:
- 风险: "<未说出的担忧>"
严重性: 中
纸老虎:
- 风险: "<看起来很可怕但没问题>"
原因: "<为什么它没问题 - 存在什么缓解措施>"
位置: "file.py:42-48" # 显示缓解位置
误报: # 发现结果证明是虚惊
- 发现: "<最初标记的>"
原因: "<为什么不是风险>"
深度清单(实现前)
系统地对每个类别工作:
技术风险:
- [ ] 可扩展性:在10倍/100倍当前负载下工作?
- [ ] 依赖:外部服务+后备定义?
- [ ] 数据:可用性、一致性、迁移清楚?
- [ ] 延迟:SLA要求将满足?
- [ ] 安全:认证、注入、OWASP考虑?
- [ ] 错误处理:所有失败模式覆盖?
集成风险:
- [ ] 破坏性变更识别?
- [ ] 迁移路径定义?
- [ ] 回滚策略存在?
- [ ] 需要功能标志?
过程风险:
- [ ] 要求清楚完整?
- [ ] 所有利益相关者输入收集?
- [ ] 技术债务跟踪?
- [ ] 维护负担理解?
测试风险:
- [ ] 覆盖差距识别?
- [ ] 集成测试计划存在?
- [ ] 需要负载测试?
- [ ] 手动测试计划定义?
输出格式:
预死亡分析:
模式: 深度
上下文: "<正在分析的实施>"
# 两遍过程
潜在风险: # 第1遍:初始扫描发现
- "外部API无断路器"
- "硬编码超时值"
# 第2遍:验证后(读取上下文,检查缓解措施)
老虎:
- 风险: "<描述>"
位置: "file.py:42"
严重性: 高|中
类别: 可扩展性|依赖|数据|安全|集成|测试
缓解措施已检查: "<寻找了什么缓解措施且未找到>"
建议修复: "<如何解决>"
大象:
- 风险: "<未说出的担忧>"
严重性: 中|高
建议修复: "<建议方法>"
纸老虎:
- 风险: "<看起来很可怕>"
原因: "<为什么它实际上没问题 - 引用缓解代码>"
位置: "file.py:45-52"
误报:
- 发现: "<初始担忧>"
原因: "<为什么验证显示不是风险>"
清单差距:
- 类别: "<哪个清单部分>"
失败项: ["<项1>", "<项2>"]
步骤3:通过询问用户问题呈现风险
阻塞: 呈现发现并要求用户决定。
# 构建风险摘要
风险摘要 = 格式化风险(老虎, 大象)
询问用户问题(
问题=f"""预死亡分析识别了{len(老虎)}个老虎,{len(大象)}个大象:
{风险摘要}
您想如何继续?""",
标题="风险",
选项=[
{
"标签": "接受风险并继续",
"描述": "已确认但不阻塞"
},
{
"标签": "向计划添加缓解措施(推荐)",
"描述": "在继续前更新计划包含风险缓解措施"
},
{
"标签": "研究缓解选项",
"描述": "我不知道如何缓解 - 帮我找解决方案"
},
{
"标签": "讨论特定风险",
"描述": "讨论具体担忧"
}
]
)
步骤4:处理用户响应
如果"接受风险并继续"
# 记录接受以进行审计追踪
print("风险已确认。继续实施。")
# 继续到下一工作流步骤
如果"向计划添加缓解措施"
# 用户提供缓解方法
# 用缓解部分更新计划文件
# 重新运行快速预死亡分析以验证缓解措施解决风险
如果"研究缓解选项"
# 为每个高严重性老虎生成并行研究
for 老虎 in 高严重性老虎:
# 内部:代码库之前如何处理这个?
任务(
子代理类型="侦察",
提示=f"""
找代码库之前如何处理:{老虎.类别}
特别寻找模式相关:{老虎.风险}
返回:
- 文件:行引用到类似解决方案
- 使用模式
- 可用库/工具
"""
)
# 外部:最佳实践是什么?
任务(
子代理类型="先知",
提示=f"""
研究最佳实践:{老虎.风险}
上下文:{老虎.类别}在{技术栈}代码库中
返回:
- 推荐方法(排名)
- 库选项
- 避免的常见陷阱
"""
)
# 等待研究完成
# 综合选项
# 通过询问用户问题呈现2-4个缓解选项
如果"讨论特定风险"
# 询问讨论哪个风险
询问用户问题(
问题="您想讨论哪个风险?",
标题="风险",
选项=[格式化风险选项(r) for r in 所有风险[:4]]
)
# 然后讨论特定风险
步骤5:更新计划(如果添加缓解措施)
如果用户添加了缓解措施,追加到计划:
## 风险缓解措施(预死亡分析)
### 已解决老虎:
1. **{风险}**(严重性:{严重性})
- 缓解措施:{用户或研究的缓解措施}
- 添加到阶段:{阶段号}
### 已接受风险:
1. **{风险}** - 接受因为:{原因}
### 预死亡分析运行:
- 日期:{时间戳}
- 模式:{快速|深度}
- 老虎:{计数}
- 大象:{计数}
集成点
在创建计划/计划代理中
计划结构批准后,退出计划模式前:
# 运行快速预死亡分析
/预死亡分析 快速
# 如果发现高风险,阻塞直到解决
# 如果只有中/低风险,通知并继续
计划批准后,实现前
# 在整个计划上运行深度预死亡分析
/预死亡分析 深度 想法/共享/计划/YYYY-MM-DD-功能.md
# 阻塞直到所有高风险老虎解决
在PR审查工作流中
# 在差异范围上运行快速预死亡分析
/预死亡分析 快速
# 通知任何发现风险
严重性阈值
| 严重性 | 阻塞? | 必需行动 |
|---|---|---|
| 高 | 是 | 必须解决或明确接受 |
| 中 | 否 | 通知用户,建议解决 |
| 低 | 否 | 注意意识 |
示例会话
用户: /预死亡分析 深度 想法/共享/计划/2026-01-08-api-rate-limiting.md
Claude: 在API限流计划上运行深度预死亡分析...
[根据深度清单审查计划]
预死亡分析完成。发现2个老虎,1个大象:
**老虎:**
1. [高] 外部支付API无断路器
- 类别:依赖
- 如果支付API慢/关闭,请求将堆积
2. [高] 无回滚策略定义
- 类别:集成
- 如果限流破坏认证流,无快速修复路径
**大象:**
1. [中] 团队之前未使用Redis
- 我们引入Redis用于限流计数器
- 学习曲线可能减缓实施
**纸老虎:**
1. 数据库迁移大小 - 只添加一个索引,<1秒迁移
[呈现询问用户问题]
用户: 研究缓解选项
Claude: 研究缓解措施...
[生成侦察+先知并行]
发现断路器3个选项:
1. **使用现有重试工具**(推荐)
- 在src/utils/retry.ts:45找到
- 已处理指数退避
- 只需添加断路器状态
2. **添加resilience4j-lite**
- 此模式流行库
- 更多功能但新依赖
3. **自定义实现**
- 完全控制但更多代码维护
断路器用哪种方法?
用户: 选项1 - 使用现有重试工具
Claude: 添加到计划:
## 风险缓解措施(预死亡分析)
### 已解决老虎:
1. **无断路器**(高)
- 缓解措施:用断路器状态扩展src/utils/retry.ts
- 添加到阶段1
还要解决回滚策略老虎吗?