# 用户决策点协议

规范路径：`comet-classic/reference/decision-point.md`

本协议由所有包含用户决策点的 comet 子 skill 共享。凡标注为“阻塞点”或“用户决策点”的步骤，都必须按本协议处理。

## 先判断是否真的需要用户决策

区分用户决策点、自动处理与停止条件：

- **用户决策点**：存在两个或更多均合法、会改变范围、行为、风险承担或不可逆结果的选项，必须由用户选择
- **自动处理**：只有一个安全且在当前请求范围内的下一步，例如修复明确失败、补齐可验证状态、重试幂等检查或按已持久化配置继续；直接执行并报告，不得制造确认
- **停止条件**：依赖缺失、状态损坏、路径越界或外部命令不可用，导致当前没有合法下一步；报告阻塞原因和恢复条件，不得伪造选项
- **手动衔接**：`NEXT: manual` 只是交还控制权，不是新的用户决策点；输出 `HINT` 后结束当前调用，不再询问“是否继续”

只有第一类使用本协议。相邻且可同时回答的选择必须合并；已经持久化且仍有效的选择不得重复询问。不得因预判后续工具或操作可能失败而预检、推断或筛除选项。展示本工作流支持的全部选择；用户选择后执行对应动作，若失败则停止并报告原错误。若某字段只剩一个工作流合法值，说明原因后直接采用，不为它单独创建停顿点。

## 核心规则

- 决策点是阻塞点。到达决策点时必须暂停，等待用户明确选择后才能继续
- 存在 `AskUserQuestion` 时，使用它展示单选/多选选项；否则在对话中提出明确选项并等待用户回复
- 若无法使用 `AskUserQuestion`，则判定本会话结构化提问不可用；本会话后续决策点不得反复重试它，直接使用文本选项降级模式
- 不得用推荐规则、默认值、历史偏好或“用户应该会同意”的推断代替当前确认
- 用户明确选择前，不得写入对应状态字段、执行对应分支操作或自动继续下一阶段

## `AskUserQuestion` 优先策略

使用结构化提问时：

- 单选决策点用 `AskUserQuestion` 的单选问题；多选决策点用多选问题
- 选项必须携带简短标签和影响说明；推荐项只能作为说明，不能自动选择
- 若工具调用成功，等待用户通过该问题作答；不得同时再输出一套文本选项
- 若工具不存在或工具调用失败，记录“本会话结构化提问不可用”，然后进入文本选项降级模式

## 最低呈现要求

- 说明当前决策点正在决定什么
- 给出清晰可选项；需要用户单选时，选项必须互斥且可执行
- 文本降级模式必须明确写出“单选”或“多选”、编号选项、每项影响，并要求用户回复编号；随后停止流程，等待用户回复
- 如有推荐，只能作为说明，不能替代用户确认
- 用户选择后，再执行对应命令或状态更新
