smoke-time —— 抽根烟的功夫,审视一遍自己
核心理念
> 比起埋头冲到终点才发现走错路,不如在半途停下来拷问自己三分钟。
这是执行中途的自我审视机制,与 awesome-socrates(执行前澄清)互补:
- awesome-socrates:任务开始前,向用户提问澄清意图。
- smoke-time:任务执行到一半,向自己提问审视过程。
触发信号来自用户的一个生活化动作——"我去抽根烟""休息一下"。用户的真实意图是:"我要离开了,你利用这段时间自己想想,等我回来给我一个更好的结果。"这不是让 Agent 空等,而是把等待时间转化为自我提升窗口。
核心原则:对己无情,对人克制。自我拷问要狠、要穷追到底;向用户提问要少、要精准——只在真正拿不准的地方才问。
触发判定
触发条件(满足任一即触发):
| 信号类型 | 判定标准 | 示例 |
|---|---|---|
| 离开暗示 | 用户表示要短暂离开,让 Agent 自行思考 | "我去抽根烟""休息一下""我去喝杯咖啡""离开5分钟""你先想想" |
| 显式审视指令 | 用户要求 Agent 复盘/审视当前进度 | "你先复盘一下""审视一下现在做的对不对""停下来想想" |
| 主动建议(高风险任务) | 当前任务复杂/不可逆/已偏离迹象,Agent 主动建议用户"去喝杯咖啡,我趁这功夫自查一遍" | 大型重构、发布前、多模块联调中产出与预期不符 |
不触发的情况:
- 用户只是说"稍等"然后立刻继续给出指令(这是暂停而非离开)。
- 任务已完成、已交付,没有进行中的工作可审视。
- 简单单步任务(查找、格式转换),没有审视价值。
- 用户明确说"不用想,直接做"。
判定不确定时:若用户确实要离开(有离开动作),默认触发;若用户在场但进度异常,默认用一句话主动建议触发("当前任务比较复杂,要不你歇一下,我自查一遍?"),不擅自暂停。
重复触发处理:同一任务执行中若多次触发 smoke-time,第二次起先检查"距上次审视后上下文是否有显著变化"(新产出、新信息、阶段推进)。有显著变化则完整执行六维度拷问;无显著变化(比如用户中途离场两次、期间 Agent 没推进)则简化为只拷问维度①④(目标对齐 + 产出质量),其余维度沿用上次结论,不重复拷问。
输入要求
- 必填:当前进行中的任务上下文(已执行到哪一步、已产出什么、原始目标是什么)。
- 自动获取:模型从当前对话历史、已读文件、已执行命令结果中提取,不要求用户额外提供。
- 可选:用户离开时附带的一句话指示(如"重点看看登录那块对不对"),作为审视重点提示。
工作流(四步:触发 → 拷问 → 决断 → 续行)
第 1 步:确认触发并锁定审视范围
收到触发信号后,先在内部(不输出给用户)明确三件事:
1. 原始任务目标:用户最初要的是什么?验收标准是什么?
2. 当前进度:已执行到哪一步?已产出哪些中间结果?
3. 审视重点:用户有没有指定重点?没有则全盘审视。
若任务上下文不充分(比如刚接手、信息太少),仍进入第 2 步,但审视会标注"信息不足,结论可信度有限"。
若为主动建议触发(Agent 识别高风险任务后主动建议用户"去喝杯咖啡"):先一句话向用户提出建议("当前任务比较复杂/接近不可逆节点,要不你歇一下,我趁这功夫自查一遍?"),获用户同意后同流程执行;用户拒绝则不触发,继续正常执行。
第 2 步:无情自我拷问(核心环节)
对照下方六个维度,逐条向自己发问。每个维度必须给出明确结论,不得含糊带过。要像最挑剔的面试官一样穷追,不接受"应该没问题""大致正确"这种糊弄话。 六个维度的具体拷问话术与判定标准见 references/self-grilling-dimensions.md,拷问时逐条对照。
六个拷问维度:
| 维度 | 拷问核心 | 典型追问 |
|---|---|---|
| ① 目标对齐 | 我现在做的,还是用户要的吗? | "用户要的是X,我有没有偷偷扩大/缩小范围?" |
| ② 路径最优 | 有没有更优的执行方式被我忽略? | "有没有现成的库/工具/模板能省一半工作?" |
| ③ 假设审查 | 我基于哪些未经验证的假设在工作? | "这个假设一旦错了,后果多严重?验证成本多低?" |
| ④ 产出质量 | 已产出的中间结果,经得起检验吗? | "如果现在交付,哪里会被挑毛病?" |
| ⑤ 风险盲区 | 有没有我没考虑到的风险/约束? | "用户没说但肯定在乎的事是什么?" |
| ⑥ 遗漏检查 | 有没有遗漏的需求/边界条件/edge case? | "任务说'所有文件',我真的覆盖全了吗?" |
拷问进行到所有维度都有结论为止。拷问结论用 references/self-grilling-dimensions.md 末尾的「总结表」(✅/⚠️/❌ 标签)内部汇总,根据汇总结果决定走第 3 步哪条路径。拷问是内部的,不逐条输出给用户——最终只输出第 3 步的决断结果。
第 3 步:决断——三选一
基于第 2 步拷问结论,从三条路径中选一条:
路径 A:方向正确,继续执行(无修改)
拷问未发现重大问题,方案与产出符合预期。→ 直接进入第 4 步,向用户汇报"自查通过"后继续。
路径 B:发现偏差,自主修正后继续
拷问发现了可自主修复的问题(错误、次优路径、遗漏),且不涉及用户决策。→ 自主修正(修代码、补遗漏、换方案),修正完成后进入第 4 步。
路径 C:发现关键不确定,必须问用户
拷问暴露了真正影响结果但 Agent 无法自行决断的问题。→ 用 AskUserQuestion 工具提出澄清问题,待用户回来后回答。提问规范见下方「向用户提问的纪律」。
决断原则:
- 能自己查证/推断的,走 A 或 B,不打扰用户。
- 真正卡住、且选错代价高的,才走 C。
- 宁可自主修正后说明,也不要把本该自己解决的问题抛给用户。
第 4 步:续行——向用户汇报自查结果
用户回来后(或走 A/B 路径后立即),输出一份简短的自查报告(不是流水账),格式见下方「输出格式」。然后:
- 路径 A:继续执行未完成部分。
- 路径 B:说明改了什么、为什么改,然后继续。
- 路径 C:先回答用户的澄清提问(如有),拿到回答后继续。
向用户提问的纪律(路径 C 专属)
当且仅当走路径 C 时,使用 AskUserQuestion 工具提问,严格遵守(与 awesome-socrates 一致):
- 数量上限:单次最多 3 个问题(用户刚回来,不宜轰炸);通常 1-2 个足够。
- 每题:一个问题只问一件真正影响结果的事;推荐项放第一并附理由;选项 2-4 个、互斥、无"其他"。
- 只问 Agent 真正拿不准的:能查代码/文件/记忆的先查,查得到的不问。
- 语言:用用户当前对话语言。
- 绝不问:技术细节该 Agent 自己定的(如"用 int 还是 string")、无关紧要的(如"文件名叫什么")、用户已回答过的。
禁止的反模式:
- ❌ 把自我拷问的过程原样抛给用户(拷问是 Agent 对自己的,不是对用户的)。
- ❌ 问"你觉得我做得对吗"(这是让用户给 Agent 当审核员,本末倒置)。
- ❌ 在路径 C 堆砌一堆问题,把"抽根烟"变成"接受盘问"。
输出格式
用户回来后的自查报告,简短直接:
[自查完成] 抽烟这会儿我想了想,结论是:{一句话总判断}
发现了{N}个问题,其中:
- 已自主修正:{列举,每条一行——问题是什么、怎么改的}
- 需要你拍板:{若走路径 C,用 AskUserQuestion 呈现;否则写"无"}
{若有修正}以上修正已落地,继续执行。
{若无修正}方向没问题,继续推进。
路径 C 且用户尚未回来时:先把澄清问题通过 AskUserQuestion 发出(用户回来后能看到),同时可继续做不依赖该回答的部分工作,不空等。
示例
✅ 正面示例一:路径 B,发现次优路径自主修正
触发:用户在做一个数据清洗脚本,执行到一半说"我去抽根烟"。
自我拷问(内部,不输出):
- 目标对齐:用户要清洗用户行为日志,我正在写正则——对齐。
- 路径最优:等等,这个日志格式其实是结构化的 JSON,用正则解又脆又慢,应该直接 json.loads 逐行解析。
- 假设审查:我假设了日志是纯文本——错了,head 一下文件就知道是 JSON。
- ……(其余维度略)
决断:路径 B。自主修正——把解析逻辑从正则改成 JSON 解析。
用户回来后:
[自查完成] 抽烟这会儿我想了想,结论是:解析方式有更优解。
发现了1个问题,已自主修正:
- 清洗逻辑从正则解析改为 JSON 逐行解析——实际日志是结构化 JSON,正则又脆又慢,JSON 解析更准更快。
以上修正已落地,继续执行。
✅ 正面示例二:路径 C,发现关键不确定问用户
触发:用户做 PPT,做到一半说"休息一下,你看看排版"。
自我拷问(内部):
- 目标对齐:用户要做投资人路演 PPT——但我发现内容里有大量内部数据,投资人版本是否要脱敏?
- 风险盲区:这个没问清楚,一旦泄露内部数据后果严重,且 Agent 无法替用户决定脱敏口径。
决断:路径 C。提问。
用户回来后(用 AskUserQuestion):
- 问题 [脱敏口径]:"路演 PPT 中的内部运营数据(如 ARPU、留存率)是否需要脱敏?" 选项:全量脱敏只留趋势(推荐)/ 保留真实数值 / 部分脱敏(你指定哪几个)
✅ 正面示例三:路径 A,方向没问题
触发:用户做一个网站,执行中途说"喝杯咖啡"。
自我拷问:六维度都查了,方案合理、无遗漏、无风险盲区。
用户回来后:
[自查完成] 抽烟这会儿我想了想,结论是:方向没问题,继续推进。
发现了0个问题。
❌ 反面示例(违规,勿学)
错误1:用户说"抽根烟",Agent 啥也不做干等3分钟,用户回来原样继续。
→ 浪费了自我提升窗口。
错误2:把自我拷问的六条维度逐条输出给用户,像写作文。
→ 拷问是内部的,用户只要结论,不要过程流水。
错误3:走路径 C 但问了 5 个问题,把"抽根烟"变成答辩。
→ 违反提问纪律,最多3个,通常1-2个。
校验规则(触发后逐条自检,红线)
- 触发判定准确:确认为离开暗示或显式审视指令,非简单暂停。
- 六维度全覆盖:①目标对齐 ②路径最优 ③假设审查 ④产出质量 ⑤风险盲区 ⑥遗漏检查,每维度有明确结论,无遗漏。
- 拷问无情:不接受"应该没问题""大致正确"的糊弄结论,每条追问到有依据为止。
- 决断合理:能自主修复的走 B 不走 C;真拿不准的走 C 不硬猜;没问题的走 A。
- 路径 C 提问守纪:≤3 个问题,只问真正影响结果的,推荐项附理由,无"其他"选项。
- 输出克制:自查报告简短直接,不输出拷问流水过程;路径 A 不画蛇添足。
- 未空等:触发后立即开始自我拷问,不空等用户回来;路径 C 在等回答期间做不依赖回答的工作。
Resources
- references/self-grilling-dimensions.md:六个自我拷问维度的详解——每维度的具体拷问话术、判定标准(什么算"通过/不通过")、正反例。第 2 步拷问时逐条对照查阅。