# Technical Documentation: cft0808/edict

> ℹ️ **Provenance:** Multi-Tier Ingestion · [CodeWiki Reference](https://codewiki.google/github.com/cft0808/edict)

### Overview (README.md)

<h1 align="center">⚔️ 三省六部 · Edict</h1>

<p align="center">
  <strong>我用 1300 年前的帝国制度，重新设计了 AI 多 Agent 协作架构。<br>结果发现，古人比现代 AI 框架更懂分权制衡。</strong>
</p>

<p align="center">
  <sub>12 个 AI Agent（11 个业务角色 + 1 个兼容角色）组成三省六部：太子分拣、中书省规划、门下省审核封驳、尚书省派发、六部+吏部并行执行。<br>比 CrewAI 多一层<b>制度性审核</b>，比 AutoGen 多一个<b>实时看板</b>。</sub>
</p>

<p align="center">
  <a href="#-demo">🎬 看 Demo</a> ·
  <a href="#-30-秒快速体验">🚀 30 秒体验</a> ·
  <a href="#-架构">🏛️ 架构</a> ·
  <a href="#-功能全景">📋 看板功能</a> ·
  <a href="docs/task-dispatch-architecture.md">📚 架构文档</a> ·
  <a href="README_EN.md">English</a> ·
  <a href="README_JA.md">日本語</a> ·
  <a href="CONTRIBUTING.md">参与贡献</a>
</p>

<p align="center">
  <img src="https://img.shields.io/badge/OpenClaw-Required-blue?style=flat-square" alt="OpenClaw">
  <img src="https://img.shields.io/badge/Python-3.9+-3776AB?style=flat-square&logo=python&logoColor=white" alt="Python">
  <img src="https://img.shields.io/badge/Agents-12_Specialized-8B5CF6?style=flat-square" alt="Agents">
  <img src="https://img.shields.io/badge/Dashboard-Real--time-F59E0B?style=flat-square" alt="Dashboard">
  <img src="https://img.shields.io/badge/License-MIT-22C55E?style=flat-square" alt="License">
  <img src="https://img.shields.io/badge/Frontend-React_18-61DAFB?style=flat-square&logo=react&logoColor=white" alt="React">
  <img src="https://img.shields.io/badge/Backend-stdlib_only-EC4899?style=flat-square" alt="Zero Backend Dependencies">
</p>

<p align="center">
  <img src="https://img.shields.io/badge/公众号-cft0808-07C160?style=for-the-badge&logo=wechat&logoColor=white" alt="WeChat">
</p>

---

## 🎬 Demo

<p align="center">
  <video src="docs/Agent_video_Pippit_20260225121727.mp4" width="100%" autoplay muted loop playsinline controls>
    您的浏览器不支持视频播放，请查看下方 GIF 或 <a href="docs/Agent_video_Pippit_20260225121727.mp4">下载视频</a>。
  </video>
  <br>
  <sub>🎥 三省六部 AI 多 Agent 协作全流程演示</sub>
</p>

<details>
<summary>📸 GIF 预览（加载更快）</summary>
<p align="center">
  <img src="docs/demo.gif" alt="三省六部 Demo" width="100%">
  <br>
  <sub>飞书下旨 → 太子分拣 → 中书省规划 → 门下省审议 → 六部并行执行 → 奏折回报（30 秒）</sub>
</p>
</details>

> 🐳 **没有 OpenClaw？** 跑一行 `docker run -p 7891:7891 cft0808/edict` 即可体验完整看板 Demo（预置模拟数据）。

---

## 🤔 为什么是三省六部？

大多数 Multi-Agent 框架的套路是：

> *"来，你们几个 AI 自己聊，聊完把结果给我。"*

然后你拿到一坨不知道经过了什么处理的结果，无法复现，无法审计，无法干预。

**三省六部的思路完全不同** —— 我们用了一个在中国存在 1400 年的制度架构：

```
你 (皇上) → 太子 (分拣) → 中书省 (规划) → 门下省 (审议) → 尚书省 (派发) → 六部 (执行) → 回奏
```

这不是花哨的 metaphor，这是**真正的分权制衡**：

| | CrewAI | MetaGPT | AutoGen | **三省六部** |
|---|:---:|:---:|:---:|:---:|
| **审核机制** | ❌ 无 | ⚠️ 可选 | ⚠️ Human-in-loop | **✅ 门下省专职审核 · 可封驳** |
| **实时看板** | ❌ | ❌ | ❌ | **✅ 军机处 Kanban + 时间线** |
| **任务干预** | ❌ | ❌ | ❌ | **✅ 叫停 / 取消 / 恢复** |
| **流转审计** | ⚠️ | ⚠️ | ❌ | **✅ 完整奏折存档** |
| **Agent 健康监控** | ❌ | ❌ | ❌ | **✅ 心跳 + 活跃度检测** |
| **热切换模型** | ❌ | ❌ | ❌ | **✅ 看板内一键切换 LLM** |
| **技能管理** | ❌ | ❌ | ❌ | **✅ 查看 / 添加 Skills** |
| **新闻聚合推送** | ❌ | ❌ | ❌ | **✅ 天下要闻 + 飞书推送** |
| **部署难度** | 中 | 高 | 中 | **低 · 一键安装 / Docker** |

> **核心差异：制度性审核 + 完全可观测 + 实时可干预**

<details>
<summary><b>🔍 为什么「门下省审核」是杀手锏？（点击展开）</b></summary>

<br>

CrewAI 和 AutoGen 的 Agent 协作模式是 **"做完就交"**——没有人检查产出质量。就像一个公司没有 QA 部门，工程师写完代码直接上线。

三省六部的 **门下省** 专门干这件事：

- 📋 **审查方案质量** —— 中书省的规划是否完备？子任务拆解是否合理？
- 🚫 **封驳不合格的产出** —— 不是 warning，是直接打回重做
- 🔄 **强制返工循环** —— 直到方案达标才放行

这不是可选的插件——**它是架构的一部分**。每一个旨意都必须经过门下省，没有例外。

这就是为什么三省六部能处理复杂任务而结果可靠：因为在送到执行层之前，有一个强制的质量关卡。1300 年前唐太宗就想明白了——**不受制约的权力必然会出错**。

</details>

---

## ✨ 功能全景

### 🏛️ 十二部制 Agent 架构
- **太子** 消息分拣 —— 闲聊自动回复，旨意才建任务
- **三省**（中书·门下·尚书）负责规划、审议、派发
- **七部**（户·礼·兵·刑·工·吏 + 早朝官）负责专项执行
- 严格的权限矩阵 —— 谁能给谁发消息，白纸黑字
- **状态流转校验** —— kanban_update.py 强制合法转换路径，非法状态跳转被拒绝
- 每个 Agent 独立 Workspace · 独立 Skills · 独立模型
- **旨意数据清洗** —— 标题/备注自动剥离文件路径、元数据、无效前缀

### 📋 军机处看板（10 个功能面板）

<table>
<tr><td width="50%">

**📋 旨意看板 · Kanban**
- 按状态列展示全部任务
- 省部过滤 + 全文搜索
- 心跳徽章（🟢活跃 🟡停滞 🔴告警）
- 任务详情 + 完整流转链
- 叫停 / 取消 / 恢复操作

</td><td width="50%">

**🔭 省部调度 · Monitor**
- 可视化各状态任务数量
- 部门分布横向条形图
- Agent 健康状态实时卡片

</td></tr>
<tr><td>

**📜 奏折阁 · Memorials**
- 已完成旨意自动归档为奏折
- 五阶段时间线：圣旨→中书→门下→六部→回奏
- 一键复制为 Markdown
- 按状态筛选

</td><td>

**📜 旨库 · Template Library**
- 9 个预设圣旨模板
- 分类筛选 · 参数表单 · 预估时间和费用
- 预览旨意 → 一键下旨

</td></tr>
<tr><td>

**👥 官员总览 · Officials**
- Token 消耗排行榜
- 活跃度 · 完成数 · 会话统计

</td><td>

**📰 天下要闻 · News**
- 每日自动采集科技/财经资讯
- 分类订阅管理 + 飞书推送

</td></tr>
<tr><td>

**⚙️ 模型配置 · Models**
- 每个 Agent 独立切换 LLM
- 应用后自动重启 Gateway（~5秒生效）

</td><td>

**🛠️ 技能配置 · Skills**
- 各省部已安装 Skills 一览
- 查看详情 + 添加新技能

</td></tr>
<tr><td>

**💬 小任务 · Sessions**
- OC-* 会话实时监控
- 来源渠道 · 心跳 · 消息预览

</td><td>

**🎬 上朝仪式 · Ceremony**
- 每日首次打开播放开场动画
- 今日统计 · 3.5秒自动消失

</td></tr>
<tr><td>

**🏛️ 朝堂议政 · Court Discussion**
- 多官员围绕议题展开部门视角讨论
- LLM 驱动的多角色辩论（各部依职责发表专业意见）
- 支持多轮推进 · 总结结论 · 保留讨论记录

</td><td>

</td></tr>
</table>

---

## 🖼️ 截图

### 旨意看板


<details>
<summary>📸 展开查看更多截图</summary>

### 省部调度


### 任务流转详情


### 模型配置


### 技能配置


### 官员总览


### 会话记录


### 奏折归档


### 圣旨模板


### 天下要闻


### 上朝仪式


</details>

---

## 🚀 30 秒快速体验

### Docker 一键启动

```bash
docker run -p 7891:7891 cft0808/sansheng-demo
```
打开 http://localhost:7891 即可体验军机处看板。

<details>
<summary><b>⚠️ 遇到 <code>exec format error</code>？（点击展开）</b></summary>

如果你在 **x86/amd64** 机器（如 Ubuntu、WSL2）上看到：
```
exec /usr/local/bin/python3: exec format error
```

这是因为镜像架构不匹配。请使用 `--platform` 参数：
```bash
docker run --platform linux/amd64 -p 7891:7891 cft0808/sansheng-demo
```

或使用 docker-compose（已内置 `platform: linux/amd64`）：
```bash
docker compose up
```

</details>

### 完整安装

#### 前置条件
- [OpenClaw](https://openclaw.ai) 已安装
- Python 3.10+
- macOS / Linux

#### 安装

```bash
git clone https://github.com/cft0808/edict.git
cd edict
chmod +x install.sh && ./install.sh
```

安装脚本自动完成：
- ✅ 创建全量 Agent Workspace（含太子/吏部/早朝，兼容历史 main）
- ✅ 写入各省部 SOUL.md（角色人格 + 工作流规则 + 数据清洗规范）
- ✅ 注册 Agent 及权限矩阵到 `openclaw.json`
- ✅ **符号链接统一数据**（各 Workspace 的 data/scripts → 项目目录，确保数据一致）
- ✅ **设置 Agent 间通信可见性**（`sessions.visibility all`，解决消息不可达问题）
- ✅ **同步 API Key 到所有 Agent**（自动从已配置的 Agent 复制）
- ✅ 构建 React 前端（需 Node.js 18+，如未安装则跳过）
- ✅ 初始化数据目录 + 首次数据同步（含官员统计）
- ✅ 重启 Gateway 使配置生效

> ⚠️ **首次安装**：需先配置 API Key：`openclaw agents add taizi`，然后重新运行 `./install.sh` 同步到所有 Agent。

#### 启动

```bash
# 方式 1：一键启动（推荐）
chmod +x start.sh && ./start.sh

# 方式 2：分别启动
bash scripts/run_loop.sh &      # 数据刷新循环
python3 dashboard/server.py     # 看板服务器

# 打开浏览器
open http://127.0.0.1:7891
```

<details>
<summary><b>🖥️ 生产环境部署（systemd）</b></summary>

```bash
# 安装 systemd 服务
sudo cp edict.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable edict
sudo systemctl start edict

# 或使用管理脚本
bash edict.sh start    # 启动
bash edict.sh status   # 查看状态
bash edict.sh restart  # 重启
bash edict.sh stop     # 停止
```

</details>

> 💡 **看板即开即用**：`server.py` 内嵌 `dashboard/dashboard.html`，Docker 镜像包含预构建的 React 前端

> 💡 详细教程请看 [Getting Started 指南](docs/getting-started.md)

---

## 🏛️ 架构

```
/* Detailed source-code truncated for AI context efficiency. */
```

### 各省部职责

| 部门 | Agent ID | 职责 | 擅长领域 |
|------|----------|------|---------|
| � **太子** | `taizi` | 消息分拣、需求整理 | 闲聊识别、旨意提炼、标题概括 |
| 📜 **中书省** | `zhongshu` | 接旨、规划、拆解 | 需求理解、任务分解、方案设计 |
| 🔍 **门下省** | `menxia` | 审议、把关、封驳 | 质量评审、风险识别、标准把控 |
| 📮 **尚书省** | `shangshu` | 派发、协调、汇总 | 任务调度、进度跟踪、结果整合 |
| 💰 **户部** | `hubu` | 数据、资源、核算 | 数据处理、报表生成、成本分析 |
| 📝 **礼部** | `libu` | 文档、规范、报告 | 技术文档、API 文档、规范制定 |
| ⚔️ **兵部** | `bingbu` | 代码、算法、巡检 | 功能开发、Bug 修复、代码审查 |
| ⚖️ **刑部** | `xingbu` | 安全、合规、审计 | 安全扫描、合规检查、红线管控 |
| 🔧 **工部** | `gongbu` | CI/CD、部署、工具 | Docker 配置、流水线、自动化 |
| 📋 **吏部** | `libu_hr` | 人事、Agent 管理 | Agent 注册、权限维护、培训 |
| 🌅 **早朝官** | `zaochao` | 每日早朝、新闻聚合 | 定时播报、数据汇总 |

### 权限矩阵

> 不是想发就能发 —— 真正的分权制衡

| From ↓ \ To → | 太子 | 中书 | 门下 | 尚书 | 户 | 礼 | 兵 | 刑 | 工 | 吏 |
|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|:---:|
| **太子** | — | ✅ | | | | | | | | |
| **中书省** | ✅ | — | ✅ | ✅ | | | | | | |
| **门下省** | | ✅ | — | ✅ | | | | | | |
| **尚书省** | | ✅ | ✅ | — | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| **六部+吏部** | | | | ✅ | | | | | | |

### 任务状态流转

```
皇上 → 太子分拣 → 中书规划 → 门下审议 → 已派发 → 执行中 → 待审查 → ✅ 已完成
                      ↑          │                              │
                      └──── 封驳 ─┘                    阻塞 Blocked
```

> ⚡ **状态转换受保护**：`kanban_update.py` 内置 `_VALID_TRANSITIONS` 状态机校验，
> 非法跳转（如 Doing→Taizi）会被拒绝并记录日志，确保流程不可绕过。
>
> 🔄 **异步事件驱动**：服务间通过 Redis Streams EventBus 解耦通信，Outbox Relay 保障事件可靠投递。
> 所有状态变更自动写入审计日志（`audit.py`），支持完整追溯。

---

## 📁 项目结构

```
/* Detailed source-code truncated for AI context efficiency. */
```

---

## 🎯 使用方法

### 向 AI 下旨

通过 Feishu / Telegram / Signal 给中书省发消息：

```
给我设计一个用户注册系统，要求：
1. RESTful API（FastAPI）
2. PostgreSQL 数据库
3. JWT 鉴权
4. 完整测试用例
5. 部署文档
```

**然后坐好，看戏：**

1. 📜 中书省接旨，规划子任务分配方案
2. 🔍 门下省审议，通过 / 封驳打回重规划
3. 📮 尚书省准奏，派发给兵部 + 工部 + 礼部
4. ⚔️ 各部并行执行，进度实时可见
5. 📮 尚书省汇总结果，回奏给你

全程可在**军机处看板**实时监控，随时可以**叫停、取消、恢复**。

### 使用圣旨模板

> 看板 → 📜 旨库 → 选模板 → 填参数 → 下旨

9 个预设模板：周报生成 · 代码审查 · API 设计 · 竞品分析 · 数据报告 · 博客文章 · 部署方案 · 邮件文案 · 站会摘要

### 自定义 Agent

编辑 `agents/<id>/SOUL.md` 即可修改 Agent 的人格、职责和输出规范。

### 增补 Skills（从网上连接）

**三种方式添加 Skills：**

#### 1️⃣ 看板 UI（最简单）

```
看板 → 🔧 技能配置 → ➕ 添加远程 Skill
→ 输入 Agent + Skill 名称 + GitHub URL
→ 确认 → ✅ 完成
```

#### 2️⃣ CLI 命令（最灵活）

```bash
# 从 GitHub 添加 mmx_cli skill 到门下省
python3 scripts/skill_manager.py add-remote \
  --agent menxia \
  --name mmx_cli \
  --source https://raw.githubusercontent.com/MiniMax-AI/cli/main/skill/SKILL.md \
  --description "MiniMax 多模态 CLI 技能"

# 一键导入默认 skills 到指定 agents
python3 scripts/skill_manager.py import-official-hub \
  --agents menxia,shangshu

# 列出所有已添加的远程 skills
python3 scripts/skill_manager.py list-remote

# 更新某个 skill 到最新版本
python3 scripts/skill_manager.py update-remote \
  --agent menxia \
  --name mmx_cli
```

#### 3️⃣ API 请求（自动化集成）

```bash
# 添加远程 skill
curl -X POST http://localhost:7891/api/add-remote-skill \
  -H "Content-Type: application/json" \
  -d '{
    "agentId": "menxia",
    "skillName": "mmx_cli",
    "sourceUrl": "https://raw.githubusercontent.com/MiniMax-AI/cli/main/skill/SKILL.md",
    "description": "MiniMax 多模态 CLI 技能"
  }'

# 查看所有远程 skills
curl http://localhost:7891/api/remote-skills-list
```

**默认可导入 Skill：**

支持的 Skills：
- `mmx_cli` — MiniMax 多模态 CLI 技能（文本、图像、视频、语音、音乐、搜索）

如果你有自己的 Skills Hub，可以通过 `OPENCLAW_SKILLS_HUB_BASE` 或 `~/.openclaw/skills-hub-url` 配置自定义源。

详见 [🎓 远程 Skills 资源管理指南](docs/remote-skills-guide.md)

---

## 🔧 技术亮点

| 特点 | 说明 |
|------|------|
| **React 18 前端** | TypeScript + Vite + Zustand 状态管理，13 个功能组件 |
| **纯 stdlib 后端** | `server.py` 基于 `http.server`，零依赖，同时提供 API + 静态文件服务 |
| **EventBus 事件总线** | Redis Streams 发布/订阅，服务间解耦通信 |
| **Outbox Relay** | 事务性 Outbox 模式，保障事件可靠投递（至少一次语义） |
| **状态机审计** | 严格生命周期状态转换 + 完整审计日志（`audit.py`） |
| **并行调度引擎** | Dispatch Worker 支持并行执行、指数退避重试、资源锁 |
| **DAG 编排器** | Orchestrator 基于 DAG 的任务分解与依赖解析 |
| **Agent 思考可视** | 实时展示 Agent 的 thinking 过程、工具调用、返回结果 |
| **一键安装 / 一键启动** | `install.sh` 自动配置，`start.sh` 一条命令启动全部服务 |
| **systemd 生产部署** | `edict.service` 支持 systemd 守护进程，开机自启 |
| **15 秒同步** | 数据自动刷新，看板倒计时显示 |
| **Dashboard 鉴权** | `auth.py` 提供看板登录认证 |
| **每日仪式** | 首次打开播放上朝开场动画 |
| **远程 Skills 生态** | 从 GitHub/URL 一键导入能力，支持版本管理 + CLI + API + UI |

---

## � 深入了解

### 核心文档

- **[📖 任务分发流转完整架构](docs/task-dispatch-architecture.md)** — **必读文档**
  - 详细讲解三省六部如何处理复杂任务的业务设计和技术实现
  - 涵盖：9大任务状态机 / 权限矩阵 / 4阶段调度（重试→升级→回滚）/ Session JSONL数据融合
  - 包含完整的使用案例、API端点说明、CLI工具文档
  - 对标 CrewAI/AutoGen：为什么制度化>自由协作
  - 故障场景与恢复机制
  - **读这个文档会理解为什么三省六部这么强大**（9500+ 字，30 分钟完整理解）

- **[🎓 远程 Skills 资源管理指南](docs/remote-skills-guide.md)** — Skills 生态
  - 从网上连接和增补 skills，支持 GitHub/Gitee/任意 HTTPS URL
  - 默认 Skills 源和自定义 Hub 支持
  - CLI 工具 + 看板 UI + Restful API
  - Skills 文件规范与安全防护
  - 支持版本管理和一键更新

- **[⚡ Remote Skills 快速入门](docs/remote-skills-quickstart.md)** — 5 分钟上手
  - 快速体验、CLI 命令、看板操作示例
  - 创建自己的 Skills 库
  - API 完整参考 + 常见问题

- **[🚀 快速上手指南](docs/getting-started.md)** — 新手入门
- **[🤝 贡献指南](CONTRIBUTING.md)** — 想参与贡献？从这里开始

---
## 🔧 常见问题排查

<details>
<summary><b>❌ 任务总超时 / 下属完成了但无法传回太子</b></summary>

**症状**：六部或尚书省已完成任务，但太子收不到回报，最终超时。

**排查步骤**：

1. **检查 Agent 注册状态**：
```bash
curl -s http://127.0.0.1:7891/api/agents-status | python3 -m json.tool
```
确认 `taizi` agent 的 `statusLabel` 是 `alive`。

2. **检查 Gateway 日志**：
```bash
ls /tmp/openclaw/ | tail -5          # 找到最新日志
grep -i "error\|fail\|unknown" /tmp/openclaw/openclaw-*.log | tail -20
```

3. **常见原因**：
   - Agent ID 不匹配（已在 v1.2 修复：`main` → `taizi`）
   - LLM provider 超时（增加了自动重试）
   - 僵尸 Agent 进程（运行 `ps aux | grep openclaw` 检查）

4. **强制重试**：
```bash
# 手动触发巡检扫描（自动重试卡住的任务）
curl -X POST http://127.0.0.1:7891/api/scheduler-scan \
  -H 'Content-Type: application/json' -d '{"thresholdSec":60}'
```

</details>

<details>
<summary><b>❌ Docker: exec format error</b></summary>

**症状**：`exec /usr/local/bin/python3: exec format error`

**原因**：镜像架构（arm64）与主机架构（amd64）不匹配。

**解决**：
```bash
# 方法 1：指定平台
docker run --platform linux/amd64 -p 7891:7891 cft0808/sansheng-demo

# 方法 2：使用 docker-compose（已内置 platform）
docker compose up
```

</details>

<details>
<summary><b>❌ Skill 下载失败</b></summary>

**症状**：`python3 scripts/skill_manager.py import-official-hub` 报错。

**排查**：
```bash
# 测试网络连通性
curl -I https://raw.githubusercontent.com/MiniMax-AI/cli/main/skill/SKILL.md

# 如果超时，使用代理
export https_proxy=http://your-proxy:port
python3 scripts/skill_manager.py import-official-hub --agents menxia
```

**常见原因**：
- 中国大陆访问 GitHub raw 资源需要代理
- 网络超时（已增加到 30 秒 + 自动重试 3 次）
- 默认 skill 源无法访问，或自定义 Skills Hub 配置错误

</details>

---
## �🗺️ Roadmap

> 完整路线图及参与方式：[ROADMAP.md](ROADMAP.md)

### Phase 1 — 核心架构 ✅
- [x] 十二部制 Agent 架构（太子 + 三省 + 七部 + 早朝官）+ 权限矩阵
- [x] 军机处实时看板（10 个功能面板 + 实时活动面板）
- [x] 任务叫停 / 取消 / 恢复
- [x] 奏折系统（自动归档 + 五阶段时间线）
- [x] 圣旨模板库（9 个预设 + 参数表单）
- [x] 上朝仪式感动画
- [x] 天下要闻 + 飞书推送 + 订阅管理
- [x] 模型热切换 + 技能管理 + 技能添加
- [x] 官员总览 + Token 消耗统计
- [x] 小任务 / 会话监控
- [x] 太子消息分拣（闲聊自动回复 / 旨意建任务）
- [x] 旨意数据清洗（路径/元数据/前缀自动剥离）
- [x] 重复任务防护 + 已完成任务保护
- [x] 端到端测试覆盖（17 个断言）
- [x] React 18 前端重构（TypeScript + Vite + Zustand · 13 组件）
- [x] Agent 思考过程可视化（实时 thinking / 工具调用 / 返回结果）
- [x] 前后端一体化部署（server.py 同时提供 API + 静态文件服务）

### Phase 2 — 制度深化 🚧
- [ ] 御批模式（人工审批 + 一键准奏/封驳）
- [x] 功过簿（Agent 绩效评分 + 模型推荐 + 成本优化）
- [x] EventBus 事件总线（Redis Streams 解耦通信）
- [x] Outbox Relay（事务性事件投递）
- [x] 状态机审计（严格生命周期 + 审计日志）
- [x] 并行调度引擎（指数退避重试 + 资源锁）
- [x] DAG 编排器（任务分解 + 依赖解析）
- [x] Dashboard 鉴权（登录认证）
- [x] 一键启动 / systemd 生产部署
- [ ] 急递铺（Agent 间实时消息流可视化）
- [ ] 国史馆（知识库检索 + 引用溯源）

### Phase 3 — 生态扩展
- [ ] Docker Compose + Demo 镜像
- [ ] Notion / Linear 适配器
- [ ] 年度大考（Agent 年度绩效报告）
- [ ] 移动端适配 + PWA
- [ ] ClawHub 上架

---

## 🤝 参与贡献

欢迎任何形式的贡献！详见 [CONTRIBUTING.md](CONTRIBUTING.md)

特别欢迎的方向：
- 🎨 **UI 增强**：深色/浅色主题、响应式、动画优化
- 🤖 **新 Agent**：适合特定场景的专职 Agent 角色
- 📦 **Skills 生态**：各部门专用技能包
- 🔗 **集成扩展**：Notion · Jira · Linear · GitHub Issues
- 🌐 **国际化**：日文 · 韩文 · 西班牙文
- 📱 **移动端**：响应式适配、PWA

---

## 📂 案例

`examples/` 目录收录了真实的端到端使用案例：

| 案例 | 旨意 | 涉及部门 |
|------|------|----------|
| [竞品分析](examples/competitive-analysis.md) | "分析 CrewAI vs AutoGen vs LangGraph" | 中书→门下→户部+兵部+礼部 |
| [代码审查](examples/code-review.md) | "审查这段 FastAPI 代码的安全性" | 中书→门下→兵部+刑部 |
| [周报生成](examples/weekly-report.md) | "生成本周工程团队周报" | 中书→门下→户部+礼部 |

每个案例包含：完整旨意 → 中书省规划 → 门下省审核意见 → 各部执行结果 → 最终奏折。

---

## ⭐ Star History

如果这个项目让你会心一笑，请给个 Star ⚔️

[](https://star-history.com/#cft0808/edict&Date)

---

## 📮 朕的邸报——公众号

> 古有邸报传天下政令，今有公众号聊 AI 架构。

<p align="center">
  <img src="docs/assets/wechat-qrcode.jpg" width="220" alt="公众号二维码 · cft0808">
  <br><br>
  <b>👆 扫码关注「cft0808」—— 朕的技术邸报</b>
</p>

你会看到：

- 🏛️ **架构拆解** —— 三省六部到底怎么分权制衡的？12 个 Agent 各司何职？
- 🔥 **踩坑复盘** —— Agent 吵架了怎么办？Token 烧光了怎么省？门下省为什么总封驳？
- 🛠️ **Issue 修复实录** —— 每个 bug 都是一道奏折，看朕如何批红
- 💡 **Token 省钱术** —— 用 1/10 的 token 跑出门下省审核效果的秘密
- 🎭 **Agent 人设彩蛋** —— 六部的 SOUL.md 是怎么写出来的？

> *"朕让 AI 上朝，结果 AI 比朕还卷。"* —— 关注后你会懂的。

---

## 📄 License

[MIT](LICENSE) · 由 [OpenClaw](https://openclaw.ai) 社区构建

---

<p align="center">
  <strong>⚔️ 以古制御新技，以智慧驾驭 AI</strong><br>
  <sub>Governing AI with the wisdom of ancient empires</sub><br><br>
  <a href="#-朕的邸报公众号"><img src="https://img.shields.io/badge/公众号_cft0808-关注获取更新-07C160?style=for-the-badge&logo=wechat&logoColor=white" alt="WeChat"></a>
</p>

---

### Getting Started (`docs/getting-started.md`)

# 🚀 快速上手指南

> 从零开始，5 分钟搭建你的三省六部 AI 协同系统

---

## 第一步：安装 OpenClaw

三省六部基于 [OpenClaw](https://openclaw.ai) 运行，请先安装：

```bash
# macOS
brew install openclaw

# 或下载安装包
# https://openclaw.ai/download
```

安装完成后初始化：

```bash
openclaw init
```

## 第二步：克隆并安装三省六部

```bash
git clone https://github.com/cft0808/edict.git
cd edict
chmod +x install.sh && ./install.sh
```

安装脚本会自动完成：
- ✅ 创建 12 个 Agent Workspace（`~/.openclaw/workspace-*`）
- ✅ 写入各省部 SOUL.md 人格文件
- ✅ 注册 Agent 及权限矩阵到 `openclaw.json`
- ✅ 配置旨意数据清洗规则
- ✅ 构建 React 前端到 `dashboard/dist/`（需 Node.js 18+）
- ✅ 初始化数据目录
- ✅ 执行首次数据同步
- ✅ 重启 Gateway 使配置生效

## 第三步：配置消息渠道

在 OpenClaw 中配置消息渠道（Feishu / Telegram / Signal），将 `taizi`（太子）Agent 设为旨意入口。太子会自动分拣闲聊与指令，指令类消息提炼标题后转发中书省。

```bash
# 查看当前渠道
openclaw channels list

# 添加飞书渠道（入口设为太子）
openclaw channels add --type feishu --agent taizi
```

参考 OpenClaw 文档：https://docs.openclaw.ai/channels

## 第四步：启动服务

```bash
# 终端 1：数据刷新循环（每 15 秒同步）
bash scripts/run_loop.sh

# 终端 2：看板服务器
python3 dashboard/server.py

# 打开浏览器
open http://127.0.0.1:7891
```

> 💡 **提示**：`run_loop.sh` 每 15 秒自动同步数据。可用 `&` 后台运行。

> 💡 **看板即开即用**：`server.py` 内嵌 `dashboard/dashboard.html`，无需额外构建。Docker 镜像包含预构建的 React 前端。

## 第五步：发送第一道旨意

通过消息渠道发送任务（太子会自动识别并转发到中书省）：

```
请帮我用 Python 写一个文本分类器：
1. 使用 scikit-learn
2. 支持多分类
3. 输出混淆矩阵
4. 写完整的文档
```

## 第六步：观察执行过程

打开看板 http://127.0.0.1:7891

1. **📋 旨意看板** — 观察任务在各状态之间流转
2. **🔭 省部调度** — 查看各部门工作分布
3. **📜 奏折阁** — 任务完成后自动归档为奏折

任务流转路径：
```
收件 → 太子分拣 → 中书规划 → 门下审议 → 已派发 → 执行中 → 已完成
```

---

## 🎯 进阶用法

### 使用圣旨模板

> 看板 → 📜 旨库 → 选择模板 → 填写参数 → 下旨

9 个预设模板：周报生成 · 代码审查 · API 设计 · 竞品分析 · 数据报告 · 博客文章 · 部署方案 · 邮件文案 · 站会摘要

### 切换 Agent 模型

> 看板 → ⚙️ 模型配置 → 选择新模型 → 应用更改

约 5 秒后 Gateway 自动重启生效。

### 管理技能

> 看板 → 🛠️ 技能配置 → 查看已安装技能 → 点击添加新技能

### 叫停 / 取消任务

> 在旨意看板或任务详情中，点击 **⏸ 叫停** 或 **🚫 取消** 按钮

### 订阅天下要闻

> 看板 → 📰 天下要闻 → ⚙️ 订阅管理 → 选择分类 / 添加源 / 配飞书推送

---

## ❓ 故障排查

### 看板显示「服务器未启动」
```bash
# 确认服务器正在运行
python3 dashboard/server.py
```

### Agent 报错 "No API key found for provider"

这是最常见的问题。三省六部有 11 个 Agent，每个都需要 API Key。

```bash
# 方法一：为任意 Agent 配置后重新运行 install.sh（推荐）
openclaw agents add taizi          # 按提示输入 Anthropic API Key
cd edict && ./install.sh            # 自动同步到所有 Agent

# 方法二：手动复制 auth 文件
MAIN_AUTH=$(find ~/.openclaw/agents -name auth-profiles.json | head -1)
for agent in taizi zhongshu menxia shangshu hubu libu bingbu xingbu gongbu; do
  mkdir -p ~/.openclaw/agents/$agent/agent
  cp "$MAIN_AUTH" ~/.openclaw/agents/$agent/agent/auth-profiles.json
done

# 方法三：逐个配置
openclaw agents add taizi
openclaw agents add zhongshu
# ... 其他 Agent
```

### Agent 不响应
```bash
# 检查 Gateway 状态
openclaw gateway status

# 必要时重启
openclaw gateway restart
```

### 数据不更新
```bash
# 检查刷新循环是否运行
ps aux | grep run_loop

# 手动执行一次同步
python3 scripts/refresh_live_data.py
```

### 心跳显示红色 / 告警
```bash
# 检查对应 Agent 的进程
openclaw agent status <agent-id>

# 重启指定 Agent
openclaw agent restart <agent-id>
```

### 模型切换后不生效
等待约 5 秒让 Gateway 重启完成。仍不生效则：
```bash
python3 scripts/apply_model_changes.py
openclaw gateway restart
```

---

## 📚 更多资源

- [🏠 项目首页](https://github.com/cft0808/edict)
- [📖 README](../README.md)
- [🤝 贡献指南](../CONTRIBUTING.md)
- [💬 OpenClaw 文档](https://docs.openclaw.ai)
- [📮 公众号 · cft0808](wechat.md) — 架构拆解 / 踩坑复盘 / Token 省钱术

---

### Remote Skills Quickstart (`docs/remote-skills-quickstart.md`)

# 远程 Skills 快速入门

## 5 分钟体验

### 1. 启动服务器

```bash
# 确保你在项目根目录
python3 dashboard/server.py
# 输出: 三省六部看板启动 → http://127.0.0.1:7891
```

### 2. 添加默认 Skill（CLI）

```bash
# 为门下省添加 MiniMax CLI skill
python3 scripts/skill_manager.py add-remote \
  --agent menxia \
  --name mmx_cli \
  --source https://raw.githubusercontent.com/MiniMax-AI/cli/main/skill/SKILL.md \
  --description "MiniMax 多模态 CLI 技能"

# 输出:
# ⏳ 正在从 https://raw.githubusercontent.com/... 下载...
# ✅ 技能 mmx_cli 已添加到 menxia
#    路径: /Users/xxx/.openclaw/workspace-menxia/skills/mmx_cli/SKILL.md
#    大小: 14655 字节
```

### 3. 列出所有远程 Skills

```bash
python3 scripts/skill_manager.py list-remote

# 输出:
# 📋 共 1 个远程 skills：
# 
# Agent       | Skill 名称           | 描述                           | 添加时间
# ------------|----------------------|--------------------------------|----------
# menxia      | mmx_cli              | MiniMax 多模态 CLI 技能         | 2026-03-02
```

### 4. 查看 API 响应

```bash
curl http://localhost:7891/api/remote-skills-list | jq .

# 输出:
# {
#   "ok": true,
#   "remoteSkills": [
#     {
#       "skillName": "mmx_cli",
#       "agentId": "menxia",
#       "sourceUrl": "https://raw.githubusercontent.com/...",
#       "description": "MiniMax 多模态 CLI 技能",
#       "localPath": "/Users/xxx/.openclaw/workspace-menxia/skills/mmx_cli/SKILL.md",
#       "addedAt": "2026-03-02T14:30:00Z",
#       "lastUpdated": "2026-03-02T14:30:00Z",
#       "status": "valid"
#     }
#   ],
#   "count": 1,
#   "listedAt": "2026-03-02T14:35:00Z"
# }
```

---

## 常见操作

### 一键导入默认 skills

```bash
python3 scripts/skill_manager.py import-official-hub \
  --agents menxia,shangshu
```

这会为指定 agent 添加默认可用的 `mmx_cli` skill。旧的 `openclaw-ai/skills-hub` 仓库当前不可用，因此不再作为默认官方源。

如果你维护自己的 Skills Hub，可以通过环境变量或本地配置指定：

```bash
export OPENCLAW_SKILLS_HUB_BASE=https://your-hub/raw-base
# 或
echo "https://your-hub/raw-base" > ~/.openclaw/skills-hub-url
```

### 更新某个 Skill 到最新版本

```bash
python3 scripts/skill_manager.py update-remote \
  --agent menxia \
  --name mmx_cli

# 输出:
# ⏳ 正在从 https://raw.githubusercontent.com/... 下载...
# ✅ 技能 mmx_cli 已添加到 menxia
# ✅ 技能已更新
#    路径: /Users/xxx/.openclaw/workspace-menxia/skills/mmx_cli/SKILL.md
#    大小: 14655 字节
```

### 移除某个 Skill

```bash
python3 scripts/skill_manager.py remove-remote \
  --agent menxia \
  --name mmx_cli

# 输出:
# ✅ 技能 mmx_cli 已从 menxia 移除
```

---

## 看板 UI 操作

### 在看板中添加 Remote Skill

1. 打开 http://localhost:7891
2. 进入 🔧 **技能配置** 面板
3. 点击 **➕ 添加远程 Skill** 按钮
4. 填写表单：
   - **Agent**: 从下拉列表选择（如 menxia）
   - **Skill 名称**: 输入内部 ID 如 `mmx_cli`
   - **远程 URL**: 粘贴 GitHub URL 如 `https://raw.githubusercontent.com/MiniMax-AI/cli/main/skill/SKILL.md`
   - **中文描述**: 可选，如 `MiniMax 多模态 CLI 技能`
5. 点击 **导入** 按钮
6. 等待 1-2 秒，看到 ✅ 成功提示

### 管理已添加的 Skills

在看板 → 🔧 技能配置 → **远程 Skills** 标签页：

- **查看**: 点击 Skill 名称查看 SKILL.md 内容
- **更新**: 点击 🔄 重新从源 URL 下载最新版本
- **删除**: 点击 ✕ 移除本地副本
- **复制 URL**: 快速分享给他人

---

## 创建自己的 Skill 库

### 目录结构

```
my-skills-hub/
├── code_review/
│   └── SKILL.md          # 代码审查能力
├── api_design/
│   └── SKILL.md          # API 设计审查
├── data_analysis/
│   └── SKILL.md          # 数据分析
└── README.md
```

### SKILL.md 模板

```markdown
---
name: my_custom_skill
description: 简短描述
version: 1.0.0
tags: [tag1, tag2]
---

# Skill 完整名称

详细描述...

## 输入

说明接收什么参数

## 处理流程

具体步骤...

## 输出规范

输出格式说明
```

### 上传到 GitHub

```bash
git init
git add .
git commit -m "Initial commit: my-skills-hub"
git remote add origin https://github.com/yourname/my-skills-hub
git push -u origin main
```

### 导入自己的 Skill

```bash
python3 scripts/skill_manager.py add-remote \
  --agent zhongshu \
  --name my_skill \
  --source https://raw.githubusercontent.com/yourname/my-skills-hub/main/my_skill/SKILL.md \
  --description "我的定制技能"
```

---

## API 完整参考

### POST /api/add-remote-skill

添加远程 skill。

**请求：**
```bash
curl -X POST http://localhost:7891/api/add-remote-skill \
  -H "Content-Type: application/json" \
  -d '{
    "agentId": "zhongshu",
    "skillName": "code_review",
    "sourceUrl": "https://raw.githubusercontent.com/...",
    "description": "代码审查"
  }'
```

**响应 (200):**
```json
{
  "ok": true,
  "message": "技能 code_review 已从远程源添加到 zhongshu",
  "skillName": "code_review",
  "agentId": "zhongshu",
  "source": "https://raw.githubusercontent.com/...",
  "localPath": "/Users/xxx/.openclaw/workspace-zhongshu/skills/code_review/SKILL.md",
  "size": 2048,
  "addedAt": "2026-03-02T14:30:00Z"
}
```

### GET /api/remote-skills-list

列出所有远程 skills。

```bash
curl http://localhost:7891/api/remote-skills-list
```

**响应:**
```json
{
  "ok": true,
  "remoteSkills": [
    {
      "skillName": "mmx_cli",
      "agentId": "menxia",
      "sourceUrl": "https://raw.githubusercontent.com/...",
      "description": "MiniMax 多模态 CLI 技能",
      "localPath": "/Users/xxx/.openclaw/workspace-menxia/skills/mmx_cli/SKILL.md",
      "addedAt": "2026-03-02T14:30:00Z",
      "lastUpdated": "2026-03-02T14:30:00Z",
      "status": "valid"
    }
  ],
  "count": 1,
  "listedAt": "2026-03-02T14:35:00Z"
}
```

### POST /api/update-remote-skill

更新远程 skill 为最新版本。

```bash
curl -X POST http://localhost:7891/api/update-remote-skill \
  -H "Content-Type: application/json" \
  -d '{
    "agentId": "zhongshu",
    "skillName": "code_review"
  }'
```

### DELETE /api/remove-remote-skill

移除远程 skill。

```bash
curl -X POST http://localhost:7891/api/remove-remote-skill \
  -H "Content-Type: application/json" \
  -d '{
    "agentId": "zhongshu",
    "skillName": "code_review"
  }'
```

---

## 故障排查

### Q: 下载失败，提示 "Connection timeout"

**A:** 检查网络连接和 URL 有效性

```bash
curl -I https://raw.githubusercontent.com/...
# 应该返回 HTTP/1.1 200 OK
```

### Q: 文件格式无效

**A:** 确保 SKILL.md 以 YAML frontmatter 开头

```markdown
---
name: skill_name
description: 描述
---

# 正文开始...
```

### Q: 导入后看不到 Skill

**A:** 刷新看板或检查 Agent 是否配置正确

```bash
# 检查 Agent 是否存在
python3 scripts/skill_manager.py list-remote

# 检查本地文件
ls -la ~/.openclaw/workspace-zhongshu/skills/
```

---

## 更多信息

- 📚 [完整指南](remote-skills-guide.md)
- 🏛️ [架构文档](task-dispatch-architecture.md)
- 🤝 [项目贡献](../CONTRIBUTING.md)

---

### Screenshots README (`docs/screenshots/README.md`)

# 📸 截图说明

看板截图用于 README 和文档展示。请启动看板后按以下顺序截图并放置到本目录。

## 截图清单

| 文件名 | 内容 | 对应面板 |
|--------|------|---------|
| `01-kanban-main.png` | 旨意看板总览 | 📋 旨意看板 |
| `02-monitor.png` | 省部调度 | 🔭 省部调度 |
| `03-task-detail.png` | 任务流转详情（点击任务卡片展开） | 📋 旨意看板 → 详情 |
| `04-model-config.png` | 模型配置面板 | ⚙️ 模型配置 |
| `05-skills-config.png` | 技能配置面板 | 🛠️ 技能配置 |
| `06-official-overview.png` | 官员总览（12 位 Agent） | 👥 官员总览 |
| `07-sessions.png` | 小任务 / 会话 | 💬 小任务 |
| `08-memorials.png` | 奏折阁 | 📜 奏折阁 |
| `09-templates.png` | 旨库（圣旨模板） | 📜 旨库 |
| `10-morning-briefing.png` | 天下要闻 | 📰 天下要闻 |
| `11-ceremony.png` | 上朝仪式动画 | 开场动画 |

## 自动截图

```bash
# 确保看板服务器正在运行
python3 dashboard/server.py &

# 自动截取全部 11 张截图
python3 scripts/take_screenshots.py

# 录制 demo GIF（需要 ffmpeg）
python3 scripts/record_demo.py
```

## 建议

- 使用 **1920×1080** 或 **2560×1440** 分辨率
- 确保看板有足够的数据（至少 5+ 任务）
- 深色主题截图效果最佳
- 截图前刷新数据确保最新状态

---

### Dashboard Upgrade Plan (`docs/dashboard-upgrade-plan.md`)

# 军机处看板（Dashboard）升级计划

> 任务ID：JJC-20260303-001  
> 日期：2026-03-03  
> 状态：门下省已准奏，尚书省派发执行中

---

## 一、背景

Phase 1 核心架构已全部完成（十二部制、实时看板、任务全生命周期、E2E测试等）。基于用户反馈和 ROADMAP Phase 2/3 规划，制定本升级计划，分三批推进。

## 二、升级批次总览

| 批次 | 周期 | 内容 | 负责部门 |
|------|------|------|----------|
| 第一批 | 2-3周 | 御批模式、移动端适配、Docker一键体验 | 工部、刑部 |
| 第二批 | 2-3周 | 功过簿、急递铺、ClawHub上架 | 工部、礼部、户部 |
| 第三批 | 后续 | 国史馆、看板适配器、年度大考 | 工部、户部 |

## 三、第一批（高优先级，2-3周）

### 3.1 御批模式（人工审批节点）

**目标**：门下省审议完成后，任务进入「待御批」状态，用户在看板一键准奏/封驳。

- 新增 `AwaitingImperial` 任务中间态
- 看板新增「待御批」面板（待批列表 + 历史批示）
- API：`POST /api/tasks/{id}/imperial-review`，body: `{ action: "approve" | "reject", comment?: string }`
- 飞书/Telegram 推送审批通知
- 超时机制：配置 `imperial_review_timeout_hours`（默认24h），超时策略可选：自动准奏 / 再次提醒 / 阻塞等待
- **执行**：工部开发前后端，刑部编写测试
- **详细设计**：见 `docs/design-imperial-review.md`

### 3.2 移动端响应式适配

**目标**：手机/平板可正常使用看板。

- Tailwind 响应式断点：`sm:640px` / `md:768px` / `lg:1024px`
- EdictBoard 移动端改为纵向卡片列表（< md）
- TaskModal 移动端全屏显示
- 顶部导航栏 < md 折叠为汉堡菜单
- **执行**：工部前端
- **详细设计**：见 `docs/design-mobile-responsive.md`

### 3.3 Docker 一键体验

**目标**：`docker compose up` 即可体验完整看板（含预置数据）。

- 基于现有 `docker/demo_data/` 构建
- Dockerfile：前端 build + 后端 serve 单容器
- docker-compose.yml：看板服务 + 可选 Gateway
- 预置 demo 数据（已有 `tasks_source.json`, `officials_stats.json` 等）
- CI（GitHub Actions）自动构建推送镜像
- **执行**：工部 DevOps
- **详细设计**：见 `docs/design-docker.md`

## 四、第二批（中优先级，2-3周）

### 4.1 功过簿（Agent 绩效评分）
- 每个 Agent 完成率、返工率、耗时统计
- 排行榜 + 趋势图面板
- 自动标记"能臣" / "需训练"
- **执行**：工部开发 + 户部数据统计 + 礼部文档

### 4.2 急递铺（消息流可视化）
- 看板实时连线动画：中书→门下→尚书→六部
- 消息类型着色（派发/审议/回奏/封驳）
- 时间线回放模式
- **执行**：工部前端

### 4.3 ClawHub 上架
- 核心 Skills 提交 OpenClaw 官方市场
- 一键安装三省六部 Skill Pack
- **执行**：礼部

## 五、第三批（后续规划）

| 功能 | 简述 | 负责 |
|------|------|------|
| 国史馆 | 历史旨意沉淀、相似检索、引用溯源 | 工部+户部 |
| 看板适配器 | Notion/Linear/GitHub Issues 同步 | 工部 |
| 年度大考 | Agent 年度绩效报告 + 可视化大屏 | 户部 |

## 六、性能基线要求（门下省修订）

升级前后须对比验证以下指标：

| 指标 | 测量方式 | 目标 |
|------|----------|------|
| 首屏加载时间 | Lighthouse / Performance API | < 2s (LCP) |
| API 响应时间 | `/api/tasks` P95 | < 200ms |
| Bundle 大小 | `vite build` 输出 | 记录基线，升级后不超过 +15% |
| 内存占用 | Chrome DevTools | 记录基线 |

**执行**：户部测量，升级前后各出一份报告。

## 七、执行分工汇总

| 部门 | 第一批 | 第二批 | 第三批 |
|------|--------|--------|--------|
| 工部 | 御批模式前后端、响应式适配、Docker | 功过簿、急递铺 | 国史馆、看板适配器 |
| 刑部 | 御批模式测试、E2E补充 | — | — |
| 礼部 | — | 文档整理、ClawHub | — |
| 户部 | 性能基线测量 | 功过簿数据统计 | 年度大考 |

## 八、里程碑

| 时间 | 里程碑 |
|------|--------|
| W1 | 性能基线测量完成；御批模式 API + 前端开发；Docker 镜像初版 |
| W2 | 御批模式联调测试；移动端适配完成；Docker compose 可用 |
| W3 | 第一批全部上线；刑部 E2E 测试通过；性能对比报告 |
| W4-6 | 第二批开发 + 上线 |
| W7+ | 第三批按需推进 |

---

### Design Docker (`docs/design-docker.md`)

# Docker 一键体验 详细设计

> 任务ID：JJC-20260303-001 · 第一批 · 功能3

## 1. 目标

```bash
docker compose up
# 浏览器打开 http://localhost:3926 即可体验完整看板
```

## 2. Dockerfile

```dockerfile
FROM node:20-alpine AS frontend
WORKDIR /app/frontend
COPY edict/frontend/package*.json ./
RUN npm ci
COPY edict/frontend/ ./
RUN npm run build

FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY edict/ ./edict/
COPY docker/demo_data/ ./data/
COPY --from=frontend /app/frontend/dist ./edict/frontend/dist
EXPOSE 3926
ENV DEMO_MODE=true
CMD ["python", "edict/server.py"]
```

## 3. docker-compose.yml

```yaml
version: "3.8"
services:
  dashboard:
    build: .
    ports:
      - "3926:3926"
    environment:
      - DEMO_MODE=true
      - HOST=0.0.0.0
      - PORT=3926
    volumes:
      - dashboard-data:/app/data
    restart: unless-stopped

volumes:
  dashboard-data:
```

## 4. Demo 数据

已有 `docker/demo_data/` 目录中的数据文件：
- `tasks_source.json` — 示例旨意
- `officials_stats.json` — 官员统计
- `agent_config.json` — Agent 配置
- `live_status.json` — 实时状态
- `morning_brief.json` — 早朝简报
- `model_change_log.json` — 模型切换记录

`DEMO_MODE=true` 时 server.py 从 `/app/data/` 加载这些文件，API 可读可写但不持久化到宿主机（除非挂载 volume）。

## 5. CI/CD（GitHub Actions）

```yaml
# .github/workflows/docker.yml
name: Build & Push Docker
on:
  push:
    branches: [main]
    tags: ['v*']
jobs:
  docker:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          username: ${{ secrets.DOCKER_USERNAME }}
          password: ${{ secrets.DOCKER_PASSWORD }}
      - uses: docker/build-push-action@v5
        with:
          push: true
          tags: |
            openclaw/sansheng-dashboard:latest
            openclaw/sansheng-dashboard:${{ github.sha }}
```

## 6. README 补充

在项目根 README 添加 Quick Start 区块：

```markdown
## 🐳 Quick Start (Docker)

​```bash
git clone https://github.com/xxx/openclaw-sansheng-liubu.git
cd openclaw-sansheng-liubu
docker compose up
# 打开 http://localhost:3926
​```
```

---

### Design Imperial Review (`docs/design-imperial-review.md`)

# 御批模式 详细设计

> 任务ID：JJC-20260303-001 · 第一批 · 功能1

## 1. 概述

在门下省审议通过后，任务不再直接派发尚书省，而是进入 `AwaitingImperial` 状态，等待用户（皇上）在看板中手动准奏或封驳。

## 2. 状态机变更

```
现有流程：
  DoorReviewing → Approved → ShangShuDispatching

新增流程：
  DoorReviewing → Approved → AwaitingImperial → ImperialApproved → ShangShuDispatching
                                               → ImperialRejected → (终止或退回中书)
```

新增状态枚举值：
- `AwaitingImperial` — 待御批
- `ImperialApproved` — 御批准奏
- `ImperialRejected` — 御批封驳

## 3. API 设计

### POST /api/tasks/{id}/imperial-review

```json
// Request
{
  "action": "approve" | "reject",
  "comment": "optional string"
}

// Response 200
{
  "task_id": "JJC-xxx",
  "status": "ImperialApproved" | "ImperialRejected",
  "reviewed_at": "2026-03-03T12:00:00Z"
}
```

### GET /api/tasks?status=AwaitingImperial

返回所有待御批任务列表。

### 配置项

在 `server.py` 或配置文件中新增：

```python
IMPERIAL_REVIEW_CONFIG = {
    "enabled": True,                          # 是否启用御批模式
    "timeout_hours": 24,                      # 超时时间
    "timeout_action": "remind",               # "auto_approve" | "remind" | "block"
    "notify_channels": ["feishu", "telegram"] # 通知渠道
}
```

## 4. 前端组件

### ImperialReviewPanel（新组件）

位置：`edict/frontend/src/components/ImperialReviewPanel.tsx`

功能：
- 显示待御批任务列表（卡片形式）
- 每个卡片含：任务标题、中书省方案摘要、门下省审议意见、等待时长
- 操作按钮：「准奏」（绿色）/ 「封驳」（红色）
- 封驳时弹出评论输入框
- 超时任务高亮提示

在 EdictBoard 中新增 Tab 或面板位。

### 状态流转动画

准奏时：玉玺盖章动画（可选，低优先级）

## 5. 通知集成

门下省审议通过 → 触发通知：

```
📜 新旨意待御批
标题：{task.title}
门下省意见：{review.summary}
⏰ 请在 {timeout_hours}h 内批示
👉 点击查看：{dashboard_url}
```

超时提醒（若 `timeout_action = "remind"`）：

```
⚠️ 旨意超时未批
标题：{task.title}
已等待：{hours}h
👉 请尽快批示
```

## 6. 后端实现要点

- `server.py` 新增路由 `/api/tasks/<id>/imperial-review`
- 任务状态流转逻辑修改：门下省 Approved → 检查 `imperial_review.enabled` → 若开启则进入 `AwaitingImperial`
- 超时检查：启动时注册定时任务（每5分钟检查一次），或使用懒检查（查询时判断）
- 数据存储：在任务 JSON 中新增 `imperial_review` 字段

```python
"imperial_review": {
    "status": "pending" | "approved" | "rejected",
    "submitted_at": "ISO timestamp",
    "reviewed_at": "ISO timestamp",
    "comment": "string",
    "timeout_notified": false
}
```

## 7. 测试用例（刑部）

| # | 场景 | 预期 |
|---|------|------|
| 1 | 门下省通过后任务进入 AwaitingImperial | 状态正确，看板显示 |
| 2 | 点击准奏 | 状态变 ImperialApproved，触发尚书省派发 |
| 3 | 点击封驳（含评论） | 状态变 ImperialRejected，评论保存 |
| 4 | 超时-自动准奏模式 | 超时后自动通过 |
| 5 | 超时-提醒模式 | 超时后发送提醒通知 |
| 6 | 超时-阻塞模式 | 超时后仍保持 AwaitingImperial |
| 7 | 御批模式关闭 | 门下省通过后直接派发（兼容旧流程） |
| 8 | API 参数校验 | 非法 action 返回 400 |

---

### Design Mobile Responsive (`docs/design-mobile-responsive.md`)

# 移动端响应式适配 详细设计

> 任务ID：JJC-20260303-001 · 第一批 · 功能2

## 1. 断点策略

使用 Tailwind CSS 默认断点：

| 断点 | 宽度 | 布局 |
|------|------|------|
| 默认 (mobile) | < 640px | 单列纵向 |
| sm | ≥ 640px | 单列宽松 |
| md | ≥ 768px | 双列 |
| lg | ≥ 1024px | 完整桌面布局（现有） |

## 2. 组件适配清单

### 2.1 EdictBoard（看板主体）

**桌面（≥ lg）**：保持现有多列横向布局

**移动（< md）**：
- 切换为纵向卡片列表
- 各状态列改为可切换的 Tab（待处理 / 进行中 / 已完成 等）
- 任务卡片全宽显示，增大点击区域

```tsx
// 伪代码
<div className="flex flex-col md:flex-row gap-4">
  {/* 移动端 Tab 切换 */}
  <div className="md:hidden">
    <StatusTabs active={activeTab} onChange={setActiveTab} />
  </div>
  {/* 桌面端多列 */}
  <div className="hidden md:flex gap-4">
    {columns.map(col => <KanbanColumn key={col.status} />)}
  </div>
</div>
```

### 2.2 TaskModal（任务详情弹窗）

**移动（< md）**：全屏模式
```tsx
<div className="fixed inset-0 md:inset-auto md:max-w-2xl md:mx-auto md:my-8 md:rounded-lg">
```

### 2.3 导航栏

**移动（< md）**：
- Logo + 汉堡菜单按钮
- 点击展开侧边栏（slide-in overlay）
- 包含所有导航项

```tsx
// 移动端汉堡菜单
<button className="md:hidden" onClick={toggleMenu}>
  <HamburgerIcon />
</button>
<nav className={`fixed inset-y-0 left-0 w-64 transform ${open ? 'translate-x-0' : '-translate-x-full'} md:static md:translate-x-0`}>
  {navItems}
</nav>
```

### 2.4 其他面板

- 官员总览：移动端改为 2 列网格 → 1 列
- 模型切换面板：卡片全宽堆叠
- 奏折时间线：保持纵向，缩小边距

## 3. 触控优化

- 所有可点击元素最小 44x44px
- 添加 `touch-action: manipulation` 消除 300ms 延迟
- 滑动手势：左滑任务卡片显示操作按钮（可选，Phase 2）

## 4. 测试

- Chrome DevTools 设备模拟：iPhone SE / iPhone 14 / iPad
- 真机测试（如有条件）
- 确保无横向溢出、无文字截断

---

### Performance Baseline Plan (`docs/performance-baseline-plan.md`)

# 性能基线测量计划

> 任务ID：JJC-20260303-001 · 门下省修订要求  
> 执行：户部

## 测量指标

| 指标 | 工具 | 方法 |
|------|------|------|
| 首屏加载 (LCP) | Lighthouse CLI | `npx lighthouse http://localhost:3926 --output=json` |
| 首次可交互 (TTI) | Lighthouse CLI | 同上 |
| Bundle 大小 | `npm run build` | 记录 `dist/` 总体积及各 chunk |
| API P95 响应时间 | autocannon / k6 | `GET /api/tasks` 1000次请求 |
| 内存占用 | Chrome DevTools / `process.memoryUsage()` | 稳态 + 50任务负载 |

## 执行步骤

1. **升级前**（当前版本）执行全量测量，输出 `docs/baseline-before.json`
2. 第一批功能全部合并后，同条件再测，输出 `docs/baseline-after.json`
3. 生成对比报告 `docs/performance-comparison.md`

## 通过标准

- LCP 不超过基线 +20%（目标 < 2s）
- API P95 不超过基线 +15%（目标 < 200ms）
- Bundle 大小不超过基线 +15%

---

### Remote Skills Guide (`docs/remote-skills-guide.md`)

# 远程 Skills 资源管理指南

## 概述

三省六部现已支持从网上连接和增补 skills 资源，无需手动复制文件。支持从以下来源获取：

- **GitHub 仓库** (raw.githubusercontent.com)
- **任何 HTTPS URL** (需返回有效的 skill 文件)
- **本地文件路径**
- **默认 Skills 源** (经验证可访问的内置导入源)

---

## 功能架构

### 1. API 端点

#### `POST /api/add-remote-skill`

从远程 URL 或本地路径为指定 Agent 添加 skill。

**请求体：**
```json
{
  "agentId": "zhongshu",
  "skillName": "code_review",
  "sourceUrl": "https://raw.githubusercontent.com/org/skills-repo/main/code_review/SKILL.md",
  "description": "代码审查专项技能"
}
```

**参数说明：**
- `agentId` (string, 必需): 目标 Agent ID (验证有效性)
- `skillName` (string, 必需): skill 的内部名称 (仅允许字母/数字/下划线/汉字)
- `sourceUrl` (string, 必需): 远程 URL 或本地文件路径
  - GitHub: `https://raw.githubusercontent.com/user/repo/branch/path/SKILL.md`
  - 任意 HTTPS: `https://example.com/skills/my_skill.md`
  - 本地: `file:///Users/bingsen/skills/code_review.md` 或 `/Users/bingsen/skills/code_review.md`
- `description` (string, 可选): skill 的中文描述

**响应成功 (200)：**
```json
{
  "ok": true,
  "message": "技能 code_review 已添加到 zhongshu",
  "skillName": "code_review",
  "agentId": "zhongshu",
  "source": "https://raw.githubusercontent.com/...",
  "localPath": "/Users/bingsen/.openclaw/workspace-zhongshu/skills/code_review/SKILL.md",
  "size": 2048,
  "addedAt": "2026-03-02T14:30:00Z"
}
```

**响应失败 (400)：**
```json
{
  "ok": false,
  "error": "URL 无效或无法访问",
  "details": "Connection timeout after 10s"
}
```

#### `GET /api/remote-skills-list`

列出所有已添加的远程 skills 及其源信息。

**响应：**
```json
{
  "ok": true,
  "remoteSkills": [
    {
      "skillName": "code_review",
      "agentId": "zhongshu",
      "sourceUrl": "https://raw.githubusercontent.com/org/skills-repo/main/code_review/SKILL.md",
      "description": "代码审查专项技能",
      "localPath": "/Users/bingsen/.openclaw/workspace-zhongshu/skills/code_review/SKILL.md",
      "lastUpdated": "2026-03-02T14:30:00Z",
      "status": "valid"  // valid | invalid | not-found
    }
  ],
  "count": 5
}
```

#### `POST /api/update-remote-skill`

更新已添加的远程 skill 为最新版本。

**请求体：**
```json
{
  "agentId": "zhongshu",
  "skillName": "code_review"
}
```

**响应：**
```json
{
  "ok": true,
  "message": "技能已更新",
  "skillName": "code_review",
  "newVersion": "2.1.0",
  "updatedAt": "2026-03-02T15:00:00Z"
}
```

#### `DELETE /api/remove-remote-skill`

移除已添加的远程 skill。

**请求体：**
```json
{
  "agentId": "zhongshu",
  "skillName": "code_review"
}
```

---

## CLI 命令

### 添加远程 Skill

```bash
python3 scripts/skill_manager.py add-remote \
  --agent zhongshu \
  --name code_review \
  --source https://raw.githubusercontent.com/org/skills-repo/main/code_review/SKILL.md \
  --description "代码审查专项技能"
```

### 列出远程 Skills

```bash
python3 scripts/skill_manager.py list-remote
```

### 更新远程 Skill

```bash
python3 scripts/skill_manager.py update-remote \
  --agent zhongshu \
  --name code_review
```

### 移除远程 Skill

```bash
python3 scripts/skill_manager.py remove-remote \
  --agent zhongshu \
  --name code_review
```

---

## 默认 Skills 源

### MiniMax CLI Skill

默认导入源包含经验证可访问的 MiniMax CLI skill。旧的 `openclaw-ai/skills-hub` 仓库当前不可用，因此不再作为默认官方源。

可用 skills 列表：

| Skill 名称 | 描述 | 适用 Agent | 源 URL |
|-----------|------|----------|--------|
| `mmx_cli` | MiniMax 多模态 CLI 技能 | 门下省/尚书省 | https://raw.githubusercontent.com/MiniMax-AI/cli/main/skill/SKILL.md |

如果你维护自己的 Skills Hub，可以使用以下方式指定 Hub base URL。指定后，`import-official-hub` 会按 `<base>/<skill_name>/SKILL.md` 解析 `code_review`、`api_design`、`security_audit`、`data_analysis`、`doc_generation`、`test_framework` 等传统 skill 名称。

```bash
export OPENCLAW_SKILLS_HUB_BASE=https://your-hub/raw-base

# 或写入本地配置
echo "https://your-hub/raw-base" > ~/.openclaw/skills-hub-url
```

**一键导入默认 skills**

```bash
python3 scripts/skill_manager.py import-official-hub \
  --agents menxia,shangshu
```

---

## 看板 UI 操作

### 快捷添加 Skill

1. 打开看板 → 🔧 **技能配置** 面板
2. 点击 **➕ 添加远程 Skill** 按钮
3. 填写表单：
   - **Agent**: 选择目标 Agent
   - **Skill 名称**: 输入 skill 的内部 ID
   - **远程 URL**: 粘贴 GitHub/HTTPS URL
   - **中文描述**: 可选，简述 skill 功能
4. 点击 **确认** 按钮

### 管理已添加的 Skills

1. 看板 → 🔧 **技能配置** → **远程 Skills** 标签
2. 查看已添加的所有 skills 及其源地址
3. 操作：
   - **查看**: 展示 SKILL.md 内容
   - **更新**: 从源 URL 重新下载最新版本
   - **删除**: 移除本地副本（不影响源）
   - **复制源 URL**: 快速分享给他人

---

## Skill 文件规范

远程 skills 必须遵循标准的 Markdown 格式：

### 最小必需结构

```markdown
---
name: skill_internal_name
description: Short description
version: 1.0.0
tags: [tag1, tag2]
---

# Skill 名称

详细描述...

## 输入

说明接收什么参数

## 处理流程

具体步骤...

## 输出规范

输出格式说明
```

### 完整示例

```markdown
---
name: code_review
description: 对 Python/JavaScript 代码进行结构审查和优化建议
version: 2.1.0
author: openclaw-ai
tags: [code-quality, security, performance]
compatibleAgents: [bingbu, xingbu, menxia]
---

# 代码审查技能

本技能专门用于对生产代码进行多维度审查...

## 输入

- `code`: 要审查的源代码
- `language`: 编程语言 (python, javascript, go, rust)
- `focusAreas`: 审查重点 (security, performance, style, structure)

## 处理流程

1. 语言识别与语法验证
2. 安全漏洞扫描
3. 性能瓶颈识别
4. 代码风格检查
5. 最佳实践建议

## 输出规范

```json
{
  "issues": [
    {
      "type": "security|performance|style|structure",
      "severity": "critical|high|medium|low",
      "location": "line:column",
      "message": "问题描述",
      "suggestion": "修复建议"
    }
  ],
  "summary": {
    "totalIssues": 3,
    "criticalCount": 1,
    "highCount": 2
  }
}
```

## 适用场景

- 兵部（代码实现）的代码产出审查
- 刑部（合规审计）的安全检查
- 门下省（审议把关）的质量评估

## 依赖与限制

- 需要 Python 3.9+
- 支持文件大小: 最多 50KB
- 执行超时: 30 秒
```

---

## 数据存储

### 本地存储结构

```
~/.openclaw/
├── workspace-zhongshu/
│   └── skills/
│       ├── code_review/
│       │   ├── SKILL.md
│       │   └── .source.json    # 存储源 URL 和元数据
│       └── api_design/
│           ├── SKILL.md
│           └── .source.json
├── ...
```

### .source.json 格式

```json
{
  "skillName": "code_review",
  "sourceUrl": "https://raw.githubusercontent.com/...",
  "description": "代码审查专项技能",
  "version": "2.1.0",
  "addedAt": "2026-03-02T14:30:00Z",
  "lastUpdated": "2026-03-02T14:30:00Z",
  "lastUpdateCheck": "2026-03-02T15:00:00Z",
  "checksum": "sha256:abc123...",
  "status": "valid"
}
```

---

## 安全考虑

### URL 验证

✅ **允许的 URL 类型:**
- HTTPS URLs: `https://`
- 本地文件: `file://` 或绝对路径
- 相对路径: `./skills/`

❌ **禁止的 URL 类型:**
- HTTP (非 HTTPS): `http://` 被拒绝
- 本地模式 HTTP: `http://localhost/` (避免环回攻击)
- FTP/SSH: `ftp://`, `ssh://`

### 内容验证

1. **格式验证**: 确保是有效的 Markdown YAML frontmatter
2. **大小限制**: 最多 10 MB
3. **超时保护**: 下载超过 30 秒自动中止
4. **路径遍历防护**: 检查解析后的 skill 名称，禁用 `../` 模式
5. **checksum 验证**: 可选的 GPG 签名验证（适用于可信发布源）

### 隔离执行

- 远程 skills 在沙箱中执行（由 OpenClaw runtime 提供）
- 无法访问 `~/.openclaw/config.json` 等敏感文件
- 只能访问分配的 workspace 目录

---

## 故障排查

### 常见问题

**Q: 下载失败，提示 "Connection timeout"**

A: 检查网络连接和 URL 有效性：
```bash
curl -I https://raw.githubusercontent.com/...
```

**Q: Skill 显示 "invalid" 状态**

A: 检查文件格式：
```bash
python3 -m json.tool ~/.openclaw/workspace-zhongshu/skills/xxx/SKILL.md
```

**Q: 能否从私有 GitHub 仓库导入？**

A: 不支持（安全考虑）。可以：
1. 将仓库设为公开
2. 在本地下载后直接添加
3. 通过 GitHub Gist 的公开链接

**Q: 如何创建自己的 skills 库？**

A: 按 `<skill_name>/SKILL.md` 的结构创建自己的仓库，然后：

```bash
git clone https://github.com/yourname/my-skills-hub.git
cd my-skills-hub
# 创建 skill 文件结构
# 提交 & 推送到 GitHub
```

然后通过 URL 添加，或通过 `OPENCLAW_SKILLS_HUB_BASE` / `~/.openclaw/skills-hub-url` 配置为自定义 Hub 后导入。

---

## 最佳实践

### 1. 版本管理

始终在 SKILL.md 的 frontmatter 中标注版本号：
```yaml
---
version: 2.1.0
---
```

### 2. 向后兼容

更新 skill 时保持输入/输出格式兼容，避免破坏现有流程。

### 3. 文档完整

包含详细的:
- 功能描述
- 适用场景
- 依赖说明
- 输出示例

### 4. 定期更新

设置定期检查更新（周期可在看板中配置）：
```bash
python3 scripts/skill_manager.py check-updates --interval weekly
```

### 5. 贡献社区

成熟的 skills 可以沉淀到你自己的公开 Skills Hub，并通过 `OPENCLAW_SKILLS_HUB_BASE` 分享给团队使用。

---

## API 完整参考

详见 [任务分发流转架构文档](task-dispatch-architecture.md) 的第三部分（API 与工具）。

---

<p align="center">
  <sub>用 <strong>开放</strong> 的生态，赋能 <strong>制度化</strong> 的 AI 协作</sub>
</p>

---

### Task Dispatch Architecture (`docs/task-dispatch-architecture.md`)

# 三省六部任务分发流转体系 · 业务与技术架构

> 本文档详细阐述「三省六部」项目如何从**业务制度设计**到**代码实现细节**，完整处理复杂多Agent协作的任务分发与流转。这是一个**制度化的AI多Agent框架**，而非传统的自由讨论式协作系统。

**文档概览图**

```
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
业务层：帝国制度 (Imperial Governance Model)
  ├─ 分权制衡：皇上 → 太子 → 中书 → 门下 → 尚书 → 六部
  ├─ 制度约束：不可越级、状态严格递进、门下必审议
  └─ 质量保障：可封驳反工、实时可观测、紧急可干预
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
技术层：OpenClaw多Agent编排 (Multi-Agent Orchestration)
  ├─ 状态机：9个状态（Pending → Taizi → Zhongshu → Menxia → Assigned → Doing/Next → Review → Done/Cancelled）
  ├─ 数据融合：flow_log + progress_log + session JSONL → unified activity stream
  ├─ 权限矩阵：严格的subagent调用权限控制
  └─ 调度层：自动派发、超时重试、停滞升级、自动回滚
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
观测层：React 看板 + 实时API (Dashboard + Real-time Analytics)
  ├─ 任务看板：10个视图面板（全部/按状态/按部门/按优先级等）
  ├─ 活动流：59条/任务的混合活动记录（思考过程、工具调用、状态转移）
  └─ 在线状态：Agent 实时节点检测 + 心跳喚醒机制
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
```

---

## 📚 第一部分：业务架构

### 1.1 帝国制度：分权制衡的设计哲学

#### 核心理念

传统的多Agent框架（如CrewAI、AutoGen）采用**"自由协作"模式**：
- Agent自主选择协作对象
- 框架仅提供通信通道
- 质量控制完全依赖Agent智能
- **问题**：容易出现Agent相互制造假数据、重复工作、方案质量无保障

**三省六部**采用**"制度化协作"模式**，模仿古代帝国官僚体系：

```
              皇上
              (User)
               │
               ↓
             太子 (Taizi)
        [分拣官、消息接入总负责]
      ├─ 识别：这是旨意还是闲聊？
      ├─ 执行：直接回复闲聊 || 建立任务→转中书
      └─ 权限：只能调用 中书省
               │
               ↓
           中书省 (Zhongshu)
      [规划官、方案起草总负责]
      ├─ 接旨后分析需求
      ├─ 拆解为子任务（todos）
      ├─ 调用门下省审议 OR 尚书省咨询
      └─ 权限：只能调用 门下 + 尚书
               │
               ↓
           门下省 (Menxia)
        [审议官、质量把握人]
      ├─ 审查中书方案（可行性、完整性、风险）
      ├─ 准奏 OR 封驳（含修改建议）
      ├─ 若封驳 → 返回中书修改 → 重新审议（最多3轮）
      └─ 权限：只能调用 尚书 + 回调中书
               │
         (✅ 准奏)
               │
               ↓
           尚书省 (Shangshu)
        [派发官、执行总指挥]
      ├─ 接到准奏方案
      ├─ 分析派发给哪个部门
      ├─ 调用六部（礼/户/兵/刑/工/吏）执行
      ├─ 监控各部进度 → 汇总结果
      └─ 权限：只能调用 六部（不能越权调中书）
               │
               ├─ 礼部 (Libu)      - 文档编制官
               ├─ 户部 (Hubu)      - 数据分析官
               ├─ 兵部 (Bingbu)    - 代码实现官
               ├─ 刑部 (Xingbu)    - 测试审查官
               ├─ 工部 (Gongbu)    - 基础设施官
               └─ 吏部 (Libu_hr)   - 人力资源官
               │
         (各部并行执行)
               ↓
           尚书省·汇总
      ├─ 收集六部结果
      ├─ 状态转为 Review
      ├─ 回调中书省转报皇上
               │
               ↓
           中书省·回奏
      ├─ 汇总现象、结论、建议
      ├─ 状态转为 Done
      └─ 回复飞书消息给皇上
```

#### 制度的4大保障

| 保障机制 | 实现细节 | 防护效果 |
|---------|---------|---------|
| **制度性审核** | 门下省必审议所有中书方案，不可跳过 | 防止Agent胡乱执行，确保方案具有可行性 |
| **分权制衡** | 权限矩阵：谁能调谁严格定义 | 防止权力滥用（如尚书越权调中书改方案） |
| **完全可观测** | 任务看板10个面板 + 59条活动/任务 | 实时看到任务卡在哪、谁在工作、工作状态如何 |
| **实时可干预** | 看板内一键 stop/cancel/resume/advance | 紧急情况（如发现Agent走错方向）能立即纠正 |

---

### 1.2 任务完整流转流程

#### 流程示意图

```mermaid
stateDiagram-v2
[*] --> Pending: 皇上下旨
Pending --> Taizi: 太子接旨
Taizi --> Zhongshu: 太子转交中书
Zhongshu --> Menxia: 中书提交审议
Menxia --> Zhongshu: 门下封驳(可多次)
Menxia --> Assigned: 门下准奏
Assigned --> Doing: 尚书派发执行
Doing --> Review: 各部完成
Review --> Done: 皇上御批通过
Review --> Menxia: 皇上要求修改
Done --> [*]
Doing --> [*]: 手动取消
Review --> [*]: 业务终止
```

#### 具体关键路径

**✅ 理想路径**（无阻滞，4-5天完成）

```
/* Detailed source-code truncated for AI context efficiency. */
```

**❌ 挫折路径**（含封驳和重试，6-7天）

```
DAY 2 同上

DAY 3 [封驳场景]：
  14:00 - 门下省审议完毕
          判定："方案不完整，缺少性能测试 + 压力测试"
          行为：🚫 封驳
          review_round += 1
          flow_log 记录："门下省 → 中书省：🚫 封驳（需补充性能测试）"
          state: Menxia → Zhongshu  # 返回中书修改
          自动派发 zhongshu agent（重新规划）

DAY 3-4：
  16:00 - 中书省收到封驳通知（唤醒agent）
          分析改进意见，补充性能测试方案
          progress："已整合性能测试需求，修正方案如下..."
          flow_log 记录："中书省 → 门下省：修订方案（第2轮审议）"
          state: Zhongshu → Menxia
          自动派发 menxia agent

  18:00 - 门下省重新审议
          判定："✅ 本次通过"
          flow_log 记录："门下省 → 尚书省：✅ 准奏通过（第2轮）"
          state: Menxia → Assigned → Doing
          后续同理想路径...

DAY 7：全部完成（比理想路径晚1-2天）
```

---

### 1.3 任务规格书与业务契约

#### Task Schema 字段说明

```
/* Detailed source-code truncated for AI context efficiency. */
```

#### 业务契约

| 契约 | 含义 | 违反后果 |
|------|------|---------|
| **不可越级** | 太子只能调中书，中书只能调门下/尚书，六部不能对外调用 | 超权调用被拒绝，系统自动拦截 |
| **状态单向递进** | Pending → Taizi → Zhongshu → ... → Done，不能跳过或倒退 | 只能通过 review_action(reject) 返回上一步 |
| **门下必审** | 所有中书提出的方案都要门下省审议，无法跳过 | 中书不能直接转尚书，门下必入 |
| **一旦Done无改** | 任务进入Done/Cancelled后不能再修改状态 | 若需修改需要创建新任务或取消后重新建 |
| **task_id唯一性** | JJC-日期-序号 全局唯一，同一天同一任务不重复建 | 看板防重，自动去重 |
| **资源消耗透明** | 每次进展汇报都要上报 tokens/cost/elapsed | 便于成本核算和性能优化 |

---

## 🔧 第二部分：技术架构

### 2.1 状态机与自动派发

#### 状态转移完整定义

```python
_STATE_FLOW = {
    'Pending':  ('Taizi',   '皇上',    '太子',    '待处理旨意转交太子分拣'),
    'Taizi':    ('Zhongshu','太子',    '中书省',  '太子分拣完毕，转中书省起草'),
    'Zhongshu': ('Menxia',  '中书省',  '门下省',  '中书省方案提交门下省审议'),
    'Menxia':   ('Assigned','门下省',  '尚书省',  '门下省准奏，转尚书省派发'),
    'Assigned': ('Doing',   '尚书省',  '六部',    '尚书省开始派发执行'),
    'Next':     ('Doing',   '尚书省',  '六部',    '待执行任务开始执行'),
    'Doing':    ('Review',  '六部',    '尚书省',  '各部完成，进入汇总'),
    'Review':   ('Done',    '尚书省',  '太子',    '全流程完成，回奏太子转报皇上'),
}
```

每个状态自动关联 Agent ID（见 `_STATE_AGENT_MAP`）：

```python
_STATE_AGENT_MAP = {
    'Taizi':    'taizi',
    'Zhongshu': 'zhongshu',
    'Menxia':   'menxia',
    'Assigned': 'shangshu',
    'Doing':    None,      # 从 org 推断（六部之一）
    'Next':     None,      # 从 org 推断
    'Review':   'shangshu',
    'Pending':  'zhongshu',
}
```

#### 自动派发流程

当任务状态转移时（通过 `handle_advance_state()` 或审批），后台自动执行派发：

```
1. 状态转移触发派发
   ├─ 查表 _STATE_AGENT_MAP 得到目标 agent_id
   ├─ 若是 Doing/Next，从 task.org 查表 _ORG_AGENT_MAP 推断具体部门agent
   └─ 若无法推断则跳过派发（如 Done/Cancelled）

2. 构造派发消息（针对性促使Agent立即工作）
   ├─ taizi: "📜 皇上旨意需要你处理..."
   ├─ zhongshu: "📜 旨意已到中书省，请起草方案..."
   ├─ menxia: "📋 中书省方案提交审议..."
   ├─ shangshu: "📮 门下省已准奏，请派发执行..."
   └─ 六部: "📌 请处理任务..."

3. 后台异步派发（非阻塞）
   ├─ spawn daemon thread
   ├─ 标记 _scheduler.lastDispatchStatus = 'queued'
   ├─ 检查 Gateway 进程是否开启
   ├─ 运行 openclaw agent --agent {id} -m "{msg}" --deliver --timeout 300
   ├─ 重试最多2次（失败间隔5秒退避）
   ├─ 更新 _scheduler 状态和错误信息
   └─ flow_log 记录派发结果

4. 派发状态转移
   ├─ success: 立即更新 _scheduler.lastDispatchStatus = 'success'
   ├─ failed: 记录失败原因，Agent 超时不会 block 看板
   ├─ timeout: 标记 timeout，允许用户手动重试 / 升级
   ├─ gateway-offline: Gateway 未启动，跳过此次派发（后续可重试）
   └─ error: 异常情况，记录堆栈供调试

5. 到达目标Agent的处理
   ├─ Agent 从飞书消息收到通知
   ├─ 通过 kanban_update.py 与看板交互（更新状态/记录进展）
   └─ 完成工作后再次触发派发到下一个Agent
```

---

### 2.2 权限矩阵与Subagent调用

#### 权限定义（openclaw.json 中配置）

```json
{
  "agents": [
    {
      "id": "taizi",
      "label": "太子",
      "allowAgents": ["zhongshu"]
    },
    {
      "id": "zhongshu",
      "label": "中书省",
      "allowAgents": ["menxia", "shangshu"]
    },
    {
      "id": "menxia",
      "label": "门下省",
      "allowAgents": ["shangshu", "zhongshu"]
    },
    {
      "id": "shangshu",
      "label": "尚书省",
      "allowAgents": ["libu", "hubu", "bingbu", "xingbu", "gongbu", "libu_hr"]
    },
    {
      "id": "libu",
      "label": "礼部",
      "allowAgents": []
    },
    // ... 其他六部同样 allowAgents = [] ...
  ]
}
```

#### 权限检查机制（代码层面）

在 `dispatch_for_state()` 之外，还有一套防御性的权限检查：

```python
def can_dispatch_to(from_agent, to_agent):
    """检查 from_agent 是否有权调用 to_agent。"""
    cfg = read_json(DATA / 'agent_config.json', {})
    agents = cfg.get('agents', [])
    
    from_record = next((a for a in agents if a.get('id') == from_agent), None)
    if not from_record:
        return False, f'{from_agent} 不存在'
    
    allowed = from_record.get('allowAgents', [])
    if to_agent not in allowed:
        return False, f'{from_agent} 无权调用 {to_agent}（允许列表：{allowed}）'
    
    return True, 'OK'
```

#### 权限违反示例与处理

| 场景 | 请求 | 结果 | 理由 |
|------|------|------|------|
| **正常** | 中书省 → 门下省审议 | ✅ 允许 | 门下在中书的 allowAgents 中 |
| **违反** | 中书省 → 尚书省改方案 | ❌ 拒绝 | 中书只能调门下/尚书，不能手工改尚书工作 |
| **违反** | 工部 → 尚书省 "我完成了" | ✅ 改状态 | 通过 flow_log 和 progress_log（不是跨Agent调用） |
| **违反** | 尚书省 → 中书省 "重新改方案" | ❌ 拒绝 | 尚书不在门下/中书的 allowAgents 中 |
| **防控** | Agent 伪造其他agent派发 | ❌ 拦截 | API 层验证 HTTP 请求来源/签名 |

---

### 2.3 数据融合：progress_log + session JSONL

#### 现象

当任务执行时，有三层数据源：

```
1️⃣ flow_log
   └─ 纯粹记录状态转移（Zhongshu → Menxia）
   └─ 数据源：任务 JSON 的 flow_log 字段
   └─ 来自：Agent 通过 kanban_update.py flow 命令上报

2️⃣ progress_log
   └─ Agent 的实时工作汇报（文本进展、todos快照、资源消耗）
   └─ 数据源：任务 JSON 的 progress_log 字段
   └─ 来自：Agent 通过 kanban_update.py progress 命令上报
   └─ 周期：通常每30分钟或关键节点上报1次

3️⃣ session JSONL（新增！）
   └─ Agent 的内部思考过程（thinking）、工具调用（tool_result）、对话历史（user）
   └─ 数据源：~/.openclaw/agents/{agent_id}/sessions/*.jsonl
   └─ 来自：OpenClaw框架自动记录，Agent无需主动操作
   └─ 周期：消息级别，粒度最细
```

#### 问题诊断

过去，只靠 flow_log + progress_log 展现进展：
- ❌ 看不到Agent的具体思考过程
- ❌ 看不到每次工具调用的结果
- ❌ 看不到Agent中间的对话历史
- ❌ Agent 表现出"黑盒状态"

例如：progress_log 记录"正在分析需求"，但用户看不到到底分析了什么。

#### 解决方案：Session JSONL 融合

在 `get_task_activity()` 中新增融合逻辑（40行）：

```
/* Detailed source-code truncated for AI context efficiency. */
```

#### Session JSONL 格式解析

从 JSONL 中提取的条目，统一转换为看板活动条目：

```python
def _parse_activity_entry(item):
    """将 session jsonl 的 message 统一解析成看板活动条目。"""
    msg = item.get('message', {})
    role = str(msg.get('role', '')).strip().lower()
    ts = item.get('timestamp', '')
    
    # 🧠 Assistant 角色 - Agent思考过程
    if role == 'assistant':
        entry = {
            'at': ts,
            'kind': 'assistant',
            'text': '...主回复...',
            'thinking': '💭 Agent考虑到...',  # 内部思维链
            'tools': [
                {'name': 'bash', 'input_preview': 'cd /src && npm test'},
                {'name': 'file_read', 'input_preview': 'dashboard/server.py'},
            ]
        }
        return entry
    
    # 🔧 Tool Result - 工具调用结果
    if role in ('toolresult', 'tool_result'):
        entry = {
            'at': ts,
            'kind': 'tool_result',
            'tool': 'bash',
            'exitCode': 0,
            'output': '✓ All tests passed (123 tests)',
            'durationMs': 4500  # 执行时长
        }
        return entry
    
    # 👤 User - 人工反馈或对话
    if role == 'user':
        entry = {
            'at': ts,
            'kind': 'user',
            'text': '请实现测试用例的异常处理'
        }
        return entry
```

#### 融合后的活动流结构

单个任务的59条活动流（JJC-20260228-E2E 示例）：

```
kind    count  代表事件
────────────────────────────────────────────────
flow      10   状态转移链（Pending→Taizi→Zhongshu→...）
progress  11   Agent工作汇报（"正在分析"、"已完成"）
todos     11   待办任务快照（进度更新时每条）
user       1   用户反馈（如"需要补充性能测试"）
assistant 10   Agent思考过程（💭 reasoning chain）
tool_result 16   工具调用记录（bash运行结果、API调用结果）
────────────────────────────────────────────────
总计      59   完整工作轨迹
```

看板展示时，用户可以：
- 📋 看流转链了解任务在哪个阶段
- 📝 看 progress 了解Agent实时说了什么
- ✅ 看 todos 了解任务拆解和完成进度
- 💭 看 assistant/thinking 了解Agent的思考过程
- 🔧 看 tool_result 了解每次工具调用的结果
- 👤 看 user 了解是否有人工干预

---

### 2.4 调度系统：超时重试、停滞升级、自动回滚

#### 调度元数据结构

```python
_scheduler = {
    # 配置参数
    'enabled': True,
    'stallThresholdSec': 180,         # 停滞多久后自动升级（默认180秒）
    'maxRetry': 1,                    # 自动重试次数（0=不重试，1=重试1次）
    'autoRollback': True,             # 是否自动回滚到快照
    
    # 运行时状态
    'retryCount': 0,                  # 当前已重试几次
    'escalationLevel': 0,             # 0=无升级 1=门下协调 2=尚书协调
    'stallSince': None,               # 何时开始停滞的时间戳
    'lastProgressAt': '2026-03-01T...',  # 最后一次获得进展的时间
    'lastEscalatedAt': '2026-03-01T...',
    'lastRetryAt': '2026-03-01T...',
    
    # 派发追踪
    'lastDispatchStatus': 'success',  # queued|success|failed|timeout|gateway-offline|error
    'lastDispatchAgent': 'zhongshu',
    'lastDispatchTrigger': 'state-transition',
    'lastDispatchError': '',          # 错误堆栈（如有）
    
    # 快照（用于自动回滚）
    'snapshot': {
        'state': 'Assigned',
        'org': '尚书省',
        'now': '等待派发...',
        'savedAt': '2026-03-01T...',
        'note': 'scheduled-check'
    }
}
```

#### 调度算法

每 60 秒运行一次 `handle_scheduler_scan(threshold_sec=180)`：

```
FOR EACH 任务:
  IF state in (Done, Cancelled, Blocked):
    SKIP  # 终态不处理
  
  elapsed_since_progress = NOW - lastProgressAt
  
  IF elapsed_since_progress < stallThreshold:
    SKIP  # 最近有进展，无需处理
  
  # ── 停滞处理逻辑 ──
  IF retryCount < maxRetry:
    ✅ 执行【重试】
    - increment retryCount
    - dispatch_for_state(task, new_state, trigger='taizi-scan-retry')
    - flow_log: "停滞180秒，触发自动重试第N次"
    - NEXT task
  
  IF escalationLevel < 2:
    ✅ 执行【升级】
    - nextLevel = escalationLevel + 1
    - target_agent = menxia (if L=1) else shangshu (if L=2)
    - wake_agent(target_agent, "💬 任务停滞，请介入协调推进")
    - flow_log: "升级至{target_agent}协调"
    - NEXT task
  
  IF escalationLevel >= 2 AND autoRollback:
    ✅ 执行【自动回滚】
    - restore task to snapshot.state
    - retryCount = 0
    - escalationLevel = 0
    - dispatch_for_state(task, snapshot.state, trigger='taiji-auto-rollback')
    - flow_log: "连续停滞，自动回滚到{snapshot.state}"
```

#### 示例场景

**场景：中书省Agent进程崩溃，任务卡在 Zhongshu**

```
T+0:
  中书省正在规划方案
  lastProgressAt = T
  dispatch status = success

T+30:
  Agent 进程意外崩溃（或超载无响应）
  lastProgressAt 仍然 = T（没有新的 progress）

T+60:
  scheduler_scan 扫一遍，发现：
  elapsed = 60 < 180，跳过

T+180:
  scheduler_scan 扫一遍，发现：
  elapsed = 180 >= 180，触发处理
  
  ✅ 阶段1：重试
  - retryCount: 0 → 1
  - dispatch_for_state('JJC-20260228-E2E', 'Zhongshu', trigger='taizi-scan-retry')
  - 派发消息发送到中书省（唤醒agent或重启）
  - flow_log: "停滞180秒，自动重试第1次"

T+ 240:
  中书省 Agent 恢复（或手工重启），收到重试派发
  汇报进展："已恢复，继续规划..."
  lastProgressAt 更新为 T+240
  retryCount 重置为 0
  
  ✓ 问题解决

T+360 (若仍未恢复):
  scheduler_scan 再次扫，发现：
  elapsed = 360 >= 180, retryCount 已经 = 1
  
  ✅ 阶段2：升级
  - escalationLevel: 0 → 1
  - wake_agent('menxia', "💬 任务JJC-20260228-E2E停滞，中书省无反应，请介入")
  - flow_log: "升级至门下省协调"
  
  门下省Agent被唤醒，可以：
  - 检查中书省是否在线
  - 若在线，询问进度
  - 若离线，可能启动应急流程（如由门下暂代起草）

T+540 (若仍未解决):
  scheduler_scan 再次扫，发现：
  escalationLevel = 1, 还能升级到 2
  
  ✅ 阶段3：再次升级
  - escalationLevel: 1 → 2
  - wake_agent('shangshu', "💬 任务长期停滞，中书省+门下省都无法推进，尚书省请介入协调")
  - flow_log: "升级至尚书省协调"

T+720 (若仍未解决):
  scheduler_scan 再次扫，发现：
  escalationLevel = 2（已最大），autoRollback = true
  
  ✅ 阶段4：自动回滚
  - snapshot.state = 'Assigned' (前一个稳定状态)
  - task.state: Zhongshu → Assigned
  - dispatch_for_state('JJC-20260228-E2E', 'Assigned', trigger='taizi-auto-rollback')
  - flow_log: "连续停滞，自动回滚到Assigned，由尚书省重新派发"
  
  结果：
  - 尚书省重新派发给六部执行
  - 中书省的方案保留在前一个 snapshot 版本中
  - 用户可以看到回滚操作，决定是否介入
```

---

## 🎯 第三部分：核心API与CLI工具

### 3.1 任务操作API端点

#### 任务创建：`POST /api/create-task`

```
请求：
{
  "title": "为三省六部编写完整自动化测试方案",
  "org": "中书省",           // 可选，默认太子
  "official": "中书令",      // 可选
  "priority": "normal",
  "template_id": "test_plan", // 可选
  "params": {},
  "target_dept": "兵部+刑部"  // 可选，派发建议
}

响应：
{
  "ok": true,
  "taskId": "JJC-20260228-001",
  "message": "旨意 JJC-20260228-001 已下达，正在派发给太子"
}
```

#### 任务活动流：`GET /api/task-activity/{task_id}`

```
/* Detailed source-code truncated for AI context efficiency. */
```

#### 状态推进：`POST /api/advance-state/{task_id}`

```
请求：
{
  "comment": "任务分明该推进了"
}

响应：
{
  "ok": true,
  "message": "JJC-20260228-E2E 已推进到下一阶段 (已自动派发 Agent)",
  "oldState": "Zhongshu",
  "newState": "Menxia",
  "targetAgent": "menxia"
}
```

#### 审批操作：`POST /api/review-action/{task_id}`

```
请求（准奏）：
{
  "action": "approve",
  "comment": "方案可行，已采纳改进建议"
}

OR 请求（封驳）：
{
  "action": "reject",
  "comment": "需补充性能测试，第N轮审议"
}

响应：
{
  "ok": true,
  "message": "JJC-20260228-E2E 已准奏 (已自动派发 Agent)",
  "state": "Assigned",
  "reviewRound": 1
}
```

---

### 3.2 CLI工具：kanban_update.py

Agent 通过此工具与看板交互，共7个命令：

#### 命令1：创建任务（太子或中书手工）

```bash
python3 scripts/kanban_update.py create \
  JJC-20260228-E2E \
  "为三省六部编写完整自动化测试方案" \
  Zhongshu \
  中书省 \
  中书令

# 说明：通常不需要手工运行（看板API自动触发），除非debug
```

#### 命令2：更新状态

```bash
python3 scripts/kanban_update.py state \
  JJC-20260228-E2E \
  Menxia \
  "方案提交门下省审议"

# 说明：
# - 第一个参数：task_id
# - 第二个参数：新状态（Pending/Taizi/Zhongshu/...）
# - 第三个参数：可选，描述信息（会记录到 now 字段）
# 
# 效果：
# - task.state = Menxia
# - task.org 自动推断为 "门下省"
# - 触发派发 menxia agent
# - flow_log 记录转移
```

#### 命令3：添加流转记录

```bash
python3 scripts/kanban_update.py flow \
  JJC-20260228-E2E \
  "中书省" \
  "门下省" \
  "📋 方案提交审核，请审议"

# 说明：
# - 参数1：task_id
# - 参数2：from_dept（谁在上报）
# - 参数3：to_dept（流转到谁）
# - 参数4：remark（备注，可包含emoji）
#
# 注意：只是记录 flow_log，不改变 task.state
#（多用于细节流转，如部门间的协调）
```

#### 命令4：实时进展汇报（重点！）

```bash
python3 scripts/kanban_update.py progress \
  JJC-20260228-E2E \
  "已完成需求分析和方案初稿，现正征询工部意见" \
  "1.需求分析✅|2.方案设计✅|3.工部咨询🔄|4.待门下审议"

# 说明：
# - 参数1：task_id
# - 参数2：进展文本说明
# - 参数3：todos 当前快照（用 | 分隔各项，支持emoji）
#
# 效果：
# - progress_log 添加新条目：
#   {
#     "at": now_iso(),
#     "agent": inferred_agent_id,
#     "text": "已完成需求分析和方案初稿，现正征询工部意见",
#     "state": task.state,
#     "org": task.org,
#     "todos": [
#       {"id": "1", "title": "需求分析", "status": "completed"},
#       {"id": "2", "title": "方案设计", "status": "completed"},
#       {"id": "3", "title": "工部咨询", "status": "in-progress"},
#       {"id": "4", "title": "待门下审议", "status": "not-started"}
#     ],
#     "tokens": (自动从 openclaw 会话数据读取),
#     "cost": (自动计算),
#     "elapsed": (自动计算)
#   }
#
# 看板效果：
# - 即时渲染为活动条目
# - todos 进度条更新（67% 完成）
# - 资源消耗累加显示
```

#### 命令5：任务完成

```bash
python3 scripts/kanban_update.py done \
  JJC-20260228-E2E \
  "https://github.com/org/repo/tree/feature/auto-test" \
  "自动化测试方案已完成，涵盖单元/集成/E2E三层，通过率98.5%"

# 说明：
# - 参数1：task_id
# - 参数2：output URL（可以是代码仓库、文档链接等）
# - 参数3：最终总结
#
# 效果：
# - task.state = Done（从 Review 推进）
# - task.output = "https://..."
# - 自动发送Feishu消息给皇上（太子转报）
# - flow_log 记录完成转移
```

#### 命令6 & 7：停止/取消任务

```bash
# 叫停（随时可恢复）
python3 scripts/kanban_update.py stop \
  JJC-20260228-E2E \
  "等待工部反馈继续"

# 说明：
# - task.state 暂存（_prev_state）
# - task.block = "等待工部反馈继续"
# - 看板显示 "⏸️ 已叫停"
#
# 恢复：
python3 scripts/kanban_update.py resume \
  JJC-20260228-E2E \
  "工部已反馈，继续执行"
#
# - task.state 恢复到 _prev_state
# - 重新派发 agent

# 取消（不可恢复）
python3 scripts/kanban_update.py cancel \
  JJC-20260228-E2E \
  "业务需求变更，任务作废"
#
# - task.state = Cancelled
# - flow_log 记录取消原因
```

---

## 💡 第四部分：对标与对比

### CrewAI / AutoGen 的传统方式 vs 三省六部的制度化方式

| 维度 | CrewAI | AutoGen | **三省六部** |
|------|--------|---------|----------|
| **协作模式** | 自由讨论（Agent自主选择协作对象） | 面板+回调（Human-in-the-loop） | **制度化协作（权限矩阵+状态机）** |
| **质量保障** | 依赖Agent智能（无审核）| Human审核（频繁中断） | **自动审核（门下省必审）+可干预** |
| **权限控制** | ❌ 无 | ⚠️ Hard-coded | **✅ 配置化权限矩阵** |
| **可观测性** | 低（Agent消息黑盒） | 中（Human看到对话）| **极高（59条活动/任务）** |
| **可干预性** | ❌ 无（跑起来后很难叫停） | ✅ 有（需要人工批准） | **✅ 有（一键stop/cancel/advance）** |
| **任务分发** | 不确定（Agent自主选） | 确定（Human手工分） | **自动确定（权限矩阵+状态机）** |
| **吞吐量** | 1任务1Agent（串行讨论） | 1任务1Team（需人工管理） | **多任务并行（六部同时执行）** |
| **失败恢复** | ❌（重新开始） | ⚠️（需人工调试） | **✅（自动重试3阶段）** |
| **成本控制** | 不透明（没有成本上限）| 中等（Human可叫停） | **透明（每条progress上报成本）** |

### 业务契约的严格性

**CrewAI 的"温和"方式**
```python
# Agent可以自由选择下一步工作
if task_seems_done:
    # Agent自己决定要不要报告给其他Agent
    send_message_to_someone()  # 可能发错人，可能重复
```

**三省六部的"严格"方式**
```python
# 任务状态严格受限，下一步由系统决定
if task.state == 'Zhongshu' and agent_id == 'zhongshu':
    # 只能做Zhongshu该做的事（起草方案）
    deliver_plan_to_menxia()
    
    # 状态转移只能通过API，不能绕过
    # 中书不能直接转尚书，必须经过门下审议
    
    # 若想绕过门下审议
    try:
        dispatch_to(shangshu)  # ❌ 权限检查拦截
    except PermissionError:
        log.error(f'zhongshu 无权越权调用 shangshu')
```

---

## 🔍 第五部分：故障场景与恢复机制

### 场景1：Agent进程崩溃

```
症状：任务卡在某个状态，180秒无新进展
报警：太子调度系统检测到停滞

自动处理流程：
  T+0: 崩溃
  T+180: scan 检测到停滞
    ✅ 第1阶段：自动重试
       - 派发消息到agent（唤醒或重启）
       - 如果agent恢复，流程继续
  
  T+360: 若仍未恢复
    ✅ 第2阶段：升级协调
       - 唤醒门下省agent
       - 汇报："中书省无响应，请介入"
       - 门下可能接管或代理工作
  
  T+540: 若仍未恢复
    ✅ 第3阶段：再次升级
       - 唤醒尚书省agent
       - 汇报："任务彻底卡住，请企业级协调"
  
  T+720: 若仍未恢复
    ✅ 第4阶段：自动回滚
       - 恢复到前一个稳定状态
       - 派发给尚书省重新处理
       - 用户可看到完整回滚链路
```

### 场景2：Agent作恶（伪造数据）

假设 `zhongshu` agent 想骗过系统：

```python
# 尝试伪造门下省的准奏（直接改JSON）
task['flow_log'].append({
    'from': '门下省',      # ❌ 假冒身份
    'to': '尚书省',
    'remark': '✅ 准奏'
})

# 系统防御：
# 1. 权限验证：API 层检查 HTTP 请求者身份
#    ├─ 来自 zhongshu agent 的请求不能直接 flow
#    ├─ 必须通过 flow_log 记录，且签名验证
#    └─ 签名不匹配则拒绝
# 2. 状态机验证：状态转移受控
#    ├─ 即使 flow_log 被篡改，state 仍然是 Zhongshu
#    ├─ 下一步只能由 gate-keeper 系统转移
#    └─ zhongshu 无权自己改 state

# 结果：❌ Agent 的伪造被系统拦截
```

### 场景3：业务流程违反（如中书越权调尚书改方案）

```python
# 中书省想绕过门下审议，直接咨询尚书省
try:
    result = dispatch_to_agent('shangshu', '请帮我审查一下这个方案')
except PermissionError:
    # ❌ 权限矩阵拦截
    log.error('zhongshu 无权调用 shangshu (仅限: menxia, shangshu)')

# 门下省想升级到皇上
try:
    result = dispatch_to_agent('taizi', '我需要皇上的指示')
except PermissionError:
    # ❌ 权限矩阵拦截
    log.error('menxia 无权调用 taizi')
```

---

## 📊 第六部分：监控与可观测性

### 看板的10个视图面板

```
1. 全任务列表
   └─ 所有任务的汇总视图（按创建时间倒序）
   └─ 快速过滤：活跃/完成/已封驳

2. 按状态分类
   ├─ Pending（待处理）
   ├─ Taizi（太子分拣中）
   ├─ Zhongshu（中书规划中）
   ├─ Menxia（门下审议中）
   ├─ Assigned（尚书派发中）
   ├─ Doing（六部执行中）
   ├─ Review（尚书汇总中）
   └─ Done/Cancelled（已完成/已取消）

3. 按部门分类
   ├─ 太子任务
   ├─ 中书省任务
   ├─ 门下省任务
   ├─ 尚书省任务
   ├─ 六部任务（并行视图）
   └─ 已派发任务

4. 按优先级分类
   ├─ 🔴 Critical（紧急）
   ├─ 🟠 High（高优）
   ├─ 🟡 Normal（普通）
   └─ 🔵 Low（低优）

5. Agent 在线状态
   ├─ 🟢 运行中（正在处理任务）
   ├─ 🟡 待命（最近有活动，闲置）
   ├─ ⚪ 空闲（超过10分钟无活动）
   ├─ 🔴 离线（Gateway 未启动）
   └─ ❌ 未配置（工作空间不存在）

6. 任务详情面板
   ├─ 基本信息（标题、创建人、优先级）
   ├─ 完整活动流（flow_log + progress_log + session）
   ├─ 阶段耗时统计（各Agent停留时间）
   ├─ Todos 进度条
   └─ 资源消耗（tokens/cost/elapsed）

7. 停滞任务监控
   ├─ 列出所有超过阈值未推进的任务
   ├─ 显示停滞时长
   ├─ 快速操作：重试/升级/回滚

8. 审批工单池
   ├─ 清单所有在 Menxia 等待审批的任务
   ├─ 按停留时长排序
   ├─ 一键准奏/封驳

9. 今日概览
   ├─ 今日新建任务数
   ├─ 今日完成任务数
   ├─ 平均流转时长
   ├─ 各Agent活动频率

10. 历史报表
    ├─ 周报（人均产出、平均周期）
    ├─ 月报（部门协作效率）
    └─ 成本分析（API调用成本、Agent工作量）
```

### 实时API：Agent 在线检测

```
GET /api/agents-status

响应：
{
  "ok": true,
  "gateway": {
    "alive": true,           // 进程存在
    "probe": true,          // HTTP 响应正常
    "status": "🟢 运行中"
  },
  "agents": [
    {
      "id": "taizi",
      "label": "太子",
      "status": "running",        // running|idle|offline|unconfigured
      "statusLabel": "🟢 运行中",
      "lastActive": "03-02 14:30", // 最后活跃时间
      "lastActiveTs": 1708943400000,
      "sessions": 42,             // 活跃session数
      "hasWorkspace": true,
      "processAlive": true
    },
    // ... 其他agent ...
  ]
}
```

---

## 🎓 第七部分：使用示例与最佳实践

### 完整案例：创建→分发→执行→完成

```
/* Detailed source-code truncated for AI context efficiency. */
```

---

## 📋 总结

**三省六部是一个制度化的AI多Agent系统**，不是传统的"自由讨论"框架。它通过：

1. **业务层**：模仿古代帝国官僚体系，建立分权制衡的组织结构
2. **技术层**：状态机 + 权限矩阵 + 自动派发 + 调度重试，确保流程可控
3. **观测层**：React 看板 + 完整活动流（59条/任务），实时掌握全局
4. **介入层**：一键stop/cancel/advance，遇到异常能立即纠正

**核心价值**：用制度确保质量，用透明确保信心，用自动化确保效率。

相比 CrewAI/AutoGen 的"自由+人工管理"，三省六部提供了一套**企业级的AI协作框架**。


## Workflow state vs execution ownership

In Edict workflows, **workflow state** and **execution ownership** are related but not always identical.

### Workflow state
Workflow state describes the current institutional stage of a task, for example:

- `Taizi`
- `Zhongshu`
- `Menxia`
- `Assigned`
- `Doing`
- `Review`
- `Done`

This is the stage shown in the board/UI and reflects where the task is in the intended process.

### Execution ownership
Execution ownership means which actual runtime agent/session currently owns the next action or is writing the next progress/log update.

In simple flows, workflow state and execution ownership may appear to match.

In more complex or multi-stage flows, they can temporarily diverge. For example:
- the workflow state may already show `Assigned`
- while the active runtime execution context is still tied to an earlier stage's dispatch chain

### Why this distinction matters
This distinction is useful when:
- debugging handoff behavior
- understanding why a later-stage label appears before a fully isolated execution handoff occurs
- reasoning about future improvements such as stage-isolated orchestration

In short:

- **workflow state** = where the task is in the institutional process
- **execution ownership** = which runtime path currently holds the next action

> This documentation does not change runtime semantics. It only clarifies an important concept for advanced real-world usage.

---

### Wechat (`docs/wechat.md`)

# 📮 朕的邸报——公众号「cft0808」

> *古有邸报传天下政令，今有公众号聊 AI 架构。*

<p align="center">
  <img src="assets/wechat-qrcode.jpg" width="260" alt="公众号二维码 · cft0808">
  <br><br>
  <b>👆 微信扫码，即刻入朝</b>
</p>

---

## 🤔 关注了能看到什么？

### 🏛️ 架构拆解系列

三省六部不是 metaphor，是真的分权制衡。公众号里你能看到：

- **为什么门下省是杀手锏** —— 以及它封驳了多少次中书省的方案
- **太子凭什么当分拣员** —— Intent Detection 的古今之辩
- **六部并行为啥不打架** —— 从唐代到 goroutine 的并发智慧
- **SOUL.md 人设怎么写** —— 让 AI 入戏的 prompt 炼丹术

### 🔥 踩坑复盘

做 12 个 Agent 协作，每天都有惊喜（惊吓）：

- ✍️ *Agent A 给 Agent B 发消息，B 说"朕不认识你"*
- 🔥 *Token 烧了 $50，结果门下省把方案驳回了三次*
- 🐛 *尚书省派发任务，六部全体罢工——原来 agent ID 写错了*
- 💀 *install.sh 把用户自定义的龙虾官角色覆盖了……*

这些都是真实 Issue，文章里逐条复盘怎么修的。

### 💡 Token 省钱术

大家最关心的问题：**这玩意儿 token 不得烧穿？**

公众号里会分享：
- 用 Claude 内置 cache 砍掉 80% SOUL.md 重复读取
- 「快速通道」机制：简单任务跳过门下省审核
- 按需启动 Agent，不轮询不烧钱
- 精简 SOUL.md：1000 字以内搞定一个高质量角色

### 🎭 彩蛋 & 幕后

- 六部的 SOUL.md 人设是怎么设计的？
- "锦衣卫监察百官" 功能会做吗？（会的）
- 为什么叫"三省六部"而不是"六扇门"？
- 朕（作者）日常怎么跟 12 个 AI 斗智斗勇

---

## 📝 已发表文章

| 日期 | 标题 | 亮点 |
|------|------|------|
| 2026.03 | 三省六部 · 250 Star 里程碑复盘 | 5 个 Issue + 20 条评论逐一回应，Token 优化方案 |

> 持续更新中，欢迎催更 ⚔️

---

## 💬 你也可以在公众号里

- 🗣️ **提问** —— 安装踩坑、架构疑惑、Token 焦虑，有问必答
- 🐛 **报 Bug** —— 不想开 Issue？直接留言也行，朕都会看
- 💡 **提建议** —— "能不能加个后宫系统？" 可以，但先排队
- 🤝 **交朋友** —— 一起研究怎么让 AI 上朝更高效

---

<p align="center">
  <b>⚔️ 朕让 AI 上朝，结果 AI 比朕还卷</b><br>
  <sub>关注公众号，看朕如何驾驭 12 个 AI 大臣</sub><br><br>
  <img src="assets/wechat-qrcode.jpg" width="180" alt="扫码关注">
</p>

---

### Wechat Article (`docs/wechat-article.md`)

# 我用三省六部制重新设计了 AI 多 Agent 协作架构

> 1300 年前的制度设计，比现代 AI 框架更懂分权。



---

## 一、一个奇怪的想法

去年底我开始重度使用 AI Agent 干活——写代码、做分析、生成文档。用的是市面上最火的几个多 Agent 框架。

用了一个月，我发现一个根本性的问题：

**这些框架没有"审核"这个概念。**

CrewAI 的模式是：几个 Agent 各自干活，做完就交。AutoGen 好一点，有个 Human-in-the-loop，但本质上是你自己当 QA。MetaGPT 有角色分工，但审核是可选的。

就像一家公司没有 QA 部门，工程师写完代码直接部署到线上。

然后你拿到最终结果，不知道中间发生了什么，无法复现，无法审计，无法干预。出了问题只能重跑。

我一直在想：有没有一种架构，天然就把审核嵌入到流程里，不是可选的插件，而是必须经过的关卡？

然后有一天，我在翻《资治通鉴》的时候突然想到——

**三省六部制。**

唐太宗在 1300 年前就设计了这个制度：中书省草拟政令，门下省审议封驳，尚书省执行。三个部门互相制衡，任何政令必须经过审议才能下发。

这不就是我要找的架构吗？


*▲ 每天第一次打开看板，会有一个"上朝"开场动画——仪式感拉满*

---

## 二、古人的架构设计

三省六部制不是一个 metaphor，它是一套经过 1400 年实践检验的分权制衡系统。

简化一下，信息流是这样的：

```
皇上（你）
  ↓ 下旨
中书省（规划）  ← 把你的一句话拆成可执行的子任务
  ↓ 提交审核
门下省（审议）  ← 审查方案质量，不行就封驳打回
  ↓ 准奏
尚书省（派发）  ← 分配给六部执行
  ↓
六部（执行）    ← 户部管数据、礼部管文档、兵部管开发、刑部管合规、工部管基建
  ↓
尚书省汇总回奏  ← 结果回报给你
```

注意这里最关键的一步：**门下省审议**。

中书省规划完方案后，不是直接扔给执行层——必须先经过门下省审议。门下省会检查：

- 子任务拆解是否合理？有没有遗漏需求？
- 部门分配是否准确？该派兵部的是不是错派给了礼部？
- 方案是否可执行？有没有不切实际的地方？

如果不合格，门下省可以**封驳**——直接打回让中书省重新规划。不是一个 warning，是强制返工。

这就是为什么唐朝能运转 289 年。**不受制约的权力必然会出错**，唐太宗想得很清楚。

---

## 三、我把它做成了开源项目

我用 OpenClaw 搭了一个真正的三省六部系统。9 个 AI Agent 各司其职，严格按照权限矩阵通信。

项目叫 **Edict（三省六部）**，已开源：

**GitHub：https://github.com/cft0808/edict**

核心架构很简单：

- **中书省**：接旨（你的指令），规划方案，拆解子任务
- **门下省**：审议方案，质量把关，不合格直接封驳
- **尚书省**：准奏后派发给六部，协调执行，汇总结果
- **六部**：户部（数据分析）、礼部（文档撰写）、兵部（代码开发）、刑部（安全合规）、工部（CI/CD 部署）
- **早朝官**：每天给你推一份新闻简报

每个 Agent 有独立的 Workspace、独立的 Skills、独立的 LLM 模型。严格的权限矩阵——谁能给谁发消息，白纸黑字：

| 谁 ↓ 给谁发 → | 中书 | 门下 | 尚书 | 六部 |
|:---:|:---:|:---:|:---:|:---:|
| **中书省** | — | ✅ | ✅ | ❌ |
| **门下省** | ✅ | — | ✅ | ❌ |
| **尚书省** | ✅ | ✅ | — | ✅ |
| **六部** | ❌ | ❌ | ✅ | ❌ |

中书省不能直接指挥六部，六部不能越级上报中书省。所有的跨层通信必须经过尚书省中转。

**这不是装饰性的设定，这是架构层面的强制约束。**


*▲ 30 秒 Demo：从上朝仪式到旨意看板、奏折归档、模型配置的完整巡览*

---

## 四、跟现有框架对比

你可能会问：跟 CrewAI、AutoGen 比，差在哪？

| | CrewAI | AutoGen | **三省六部** |
|---|:---:|:---:|:---:|
| 审核机制 | ❌ | ⚠️ 可选 | ✅ 门下省强制审核 |
| 实时看板 | ❌ | ❌ | ✅ 10 个面板 |
| 任务干预 | ❌ | ❌ | ✅ 叫停 / 取消 / 恢复 |
| 流转审计 | ⚠️ | ❌ | ✅ 完整奏折存档 |
| Agent 健康监控 | ❌ | ❌ | ✅ 心跳检测 |
| 热切换 LLM | ❌ | ❌ | ✅ 看板内一键切换 |

最核心的差异是**门下省审核机制**。

这不是 Human-in-the-loop（那是让你自己当 QA），这是一个专职的 AI Agent 负责审核另一个 AI Agent 的产出。制度性的，强制的，架构级别的。

一个不经审核的 AI 协作系统，就像一个没有代码 review 的团队——跑得快，翻车也快。

---

## 五、军机处看板——让一切可观测

光有架构不够，你还得看得见。

所以我做了一个**军机处看板**——一个实时监控所有任务流转的 Web 面板。零依赖，单文件 HTML，Python 标准库后端，打开浏览器就能用。

10 个功能面板：

**📋 旨意看板**：所有任务以卡片形式展示，按状态分列，支持过滤搜索。每张卡片有心跳徽章——🟢 活跃、🟡 停滞、🔴 告警。点开看完整的流转时间线，随时可以叫停或取消。


*▲ 旨意看板：任务卡片按状态分列，心跳徽章一目了然*

**🔭 省部调度**：可视化各状态的任务数量、部门分布、Agent 健康卡片。一眼看清谁在忙、谁在闲、谁宕机了。


*▲ 省部调度：状态分布 + 部门负载 + Agent 健康卡片*

**📜 奏折阁**：所有已完成的旨意自动归档为"奏折"，展示完整的五阶段时间线——圣旨→中书规划→门下审议→六部执行→回奏。一键复制为 Markdown。


*▲ 奏折阁：完整的五阶段时间线，一键导出 Markdown*

**📜 旨库**：9 个预设圣旨模板。选一个，填参数，预览，一键下旨。覆盖：周报生成、代码审查、API 设计、竞品分析等常见场景。


*▲ 旨库：9 个预设模板，填参数一键下旨*

**⚙️ 模型配置**：每个 Agent 可以独立切换 LLM 模型。中书省用 Claude 做规划，兵部用 GPT-4o 写代码，户部用 DeepSeek 算数据——各取所长。


*▲ 模型配置：每个 Agent 独立切换 LLM，各取所长*

还有官员总览（Token 消耗排行榜）、技能管理、天下要闻（自动新闻聚合）、会话监控、上朝仪式（每天首次打开的彩蛋动画）。

**全部零依赖**，没有 React 也没有 Vue，纯 HTML + CSS + JavaScript，2200 行搞定。


*▲ 官员总览：Token 消耗排行榜 + 活跃度统计*


*▲ 天下要闻：每日自动聚合科技/财经资讯*

---

## 六、跑一个真实案例给你看

光说不练不行。来看一个真实的运行记录——让三省六部分析竞品。

**旨意**：分析 CrewAI、AutoGen 和 LangGraph 这三个框架的差异，输出对比报告。


*▲ 点开任意任务卡片，可以看到完整的流转链和实时状态*

### 中书省规划（45 秒）

中书省接旨后，拆成了 4 个子任务：
1. 兵部 → 架构与通信机制调研
2. 户部 → 数据采集与量化对比（GitHub Stars、Contributors 等）
3. 兵部 → 开发者体验深度评测
4. 礼部 → 汇总写对比报告

### 门下省审议（32 秒）—— 封驳了！

**门下省第一轮直接打回：**

> *"方案有三个问题：1）旨意明确要求评测'可观测性'，但规划里没有对应子任务；2）子任务 1 和 3 都是兵部调研，有重叠，建议合并；3）缺少推荐场景的结论性子任务——分析没有结论等于没分析。驳回。"*

中书省修改方案后，门下省第二轮准奏。

**这就是门下省的价值。** 如果没有这一步，兵部会做两次调研，最终报告里也不会有推荐场景——因为原始规划里就没要求。

### 各部执行（17 分钟）

- **兵部**：技术深度对比，覆盖架构、通信、可观测性三维度
- **户部**：量化数据表——Stars、Contributors、Issue 响应时间、Hello World 搭建时长
- **礼部**：整合兵部 + 户部数据，撰写最终报告

### 回奏

22 分钟，15800 Token，一份结构化对比报告。结论很有意思：

| 场景 | 推荐 | 理由 |
|------|------|------|
| 快速原型 | CrewAI | 上手最快 |
| 对话式协作 | AutoGen | 天然适合多轮讨论 |
| 复杂工作流 | LangGraph | 状态机最灵活 |
| **可靠性优先** | **三省六部** | 唯一内置强制审核 |

---

## 七、技术上的一些选择

做这个项目的时候，我做了几个刻意的技术决策：

**1. 零依赖**

看板前端是一个 HTML 文件，2200 行，没有用任何框架。后端是 Python 标准库的 `http.server`，没有 Flask 也没有 FastAPI。

为什么？因为我不想让人跑之前先 `pip install` 一堆东西。这个项目的目标用户可能只是想快速体验一下三省六部的流转效果，不想搭环境。

**2. 每个 Agent 一个 SOUL.md**

每个 Agent 的人格、职责、工作流规则都写在一个 Markdown 文件里。想修改门下省的审核标准？编辑 `agents/menxia/SOUL.md`，下次启动自动生效。

这意味着你可以定制自己的三省六部——也许你的"兵部"不是负责工程，而是负责市场分析。改个 SOUL.md 就行。

**3. 权限矩阵是强制的**

不是"建议"Agent 之间不要越级通信，是在架构层面强制限制。六部不能给中书省发消息，中书省不能绕过门下省直接让尚书省执行。OpenClaw 的配置文件里白纸黑字写着谁能跟谁说话。

---

## 八、现在你可以试了

项目已经开源，MIT 协议。

**GitHub：https://github.com/cft0808/edict**

最快的体验方式：

```bash
# Docker 一行启动
docker run -p 7891:7891 cft0808/edict

# 打开浏览器
open http://localhost:7891
```

如果你装了 OpenClaw，可以完整安装：

```bash
git clone https://github.com/cft0808/edict.git
cd edict
chmod +x install.sh && ./install.sh
```

安装脚本自动创建 9 个 Agent Workspace、写入人格文件、注册权限矩阵、重启 Gateway。


*▲ 技能管理：各省部已安装的 Skills 一览，可查看详情和添加新技能*

---

## 九、下一步

Phase 1（核心架构）已经完成了。接下来要做的几件事：

- **御批模式**：让门下省的审议结果可以推送到你的飞书/Telegram，你亲自决定准奏还是封驳
- **功过簿**：每个 Agent 的绩效评分——完成率、返工率、耗时统计
- **急递铺**：看板里加一个实时的 Agent 通信流向图——中书省发消息给门下省的时候，连线亮一下
- **国史馆**：把历史旨意和奏折沉淀成知识库，新旨意可以参考历史经验

完整 Roadmap 在 GitHub 上，Phase 2 和 Phase 3 的每个子项都标了难度，欢迎认领。

---

## 最后

AI Agent 协作的核心问题不是"让 Agent 更聪明"，而是"让 Agent 的协作有规矩"。

CrewAI 解决了"多个 Agent 一起干活"的问题。AutoGen 解决了"Agent 之间能对话"的问题。

但谁来解决"Agent 的产出质量有保障"的问题？

唐太宗在 1300 年前就给出了答案：**分权制衡**。规划的不审核，审核的不执行，执行的不规划。每一个环节都有人盯着，每一个决策都要经过审议。

这可能是我见过的、最优雅的"AI 治理"方案——因为它根本不是为 AI 设计的。

它是为**治理**本身设计的。

---

**GitHub：https://github.com/cft0808/edict**

开源 · MIT · 欢迎 Star ⚔️

---

--- METRICS ---
- Files Extracted: 13
- Estimated Token Budget: ~18743 tokens
- Canonical Reference: https://codewiki.google/github.com/cft0808/edict
