Commit 7764f0811222416c53c7ffe95953a24675f56b5e
1 parent
dd319bbd
docs(28): 补记 system/templates 清理这一轮,并登记已立起来的三条守卫
主文档新增 §11.4b,记 dd319bb 那轮清掉的内容与「不清会怎样」: 四份本体提示词、三个 skill js、两份图模板 README 的 CI 防线规则、 DevLoop PRD 13 份 HTML(连带重生成的 52 份 _spec + manifest + search-index)。 其中两条值得单独记: - innovator-hunt/collect_seed.js 是真 bug 且已发作过 —— 裸相对路径相对 cwd 解析, 在 agent 自己目录下造出一棵野生嵌套树。 - DevLoop PRD 写的 system/templates/devloop-pm.md 根和形状都错 (实际是 system/agents/{agentName}/prompt.md),由此推出一条方法论: 批量替换字符串时,替换的正确性取决于替换后的整体是否成立, 而不是被替换的那一段是否过期。 同时订正两处早于本次改造就已过期的内容(「6 个命名冲突 id」清单里四个 id 根本不存在;orggraph-planning 被告知的真相源仍是 company.json.agents[]), 并写明刻意不动的三类:历史说明 / 迁移完成的证明 / 运行态记录。 followups 新增 §五,登记本轮立起来的三条不变式测试 (agents-root-single-holder / no-stale-templates-path / repo-hygiene), 写明它们共有的「样本非空」前置断言为什么不能省,以及改动它们前要想清楚的事。 §四 那条「脚本路径需要跟着更新」已在 cd2066a 完成,改成实跑结论。 交付状态从「未 commit、未 push」更新为已推送(ca468ab..dd319bb)。 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Showing
2 changed files
with
53 additions
and
3 deletions
docs/done/system-design/28-agent-registry-unification.md
| ... | ... | @@ -612,9 +612,41 @@ echo OK |
| 612 | 612 | - **`source_kind` / `legacy_path` 删列**(验收 2 后半):两列仍在,见批次 1-5 的实际注记。 |
| 613 | 613 | - **任务态清理策略**(§5.6):仍然只有设计、没有实现。实现时**必须**先读 §5.6b —— 公司态是 dream 的原料,不是缓存。 |
| 614 | 614 | |
| 615 | +### 11.4b 收尾:清掉活定义里所有已死的 `system/templates` 引用(`dd319bb`) | |
| 616 | + | |
| 617 | +批次 1 把目录并走之后,**目录本身在磁盘和 git 里都已不存在**(`git ls-files system/templates` 返回空), | |
| 618 | +但引用还散在各处。这一轮把「agent 运行时真会照着读写的那些」全部清掉: | |
| 619 | + | |
| 620 | +| 位置 | 处理 | 不清会怎样 | | |
| 621 | +|------|------|-----------| | |
| 622 | +| 四份本体提示词(`workgraph-planning` / `orggraph-planning` 的 `agent.md`+`tools.md`、`org-innovator/agent.md`) | 9 处路径 + 4 条产出落点 | agent 读不到就**静默降级**,不报错 | | |
| 623 | +| `evolver-youtube-crawler` 的三个 skill js | 4 处硬编码目标 | 同上 | | |
| 624 | +| `innovator-hunt/collect_seed.js` | 裸相对路径改为按 `__dirname` 推导 | **真 bug,已发作过**:相对 cwd 解析,在 agent 自己目录下造出一棵野生嵌套树 `system/agents/innovator-hunt/system/templates/…` | | |
| 625 | +| `work-graph-templates` / `org-graph-templates` 的 README | CI 防线三条规则 | 文档写的规则与实际执行的检查对不上(测试早改对了,只有 README 没跟上) | | |
| 626 | +| DevLoop PRD(13 份 HTML → 重生成 52 份 `_spec` + manifest + search-index) | 按真实形状改 | **根和形状都错**:写的是 `system/templates/devloop-pm.md`(扁平 `.md`),而 `loop-controller.js:166` 读的是 `system/agents/{agentName}/prompt.md`(目录 + `prompt.md`) | | |
| 627 | + | |
| 628 | +最后一行推出一条值得记的方法论: | |
| 629 | +**批量替换字符串时,替换的正确性取决于替换后的整体是否成立,而不是被替换的那一段是否过期。** | |
| 630 | +无脑把 `templates` 换成 `agents` 会把一个错路径改成另一个错路径。 | |
| 631 | + | |
| 632 | +顺带订正两处**早于本次改造就已过期**的内容: | |
| 633 | + | |
| 634 | +- 「避开 6 个命名冲突 id」列的 `digester` / `evolver` / `hunter` / `innovator` **四个 id 根本不存在**(早已改名), | |
| 635 | + 而它的理由(两个目录下各有一份、内容不同步)也已随合并消失。约束保留(元 agent 本来就不该进执行流), | |
| 636 | + 理由与清单按实际本体重写。 | |
| 637 | +- `orggraph-planning/agent.md` 里「真相源是 `company.json.agents[]`」—— 28 号起真相源是 `company_agents` 表。 | |
| 638 | + | |
| 639 | +**刻意不动的三类**(改了是净损失):① 解释迁移历史的注释、`docs/done/`、`tasks/` 下的执行记录; | |
| 640 | +② `server/tests/` 里断言该目录已不存在的守卫(删掉等于删掉「迁移已完成」的证明); | |
| 641 | +③ 未跟踪的 `workspace/` `conversations/` 与 `train/` 下的历次训练报告(那是记录,不是定义)。 | |
| 642 | + | |
| 643 | +新增 `server/tests/unit/no-stale-templates-path.test.js` 守住「活定义」这一档,**零例外**。 | |
| 644 | +判据是「**git 跟踪的才是人工维护的定义,未跟踪的是运行态产物**」—— | |
| 645 | +这条判据本身就把上面三类自动排除掉了,不需要写脆弱的例外规则。 | |
| 646 | + | |
| 615 | 647 | ### 11.5 交付状态 |
| 616 | 648 | |
| 617 | -**改动全部在工作区,未 commit、未 push。** 提交时注意:测试过程中在真实 | |
| 649 | +**改动已全部提交并推送**(`ca468ab..dd319bb`,四个提交)。当时的提交注意事项保留备查:测试过程中在真实 | |
| 618 | 650 | `system/agents/` 下建出来的 agent 本体(`zz-*` 这类,当前工作区里共 **17 个**,如 `zz-tenant-ceo` / `zz-draft-role` / `zz-heartbeat-scoped` …) |
| 619 | 651 | **是正式注册表条目,一并进版本库** —— |
| 620 | 652 | 它们不是测试垃圾,而是可被后续任何公司复用的本体,agent 复用得越多、积累的历史与经验越多。 | ... | ... |
docs/todo/system-design/28-followups.md
| ... | ... | @@ -80,9 +80,9 @@ |
| 80 | 80 | ## 四、验证口径提醒 |
| 81 | 81 | |
| 82 | 82 | 主文档 §11.3 留了一段「文档与代码一致性检查」的 shell(常量改名同步)。 |
| 83 | -它引用的三份文档路径里,28 号那份已移入 `docs/done/system-design/` —— **那段脚本的路径需要跟着更新**。 | |
| 83 | +路径已随文档迁移更新完毕(`cd2066a`),实跑三份文档全部命中当前常量名 `AGENT_REGISTRY_TREE_RE`。 | |
| 84 | 84 | |
| 85 | -另外,取值域**不要**抄进文档。毕业闸门的权威判据只有三处: | |
| 85 | +取值域**不要**抄进文档。毕业闸门的权威判据只有三处: | |
| 86 | 86 | - `server/services/agent-locator.js` 的 `missingBodyDefinition()` |
| 87 | 87 | - `server/services/graph-service.js` 的 `promoteDraftIfComplete()` |
| 88 | 88 | - `server/services/graph-service.js` 的 `isUngraduatedStatus()`(只挡 `draft` / `training`) |
| ... | ... | @@ -90,3 +90,21 @@ |
| 90 | 90 | 文档里复述取值域会产生第二份真相 —— 这个坑本仓库踩过: |
| 91 | 91 | 一度按「≠ active 就挡」判,把库里 36 个 `enabled`/`idle`/`ready`/`trained` 的本体全判成「没填完」, |
| 92 | 92 | `workgraph-planning` / `master` / `qa-judge` 全部雇不进来。 |
| 93 | + | |
| 94 | +--- | |
| 95 | + | |
| 96 | +## 五、已经立起来的守卫(别重复造,也别删) | |
| 97 | + | |
| 98 | +这三条是本轮沉淀的不变式测试。它们守的都是「同一个事实只能有一处持有者」, | |
| 99 | +而且都带**「样本非空」前置断言** —— 少了那一条,扫描路径一写错就会以「零违例」的形式全绿, | |
| 100 | +一条永远通过的不变式测试和没有这条测试是一回事。 | |
| 101 | + | |
| 102 | +| 测试 | 守什么 | 违例时 | | |
| 103 | +|------|--------|--------| | |
| 104 | +| `agents-root-single-holder.test.js` | 本体根路径只能由 `locator.AGENTS_ROOT` 持有 | 精确点名到文件行号 | | |
| 105 | +| `no-stale-templates-path.test.js` | 活定义里不许出现已死的 `system/templates`(判据:git 跟踪的才是定义,未跟踪的是运行态产物) | 同上 | | |
| 106 | +| `repo-hygiene.test.js` | tracked 与 ignored 不重叠 | 列出越界文件 | | |
| 107 | + | |
| 108 | +**改动它们之前先想清楚**:这三条的价值全在于「红了才有用」。 | |
| 109 | +放宽判据、加例外、或者把断言改成永远成立的形式,等于把守卫拆掉 —— | |
| 110 | +本仓库有过「隔离是表演」的测试污染前科。 | ... | ... |