orggraph-planning.json
5.13 KB
{
"_doc": "P3B mock fixture · orggraph-planning。建公司时(company.js /create)与手动点「重新规划组织」时(POST /:companyId/org-graph/replan → triggerOrgGraphPlanning)各被调一次,产出这家公司的 org graph。\n\n在此之前本 agent 没有 fixture,mock 下回放的是 default.json 的 echo,所以新建公司后 org graph 一直是空的(用户新建 test-org 撞到的就是这个)。\n\n⚠️ 图必须放在 chunks 里,不能只放 result:agent-chat 的 fullOutput 只累积 agent_message_chunk(agent-chat.js:2316),session/result 的文本只有在 fullOutput 为空时才补进去。凡是要被读回的东西都放 chunks。\n\n⚠️⚠️ mock 的边界(别把这份 fixture 当成「mock 下 org graph 会自动落库」):真实 orggraph-planning 是靠 Step 6 自己 `curl -d @/tmp/x.json` POST /api/company/{id}/org-graph 把图写进库的,而 mock 模式不执行任何工具调用(ClaudeCliProtocol._sendMockPrompt 只回放 chunks/files/result,没有 HTTP 副作用)。所以本 fixture 只让 mock 下的规划**产出一份形状正确、可被读回的图文本**(会话页可见、SSE 可见、日志可见),落库那一环仍缺一个服务端消费者——见 27-P3B §四 W8 的备注。work 层没这个问题:workgraph-planning 的图由 graph-engine.extractPlannedGraph 从 output 里解析,不靠 agent 自己发 HTTP。\n\n图的形状对齐 system/org-graph-templates/dev.json:org-planner → org-coder → org-validator 三节点 + 两条 fail 回退边(一条带 failReason,一条兜底),满足 org-graph-service 的四项校验(无环 / 单入口 org-planner / 全可达 / 回退边显式标 backward)。三个角色名与 dev.json 一致;其中只有 org-validator 在 system/templates/ 里有模板,org-planner / org-coder 尚无(agent.md Step 4 明确允许「新造」库里没有的角色)。图本身不受影响:org-graph-service.writeGraph 会为未登记的 systemAgentId 自动补一行 company_hired 的 system_agents(实测 ok:true / nodeCount 3 / edgeCount 4)。\n\n⚠️⚠️⚠️ fixture 名的查找键:ClaudeCliProtocol._sendMockPrompt 用 `agentInfo.name`(冒号后那段)找 fixture。graph-engine 传的是 `{cid}:{agentId}`,能命中本文件;而 agent-chat.js 的 getOrCreateProtocol 传的是 **identity.md 里的显示名**(orggraph-planning 的 identity.md 没有「名称:」行 → 退化成字面量 'Agent'),于是走 chat 的调用回放的仍是 default.json。orggraph-planning 只有 chat 这一条入口,所以在 agent-chat 改传 agentId 之前,本 fixture 在跑起来的服务里命不中——见 27-P3B §四 W8 备注。\n\n单变体(不用 sequence):一家公司可能被反复 replan 走查,序列会在第二次之后变形。",
"chunks": [
"[mock] orggraph-planning 接到建司通知,开始按八步工作流规划这家公司的 org graph。\n\n",
"Step 1 读输入:company-goal 指向「做出/改进一个能跑的软件产品」,交付物是代码,验收方式是跑测试。\n",
"Step 2 读候选骨架:dev.json 的 whenToUse 命中(信号词:实现 / 开发 / 接口 / 上线);content.json、ops.json 不命中,不采用。\n",
"Step 3 读可招角色:org-validator 在 system/templates/ 里有现成模板;org-planner / org-coder 清单里还没有,按 Step 4「新造」条款直接写进图,Step 7 走 base 继承生成(模板补齐后自动改走 hired_from_template)。\n",
"Step 4 规划:主干沿用 dev 骨架不裁剪——本公司既要出需求也要出代码还要验收,三个职能缺一不可。\n\n",
"Step 5 规划记录已写入 workspace/orggraph-plan.md。\n\n",
"Step 6 提交图(POST /api/company/{公司ID}/org-graph):\n\n",
"```json\n{\n \"nodes\": [\n { \"roleName\": \"org-planner\", \"systemAgentId\": \"org-planner\" },\n { \"roleName\": \"org-coder\", \"systemAgentId\": \"org-coder\" },\n { \"roleName\": \"org-validator\", \"systemAgentId\": \"org-validator\" }\n ],\n \"edges\": [\n { \"from\": \"org-planner\", \"to\": \"org-coder\", \"condition\": \"success\" },\n { \"from\": \"org-coder\", \"to\": \"org-validator\", \"condition\": \"success\" },\n { \"from\": \"org-validator\", \"to\": \"org-planner\", \"condition\": \"fail\", \"failReason\": \"input_underspecified\", \"edgeKind\": \"backward\" },\n { \"from\": \"org-validator\", \"to\": \"org-coder\", \"condition\": \"fail\", \"edgeKind\": \"backward\" }\n ]\n}\n```\n\n",
"四项校验自查:1) forward 边可排拓扑序 org-planner → org-coder → org-validator,无环;2) 入度为 0 的只有 org-planner,单入口;3) 从 org-planner BFS 覆盖全部 3 个节点;4) 两条 fail 边都已标 edgeKind: backward。\n\n",
"Step 7 执行招聘:按拓扑序 hire org-planner → org-coder → org-validator。\n",
"Step 8 关闭自身心跳,转入休眠;后续增量调整交给 HR。\n"
],
"result": "mock-ok orggraph-planning:已规划 dev 型 org graph(org-planner → org-coder → org-validator,含两条 fail 回退边),并按拓扑序完成招聘。"
}