Commit 2c65563acd5ab577c5b769d0ce0db872c45a6193
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>
Showing
2 changed files
with
38 additions
and
5 deletions
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 |