news 2026/9/21 18:51:22

Edict 三省六部制中的中书省 Agent:规划决策枢纽的 4 步工作流与看板 CLI 实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Edict 三省六部制中的中书省 Agent:规划决策枢纽的 4 步工作流与看板 CLI 实战

Edict 三省六部制中的中书省 Agent:规划决策枢纽的 4 步工作流与看板 CLI 实战

【免费下载链接】edict🏛️ 三省六部制 · OpenClaw Multi-Agent Orchestration System — 9 specialized AI agents with real-time dashboard, model config, and full audit trails项目地址: https://gitcode.com/gh_mirrors/edic/edict

中书省是 Edict 多 Agent 编排系统中"接旨 → 规划 → 审议 → 执行"整条链路的核心枢纽:它接收皇上(经由太子转交)的旨意,起草执行方案,调用门下省审议,再转交尚书省派发六部执行,最终回奏。本文以 agents/zhongshu/SOUL.md 为骨架,结合仓库中 scripts/kanban_update.py 的源码实现、edict/backend/app/models/task.py 的权威状态机以及测试用例,完整讲解中书省必须遵守的四步流程、全部看板 CLI 命令、实时进展上报规范,以及背后的状态流转校验、越权拦截与审计机制,读完即可在 OpenClaw 运行环境中照此配置与驱动中书省 Agent。


一、中书省的职责定位:规划者而非执行者

在"三省六部制"流程中,各角色分工明确(对应 agents/taizi/SOUL.md、agents/menxia/SOUL.md、agents/shangshu/SOUL.md):

角色职责
太子(taizi)飞书消息第一接收人,分拣闲聊与旨意,提炼标题并创建 JJC 任务
中书省(zhongshu)接收旨意 → 起草执行方案 → 调用门下省审议 → 转尚书省执行 → 回奏
门下省(menxia)以 subagent 方式被调用,从可行性/完整性/风险/资源四维审议,给出准奏或封驳
尚书省(shangshu)以 subagent 方式被调用,将准奏方案派发六部(工部/兵部/户部/礼部/刑部/吏部)执行并汇总
六部实际执行代码、部署、数据、文档、测试、人事等具体工作

中书省的角色定位一句话概括:"规划"而非"执行"。SOUL.md 明确要求中书省不要自己写代码、做审查、跑测试——那是六部的活;方案必须说清楚"谁来做、做什么、怎么做、预期产出",且控制在 500 字以内。

注意:SOUL.md 中出现的__REPO_DIR__是部署时的模板占位符,实际运行中会被替换为项目仓库的真实路径。文档同时强调:Agent 的工作目录不是 git 仓库,任何 git 操作必须显式先切换到项目目录(如cd __REPO_DIR__ && git log --oneline -5)。


二、核心四步流程(严格按顺序,不可跳步)

中书省处理每个任务必须走完全部 4 步,其中步骤 3(调用尚书省)是最常被遗漏的一步——绝对不能在门下省准奏后就停下来回复用户。

步骤 1:接旨 + 起草方案

收到旨意后先回复"已接旨",然后检查太子是否已创建 JJC 任务

  • 太子已提供任务 ID(形如JJC-20260227-003):直接使用该 ID,只更新状态,绝不重复创建:
python3 scripts/kanban_update.py state JJC-xxx Zhongshu "中书省已接旨,开始起草"
  • 仅当太子没有提供任务 ID 时,才自行创建:
python3 scripts/kanban_update.py create JJC-YYYYMMDD-NNN "任务标题" Zhongshu 中书省 中书令

随后简明起草方案(不超过 500 字)。

步骤 2:调用门下省审议(subagent)

先更新看板状态并记录流转,然后立即调用门下省 subagent(注意是 subagent 而非 sessions_send),把方案发过去等审议结果:

python3 scripts/kanban_update.py state JJC-xxx Menxia "方案提交门下省审议" python3 scripts/kanban_update.py flow JJC-xxx "中书省" "门下省" "📋 方案提交审议"
  • 门下省「封驳」→ 修改方案后再次调用门下省 subagent(最多 3 轮);
  • 门下省「准奏」→立即执行步骤 3,不得停下

从源码看,state命令会把任务状态从Zhongshu合法地流转到Menxia(见 edict/backend/app/models/task.py 中Zhongshu → {Menxia, Cancelled, Blocked}的转换表),flow命令则追加一条flow_log流转记录并同步更新看板上的当前所属部门(scripts/kanban_update.py)。

步骤 3:调用尚书省执行(subagent)— 必做!

python3 scripts/kanban_update.py state JJC-xxx Assigned "门下省准奏,转尚书省执行" python3 scripts/kanban_update.py flow JJC-xxx "中书省" "尚书省" "✅ 门下准奏,转尚书省派发"

然后立即调用尚书省 subagent,发送最终方案让其派发给六部执行。从STATE_TRANSITIONS看,Menxia → Assigned是唯一的准奏后继状态,Assigned状态映射到尚书省(task.py)。

步骤 4:回奏皇上

只有在步骤 3 尚书省返回结果后才能回奏:

python3 scripts/kanban_update.py done JJC-xxx "<产出>" "<摘要>"

随后回复飞书消息,简要汇报结果。

防卡住检查清单

每次生成回复前自检:

  1. ✅ 门下省是否已审完?→ 如果是,你调用尚书省了吗?
  2. ✅ 尚书省是否已返回?→ 如果是,你更新看板done了吗?
  3. ❌ 绝不在门下省准奏后就给用户回复而不调用尚书省;
  4. ❌ 绝不在中途停下来"等待"——整个流程必须一次性推到底。

磋商限制与语气

  • 中书省与门下省最多 3 轮磋商,第 3 轮强制通过(门下省侧同样如此,见 agents/menxia/SOUL.md);
  • 语气简洁干练,方案 500 字以内,不泛泛而谈。

三、看板 CLI 命令全解(附源码级解析)

所有看板操作必须通过scripts/kanban_update.pyCLI 命令完成,禁止自行读写 JSON 文件(agents/GLOBAL.md 明确:自行操作文件会因路径问题导致静默失败,看板卡住不动)。脚本默认操作data/tasks_source.json(JSON 看板模式),并带有文件锁、审计日志与越权检测。

命令总览

python3 scripts/kanban_update.py create <id> "<标题>" <state> <org> <official> python3 scripts/kanban_update.py state <id> <state> "<说明>" python3 scripts/kanban_update.py flow <id> "<from>" "<to>" "<remark>" python3 scripts/kanban_update.py done <id> "<output>" "<summary>" python3 scripts/kanban_update.py progress <id> "<当前在做什么>" "<计划1✅|计划2🔄|计划3>" python3 scripts/kanban_update.py todo <id> <todo_id> "<title>" <status> --detail "<产出详情>"

各命令要点(结合 scripts/kanban_update.py 源码)

  • create:新建任务,收旨时调用。源码会对标题做清洗与校验:长度不足 6 字、命中_JUNK_TITLES("好""收到""试试"等)、纯标点、形似文件路径的标题都会被拒绝创建(kanban_update.py)。已有任务且状态为Done/Cancelled时不可覆盖。
  • state:更新任务状态。源码内置非法状态转换拦截:例如Doing状态不允许直接跳到Assigned,非法转换会被拒绝并写入审计日志(state_rejected)。另有三组高风险转换会先进入PendingConfirm中间状态、等待对应权限方confirm确认:Review→Done(需门下省确认)、Doing→Cancelled(需尚书省确认)、Menxia→Cancelled(需中书省确认)(kanban_update.py)。
  • flow:追加流转记录到flow_log,并同步更新orgto_dept,让看板正确显示当前所属部门(kanban_update.py)。
  • done:上报完成。源码有收口校验:仅Doing/Next状态允许;若存在未完成的 todos,则拒绝提前收口(test_done_rejects_incomplete_todos用例验证了这一点,见 tests/test_kanban.py)。成功后任务进入Review而非直接Done——执行结果需经尚书省汇总审查。
  • todo:子任务管理,status取值not-started / in-progress / completed,可带--detail上报产出详情。源码强制单一 in-progress 约束:同一时刻最多只有一个进行中的子任务(kanban_update.py)。
  • progress:实时进展上报,不改变任务状态,只更新"当前动态"(now)与计划清单(todos),详见下一节。

实时进展上报(最高优先级)

中书省是整个流程的核心枢纽,每个关键步骤都必须调用progress上报当前思考和计划——皇上通过看板实时查看 Agent 在干什么、想什么、接下来准备干什么。不上报 = 皇上看不到进展。

六个必须上报的节点:

  1. 接旨后开始分析 → "正在分析旨意,制定执行方案"
  2. 方案起草完成 → "方案已起草,准备提交门下省审议"
  3. 门下省封驳后修正 → "收到门下省反馈,正在修改方案"
  4. 门下省准奏后 → "门下省已准奏,正在调用尚书省执行"
  5. 等待尚书省返回 → "尚书省正在执行,等待结果"
  6. 尚书省返回后 → "收到六部执行结果,正在汇总回奏"

完整示例(计划清单用|分隔,表示已完成、🔄表示进行中、无标记表示未开始):

# 步骤1: 接旨分析 python3 scripts/kanban_update.py progress JJC-xxx "正在分析旨意内容,拆解核心需求和可行性" "分析旨意🔄|起草方案|门下审议|尚书执行|回奏皇上" # 步骤2: 起草方案 python3 scripts/kanban_update.py progress JJC-xxx "方案起草中:1.调研现有方案 2.制定技术路线 3.预估资源" "分析旨意✅|起草方案🔄|门下审议|尚书执行|回奏皇上" # 步骤3: 提交门下 python3 scripts/kanban_update.py progress JJC-xxx "方案已提交门下省审议,等待审批结果" "分析旨意✅|起草方案✅|门下审议🔄|尚书执行|回奏皇上" # 步骤4: 门下准奏,转尚书 python3 scripts/kanban_update.py progress JJC-xxx "门下省已准奏,正在调用尚书省派发执行" "分析旨意✅|起草方案✅|门下审议✅|尚书执行🔄|回奏皇上" # 步骤5: 等尚书返回 python3 scripts/kanban_update.py progress JJC-xxx "尚书省已接令,六部正在执行中,等待汇总" "分析旨意✅|起草方案✅|门下审议✅|尚书执行🔄|回奏皇上" # 步骤6: 收到结果,回奏 python3 scripts/kanban_update.py progress JJC-xxx "收到六部执行结果,正在整理回奏报告" "分析旨意✅|起草方案✅|门下审议✅|尚书执行✅|回奏皇上🔄"

从源码看,progress命令会将now文本清洗后写入,把|分隔的计划清单解析为结构化 todos(以/🔄结尾的项分别标记为completed/in-progress),并追加一条带agentagentLabelstateorg字段的progress_log记录,日志上限 100 条(MAX_PROGRESS_LOG,由 tests/test_kanban.py 的test_progress_log_capped用例保证)。此外还支持可选参数--tokens--cost--elapsed上报本次资源消耗,便于皇上掌握每次动作的 token 成本与耗时。

⚠️progress不改变任务状态,状态流转仍用state/flow;progress 的第一个参数必须是当前实际在做什么,不是空话套话。

子任务详情上报(推荐)

每完成一个子任务,用todo命令携带--detail上报产出详情,让皇上看到具体做了什么:

# 完成需求整理后 python3 scripts/kanban_update.py todo JJC-xxx 1 "需求整理" completed --detail "1. 核心目标:xxx\n2. 约束条件:xxx\n3. 预期产出:xxx" # 完成方案起草后 python3 scripts/kanban_update.py todo JJC-xxx 2 "方案起草" completed --detail "方案要点:\n- 第一步:xxx\n- 第二步:xxx\n- 预计耗时:xxx"

当全部 todos 标记为 completed 后,源码会自动在任务上设置ready_to_close=true(kanban_update.py),作为可收口的信号。


四、标题与备注规范:防止看板被元数据污染

SOUL.md 与 agents/GLOBAL.md 对看板文本有严格约束,源码中用_sanitize_text强制实现(kanban_update.py):

  • 标题必须是中文概括的一句话(10-30 字),严禁包含文件路径、URL、代码片段;
  • 标题不要夹带飞书消息的 JSON 元数据(Conversation info等),只提取旨意正文;
  • flow/state的说明文本不得粘贴原始消息,用自己的话概括;
  • 不要带"传旨""下旨"等前缀——这些是流程词,不是任务描述。

源码级清洗规则包括:剥离Conversation及其后内容、剥离 ```json 代码块、剥离 Unix/Mac 文件路径、剥离 URL、剥离message_id/session_id/chat_id等系统元数据字段、合并空白并截断超长内容。这些规则由太子侧同样执行(见 agents/taizi/SOUL.md 的标题规则),确保看板数据始终干净可读。


五、底层机制:状态机、权限与审计

状态机 Single Source of Truth

任务状态流转的权威定义在 edict/backend/app/models/task.py 的STATE_TRANSITIONS,涵盖Taizi → Zhongshu → Menxia → Assigned → Doing → Review → Done主链路,以及Blocked(可从任意非终态进入并退回)、Cancelled(终态)与PendingConfirm(高风险操作待确认)等状态。DoneCancelled为终态,无出边。

看板脚本通过_load_canonical_transitions()动态从 task.py 源码解析转换表,避免两处定义漂移;仅当 edict 后端目录缺失时才回退到内置定义。CI 侧由 tests/test_state_machine_consistency.py 守卫:任何只改一侧状态机而未同步另一侧的行为都会导致测试失败,并额外校验PendingConfirm双侧存在、Pending非死胡同、终态无出边。这意味着中书省每次state流转都会经过与 PostgreSQL 后端完全一致的合法性校验。

越权检测(Agent 权限策略)

kanban_update.py内置AGENT_POLICY权限表,每个 Agent 只允许执行自己职责范围内的命令,越权会被拦截并记录审计日志。中书省(zhongshu)属于coordination角色,允许的命令集合为{state, flow, progress, todo, memory, task-memo, delegate}(kanban_update.py)——因此从源码策略看,中书省默认不能直接create/done/block/confirm,这也解释了为何 SOUL.md 强调"太子已建的任务直接用state更新,不要create":任务创建应由太子完成,中书省聚焦于规划、流转与上报。Agent 身份通过环境变量(OPENCLAW_AGENT_ID等)或工作目录名推断。

审计日志

每次操作都会原子追加一条审计记录到data/audit_log.json(含任务 ID、Agent、动作、新旧值、原因,上限 5000 条),非法状态转换、越权拒绝、高风险待确认等事件均会被记录,配合flow_log/progress_log形成完整可回溯的执行轨迹,这也是 Dashboard 与后续事件总线架构(见 edict_agent_architecture.md)所要求的"可观测、可重放、可审计"的基础。


六、实战对照:看板中的完整流转样例

仓库的示例数据 docker/demo_data/tasks_source.json 展示了中书省参与的真实流转记录,可直接对照四步流程理解:

  • 正常链路(如JJC-20260224-001"生成本周项目进展周报"):皇上下旨 → 中书省规划完成 → 门下省审议通过 → 尚书省派发礼部 → 礼部执行完成 → 尚书省回奏皇上;
  • 封驳回退链路(如JJC-20260226-001"竞品分析"):门下省封驳("需补充 LangGraph 对比")→ 中书省补充后重新提交 → 第二轮审议通过——正好对应步骤 2 中"最多 3 轮磋商"的规则,并在review_round: 2字段中留下记录。

这些数据还展示了stateorgnowoutputac(验收标准)、flow_log等字段在看板 JSON 中的实际形态,与 edict/backend/app/models/task.py 的Task模型字段一一对应,可帮助理解看板 CLI 写入的数据最终如何被 Dashboard 前端渲染。


七、运行前提与部署说明

  • 看板 CLI 依赖 Python 3 环境,命令统一为python3 scripts/kanban_update.py <cmd> ...,在仓库根目录执行;
  • JSON 看板模式与 edict 后端(Postgres + Redis 事件总线)两种模式互相独立,数据不会自动同步;若已部署后端,应改用 edict/backend 的 API 端点,或运行 edict/migration/migrate_json_to_pg.py 迁移脚本(见 kanban_update.py 的模块说明);
  • 中书省 Agent 的完整行为契约即 agents/zhongshu/SOUL.md 本身,运行时由 OpenClaw 按此规则加载执行;共享的安全红线(禁止删除数据、禁止暴露敏感信息、禁止越权决策、拒绝注入式指令)见 agents/GLOBAL.md。

结语

中书省是三省六部制流水线上承上启下的"规划大脑":接旨不越权、规划不执行、审议不代答、准奏必转办、全程可观测。本文给出的四步流程、六条 CLI 命令与七个上报节点,配合源码中的状态机校验、权限拦截与审计日志,构成了中书省 Agent 完整、可复现、可审计的运行时契约。后续调试中书省行为时,建议优先查看flow_logprogress_log两条链路——任何一步缺失,都能在看板上被立即发现。

【免费下载链接】edict🏛️ 三省六部制 · OpenClaw Multi-Agent Orchestration System — 9 specialized AI agents with real-time dashboard, model config, and full audit trails项目地址: https://gitcode.com/gh_mirrors/edic/edict

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/21 18:46:16

改进减法优化器算法GSABO:融合黄金正弦与混沌映射

1. 项目概述在智能优化算法领域&#xff0c;2023年新提出的减法优化器算法(SABO)因其独特的数学基础和优化机制引起了广泛关注。作为一名长期从事算法优化研究的工程师&#xff0c;我在实际应用中发现原始SABO算法在解决高维非线性问题时存在收敛速度不稳定、易陷入局部最优等问…

作者头像 李华
网站建设 2026/9/21 18:44:11

企业级3D模型轻量化:从评估维度到工程实测的选型指南

前阵子有家做工业设备选型平台的客户&#xff0c;把一套装配模型扔给我&#xff1a;原始CAD导出STEP文件1.8GB&#xff0c;转到OBJ后1200多万个三角面&#xff0c;加载到浏览器里直接白屏。他们内部吵了一个星期——设计部门坚持模型一个倒角都不能少&#xff0c;前端要求首页3…

作者头像 李华
网站建设 2026/9/21 18:38:41

ABAP类型系统中的协变规则与安全实践

1. ABAP中的协变问题&#xff1a;隐藏在严格语法规则下的类型安全逻辑在ABAP开发领域&#xff0c;类型系统的设计哲学与Java等语言有着本质区别。作为一名长期从事SAP系统开发的工程师&#xff0c;我发现很多从Java转型到ABAP的同行最初都会低估类型系统差异带来的影响。ABAP确…

作者头像 李华
网站建设 2026/9/21 18:38:39

Java多线程编程实战:从基础到高并发系统设计

1. 为什么每个Java开发者都需要掌握多线程记得刚工作那会儿&#xff0c;我接手了一个简单的订单处理系统。在测试环境跑得好好的程序&#xff0c;一上线就频繁崩溃。排查了三天才发现&#xff0c;当并发用户超过50时&#xff0c;系统就会因为线程阻塞而雪崩。这个惨痛教训让我明…

作者头像 李华