三省六部 (Edict) 运行原理详解
一句话概括
用户在 Discord 发消息 → 太子 Agent 接旨 → 中书省起草方案 → 门下省审议 → 尚书省派单 → 六部执行 → 结果回奏。整个流程通过 OpenClaw 的 sub-agent 机制 + 共享 JSON 文件 串联。
核心机制:Agent 链式调用
每个"省/部"是一个独立的 OpenClaw Agent,有自己的:
- Workspace (
~/.openclaw/workspace-zhongshu/) - SOUL.md(角色定义,比如中书省的 prompt 里写死了"你是中书令,负责起草任务令")
- Skills 目录(可用工具)
- subagents.allowAgents(能调用谁)
权限链是单向的,模拟真实官僚体系:
太子 → 只能叫中书省
中书省 → 只能叫门下省、尚书省
尚书省 → 能叫六部中的任何一个
六部 → 只能回报尚书省
完整流程举例
假设你在 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.sh 每 15 秒执行一轮:
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 实时进展日志
- 子任务 TODO 完成度
关键设计点
| 设计 | 实现方式 | 为什么 |
|---|---|---|
| **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:
- JSON 文件 = 公文流转的驿站
- SOUL.md = 每个官员的职责说明书
kanban_update.py= 公文盖章系统- Dashboard = 皇帝的御书房大屏
run_loop.sh= 太监每隔 15 秒来汇报一次最新进展
整套系统没有自建任何 AI 基础设施,完全寄生在 OpenClaw 上——Agent 调度、模型调用、消息投递都用 OpenClaw 原生能力,edict 只做流程编排和可视化。