From 95ef7825c79baf694765ace9033ba0d6da7d19d3 Mon Sep 17 00:00:00 2001 From: yibo Date: Tue, 18 Aug 2026 14:49:28 +0800 Subject: [PATCH] docs(27-P3C): 补毕业闸门的三个权威判据,标注一个已被踩过的取值域坑 --- docs/todo/system-design/27-p3c-goal-task-model.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/todo/system-design/27-p3c-goal-task-model.md b/docs/todo/system-design/27-p3c-goal-task-model.md index c06b9d2..3bf4c90 100644 --- a/docs/todo/system-design/27-p3c-goal-task-model.md +++ b/docs/todo/system-design/27-p3c-goal-task-model.md @@ -313,7 +313,11 @@ AgentManager 调 task-planning(输入:goal.description + 公司 org graph æ‘ 2. **失败必须降级,不能把 goal 卡在 `planning`**:3 轮都没产出合法 DAG → **退化成 1 条同描述的 task**(`created_by='human'`、`seq=1`、`depends_on=[]`),goal 转 `active`,并在界面标注「自动拆分失败,已按单任务下达」。绝不能留一个永远转圈的 `planning` goal —— 那正是这次要消灭的那类静默状态。 3. **本体落点是 `system/agents/task-planning/`**(`system/templates/` 已在 2026-08-18 的 agent 目录重构里**彻底取消**,50 个本体全部 `git mv` 进 `system/agents/`,`base` → `_base`)。形态照 `workgraph-planning`:`agent.md` / `config.json` / `identity.md` / `soul.md` / `tools.md`。**不要用 `_` 开头命名** —— `_` 是保留前缀,扫描时会被跳过。 -4. **`agent.md` + `soul.md` 必须一次写完,不能先建骨架后填**。本体现在有**毕业闸门**:`agent.md` 与 `soul.md` 非空、且不带 `_base` 的骨架哨兵,才会从 `system_agents.status='draft'` 毕业;否则 `hire()` 直接拒绝并返回 `body_not_ready`。「从 `_base` 复制骨架 → 以后再填」的中间态**雇不进公司**。(`.claude/skills/main_skill/SKILL.md` 是可选的,57 个本体里 54 个没有。) +4. **`agent.md` + `soul.md` 必须一次写完,不能先建骨架后填**。本体现在有**毕业闸门**:`agent.md` 与 `soul.md` 非空、且不带 `_base` 的骨架哨兵,才会从 `system_agents.status='draft'` 毕业;否则 `hire()` 拒绝并返回 `body_not_ready`。「从 `_base` 复制骨架 → 以后再填」的中间态**雇不进公司**。(`.claude/skills/main_skill/SKILL.md` 是可选的,57 个本体里 54 个没有。) + + 三个权威判据(真到建本体时以它们为准,别照文档复述):`agent-locator.js` 的 **`missingBodyDefinition()`**(判什么算没填完)、`graph-service.js` 的 **`promoteDraftIfComplete()`**(转正动作)、以及 `hire()` 用的 **`isUngraduatedStatus()`**。 + + > ⚠️ **`isUngraduatedStatus()` 只挡 `draft` / `training` 两个状态,不是「≠ active 就挡」。** 这个坑已经被踩过一次:库里有 36 个本体的 status 是 `enabled` / `idle` / `ready` / `trained`,按「不等于 active」判会被全部误判成「没填完」。取值域的唯一持有者是 `graph-service`,**不要在别处复述它** —— 本文档 §六.3 已经因为 `canDispatch` 被前端复述过一次取值域而记过同类教训。 5. **`_registry.json` 登记是可选的,建目录才是关键动作** —— 这条与初稿写反了,留档纠正:`graph-seed-service.seedAgents()` 现在直接 `readdirSync(system/agents/)` 把**目录当真相**,`_registry.json`(已随重构挪到 `system/agents/_registry.json`,数组格式不变)只用于按 id 补 `benchmark_score`,registry 缺条目照样 seed。初稿写的「不登记会把 CI 跑红」引的是 27-P3/P4 §八.21 的前科,那条前科属于 `template-refs.test.js` 硬编码 `system/templates` 路径的时代,**该测试正随重构一起改**。仍建议顺手登记(`benchmark_score` 要用),但它不是闸门。 -- libgit2 0.21.4