Commit ec17c8ff69c1fb7e12fa73ed85154e006a635ff1

Authored by yibo
1 parent 364cc3dc

docs(35): 复盘结论 + 改进方案提案,未拍板

用户问"任务结果差是 agent 能力、架构、还是 graph workflow 问题",这份文档是
书面复盘:按发生顺序分四类——图/模板设计缺陷(31/33 号,已修)、招聘装配可靠性
bug(32 号已知问题的新样本)、一个复盘时新发现的架构缺口(missingBodyDefinition
完整性闸门只在招聘路径上调用,graph-engine.js 的执行核心路径 advanceOne 一次
都没查,本体不完整时没有第二道防线,静默拿空提示词跑真实 LLM)、agent 能力
(不是问题,两次订正过"没工具做不到"的误判,且有正面即兴发挥的例子)。

结论:主要是架构问题 + 一个具体可靠性 bug,不是模型能力问题。

提出两档改进方案供讨论:
  低成本(建议直接做)——把完整性闸门接进图执行前置检查(提案 A)、
    控制台展示验收证据可见性(提案 B,纯 UI 不改行为)
  大改动(建议先讨论优先级)——标准化视觉验收工具(提案 C)、
    引擎级证据闸门(提案 D)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
docs/README.md
@@ -49,6 +49,7 @@ Graph Agent 架构重构(27 系列)。**已完成的阶段文档已移入 `d @@ -49,6 +49,7 @@ Graph Agent 架构重构(27 系列)。**已完成的阶段文档已移入 `d
49 | [29-dream-design.md](./todo/system-design/29-dream-design.md) | **dream(经验汇流)**— ✅ 已实现。定时整理所有 agent 在所有公司的记忆,提炼后跨公司沉淀(不泄漏公司信息)。四条取舍已拍板并实现:去敏独立判定、四落点分层写入(经验/`SKILL.md`/`soul.md`/`agent.md`,受管区块+三道闸门)、每日定时(串行+空转保护)、引用真伪自动查、REST+控制台入口(`/api/dream/*`、`/dream`)。`innovator-evolver` 真 CLI 跑通一次。**仍缺的**:「结论对不对」只能人抽查;「套进 org/work graph 来跑」评估后用户选了不做(作用域不匹配,见文内 §5.7) | 49 | [29-dream-design.md](./todo/system-design/29-dream-design.md) | **dream(经验汇流)**— ✅ 已实现。定时整理所有 agent 在所有公司的记忆,提炼后跨公司沉淀(不泄漏公司信息)。四条取舍已拍板并实现:去敏独立判定、四落点分层写入(经验/`SKILL.md`/`soul.md`/`agent.md`,受管区块+三道闸门)、每日定时(串行+空转保护)、引用真伪自动查、REST+控制台入口(`/api/dream/*`、`/dream`)。`innovator-evolver` 真 CLI 跑通一次。**仍缺的**:「结论对不对」只能人抽查;「套进 org/work graph 来跑」评估后用户选了不做(作用域不匹配,见文内 §5.7) |
50 | [30-task-delegation-reliability-gaps.md](./todo/system-design/30-task-delegation-reliability-gaps.md) | **任务委派可靠性现状**— 📝 调研记录,非设计方案。DevLoop `runUnit`、Company 招聘装配、Graph 执行三条链路核对结论一致:都是「失败预算耗尽 → 停等人工」,没有「卡住了主动通知人」这一层;DevLoop 当前还默认走 mock,真实 CLI 成功率无实证数据 | 50 | [30-task-delegation-reliability-gaps.md](./todo/system-design/30-task-delegation-reliability-gaps.md) | **任务委派可靠性现状**— 📝 调研记录,非设计方案。DevLoop `runUnit`、Company 招聘装配、Graph 执行三条链路核对结论一致:都是「失败预算耗尽 → 停等人工」,没有「卡住了主动通知人」这一层;DevLoop 当前还默认走 mock,真实 CLI 成功率无实证数据 |
51 | [31-work-graph-fail-fallback-coverage.md](./todo/system-design/31-work-graph-fail-fallback-coverage.md) | work graph 兜底边覆盖不全 — ✅ 已完成(除入口节点外强制兜底边,`planner.json`/`executor-fanout.json` 补 6 条边),978/978 单测通过;2026-08-21 又用真实 LLM 起了一条新任务做端到端回归验证,`org-planner-sdd` 自判失败后自动打回 `org-planner-prd`(3 次,零人工介入),修复确认生效 | 51 | [31-work-graph-fail-fallback-coverage.md](./todo/system-design/31-work-graph-fail-fallback-coverage.md) | work graph 兜底边覆盖不全 — ✅ 已完成(除入口节点外强制兜底边,`planner.json`/`executor-fanout.json` 补 6 条边),978/978 单测通过;2026-08-21 又用真实 LLM 起了一条新任务做端到端回归验证,`org-planner-sdd` 自判失败后自动打回 `org-planner-prd`(3 次,零人工介入),修复确认生效 |
  52 +| [35-validation-rigor-and-body-readiness-proposal.md](./todo/system-design/35-validation-rigor-and-body-readiness-proposal.md) | 📝 **复盘 + 改进方案,未拍板**。承接 31/32/33/34 号的复盘结论:任务结果差主要是架构问题(完整性闸门 `missingBodyDefinition` 只在招聘时查、图执行侧完全没有第二道防线——新发现)+ 一个具体的招聘装配可靠性 bug,不是 agent 能力问题。提出两档改进:低成本(把完整性闸门接进图执行前置检查、控制台展示验收证据可见性)建议直接做;大改动(标准化视觉验收工具、引擎级证据闸门)建议先讨论优先级 |
52 | [34-validator-scored-without-real-deliverable.md](./todo/system-design/34-validator-scored-without-real-deliverable.md) | 📝 **调研记录,checklist 已查完**。最初以为 `org-coder-impl` 从未产出任何 HTML/CSS,后来发现真实网站其实存在于 `graph_files` 索引不覆盖的「项目根」目录(已顺手修:控制台「产物」面板现在会展示项目根)。追加查清 validator 有没有真的做浏览器级检查——中途自我订正一次:不是"没工具做不到"(`bash` 能走到仓库自带的 Playwright,另一条对照任务证明可行),是**没人教它这么做**;抽查另外两个项目根后发现**验证严谨度完全不稳定**(同类任务有的做了真实 Playwright 级验证、有的只做静态正则、有的没验证就被取消),根因很可能是新招聘的 `unit-tester` 本体撞上了 [32 号文档](./todo/system-design/32-hire-body-fill-reliability.md) 那类"装配没填充完"的真实样本,不是平台工具限制 | 53 | [34-validator-scored-without-real-deliverable.md](./todo/system-design/34-validator-scored-without-real-deliverable.md) | 📝 **调研记录,checklist 已查完**。最初以为 `org-coder-impl` 从未产出任何 HTML/CSS,后来发现真实网站其实存在于 `graph_files` 索引不覆盖的「项目根」目录(已顺手修:控制台「产物」面板现在会展示项目根)。追加查清 validator 有没有真的做浏览器级检查——中途自我订正一次:不是"没工具做不到"(`bash` 能走到仓库自带的 Playwright,另一条对照任务证明可行),是**没人教它这么做**;抽查另外两个项目根后发现**验证严谨度完全不稳定**(同类任务有的做了真实 Playwright 级验证、有的只做静态正则、有的没验证就被取消),根因很可能是新招聘的 `unit-tester` 本体撞上了 [32 号文档](./todo/system-design/32-hire-body-fill-reliability.md) 那类"装配没填充完"的真实样本,不是平台工具限制 |
53 | [33-needs-gate-role-filter-bug.md](./todo/system-design/33-needs-gate-role-filter-bug.md) | ✅ **已修复**。`executor.json`/`executor-fanout.json` 里 `produces:["log"]` 声明了一个 test/integration 类节点永远不会被索引到的 kind,导致 `org-coder-validator` 被 `missing_required_input` 反复误判 blocked;改成 `required:false`(对齐 `validator.json` 既有写法)。文档记录了一条**走过的弯路**(按 role 过滤 `inboundContracts` 会削弱 T-mt25ecbd 的产出闸门,已撤回),发现于 31 号文档的真实回归验证过程中,与兜底边问题无关 | 54 | [33-needs-gate-role-filter-bug.md](./todo/system-design/33-needs-gate-role-filter-bug.md) | ✅ **已修复**。`executor.json`/`executor-fanout.json` 里 `produces:["log"]` 声明了一个 test/integration 类节点永远不会被索引到的 kind,导致 `org-coder-validator` 被 `missing_required_input` 反复误判 blocked;改成 `required:false`(对齐 `validator.json` 既有写法)。文档记录了一条**走过的弯路**(按 role 过滤 `inboundContracts` 会削弱 T-mt25ecbd 的产出闸门,已撤回),发现于 31 号文档的真实回归验证过程中,与兜底边问题无关 |
54 55
docs/todo/system-design/35-validation-rigor-and-body-readiness-proposal.md 0 → 100644
  1 +# 35-validation-rigor-and-body-readiness-proposal. 复盘结论 + 改进方案(待讨论)
  2 +
  3 +> **日期**: 2026-08-22
  4 +> **性质**: 复盘 + 改进方案提案,**未拍板,等讨论**。承接
  5 +> [31](./31-work-graph-fail-fallback-coverage.md) /
  6 +> [32](./32-hire-body-fill-reliability.md) /
  7 +> [33](./33-needs-gate-role-filter-bug.md) /
  8 +> [34](./34-validator-scored-without-real-deliverable.md) 四份文档的真实回归验证
  9 +> 与调研——那几份记的是"发现了什么",这份记的是"复盘下来该怎么办"。
  10 +> **触发**:用户问"任务结果这么差,是 agent 能力问题、架构问题、还是 graph
  11 +> workflow 缺陷",本文档是那次复盘的书面结论 + 据此提出的改进方案。
  12 +
  13 +---
  14 +
  15 +## 一、复盘结论:四类原因,权重不均
  16 +
  17 +用一条真实回归任务(`T-mt2r6fz0-125b`,"做一个 apple.com 风格的 lemonboss 官网")
  18 +撞见的问题,按发生顺序分类:
  19 +
  20 +### 1.1 图/模板设计缺陷(已修复)—— 31、33 号文档
  21 +
  22 +- `org-planner-sdd` 没有兜底边,自判失败即卡死到人工重试(31 号)。
  23 +- `test→validator` 边声明的 `produces:["log"]` 是一个 test 类节点永远写不出来的
  24 + kind,导致 `missing_required_input` 假阳性、永久熔断(33 号)。
  25 +
  26 +这两条是**真实的图/模板设计缺陷**,不是 agent 判断失误,也不是"能力"问题——
  27 +图本身的结构不完整。**权重:中**(真实存在,但已经修好,且这类问题一旦发现,
  28 +定位和修法都很直接)。
  29 +
  30 +### 1.2 招聘装配可靠性 bug(已知,这次是新样本)—— 32 号文档
  31 +
  32 +`unit-tester` 本体的 `agent.md` 全程是空白的 `_base` 骨架(带
  33 +`LEMONBOSS_BASE_SKELETON` 哨兵标记),隔壁 `coder` 却正常填充过。32 号文档已经
  34 +分析过这类异步装配的可靠性问题并实施了方案 B(`6a18379`),但这次撞见的样本
  35 +发生在修复提交**之前** 1 小时,且没有专门验证过新机制是否已经完全堵住这个口子。
  36 +**权重:这次具体检查偏弱的最直接原因**——`unit-tester` 在没有任何角色指导的
  37 +情况下,只能靠自己对"该怎么测试网页"的通用理解去写检查脚本,写出来的东西天然
  38 +比有明确方法论指导的 `org-coder`/`coder-validator` 弱。
  39 +
  40 +### 1.3 一个新发现的、更深的架构缺口:完整性闸门只在招聘时查,执行时不查
  41 +
  42 +复盘时确认过一件事(`server/services/graph-engine.js` 全文搜索):
  43 +`missingBodyDefinition()`(检测本体是否还带 `_base` 哨兵/空白)只在
  44 +**招聘/建公司/dream 沉淀**这几条路径上被调用(`graph-service.js` /
  45 +`graph-seed-service.js` / `company-service.js` / `dream-service.js`),
  46 +**图执行的核心路径(`advanceOne`/`defaultAgentExecutor`)一次都没有调用它**。
  47 +
  48 +也就是说:即使 32 号文档的修复完全生效、招聘那一刻永远不会留下半成品——只要一个
  49 +本体因为**任何其它原因**(手工改坏、迁移遗留、装配虽然完成了但内容本身依然是
  50 +空骨架而系统判断不出来……)在 `system_agents` 目录里长期处于未填充状态,
  51 +**图执行侧完全没有第二道防线**,会原样把这份空白提示词交给真实 Claude CLI 去跑,
  52 +静默产出一份"看起来是回复、其实没有任何角色指导"的结果——这正是这次
  53 +`unit-tester` 发生的事。**这是本次复盘里唯一一条原来没人查过、独立于 32 号文档
  54 +既有分析的新架构缺口**。
  55 +
  56 +### 1.4 不是 agent 能力问题——两次订正过这一点
  57 +
  58 +- 最初以为"没有浏览器工具,物理上做不到视觉检查",后来发现同一批工具权限下
  59 + 隔壁一条任务真的跑出了 Playwright 测试(见 34 号文档 §5.3 的订正)——**能力
  60 + 和权限都够**,缺的是指导。
  61 +- `unit-tester` 在零指导的情况下,还是主动写出了一份能真实解析 CSS `clamp()`
  62 + 算出字号比例、能识别锚点跳转反模式的静态断言脚本——这是**相当不错的即兴发挥**,
  63 + 不是能力不足的表现。
  64 +
  65 +**结论:这次任务结果差,主要是架构 + 一个具体的可靠性 bug,不是模型能力问题。**
  66 +按影响力排序:①执行侧没有完整性闸门(新发现,架构缺口)> ②招聘装配可靠性 bug
  67 +(已知,这次撞上了修复前的窗口)> ③图模板设计缺陷(已修)> ④agent 能力(不是
  68 +问题,甚至有正面例子)。
  69 +
  70 +---
  71 +
  72 +## 二、改进方案(分两档,供讨论)
  73 +
  74 +### 第一档:低成本、高置信度,建议直接做
  75 +
  76 +#### 提案 A:把 `missingBodyDefinition()` 接进图执行的派发前置检查
  77 +
  78 +**做什么**:`advanceOne`(或它调用 `defaultAgentExecutor` 之前的那一步)在真正
  79 +派发一次 agent 调用前,对这个节点的 `systemAgentId` 跑一次
  80 +`agentLocator.missingBodyDefinition(systemAgentId)`;非空就不派发真实调用,
  81 +直接按新 fail_reason(复用已有语义相近的命名,比如 `body_not_ready`,与招聘时
  82 +挡重复招聘的判词同名同义)让节点走 fail 流程——**跟 31 号文档修的兜底边机制是
  83 +同一条已有的选边逻辑**,不需要发明新的路由方式,只需要在这一个检查点新增一次
  84 +判断和一个新的 fail_reason 取值。
  85 +
  86 +**为什么现在做**:
  87 +- 判据函数已经存在、已经测过、语义已经很清楚(`agent-locator.test.js` 覆盖过),
  88 + 不是从零设计。
  89 +- 改动面很小:一个检查点、一个新 fail_reason、复用现成的选边/兜底/熔断机制。
  90 + 跟 31 号文档同一类"结构性、可验证、影响面可控"的修法。
  91 +- 直接堵住了 §1.3 说的"唯一没有第二道防线"的洞——不管以后是招聘装配失败、
  92 + 手工改坏、还是任何其它原因导致本体不完整,图执行到这一步都会被拦下来,
  93 + 而不是静默拿一份空提示词去跑真实 LLM。
  94 +- 有真实的失败样本(`unit-tester`)可以直接改写成回归测试,验证成本低。
  95 +
  96 +**代价 / 需要想清楚的点**:
  97 +- fail_reason 走兜底边意味着这个节点会被打回上游重跑——但重跑到同一个
  98 + systemAgentId,body 还是没填,会不会陷入无意义的重试循环?需要确认
  99 + `body_not_ready` 这类 fail_reason 是否应该被排除在正常回退计数(backward_count)
  100 + 之外,还是就该老实算一次退(让 §四.D.2.1 的熔断兜底),倾向于后者——不发明
  101 + 第二套计数规则。
  102 +- 需要决定:检查失败时是"这个节点 blocked 等人工重新触发装配",还是"引擎自动
  103 + 触发一次装配再重试"(后者更省心但复杂度更高,涉及跟 32 号文档的
  104 + `agent-body-filler.js` 打通)。**建议第一版先做前者(简单、可控),装配自愈
  105 + 留给后续。**
  106 +
  107 +#### 提案 B:控制台展示"这份验收有没有证据支撑"(纯 UI,不改行为)
  108 +
  109 +**做什么**:在已有的 `TaskFilesPanel`/节点详情面板上,如果 validator 的
  110 +`attempt-*.scores.json`(或对应产出)能关联上一份"真实检查证据"(比如同目录下
  111 +有没有一份 `tests/*.mjs`/`*.check.js` 之类的脚本、或 `attempt-*.json` 里有没有
  112 +`test_run.executed:true` 这类字段),标一个不起眼的小标签——不是要engine 判断
  113 +"验证够不够严谨"(那是提案 D 的范畴,成本高很多),只是**把现在完全不可见的
  114 +差异露出来**,让人在看"已完成"三个字时,能多看一眼"这条完成背后有没有真实证据"。
  115 +
  116 +**为什么可以现在做**:纯前端 + 读现成数据,不改变任何执行行为,风险几乎为零,
  117 +且直接回应 34 号文档 §5.3 那条"三个任务验证严谨度天差地别、界面上完全看不出来"
  118 +的具体抱怨。
  119 +
  120 +---
  121 +
  122 +### 第二档:更大的设计决策,建议先讨论优先级再动手
  123 +
  124 +#### 提案 C:给"视觉/UX 类"任务提供一套标准化、可复用的验收工具
  125 +
  126 +**问题**:`p-bkhylu` 那条任务能做到 Playwright 级验证,纯粹是因为那次的 agent
  127 +会话自己想到了、自己写了 `verify.mjs`。换一次任务、换一次会话,不保证还会有人
  128 +这么做——`unit-tester` 这次就没想到(或者说,没被指导要这么想)。
  129 +
  130 +**候选做法**:在仓库里放一份可复用的验收脚本模板/skill(比如
  131 +`scripts/visual-acceptance-check.mjs`,封装"读 index.html/css/js → 用 Playwright
  132 +量视口/对比度/字号"这类通用检查逻辑),并在 `coder`/`unit-tester`/
  133 +`coder-validator` 这类角色的 `agent.md`(或它们的 `tools.md`)里显式点名:"遇到
  134 +`goal-benchmark.json` 里要求视口/对比度/首屏这类视觉维度时,用这份工具,不要
  135 +自己发明"。
  136 +
  137 +**代价**:这不是"填一个空文件"那么简单——要设计这份工具的接口(读哪些文件、
  138 +输出什么形态、怎么接进 `attempt-*.json`)、要决定哪些角色的 `agent.md` 需要
  139 +更新、要不要影响现有已经在跑的任务。**这是一个需要先讨论范围的设计任务,
  140 +不建议直接动手**。
  141 +
  142 +#### 提案 D:给"要求真实检查"的验收维度加引擎级证据闸门
  143 +
  144 +**问题**:`goal-benchmark.json` 的 `evidence_hint` 目前只是**写给 agent 看的
  145 +文本提示**,agent 信不信、照不照做,引擎完全不管——验证严不严谨完全靠自觉。
  146 +
  147 +**候选做法**:给 `evidence_hint` 里出现"打开浏览器/截图/开发者工具"这类关键词
  148 +的维度,要求打分时必须附带一个可核实的 `evidence_ref`(比如指向一份真实脚本的
  149 +`stdout` 日志文件,或类似 `coder-validator` 已经在用的 `test_run.executed:true`
  150 ++ `output_excerpt` 那套惯例)——引擎收到一个没有 `evidence_ref` 的高分视觉维度时,
  151 +可以选择"降级为 inconclusive"或至少"打一个显式的 ⚠️ 标记",而不是原样采信。
  152 +
  153 +**代价**:这个提案影响 `goal-benchmark.json` 的 schema、`goal-contract.js` 的
  154 +判定逻辑、以及所有会产出这类分数的 validator 角色的 `agent.md`——影响面明显
  155 +比提案 A/B 大,且需要先定"哪些关键词触发这道闸门""没有证据时降级还是拦截"这类
  156 +细节,**建议留到提案 A/B 落地、有更多真实样本之后再决定要不要做,不是这次的
  157 +优先级**。
  158 +
  159 +---
  160 +
  161 +## 三、建议的推进顺序(供讨论,非最终决定)
  162 +
  163 +1. **提案 A**(执行侧完整性闸门)——最推荐现在就做,闭环 §1.3 那个新发现的架构
  164 + 缺口,改动小、可测、影响明确。
  165 +2. **提案 B**(控制台证据可见性)——可以跟 A 一起做,纯 UI,风险低。
  166 +3. **提案 C / D**——不建议现在动手,先攒几个更多真实任务的样本(比如提案 A/B
  167 + 落地后再跑几次真实回归),再决定要不要投入更大的设计成本,避免在样本量只有
  168 + "三个任务"的情况下就把标准定死。