三省六部 (Edict) 运行原理详解

一句话概括

用户在 Discord 发消息 → 太子 Agent 接旨 → 中书省起草方案 → 门下省审议 → 尚书省派单 → 六部执行 → 结果回奏。整个流程通过 OpenClaw 的 sub-agent 机制 + 共享 JSON 文件 串联。

核心机制:Agent 链式调用

每个"省/部"是一个独立的 OpenClaw Agent,有自己的:

权限链是单向的,模拟真实官僚体系:


太子 → 只能叫中书省
中书省 → 只能叫门下省、尚书省
尚书省 → 能叫六部中的任何一个
六部 → 只能回报尚书省

完整流程举例

假设你在 Discord 跟太子说:"帮我写一份 Q1 技术周报"

Step 1: 太子接旨

太子 Agent(绑定 Discord #edict 频道)收到消息,判断这是一个任务,调用 kanban_update.py


python3 kanban_update.py create JJC-20260302-001 \
  "撰写Q1技术周报" Zhongshu 中书省 中书令

这会在 data/tasks_source.json 里创建一条记录:


{
  "id": "JJC-20260302-001",
  "title": "撰写Q1技术周报",
  "state": "Zhongshu",
  "org": "中书省",
  "flow_log": [
    {"from": "皇上", "to": "中书省", "remark": "下旨:撰写Q1技术周报"}
  ]
}

然后太子通过 sessions_spawn 唤醒中书省,把整理好的需求发过去。

Step 2: 中书省起草

中书省 Agent 醒来,读自己的 SOUL.md("你是中书令,负责分解任务、评估优先级"),开始工作:

1. 分析任务,拟定执行方案:谁来写、什么格式、需要哪些数据

2. 汇报进展:

`bash

python3 kanban_update.py progress JJC-20260302-001 \

"正在拟定周报框架" \

"1.确定大纲🔄|2.收集数据|3.撰写初稿"

`

3. 方案写好后,流转给门下省审议:

`bash

python3 kanban_update.py flow JJC-20260302-001 \

"中书省" "门下省" "规划方案提交审核"

python3 kanban_update.py state JJC-20260302-001 Menxia \

"等待门下省审议"

`

4. 通过 sessions_spawn 唤醒门下省

Step 3: 门下省审议

门下省的 SOUL.md 写的是"你是侍中,负责审议,发现问题要退回"。它会:


# 准奏
python3 kanban_update.py flow JJC-20260302-001 \
  "门下省" "尚书省" "✅ 准奏,方案可行"
python3 kanban_update.py state JJC-20260302-001 Assigned \
  "尚书省派单中"

Step 4: 尚书省派单

尚书省看任务类型,决定派给哪个部:


python3 kanban_update.py state JJC-20260302-001 Doing "礼部执行中"

通过 sessions_spawn 唤醒礼部。

Step 5: 礼部执行

礼部 Agent 实际干活——搜集数据、写周报、生成文件。执行中持续汇报:


python3 kanban_update.py progress JJC-20260302-001 \
  "正在撰写项目A进展" \
  "1.项目A✅|2.项目B🔄|3.总结"

完成后:


python3 kanban_update.py done JJC-20260302-001 \
  "/path/to/report.md" "Q1技术周报已完成"

Step 6: 结果回奏

太子收到完成通知,通过 Discord 回复用户。

看板实时监控

整个过程中,run_loop.sh15 秒执行一轮:


while true; do
  python3 sync_from_openclaw_runtime.py  # 从 OpenClaw 运行时同步状态
  python3 sync_agent_config.py           # 同步 agent 配置
  python3 apply_model_changes.py         # 应用模型切换
  python3 sync_officials_stats.py        # 统计各官员工作量
  python3 refresh_live_data.py           # 刷新看板数据
  sleep 15
done

Dashboard(localhost:7891)提供 Web UI,可以看到:

关键设计点

设计实现方式为什么
**Agent 间通信**OpenClaw `sessions_spawn`不自建消息队列,复用平台能力
**状态共享**`tasks_source.json` + `fcntl` 文件锁简单粗暴但有效,多 Agent 并发安全
**权限控制**`subagents.allowAgents` 白名单六部不能直接叫六部,必须走尚书省
**防垃圾任务**`_is_valid_task_title` 校验"好的"、"?"、文件路径不会变成任务
**进展追踪**`kanban_update.py progress`Agent 主动汇报,不靠轮询
**卡住检测**每 120 秒 `scheduler-scan`超过 180 秒没更新的任务自动重试

架构图


┌─────────────────────────────────────────────────────────┐
│                     用户 (皇帝)                          │
│                  Discord #edict 频道                     │
└──────────────────────┬──────────────────────────────────┘
                       │ 消息
                       ▼
┌──────────────────────────────────────────────────────────┐
│  太子 Agent (taizi)                                      │
│  职责: 消息分拣、接旨、回奏                                │
│  判断: 闲聊→自己回 | 旨意→创建任务→转中书省                 │
└──────────────────────┬──────────────────────────────────┘
                       │ sessions_spawn
                       ▼
┌──────────────────────────────────────────────────────────┐
│  中书省 (zhongshu)                                       │
│  职责: 分析旨意、起草执行方案、评估优先级                    │
└───────────┬──────────────────────┬──────────────────────┘
            │ spawn                │ spawn (准奏后)
            ▼                      ▼
┌─────────────────────┐  ┌─────────────────────────────────┐
│  门下省 (menxia)     │  │  尚书省 (shangshu)               │
│  职责: 审议方案       │  │  职责: 派单给六部                 │
│  准奏 / 封驳         │  └───────────┬───────────────────────┘
└─────────────────────┘              │ spawn
                                     ▼
                    ┌────────────────────────────────┐
                    │          六 部                  │
                    ├────────┬────────┬──────┬───────┤
                    │ 礼部   │ 户部   │ 工部  │ ...  │
                    │ 文档   │ 预算   │ 工程  │      │
                    └────────┴────────┴──────┴───────┘

数据流


Agent 调用 kanban_update.py
        ↓ (fcntl 加锁写入)
  tasks_source.json  ← 唯一数据源
        ↓ (run_loop.sh 每15秒触发)
  refresh_live_data.py → 生成 live_status.json
        ↓
  Dashboard (server.py) 读取 → 前端展示

一个比喻

把它想象成古代朝廷的奏折系统,但每个官员是一个 AI Agent:

整套系统没有自建任何 AI 基础设施,完全寄生在 OpenClaw 上——Agent 调度、模型调用、消息投递都用 OpenClaw 原生能力,edict 只做流程编排和可视化