# 迭代日志 v1 — workgraph-planning-methodology-trial > 训练目标:≥80(合格线 65,来自 `digest/benchmark_v1.md` §3.3) > 起点:候选(b)(`digest/calibration_cases.md`),已知缺口 D2(未穷举 2^5 信号组合)、 > D4(benchmark/validator 未单独展开专属规则)。本轮任务是在候选(b)基础上做真正的 > 独立迭代改进,不是照抄。 > Small Loop 上限 10 轮,本次用了 2 轮。 --- ## Round 1(草稿 + 自评 + 样本验证,发现 2 处结构漏洞) ### 草稿设计(v1 草案,未落盘为独立文件,直接在此摘要) 在候选(b)基础上重新设计为「短路门 + 逐节点判定表」结构,而不是候选(b)那种 "若…且…且…否则"的单链条件句: 1. **G2 门(S3=是 强制保留)**:若 `S3=是`,无论其他信号如何组合,直接判定全部 5 节点保留,终止决策——这条本身就是 digest `complexity_signals_v1.md` S3 段 原文("无论其他信号如何组合"),不是我新加的,只是把它从"叙述句"改写成 "决策树第一个门",让它在流程上真正先于其余判断执行。 2. **G3 门(S5=是 且先例 S1-S4 严格全部一致 才复用)**:比候选(b)第2条更严格—— 候选(b)只写"且先例任务在 S1-S4 上与本次任务取值一致",没定义"一致"到底要 几个信号匹配;v1 草案明确成"四个信号全部相同,缺一不算",不一致就退化为 `S5=否` 继续往下走正常判定,不允许"大体相似就照抄"。 3. **BRD 判定表**:在 `S3=否` 且 `S5` 门未命中的前提下,对 `S1(1/≥2) × S2(是/否) × S4(是/否)` 共 8 种组合给出完整判定(4 行折叠表,S4=是 时无论 S1/S2 一律保留, S1≥2 时无论 S2 一律保留,只有 `S4=否 且 S1=1` 时才看 S2 决定裁或留)—— 这是本轮对 D2 已知缺口的直接修补:候选(b)只写了"S4=否且S2=是且S1=1"这一条 AND 组合命中裁剪,没写其余 7 种组合各自的输出,本表把全部 8 种都显式列出。 4. **PRD**:永不裁(`sdd` 边 `needs:[prd]`、`benchmark` 边 `needs:[...,prd,...]` 两条边都依赖它,裁掉无法修补,只能整张图重画,不算"裁剪")。 5. **SDD**:节点本身不裁(`benchmark` 边 `produces:[sdd]` 是这条边存在的前提, 删掉节点等于要把 `prd→sdd→benchmark` 改成 `prd→benchmark` 直接产 `prd`, 这是图形状变更不是节点裁剪,超出本判据范围);`S1=1` 时内容可以"精简"(吸收 进本节点自己的产出里,不新增字数要求),`S1≥2` 时保持完整(需要展开跨交付物 整合决策)。 6. **benchmark**:始终保留——它是本图 `acceptance` 产物的唯一生产者,且 `writesArtifacts:true` 把它写进 root run 的 artifacts/ 共享区,供**另一张图** (`org-validator` 宿主的 `validator.json`)消费,裁掉的影响不止本图内部,是 跨图断供;`goal-benchmark`/`goal-test-data`/`goal-test-script` 三选一或多选 (27-E2E §十一)是另一层"验收方式选型"决策,不受 S1-S5 支配,明确排除在本 判据范围外。 7. **validator(org-planner-validator)**:始终保留——它是四张骨架共有的 "做→自检→本层验收"形状里"自检"那一步(`work-graph-templates/README.md` L29),裁掉等于让 planner 输出的三份文档失去内部一致性检查,直接把矛盾 传给下游 `org-validator`;`needs` 随 brd/prd/sdd 实际留存情况自动调整 (见第4项裁剪连带修正清单)。 ### 自评(套用 `benchmark_v1.md` 逐维度打分标准) | 维度 | 分数 | 依据 | |---|---|---| | D1 | 5 | 全部判据都是 S1-S5 的文本可判定信号,无"简单/复杂"类形容词单独作判据 | | D2 | 5 | BRD 8 种组合全列,PRD/benchmark/validator 常量输出,SDD 仅系于 S1 二值,G2/G3 门在此之前已吸收 S3/S5,理论上覆盖全部信号空间,无"具体看情况"留白 | | D3 | 5(**自评过高,见下方验证发现**) | 裁 brd 时给出 `needs` 从 `["brd","prd","sdd"]` 改成 `[{"kind":"brd","required":false},"prd","sdd"]` 的具体方案 | | D4 | 5 | 五个节点全部有专属规则,含 benchmark/validator | | D5 | 5 | 有裁有留,S3=是/prd不可裁 都是显式声明的"不受信号影响"的地基级约束 | ``` 加权和 = 5/5×15 + 5/5×30 + 5/5×20 + 5/5×20 + 5/5×15 = 100 ``` **没有直接采信这个 100 分**——按任务书要求,先跑样本验证再定稿,`D3=5` 这一项 需要经过手工验算法(`agent.md` 约束一手工验算法五条)逐条复核才能确认,不能只 凭"给了 needs 改法"就认定"不会破坏五项校验中任一项"(`benchmark_v1.md` D3 5分档原文的后半句)。 ### 样本验证发现的问题 用 C4(p-v1mpcl,`S1=1/S2=是/S3=否/S4=否/S5=否`)代入 BRD 表:命中"`S4=否 且 S1=1 且 S2=是` → 裁剪 brd"。裁剪后手动过一遍五项校验手工验算法(第2/4/5条): - 规则4(回退边标注)复核时发现:`planner.json` 原图有一条 `org-planner-prd --fail--> org-planner-brd`(`edgeKind:backward`)。裁掉 `org-planner-brd` 节点后,这条边的 `to` 指向一个已经不存在的节点——v1 草案 只处理了 `needs` 级联,完全没提这条边要怎么办。这不是"给了方案但有点小遗漏", 是**根本没意识到还有一条 backward 边需要同步删除**,如果照 v1 草案原样执行, 会画出一张边引用不存在节点的废图,比 `rule=data-contract` 拒绝还基础的错误。 - 连带发现规则2/5的推导也不完整:`org-planner-brd` 原本是唯一入口,裁掉之后 谁是新入口?v1 草案没有说。手动推导后确认是 `org-planner-prd`(forward 入度 变 0),而 `org-planner-prd` 变成入口后,按约束五"除入口节点外每个节点都要 留兜底边"的**例外条款**,`prd` 本身不需要再单独配一条 fail 兜底边——但 v1 草案完全没提这层,若使用者不知道这条例外,可能会误以为"prd 缺兜底边,图不 合法"而画蛇添足加一条不需要的边,或者反过来因为找不到 prd 的兜底边而误判 图不合法拒绝整张图。 另外在检查 `S5` 门的可操作性时发现第二个问题:**"先例的 S1-S4 取值"从哪来?** 仓库现有全部 5 份规划记录(`hunt/knowhow_v1.md` 块C)都写于本次训练引入 S1-S5 信号体系之前,没有一份标注过自己的信号取值。v1 草案的 G3 门要求"先例 S1-S4 与本次一致",但如果先例记录本身没有这四个值可比对,这条门在当前仓库的真实 历史数据上**完全无法执行**,会卡在"不知道怎么判断"——这正是 D2 5分档要求 的"不存在'具体看情况'的留白"要避免的情况,v1 草案表面上写了判定条件,实际 在当前唯一能拿到的历史数据集上是不可执行的空判据。 **结论**:D3 不该打 5,至少要扣到 4(一处遗漏,但只在"裁到图的唯一入口节点" 这一种情况下才会触发,影响面窄——`planner.json` 五节点里只有 `brd` 是唯一 入口,其余四个节点即便未来讨论裁剪也不会遇到"入口消失"这个子问题,所以严重度 定为"影响范围小"而非"系统性忽视",符合 4 分档描述)。D2 的"先例不可比对"问题 更多是数据可用性问题而非规则本身不确定,但既然会导致门"卡住无法执行",也需要 在规则里显式给出 fallback,否则同样违反"不存在留白"的字面要求,需要一起修。 **处置**:不推翻整体框架(G2/G3门 + BRD表 + 逐节点规则的结构本身是合理的), 针对这 2 个具体漏洞做 v2 修正,不是重新设计。 --- ## Round 2(修正 2 处漏洞,重新验证,定稿) ### 修正内容 1. **补充"裁剪 brd 的连带结构修正清单"**(写入 SKILL.md §4): - 删除 `org-planner-prd --fail--> org-planner-brd` 这条 backward 边(目标 节点已不存在); - `org-planner-prd` 自动成为新的唯一入口(forward 入度归零);按约束五 例外条款,入口节点**不需要**为自己另配 fail 兜底边,不必也不应该新增; - 收尾前重新过一遍五项校验手工验算法第 2/3/4/5 条(第1条无环性不受影响, 因为只是删边不改变节点间的既有拓扑序)。 2. **补充 S5 门的 fallback**(写入 SKILL.md §2 G3):若先例记录未标注 S1-S4 信号值(当前仓库全部历史记录都属于此类,因为 S1-S5 是本次训练新引入的), 视为"无法核实匹配",**直接按 `S5=否` 处理**,落回正常的逐节点判定流程, 不允许因为"先例存在但取值未知"就跳过判断。这条 fallback 保证 G3 门在 任何输入下都有确定出口,不会卡死。 ### 重新自评 | 维度 | 分数 | 变化说明 | |---|---|---| | D1 | 5 | 不变 | | D2 | 5 | S5 门补 fallback 后,对"先例信号值未知"这一具体情形也有确定输出(视为S5=否),不再有隐性卡死点 | | D3 | 5 | backward 边删除 + 新入口豁免说明补齐后,重新手动过五项校验(见下)全部通过,"不会破坏五项校验中任一项"这半句才真正成立 | | D4 | 5 | 不变 | | D5 | 5 | 不变 | ``` 加权和 = 5/5×15 + 5/5×30 + 5/5×20 + 5/5×20 + 5/5×15 = 100 ``` ### 用修正后规则重新走一遍 C4 的五项校验手工验算法(裁 brd 后的图) 节点:`prd, sdd, benchmark, validator`(4个)。边: `prd--success-->sdd`(produces:[prd])、`sdd--success-->benchmark`(produces:[sdd],needs:[prd])、 `benchmark--success-->validator`(produces:[acceptance],needs:[{brd,required:false},prd,sdd])、 `sdd--fail-->prd`(backward)、`benchmark--fail-->sdd`(backward)、 `validator--fail-->prd`(backward,failReason:input_underspecified)、`validator--fail-->sdd`(backward)。 (`prd--fail-->brd` 已按修正清单删除。) | # | 手工验算 | 结果 | |---|---|---| | 1 | 划掉 backward 边后剩 `prd→sdd→benchmark→validator`,可排出拓扑序 | 通过 | | 2 | forward 入度为0的节点:仅 `prd` | 通过(恰好一个) | | 3 | 从 `prd` 沿 forward 边 BFS:`prd→sdd→benchmark→validator`,覆盖全部4个节点 | 通过 | | 4 | `sdd→prd`/`benchmark→sdd`/`validator→prd`/`validator→sdd` 的 `to` 均排在 `from` 之前,且都标了 `backward` | 通过 | | 5 | 除入口 `prd` 外,`sdd`(有 `sdd→prd` 空 failReason 兜底边)、`benchmark`(有 `benchmark→sdd` 空 failReason 兜底边)、`validator`(有 `validator→sdd` 空 failReason 兜底边,另一条 `validator→prd` 带 failReason 不计入但不影响)均满足 | 通过 | 五项全部通过,且 `prd` 作为新入口按约束五例外条款无需额外配兜底边(未出现"5项未通过"或"多配了一条不必要的边"两种误判)。 **最终得分:100 分**(未触发任何否决/封顶条款:D1≠1或未达否决门槛、D2≥4不封顶、D3>2不触发40封顶、D2>2不触发45封顶)。达到并超过目标线 80 分(`digest/industry_avg_score.md`)。2 轮即达标,未用满 10 轮上限,停止迭代。 **如实说明**:100 分是在"仅需覆盖 `planner.json` 五节点的裁剪判据"这个明确边界内、经过本轮两次真实手工验算后的分数,不代表这套规则解决了 work graph 规划的全部问题——`evolve_report.md` §局限性 有详细的范围外说明,不应被误读为"这个领域已经完美解决"。