iteration_log.md 11.4 KB

迭代日志 v1 — workgraph-planning-methodology-trial

训练目标:≥80(合格线 65,来自 digest/benchmark_v1.md §3.3) 起点:候选(b)(digest/calibration_cases.md),已知缺口 D2(未穷举 25 信号组合)、 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 §局限性 有详细的范围外说明,不应被误读为"这个领域已经完美解决"。