Commit 2c65563acd5ab577c5b769d0ce0db872c45a6193

Authored by yibo
1 parent 77e18677

fix(p3b): W11 收尾——base agent 的提示词不再骗它自己;自动模式真跑记录

## W11 最后一块:agent 侧的假承诺

方案 (b) 此前只把 agent-chat.js 的空转喊出来了 —— 那是喊给**运维**听的。
而 agent 读的是 system/templates/base/agent.md,那一侧还写着:

- 开场「你当前默认只被挂载了 meta-research 这个元技能」—— 那个包不存在,没挂载过
- 阶段三「*系统给你换上 meta-execute 技能时,你才会拥有修改核心文件的破坏性权限*」
  —— **纯假承诺**:权限自始至终由 config.json 的 cli.toolPolicy 决定,与 phase 无关,
  而 base/config.json 从 RESEARCH 第一秒就给了 bash 与 str_replace

**一个以为自己被拦着的 agent,比知道没人拦它的 agent 更危险。**

改成如实表述:开场加一段说明「技能包不存在、换装不会发生、权限全程不变、
四段式真正给的是上下文隔离而不是权限隔离」;三处「换上 X 技能」改成
「记忆已清空,你手上只有 <artifact>」;阶段三那句改成「写入权限从第一阶段起
就没变过 —— 前三步不落盘是纪律要求,不是系统给你的限制」。

至此 (b) 才算闭合:运维侧有告警、agent 侧不再被误导、文档侧记清了根因。

## 自动模式真跑:跑出一个结构性缺口

关看门狗后自动模式接管(pause → start{mode:auto},运行中的 run 要先暂停才能切模式),
它自己把 brd 之后的节点接上跑。结果:

- brd → success(产出 brd.md + contract.json)
- prd → **fail(impl_bug)**,run 收敛 blocked,预算 calls 3/100 tokens 52,096
- worktree 零污染(与跑前逐行一致)

prd 自己的归因说清了原因,而且是对的:**它拿不到上游的产出**。
brd 的 brd.md / contract.json 躺在**它自己的私有目录**里,
而共享区 artifacts/ 只有 project-root.json 与 task-goal.json ——
同一张 work graph 内部**上游→下游没有任何数据通路**。

这不是引擎 bug,是 §四.A.5 设计里只做了「跨 org node 走 artifacts/ 共享区」,
没做「同图内相邻节点怎么把 contract 交出去」:CONVENTIONS §12 的隔离原则是
「下游只能看到上游的契约、看不到实现」,但契约被写进了私有目录,
下游同样读不到;而写 artifacts/ 是只给验收契约产出者的特权动作。

W12 补完在这一轮同时得到验证:fail_reason=impl_bug 落库,概览 tab 显示
「[归因产出] impl_bug」+ 完整 remediation_note,不再是「失败、无原因」。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
docs/todo/system-design/27-p3b-real-run-runway.md
@@ -689,6 +689,30 @@ agent 路径解析错误留下的**历史目录**,说明它确实会往意想 @@ -689,6 +689,30 @@ agent 路径解析错误留下的**历史目录**,说明它确实会往意想
689 **`bash` 和 `str_replace` 从 RESEARCH 第一秒就在手上**。所以「RESEARCH 阶段照样能写文件」 689 **`bash` 和 `str_replace` 从 RESEARCH 第一秒就在手上**。所以「RESEARCH 阶段照样能写文件」
690 的成因是 `config.json` 直接给全了工具,**不是**技能包缺失。 690 的成因是 `config.json` 直接给全了工具,**不是**技能包缺失。
691 691
  692 +**收尾补一处:agent 自己的提示词还在骗它自己(2026-08-17)**
  693 +
  694 +上面查清了「技能包改不了权限」,但 `system/templates/base/agent.md` **仍然在对 agent 本人**
  695 +写着这三句:
  696 +
  697 +- 开场「你当前默认只被挂载了 `meta-research` 这个元技能」—— 那个包不存在,没挂载过;
  698 +- 阶段三「*系统给你换上 `meta-execute` 技能时,你才会拥有修改核心文件的破坏性权限*」
  699 + —— **这是纯假承诺**,权限自始至终由 `config.json` 决定,与 phase 无关;
  700 +- 阶段一/二「给你换上 Plan 技能」—— 同上。
  701 +
  702 +方案 (b) 的本意是「如实降级」,只把 `agent-chat.js` 的空转喊出来是喊给**运维**听的;
  703 +agent 读的是 `agent.md`,那一侧不改,模型就会继续以为「前三阶段我写不动文件」——
  704 +而它其实从第一秒就握着 `bash` 和 `str_replace`。**一个以为自己被拦着的 agent,
  705 +比知道没人拦它的 agent 更危险。**
  706 +
  707 +已改成如实表述:开场加一段⚠️说明「技能包不存在、换装不会发生、权限全程不变、
  708 +四段式真正给的是**上下文隔离**而不是权限隔离」,并把三处「换上 X 技能」改成
  709 +「记忆已清空,你手上只有 <artifact>」。阶段三那句改成
  710 +「你的写入权限从第一阶段起就没变过 —— 『前三步不落盘』是纪律要求,不是系统给你的限制」。
  711 +
  712 +至此 W11 的 (b) 才算真的闭合:**运维侧有告警、agent 侧不再被误导、文档侧记清了根因**。
  713 +真要落地按阶段收权限,见 27-P3/P4 §九bis 的结论(必须让 `transition` 同期改写生效中的
  714 +`toolPolicy`,且它与「四段式改写成引擎上的标准图模板」是同一件事的两半)。
  715 +
692 结论:走 (a) 会造出一个**比现状更危险的状态** —— 四个文件躺着、日志说「已切换」、文档可以打勾, 716 结论:走 (a) 会造出一个**比现状更危险的状态** —— 四个文件躺着、日志说「已切换」、文档可以打勾,
693 而权限闸门一如既往地开着。这正是 T9 那次「落地了降级却既没核实也没回改文档」的同型。 717 而权限闸门一如既往地开着。这正是 T9 那次「落地了降级却既没核实也没回改文档」的同型。
694 真要落地阶段化权限,必须让 `transition` 同时按 phase 改写生效中的 `toolPolicy`, 718 真要落地阶段化权限,必须让 `transition` 同时按 phase 改写生效中的 `toolPolicy`,
system/templates/base/agent.md
@@ -5,23 +5,32 @@ @@ -5,23 +5,32 @@
5 在你收到上级派发的任何 Task 时,你绝对不能“一气呵成、随地大小写代码或写产出”。你被赋予了严厉的生命周期“四段式法则”:`Research` -> `Plan` -> `Execute` -> `Verify`。 5 在你收到上级派发的任何 Task 时,你绝对不能“一气呵成、随地大小写代码或写产出”。你被赋予了严厉的生命周期“四段式法则”:`Research` -> `Plan` -> `Execute` -> `Verify`。
6 6
7 ## 强制执行回路 (Task Lifecycle Paradigm) 7 ## 强制执行回路 (Task Lifecycle Paradigm)
8 -你当前默认只被挂载了 **`meta-research`** 这个元技能,你必须依靠自己主动呼叫状态机工具来切换你的脑子和技能包。请严格按照下述单节点法则推进你的干活流程: 8 +你必须依靠自己主动呼叫状态机工具来推进阶段 —— 每次流转会**清空你的对话记忆**,
  9 +只把你上一阶段的产出文件(artifact)作为新起点交回给你。请严格按下述单节点法则推进:
  10 +
  11 +> ⚠️ **关于「换技能包」**:流转时系统会尝试挂载 `meta-<阶段>` 元技能,但**该技能包目前不存在**
  12 +> (`system/skills/` 尚未落地),所以换装这一步不会发生,只会打一条告警。
  13 +> 你的工具权限**全程不随阶段变化** —— 它由你自己 `config.json` 里的 `cli.toolPolicy`
  14 +> 在会话建立时一次性决定。四段式真正给你的保障是**上下文隔离**,不是权限隔离。
  15 +> 所以「到了 EXECUTE 才动手」是要你自己守的纪律,没有任何机制会替你拦住。
9 16
10 ### 阶段一:RESEARCH(调研)->你当前所处的阶段! 17 ### 阶段一:RESEARCH(调研)->你当前所处的阶段!
11 1. **不要猜测,去寻找**:动用一切读取工具看懂上级给你的任务,去硬盘里找背景文件。 18 1. **不要猜测,去寻找**:动用一切读取工具看懂上级给你的任务,去硬盘里找背景文件。
12 -3. **斩断记忆(Context Flush)**:写完后,运行 `node bin/lemon.js task transition --agentId <你自己ID> --phase plan --artifact 你的_research.md路径`。**绝不要自己在当前对话里直接去出规划!必须呼叫此命令行让系统清空你的记忆并给你换上 Plan 技能!** 19 +3. **斩断记忆(Context Flush)**:写完后,运行 `node bin/lemon.js task transition --agentId <你自己ID> --phase plan --artifact 你的_research.md路径`。**绝不要自己在当前对话里直接去出规划!必须呼叫此命令行让系统清空你的记忆、
  20 +并把 `_research.md` 作为唯一起点交回给你。**
13 21
14 ### 阶段二:PLAN(规划) 22 ### 阶段二:PLAN(规划)
15 -*(当你成功跳过防线来到这里时,你将失去 `meta-research`,获得 `meta-plan`)* 23 +*(上一阶段的记忆已被清空,你手上只有 `_research.md`)*
16 1. 读你的 `_research.md`。 24 1. 读你的 `_research.md`。
17 3. 运行 `node bin/lemon.js task transition --agentId <你自己ID> --phase execute --artifact 你的_plan.md路径`。 25 3. 运行 `node bin/lemon.js task transition --agentId <你自己ID> --phase execute --artifact 你的_plan.md路径`。
18 26
19 ### 阶段三:EXECUTE(执行) 27 ### 阶段三:EXECUTE(执行)
20 -*(系统给你换上 `meta-execute` 技能时,你才会拥有修改核心文件的破坏性权限)* 28 +*(记忆再次清空,你手上只有 `_plan.md`。**注意**:你的写入权限从第一阶段起就没变过 ——
  29 +「前三步不落盘、只有到这里才动手」是纪律要求,不是系统给你的限制)*
21 2. 运行 `node bin/lemon.js task transition --agentId <你自己ID> --phase verify`。 30 2. 运行 `node bin/lemon.js task transition --agentId <你自己ID> --phase verify`。
22 31
23 ### 阶段四:VERIFY(验证) 32 ### 阶段四:VERIFY(验证)
24 -*(系统给你换上 `meta-verify` 技能,你的任务是自己检测自己跑的代码或跑分)* 33 +*(记忆清空,你的任务是自己检测自己跑的代码或跑分)*
25 1. 如果失败,将原因定入本地 `_lessons.md`,用工具打回上一阶段。 34 1. 如果失败,将原因定入本地 `_lessons.md`,用工具打回上一阶段。
26 2. 如果确信真的 PASS,才可以向上级(老板)调用归档终结命令 `report_task({status: "PASS"})`。 35 2. 如果确信真的 PASS,才可以向上级(老板)调用归档终结命令 `report_task({status: "PASS"})`。
27 36