# moziplus v2.0 — AI 原生多Agent编排平台 架构设计

**版本**: v2.6（实现前终版）  
**日期**: 2026-05-14  
**作者**: 庞统（副军师）  
**状态**: 实现前终版，防降级机制 + 上下文管理 + spawn 首选 + Skill AI native  
**调研基础**: `docs/research/shared-consciousness-research.md`  
**变更记录**: 
- v2.0 初版（四相循环 + Blackboard 设计）
- v2.1 技术架构修订（Daemon+HTTP API+SQLite, 废弃sessions_send/cron）
- v2.2 完整设计（物理结构、API定义、经验沉淀、状态机、实现清单）
- v2.3 评审修订（司马懿两轮评审：openclaw agent CLI调度、质量治理框架、双写简化）
- v2.4 AI native 修正（恢复三个被妥协的核心目标：Agent 自主协作、实时共享感知、AI 持续参与）
- v2.5 AI native 完善（Skill 三层体系 + 调度五原则 + Iterative Refinement + Observation 自由格式 + spawn 实验 + 双模式调度）
- v2.6 实现前终版（spawn 首选 + 庞统上下文管理 + 防降级机制 + Skill AI native 方案 + 并行感知识别机制）

---

## 0. 设计哲学

> "可预测的骨架 + AI 驱动的填充" —— 不是纯 DAG，也不是纯 ReAct，而是混合模式。

六个核心信念：

1. **AI 参与每一个决策层** —— 编排/路由/渲染/异常处理/经验沉淀都有 AI 参与
2. **黑板是唯一真相源** —— 所有 Agent 通过黑板共享信息，没有私下通信
3. **产出物 > 消息** —— 共享产出物比共享消息更重要
4. **验证才算完** —— 不验证产出不算完成
5. **有界并行** —— 默认最多 4 个 Agent 并行（有学术依据）
6. **闭环学习** —— 执行→经验沉淀→下次改进

---

## 1. 系统总览

### 1.1 宏观架构

```
用户（自然语言）
     │
     ▼
┌─────────────────────────────────────────────────────────────┐
│                    对话入口（Conversation Layer）              │
│  庞统的持久 session，用户唯一交互点                             │
│  支持：WebChat / CLI / Cron 触发 / API 调用                  │
└───────────────────────┬─────────────────────────────────────┘
                        │
┌───────────────────────▼─────────────────────────────────────┐
│                 庞统 AI 指挥官（Control Unit）                 │
│                                                              │
│  ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐        │
│  │ Phase 1  │ │ Phase 2  │ │ Phase 3  │ │ Phase 4  │        │
│  │ 需求探索  │ │ 动态规划  │ │ 自主执行  │ │ 主动汇报  │        │
│  └──────────┘ └──────────┘ └──────────┘ └──────────┘        │
│                                                              │
│  内置机制：                                                   │
│  - /goal Ralph Loop：持久目标跨 turn 保持                    │
│  - Scope Reduction Detection：防偷懒                          │
│  - 幻觉门控：验证产出再算完成                                  │
│  - Fidelity 路由：按需分发信息                                │
│  - Boids 规则注入：Agent 协作行为塑造                         │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐    │
│  │              Blackboard（共享意识空间）                 │    │
│  │                                                      │    │
│  │  TaskCtx │ Moments │ Artifacts │ Decisions │ Plan    │    │
│  │  AgentStates │ Experience │ EventLog                 │    │
│  └──────────────────────────────────────────────────────┘    │
└───────────────────────┬─────────────────────────────────────┘
                        │ Fidelity 三档读写
          ┌─────────────┼─────────────┐
          │             │             │
     ┌────▼────┐  ┌────▼────┐  ┌────▼────┐
     │  张飞   │  │  关羽   │  │  赵云   │  ...
     │  编码   │  │  风控   │  │  数据   │
     └─────────┘  └─────────┘  └─────────┘
     每个 Agent: isolated session + SOUL.md + Skills
     写入保护: propose → validate → commit
```

### 1.2 与 v1.0 的关系

| 维度 | v1.0 | v2.0 |
|------|------|------|
| 编排 | 固定 DAG 模板 + 确定性状态机 | 庞统 AI 动态规划 + 持续指挥 |
| 通信 | Sanguo Mail（异步邮件轮询） | Blackboard（实时共享读写） |
| 入口 | CLI + Dashboard | 自然语言对话 |
| 计划 | 一次性生成不可变 | 持续演进，可随时调整 |
| Agent 调度 | 按模板固定分配 | 按能力画像动态选择 |
| 信息可见性 | 每个 Agent 只看自己 | Fidelity 三档按需 |
| 异常处理 | Report Watcher（规则） | 庞统 AI 判断 |
| 验证 | output.md frontmatter | 幻觉门控 + AI 验证 |
| 经验 | 无闭环 | DISCOVER→DISTILL→APPLY→IMPROVE |

**v2.0 独立仓库、独立代码、独立部署**。v1.0 继续运行，互不干扰。

---

## 2. 核心模块详细设计

### 2.1 Blackboard（共享意识空间）

#### 2.1.1 物理结构

```
~/.sanguo_projects/sanguo_moziplus_v2/
├── blackboard/                         # 共享意识空间根目录
│   ├── tasks/                          # 任务空间
│   │   └── {task-id}/                  # 每个任务独立目录
│   │       ├── context.json            # 任务上下文（目标/约束/状态）
│   │       ├── moments.jsonl           # 原子事件流（追加写入）
│   │       ├── plan.json               # 动态计划图谱
│   │       ├── decisions.jsonl         # 决策记录（不可变）
│   │       ├── agents/                 # 各 Agent 工作区
│   │       │   ├── {agent-id}/
│   │       │   │   ├── state.json      # Agent 当前状态
│   │       │   │   ├── output/         # Agent 产出物
│   │       │   │   └── inbox/          # Agent 专属信箱（通知类）
│   │       │   └── ...
│   │       └── artifacts/              # 共享产出物索引
│   │           └── index.json          # 产出物注册表
│   ├── global/                         # 全局共享空间
│   │   ├── agent-registry.json         # Agent 能力画像注册表
│   │   ├── experience/                 # 跨任务经验库
│   │   │   ├── {domain}.jsonl          # 按领域组织
│   │   │   └── index.json              # 经验索引
│   │   └── templates/                  # 任务模板库
│   │       └── {template-id}.json
│   ├── events/                         # 不可变全局事件日志
│   │   └── {date}.jsonl                # 按日期分文件
│   ├── inbox/                          # 用户需求入口
│   │   └── {req-id}.json               # 待处理需求
│   └── locks/                          # 写入锁目录
│       └── {resource-path}.lock        # 文件锁
├── daemon/                             # 守护进程代码
├── skills/                             # Skill 包
├── docs/                               # 文档
└── config/                             # 配置
```

#### 2.1.2 数据结构定义

**context.json** — 任务上下文：
```json
{
  "task_id": "task-20260514-001",
  "title": "均线策略回测",
  "goal": "对双均线交叉策略在沪深300上进行5年回测",
  "intent": "验证该策略在A股市场的有效性",
  "end_state": "回测报告完整，包含收益曲线、最大回撤、夏普比率",
  "constraints": [
    "数据范围：2020-2025",
    "标的：沪深300指数",
    "初始资金：100万"
  ],
  "state": "executing",           // exploring → planning → executing → reviewing → completed
  "phase": 3,                     // 当前四相阶段
  "created_at": "2026-05-14T08:00:00+08:00",
  "updated_at": "2026-05-14T08:15:00+08:00",
  "parent_task": null,            // 子任务指向父任务
  "tags": ["backtest", "strategy", "moving-average"],
  "confidence": 0.0               // 庞统对"需求理解程度"的自评
}
```

**moments.jsonl** — 原子事件流（每行一个 JSON）：
```json
{"type":"task_created","ts":"...","agent":"pangtong","data":{"goal":"..."}}
{"type":"requirement_clarified","ts":"...","agent":"pangtong","data":{"clarifications":[...]}}
{"type":"plan_generated","ts":"...","agent":"pangtong","data":{"plan_id":"p1","steps":5}}
{"type":"plan_approved","ts":"...","agent":"pangtong","data":{"approved_by":"user"}}
{"type":"agent_assigned","ts":"...","agent":"pangtong","data":{"agent":"zhaoyun","step":"s1"}}
{"type":"agent_started","ts":"...","agent":"zhaoyun","data":{"step":"s1"}}
{"type":"artifact_produced","ts":"...","agent":"zhaoyun","data":{"file":"data.csv","summary":"5年日线数据","confidence":0.95}}
{"type":"agent_completed","ts":"...","agent":"zhaoyun","data":{"step":"s1","status":"success"}}
{"type":"anomaly_detected","ts":"...","agent":"pangtong","data":{"type":"data_quality","severity":"warning"}}
{"type":"plan_adjusted","ts":"...","agent":"pangtong","data":{"reason":"数据质量问题","added_step":{...}}}
{"type":"consensus_reached","ts":"...","agent":"pangtong","data":{"result":"回测通过"}}
{"type":"task_completed","ts":"...","agent":"pangtong","data":{"final_state":"success"}}
```

**plan.json** — 动态计划图谱：
```json
{
  "plan_id": "p1",
  "task_id": "task-20260514-001",
  "version": 3,
  "steps": [
    {
      "id": "s1",
      "type": "data_fetch",
      "intent": "获取沪深300的5年日线数据",
      "end_state": "数据文件就绪，通过质量检查",
      "constraints": ["使用AKShare", "保存为CSV"],
      "agent": "zhaoyun",
      "status": "completed",
      "artifacts": ["data/hs300_daily.csv"],
      "started_at": "...",
      "completed_at": "...",
      "confidence": 0.95
    },
    {
      "id": "s2",
      "type": "strategy_implementation",
      "intent": "实现双均线交叉策略",
      "end_state": "策略代码可运行，通过单元测试",
      "constraints": ["使用vnpy框架", "参数可配置"],
      "agent": "zhangfei",
      "status": "executing",
      "depends": ["s1"],
      "started_at": "..."
    },
    {
      "id": "s2.5",
      "type": "data_cleaning",
      "intent": "清洗异常数据点",
      "end_state": "异常值处理完毕，数据连续无缺失",
      "agent": "zhaoyun",
      "status": "pending",
      "depends": [],
      "added_dynamically": true,
      "add_reason": "s1 完成后发现数据有缺失值"
    }
  ],
  "changelog": [
    {"version":1,"change":"初始计划","ts":"..."},
    {"version":2,"change":"添加 s2.5 数据清洗步骤","reason":"发现数据质量问题","ts":"..."},
    {"version":3,"change":"调整 s3 约束","reason":"用户要求改为vnpy框架","ts":"..."}
  ]
}
```

**agent-registry.json** — Agent 能力画像：
```json
{
  "agents": {
    "zhaoyun-data": {
      "name": "赵云",
      "role": "数据总管",
      "capabilities": ["data_fetch", "data_cleaning", "data_validation", "quality_check"],
      "tools": ["exec", "read", "write", "web_fetch"],
      "model_preference": "auto",
      "max_parallel_tasks": 1,
      "priority": 2,
      "performance": {
        "tasks_completed": 42,
        "avg_confidence": 0.91,
        "avg_duration_minutes": 8,
        "strengths": ["data_quality", "python"],
        "last_active": "..."
      },
      "session_key": "agent:zhaoyun-data:main"
    },
    "zhangfei-dev": {
      "name": "张飞",
      "role": "编码先锋",
      "capabilities": ["coding", "backtest", "strategy_implementation", "scripting"],
      "tools": ["exec", "read", "write", "edit"],
      "model_preference": "auto",
      "max_parallel_tasks": 1,
      "priority": 1,
      "performance": { ... },
      "session_key": "agent:zhangfei-dev:main"
    },
    "guanyu-dev": {
      "name": "关羽",
      "role": "风控守将",
      "capabilities": ["risk_check", "position_sizing", "stop_loss", "live_audit"],
      "tools": ["exec", "read", "write", "edit"],
      "model_preference": "auto",
      "max_parallel_tasks": 1,
      "priority": 3,    // 风控最高优先级
      "performance": { ... },
      "session_key": "agent:guanyu-dev:main"
    },
    "simayi-challenger": {
      "name": "司马懿",
      "role": "质量总监",
      "capabilities": ["code_review", "challenge", "final_acceptance"],
      "tools": ["exec", "read", "write", "edit"],
      "model_preference": "auto",
      "max_parallel_tasks": 1,
      "priority": 2,
      "performance": { ... },
      "session_key": "agent:simayi-challenger:main"
    },
    "jiangwei-infra": {
      "name": "姜维",
      "role": "平台总督",
      "capabilities": ["deployment", "docker", "nas", "backtest_server", "vnpy"],
      "tools": ["exec", "read", "write", "edit"],
      "model_preference": "auto",
      "max_parallel_tasks": 1,
      "priority": 1,
      "performance": { ... },
      "session_key": "agent:jiangwei-infra:main"
    }
  }
}
```

**decisions.jsonl** — 决策记录（不可变）：
```json
{"ts":"...","agent":"pangtong","decision":"assign_s2_to_zhangfei","reason":"张飞擅长策略编码","alternatives_considered":["关羽(风控优先)"]}
{"ts":"...","agent":"pangtong","decision":"add_s2.5","reason":"数据清洗步骤缺失","trigger":"s1 confidence=0.7 低于阈值"}
```

#### 2.1.3 写入保护：propose → validate → commit

借鉴 Network-AI 的三阶段原子写入：

```
Agent A:
  1. propose: 写入 agents/{agent-id}/proposed/{change-id}.json
     包含：target_path, proposed_content, priority, reason
     
Control Unit (庞统):
  2. validate: 
     a. 格式校验（JSON schema）
     b. 冲突检测（target 是否被其他 propose 锁定）
     c. 优先级检查（是否有更高优先级的 propose）
     d. 业务校验（状态流转是否合法）
     
  3. commit: 
     a. 获取文件锁 (locks/{resource}.lock)
     b. 原子写入（tmp → rename）
     c. 追加 Moment 事件
     d. 释放锁
     
  或 abort:
     a. 记录拒绝原因
     b. 通知提议 Agent
```

**简化规则**：
- Agent 对自己工作区（`agents/{agent-id}/`）的写入：**自动 commit**，不需要 propose
- Agent 对共享区域（`artifacts/`, `plan.json`, `context.json`）的写入：**必须 propose → commit**
- Agent 对其他 Agent 工作区的写入：**禁止**（覆盖保护原则）

#### 2.1.4 文件锁实现

借鉴 ClawTeam 的 fcntl + 原子 rename：

```python
import fcntl, tempfile, os
from pathlib import Path

def atomic_write(path: Path, content: str):
    """原子写入：先写临时文件，再 rename"""
    path.parent.mkdir(parents=True, exist_ok=True)
    fd, tmp = tempfile.mkstemp(dir=path.parent, prefix=f"{path.stem}-", suffix=".tmp")
    with os.fdopen(fd, 'w') as f:
        f.write(content)
    Path(tmp).replace(path)  # atomic on same filesystem

class BlackboardLock:
    """文件系统互斥锁"""
    def __init__(self, lock_dir: Path):
        self.lock_dir = lock_dir
    
    def acquire(self, resource: str, holder: str, timeout_ms=10000) -> bool:
        lock_path = self.lock_dir / f"{resource.replace('/', '_')}.lock"
        lock_path.parent.mkdir(parents=True, exist_ok=True)
        start = time.monotonic()
        while (time.monotonic() - start) * 1000 < timeout_ms:
            try:
                fd = os.open(str(lock_path), os.O_CREAT | os.O_EXCL | os.O_WRONLY, 0o600)
                os.write(fd, json.dumps({"holder": holder, "acquired_at": time.time()}).encode())
                os.close(fd)
                return True
            except FileExistsError:
                # stale lock check (> 30s)
                age = time.time() - lock_path.stat().st_mtime
                if age > 30:
                    lock_path.unlink(missing_ok=True)
                time.sleep(0.1)
        return False
    
    def release(self, resource: str, holder: str):
        lock_path = self.lock_dir / f"{resource.replace('/', '_')}.lock"
        if lock_path.exists():
            data = json.loads(lock_path.read_text())
            if data.get("holder") == holder:
                lock_path.unlink()
```

---

### 2.2 Control Unit（庞统 AI 指挥官）

#### 2.2.1 四相循环

```
Phase 1: 需求探索
├── 苏格拉底对话，帮用户发现真实需求
├── 歧义评分（0-1），高歧义时深入追问
├── 输出：context.json（goal/intent/end_state/constraints）
├── 自评 confidence，>0.8 才进入 Phase 2
└── 人的参与：🔴 高（全程对话）

Phase 2: 动态规划
├── 根据 context.json 生成 plan.json
├── AI 挑战：庞统自己审视计划的弱点
├── 三方共识（可选）：庞统+司马懿+用户审核
├── Plan 审批：用户确认后才执行
├── 人的参与：🟡 可选（简单任务可跳过审批）
└── 输出：plan.json（version 1）

Phase 3: 自主执行
├── 按 plan.json 调度 Agent
├── 每步执行：
│   ├── 选择 Agent（能力画像匹配）
│   ├── 注入任务上下文（Fidelity 按角色）
│   ├── Agent 写入黑板
│   ├── 幻觉门控（验证产出存在）
│   ├── 异常检测（超时/质量低/Agent 崩溃）
│   └── 动态调整计划（如需）
├── /goal Ralph Loop：跨 turn 保持目标专注
├── 人的参与：🟢 几乎不参与（可随时介入 steer）
└── 输出：artifacts/ + moments 流

Phase 4: 主动汇报
├── AI 推送进展摘要（不等人查）
├── 验收：庞统自审 + 司马懿终审
├── 经验沉淀：提取关键经验写入 experience/
├── 人的参与：🔵 验收
└── 输出：最终报告 + experience 条目
```

#### 2.2.2 庞统的运行模式

**事件驱动 + 持久 session**：

```
庞统 session 始终在线（OpenClaw persistent session）

触发方式：
1. 用户发消息 → 直接在 session 中处理
2. Agent 写入黑板 → daemon 更新状态 → `openclaw agent` CLI 通知庞统
3. Agent 完成/失败 → 写入 moments → wake 庞统
4. 异常检测 → daemon 事件循环 → `openclaw agent` CLI 通知庞统
5. 用户 steer（中途干预）→ 直接注入 session

空闲时：
- 不消耗资源
- 被 wake 事件唤醒后立即恢复上下文
- 通过黑板恢复状态（不需要重载全部历史）
```

#### 2.2.3 信息路由（Fidelity 三档）

```python
def route_information(target_agent: str, task_ctx: dict, moments: list) -> dict:
    """根据目标 Agent 的角色，选择合适的信息保真度"""
    role = get_agent_role(target_agent)
    
    if role == "control_unit":  # 庞统自己
        return {
            "fidelity": "full",
            "context": task_ctx,
            "moments": moments,              # 全量事件
            "artifacts": all_artifacts,       # 全部产出物
            "agent_states": all_agent_states  # 所有Agent状态
        }
    
    elif role in get_collaborators(task_ctx):  # 同任务协作伙伴
        return {
            "fidelity": "summary",
            "context": task_ctx,              # 完整任务上下文
            "relevant_steps": filter_relevant(moments, target_agent),
            "artifacts": get_dependent_artifacts(target_agent),
            "summary": ai_summarize(moments)  # AI 压缩摘要
        }
    
    else:  # 外围 Agent
        return {
            "fidelity": "signal",
            "action_required": get_pending_actions(target_agent),
            "final_result": task_ctx.get("result"),
            "notification": True
        }
```

#### 2.2.4 Agent 选择算法

```python
def select_agent(step: dict, registry: dict) -> str:
    """根据步骤需求和Agent能力画像选择最合适的Agent"""
    required_caps = step.get("required_capabilities", infer_caps(step))
    
    candidates = []
    for agent_id, profile in registry["agents"].items():
        # 能力匹配
        cap_overlap = len(set(required_caps) & set(profile["capabilities"]))
        if cap_overlap == 0:
            continue
        
        # 可用性检查
        if profile["performance"]["tasks_in_progress"] >= profile["max_parallel_tasks"]:
            continue
        
        # 评分：能力匹配度 * 历史表现 * 当前空闲度
        score = (
            cap_overlap / len(required_caps) * 0.4 +          # 能力匹配
            profile["performance"]["avg_confidence"] * 0.3 +   # 历史表现
            (1 - profile["performance"]["tasks_in_progress"] / 
             profile["max_parallel_tasks"]) * 0.3              # 当前空闲度
        )
        candidates.append((agent_id, score))
    
    if not candidates:
        return None  # 需要排队或调整计划
    
    return max(candidates, key=lambda x: x[1])[0]
```

---

### 2.3 Agent 层

#### 2.3.1 Agent 工作流程

```
1. 接收任务
   ├── 庞统通过 daemon API 创建任务步骤
   ├── 消息包含：step intent + end_state + constraints + 相关黑板内容
   └── 不包含：完整计划、其他Agent的详情（Fidelity 控制）

2. 执行任务
   ├── 读取黑板中自己需要的上下文
   ├── 执行实际工作（编码/数据分析/风控检查等）
   ├── 写入产出到 agents/{agent-id}/output/
   └── 追加 Moments 事件

3. 提交产出
   ├── propose 共享产出物到 artifacts/
   ├── 庞统 validate + commit
   ├── 自评 [confidence: 0.X]
   └── 元认知：confidence < 0.6 时推荐人工审核

4. 等待下一步
   ├── 庞统根据执行结果决定下一步
   └── Agent 进入空闲状态
```

#### 2.3.2 Agent 行为注入

每个 Agent 的 SOUL.md / prompt 中注入**Boids 协作规则**：

```markdown
## 协作规则（Boids 群体智能）
1. **Separation（不重复）**：开始工作前检查黑板，确认没有其他 Agent 在做相同的事
2. **Alignment（风格一致）**：遵循团队的编码规范、产出格式、命名约定
3. **Cohesion（主动共享）**：发现重要信息时主动写入黑板共享区域
4. **Boundary（不越界）**：只在自己的工作区和共享区域操作，不修改其他 Agent 的产出
```

以及**元认知自评**：

```markdown
## 自评要求
完成任务后，标注置信度：
- `[confidence: 0.X]` 其中 X 为 0-10
- confidence < 0.6 时说明不确定之处并推荐人工审核
- 遇到专业外的问题主动上报，不硬撑
```

以及**Auftragstaktik 任务式指挥**：

```markdown
## 任务执行方式
你会收到：Intent（意图）、End State（终态）、Constraints（约束）
- 自主决定如何达成目标
- 可以选择任何合理的方法
- 但必须遵守所有 Constraints
- 遇到 Constraints 阻碍目标时，上报而不是绕过
```

---

### 2.4 事件系统

#### 2.4.1 Moments 事件类型

```python
class MomentType(str, Enum):
    # 任务生命周期
    TASK_CREATED = "task_created"
    REQUIREMENT_CLARIFIED = "requirement_clarified"
    TASK_COMPLETED = "task_completed"
    TASK_FAILED = "task_failed"
    
    # 计划
    PLAN_GENERATED = "plan_generated"
    PLAN_APPROVED = "plan_approved"
    PLAN_ADJUSTED = "plan_adjusted"
    
    # Agent 调度
    AGENT_ASSIGNED = "agent_assigned"
    AGENT_STARTED = "agent_started"
    AGENT_COMPLETED = "agent_completed"
    AGENT_FAILED = "agent_failed"
    AGENT_BLOCKED = "agent_blocked"
    
    # 产出
    ARTIFACT_PRODUCED = "artifact_produced"
    ARTIFACT_VALIDATED = "artifact_validated"
    
    # 决策
    DECISION_MADE = "decision_made"
    CHALLENGE_RAISED = "challenge_raised"
    CHALLENGE_VERDICT = "challenge_verdict"
    
    # 异常
    ANOMALY_DETECTED = "anomaly_detected"
    TIMEOUT_WARNING = "timeout_warning"
    
    # 用户交互
    USER_STEER = "user_steer"
    USER_APPROVED = "user_approved"
    USER_REJECTED = "user_rejected"
    
    # 经验
    EXPERIENCE_CAPTURED = "experience_captured"
```

#### 2.4.2 事件驱动唤醒

```python
# 庞统的唤醒条件
WAKE_CONDITIONS = {
    # 事件驱动：Agent 回报触发下一步
    "blackboard_change": {
        "trigger": "moments.jsonl 有新行",
        "action": "wake pangtong session",
        "context": "新增的 moments"
    },
    # Agent 完成
    "agent_completed": {
        "trigger": "agents/{id}/state.json status=completed",
        "action": "wake pangtong",
        "context": "agent_id + step_id"
    },
    # 超时检测
    "step_timeout": {
        "trigger": "step started_at + 30min < now",
        "action": "wake pangtong with alert",
        "context": "step_id + duration"
    },
    # 用户消息
    "user_message": {
        "trigger": "inbox/ 有新文件",
        "action": "wake pangtong",
        "context": "消息内容"
    }
}
```

---

### 2.5 经验沉淀系统

#### 2.5.1 闭环学习

```
DISCOVER（发现）
├── 任务执行过程中 Agent 发现好做法
├── 异常处理中发现新模式
└── 写入 blackboard/tasks/{id}/agents/{id}/discoveries.json

DISTILL（蒸馏）
├── 任务完成后庞统自动提取关键转折点
├── 从 decisions.jsonl + moments.jsonl 提炼经验
├── 压缩为经验条目：{pattern, context, outcome, applicability}
└── 写入 blackboard/global/experience/{domain}.jsonl

APPLY（应用）
├── 新任务开始时，庞统检索相关经验
├── 按任务类型+标签匹配
├── 注入 Agent prompt 作为参考
└── 标记"来自经验 X"

IMPROVE（改进）
├── 验证经验是否真的有效
├── 无效经验标记 deprecated
├── 有效经验提升 confidence
└── 定期合并相似经验
```

#### 2.5.2 经验数据结构

```json
{
  "id": "exp-001",
  "pattern": "数据清洗应在策略编码前完成",
  "context": "量化策略开发任务",
  "outcome": "减少返工率 40%",
  "applicability": ["backtest", "strategy_development"],
  "source_task": "task-20260514-001",
  "confidence": 0.85,
  "times_applied": 3,
  "times_validated": 2,
  "created_at": "...",
  "last_validated_at": "..."
}
```

---

### 2.6 监控与运维

#### 2.6.1 健康检查

```python
class HealthChecker:
    """定期检查黑板和 Agent 健康状态"""
    
    checks = [
        # Agent 存活检测
        "agent_heartbeat",      # 检查 state.json 更新时间
        "agent_zombie",         # 运行超过 2 小时的 Agent
        "agent_stale_lock",     # 超过 30 秒的锁
        
        # 任务健康
        "step_timeout",         # 步骤超时
        "plan_stuck",           # 计划卡住（所有 pending 步骤都有未完成的依赖）
        "artifact_missing",     # Agent 声称产出但文件不存在（幻觉门控）
        
        # 系统健康
        "blackboard_disk",      # 磁盘空间
        "moment_flood",         # 事件洪泛检测
    ]
```

#### 2.6.2 Token 成本治理

借鉴 Network-AI FederatedBudget + ClawTeam 成本追踪：

```python
class TokenBudget:
    """Token 预算管理"""
    
    def __init__(self):
        self.global_ceiling = 500_000      # 每任务全局上限
        self.per_agent_ceiling = 100_000   # 每 Agent 上限
        self.spent = {}                     # agent_id → tokens used
    
    def check(self, agent_id: str, estimated: int) -> bool:
        total = sum(self.spent.values())
        if total + estimated > self.global_ceiling:
            return False  # 全局预算不足
        if self.spent.get(agent_id, 0) + estimated > self.per_agent_ceiling:
            return False  # Agent 预算不足
        return True
```

---

## 3. 技术实现方案（v2.1 修订）

> ⚠️ v2.1 关键修正：
> - ❌ 废弃 sessions_send（不稳定、timeout）
> - ❌ 废弃 sessions_spawn（sub-agent 大爆炸、session 文件堆积）
> - ❌ 废弃 cron wake（不稳定）
> - ✅ 采用自建 Daemon HTTP API + SQLite（v1.0 已验证可靠）
> - ✅ Agent 复用主 session，通过 Daemon API 回报
> - ✅ 所有状态/流转/事件类型从配置文件加载，不硬编码

### 3.1 技术栈

| 层级 | 技术 | 说明 |
|------|------|------|
| 编排引擎 | **自建 Daemon** (FastAPI + uvicorn) | HTTP API + 事件循环，PM2 管理 |
| 数据存储 | **SQLite** (WAL mode) | 任务/计划/事件/Agent状态/经验 |
| 文件存储 | **文件系统** (artifacts) | 产出物（代码/数据/文档），git 可追踪 |
| Agent 运行时 | **OpenClaw Gateway** | Agent 的主 session 管理 |
| Agent 通信 | **Daemon HTTP API** | Agent 回报结果、查询黑板 |
| Agent 调度 | **`openclaw agent` CLI** | 发消息到 Agent 主 session（不创建 sub-agent） |
| 庞统通信 | **`openclaw agent` CLI** | Daemon → 庞统主 session 注入 systemEvent |
| 配置管理 | **YAML/JSON 配置文件** | 状态/流转/事件/模板全部配置化 |
| 文件锁 | **fcntl / O_EXCL** | 零依赖，跨进程安全 |
| 前端 | **OpenClaw Control Center** | 对话式入口（庞统主 session） |
| 经验检索 | **ripgrep + SQLite FTS** | 文本搜索 |
| 同步 | **sanguo_git_sync** | 已有的三端 Git 同步 |

### 3.2 为什么不用 OpenClaw 原生调度？

| 方案 | 问题 | 结论 |
|------|------|------|
| sessions_send | 不稳定，经常 timeout | ❌ 废弃 |
| cron wake | 各种问题，不可靠 | ❌ 废弃 |
| sessions_spawn | 每次创建新 session，文件堆积（庞统 296个/354MB），sub-agent 缺少 SOUL.md | ❌ 废弃 |
| **自建 Daemon HTTP API** | v1.0 已验证（FastAPI + SQLite + PM2），可靠 | ✅ 采用 |

### 3.3 Agent 调度方式：主 session + HTTP 回报

**核心原则：不创建 sub-agent，复用 Agent 主 session。**

```
Daemon 需要调度张飞执行编码任务：

1. Daemon 通过 `openclaw agent` CLI 发消息到 agent:zhangfei-dev:main
   - 消息内容：step intent + end_state + constraints
   - 张飞在自己的主 session 里收到消息

2. 张飞执行任务
   - 读取 daemon API 获取需要的上下文
   - 在自己的 workspace 里工作

3. 张飞通过 daemon HTTP API 回报结果
   - curl POST http://localhost:8080/api/step/{id}/complete
   - body: { artifacts: [...], confidence: 0.9, summary: "..." }
   - daemon 做幻觉门控（验证文件存在）
   - daemon 更新 SQLite 状态
   - daemon 触发下一步

4. daemon 调 `openclaw agent` CLI 通知庞统进展
   - 庞统在主 session 收到 systemEvent
   - 庞统决定下一步操作
```

**为什么不用 sub-agent？**
- 每个 sub-agent 产生 3-5 个磁盘文件（.jsonl + .trajectory + .path）
- 庞统已有 296 个 session 文件 354MB，姜维 227 个 1.4GB
- sub-agent 没有 SOUL.md/IDENTITY.md，行为不够可控
- cleanup: delete 只是从 UI 隐藏，文件仍然在磁盘上

**主 session 的上下文膨胀怎么办？**
- Agent 每完成一个任务步骤后，daemon 发 systemEvent 触发 reset
- OpenClaw 的 reset 会压缩历史，释放上下文空间
- 或者：每 N 个步骤后自动 reset 一次

### 3.4 用户查看进展的流程

```
用户: "任务进展如何？"
  │
  ▼
庞统主 session 收到消息
  │
  ▼
庞统调用 Daemon API:
  GET http://localhost:8080/api/task/{task_id}/status
  │
  ▼
Daemon 返回:
  {
    "task": { "title": "...", "state": "executing", "phase": 3 },
    "plan": { "steps": [...], "completed": 3, "total": 5 },
    "current_step": {
      "agent": "zhangfei",
      "status": "executing",
      "started_at": "...",
      "progress": "正在编码策略逻辑"
    },
    "recent_moments": [
      { "type": "agent_completed", "agent": "zhaoyun", "summary": "数据获取完成" },
      { "type": "plan_adjusted", "reason": "发现数据质量问题" }
    ],
    "anomalies": [],
    "token_budget": { "used": 120000, "total": 500000 }
  }
  │
  ▼
庞统用 AI 生成人类可读的进展汇报，回复用户
```

**关键设计：庞统是无状态的**
- 所有任务状态在 Daemon 的 SQLite 里
- 庞统 session 不保存任务状态
- 每次被问到进展，实时查询 Daemon API
- 这比 v1.0 好：v1.0 庞统需要在 session 里记住所有任务，上下文很快就爆了

### 3.5 配置化（零硬编码）

```
config/
├── states.yaml              # 任务状态定义 + 合法流转
├── step-states.yaml         # 步骤状态定义 + 合法流转
├── events.yaml              # 事件类型定义
├── agent-registry.json      # Agent 能力画像
├── templates/               # 任务模板
│   ├── backtest.yaml
│   ├── strategy-research.yaml
│   └── deployment.yaml
└── settings.yaml            # 全局设置
```

**states.yaml**:
```yaml
# 任务级状态定义（v2.0）
# 基于 v1.0 state_machine.py 的成熟经验，新增 AI native 场景
# Daemon 启动时加载，代码里不允许出现硬编码的状态名

# ── 终态（不可变）──
terminal_states: [completed]

# ── 任务状态 ──
states:
  # === Phase 1: 需求探索 ===
  - name: exploring
    description: "AI 与用户需求探索中"
    phase: 1
    type: active
    transitions_to: [planning, cancelled]
    user_actions: [cancel, steer, takeover]
    auto_triggers:
      - trigger: confidence >= 0.8
        to: planning
        description: "AI 判断需求已足够清晰"

  # === Phase 2: 动态规划 ===
  - name: planning
    description: "AI 生成/调整执行计划"
    phase: 2
    type: active
    transitions_to: [executing, planning, paused, cancelled]
    user_actions: [cancel, pause, steer, approve, reject]
    auto_triggers:
      - trigger: plan_approved
        to: executing
        description: "计划被批准（用户或 AI 自动）"
      - trigger: plan_revise
        to: planning  # 自转换
        description: "challenge 驳回，修订计划"

  # === Phase 3: 自主执行 ===
  - name: executing
    description: "Agent 自主执行中"
    phase: 3
    type: active
    transitions_to: [reviewing, paused, escalated, failed, executing, cancelled]
    user_actions: [cancel, pause, steer, takeover, intervene]
    auto_triggers:
      - trigger: all_steps_done
        to: reviewing
        description: "所有步骤完成"
      - trigger: critical_step_failed
        to: escalated
        description: "关键步骤失败，需人工"

  # === Phase 3.5: 执行中暂停 ===
  - name: paused
    description: "用户暂停，等待恢复"
    phase: 3
    type: active
    transitions_to: [executing, planning, cancelled]
    user_actions: [cancel, resume, replan]
    auto_triggers:
      - trigger: resume
        to: executing
        description: "用户恢复"
      - trigger: goal_changed
        to: planning
        description: "用户改需求，重新规划"

  # === 人工介入 ===
  - name: escalated
    description: "AI 主动升级，需要用户决策"
    phase: 3
    type: active
    transitions_to: [executing, planning, cancelled]
    user_actions: [cancel, rollback, replan]
    auto_triggers:
      - trigger: user_decision
        to: executing
        description: "用户给出决策，继续执行"
      - trigger: goal_changed
        to: planning
        description: "用户决定改需求"

  # === Phase 4: 验收 ===
  - name: reviewing
    description: "AI 向用户汇报，等待验收"
    phase: 4
    type: active
    transitions_to: [completed, executing, cancelled]
    user_actions: [accept, reject, cancel, steer]
    auto_triggers:
      - trigger: user_accept
        to: completed
        description: "用户验收通过"
      - trigger: user_reject
        to: executing
        description: "用户不满意，继续执行"

  # === 终态 ===
  - name: completed
    description: "任务完成"
    phase: 4
    type: terminal
    transitions_to: []

  - name: cancelled
    description: "已取消（可 resume 重新激活）"
    phase: null
    type: normal  # 非终态，可恢复
    transitions_to: [executing]
    user_actions: [resume]

  - name: failed
    description: "任务失败（可 retry/escalate）"
    phase: null
    type: normal
    transitions_to: [executing, escalated, cancelled]
    user_actions: [retry, escalate, cancel]

# ── 用户动作定义（AI native 扩展）──
user_actions:
  cancel:
    description: "取消任务"
    available_from: "任何非终态"
  pause:
    description: "暂停，冻结所有执行"
    available_from: [planning, executing]
  resume:
    description: "恢复执行"
    available_from: [paused, cancelled]
  steer:
    description: "用户中途改方向（不改 goal，只调整执行策略）"
    available_from: [exploring, planning, executing, reviewing]
    ai_native: true  # v2.0 新增：用户在对话中说“改成MACD”即触发
  takeover:
    description: "用户接管某个步骤"
    available_from: [executing, escalated]
    ai_native: true  # v2.0 新增：用户说“这部分我来”
  intervene:
    description: "用户主动干预（查看/修改产出物）"
    available_from: [executing]
    ai_native: true  # v2.0 新增：用户随时可以介入
  approve:
    description: "批准计划"
    available_from: [planning]
  reject:
    description: "驳回计划"
    available_from: [planning, reviewing]
  replan:
    description: "重新规划"
    available_from: [paused, escalated]
    ai_native: true
  accept:
    description: "验收通过"
    available_from: [reviewing]
  retry:
    description: "失败后重试"
    available_from: [failed]
  escalate:
    description: "升级到人工"
    available_from: [failed]
  rollback:
    description: "回滚到执行态"
    available_from: [escalated]
```

**step-states.yaml**:
```yaml
# 步骤级状态定义（v2.0）
# 基于 v1.0 NODE_STATES 成熟经验

step_states:
  - name: pending
    description: "待分配"
    transitions_to: [assigned, cancelled]

  - name: assigned
    description: "已分配 Agent"
    transitions_to: [executing, cancelled]

  - name: executing
    description: "Agent 执行中"
    transitions_to: [completed, failed, blocked, reviewing, waiting_human, cancelled]
    # reviewing: 执行完进入审查（v1.0 challenge 机制）
    # waiting_human: Agent 请求人工确认

  - name: reviewing
    description: "产出审查中（challenge）"
    transitions_to: [completed, pending, failed, escalated]
    # v1.0 挑战循环：pass → completed, iterate → pending, fail → failed

  - name: blocked
    description: "被阻塞"
    transitions_to: [pending, failed, cancelled]
    max_retries: 3

  - name: waiting_human
    description: "等待人工确认（Checkpoint）"
    transitions_to: [executing, completed, cancelled]
    # v2.0: AI 主动请求用户确认关键产出

  - name: completed
    description: "完成"
    transitions_to: []
    type: terminal

  - name: failed
    description: "失败（可重试）"
    transitions_to: [pending, escalated, cancelled]
    max_retries: 3

  - name: escalated
    description: "升级到人工"
    transitions_to: [executing, pending, cancelled]

  - name: cancelled
    description: "已取消"
    transitions_to: []
    type: terminal

# ── 步骤执行方式 ──
execution_modes:
  - name: sub_agent
    description: "创建 isolated sub-agent 执行（sessions_spawn）"
    when: "复杂任务（编码、文档、调研）"
    cleanup: "delete"
    archive_transcript_to: "artifacts/task-{id}/steps/{step_id}/"

  - name: main_session
    description: "在 Agent 主 session 中执行"
    when: "简单任务（数据获取、文件操作）"
    record_to: "artifacts/task-{id}/steps/{step_id}/transcript.jsonl"

  - name: human
    description: "用户自己执行"
    when: "用户说'这部分我来'"
    trigger: "takeover"
```

**代码中禁止出现硬编码状态名**：
```python
# ❌ 禁止
if task.state == "executing":

# ✅ 正确
EXECUTING = config.get_state("executing")
if task.state == EXECUTING:
```

### 3.6 核心代码模块

```
sanguo_moziplus_v2/
├── daemon/                        # 守护进程
│   ├── main.py                    # FastAPI 入口
│   ├── api/                       # HTTP API 路由
│   │   ├── tasks.py               # 任务 CRUD
│   │   ├── steps.py               # 步骤 CRUD + 回报
│   │   ├── board.py               # 黑板查询
│   │   ├── moments.py             # 事件查询
│   │   └── agents.py              # Agent 状态/心跳
│   ├── engine/                    # 编排引擎
│   │   ├── orchestrator.py        # 编排主循环（事件驱动）
│   │   ├── planner.py             # 动态规划
│   │   ├── selector.py            # Agent 选择
│   │   ├── validator.py           # 产出验证（幻觉门控）
│   │   ├── archiver.py            # 执行历史归档
│   │   └── experience.py          # 经验沉淀引擎
│   ├── cli_client.py             # openclaw agent CLI 调用封装
│   ├── db.py                      # SQLite 数据层
│   ├── lock.py                    # 文件锁实现
│   ├── health.py                  # 健康检查（daemon 内部定时）
│   ├── budget.py                  # Token 预算管理
│   └── config_loader.py           # YAML/JSON 配置加载
├── config/                        # 配置文件
│   ├── states.yaml
│   ├── step-states.yaml
│   ├── events.yaml
│   ├── agent-registry.json
│   ├── templates/
│   └── settings.yaml
├── artifacts/                     # 产出物 + 执行历史（git 追踪）
│   └── task-{id}/                 # 每个任务一个目录
│       ├── context.json           # 任务上下文
│       ├── plan.json              # 执行计划
│       ├── steps/                 # 各步骤产出
│       │   ├── s1/
│       │   │   ├── output.json    # 步骤产出元数据
│       │   │   ├── transcript.jsonl  # 执行历史（从 OpenClaw 归档）
│       │   │   └── ...             # 实际产出文件
│       │   └── s2/
│       ├── moments.jsonl           # 关键事件流
│       └── experience.md           # 提取的经验教训
├── skills/                        # Skill 包（供 Agent 加载）
│   ├── task-bootstrap/            # Agent 任务引导 Skill
│   │   └── SKILL.md               # Boids + 元认知 + Auftragstaktik
│   └── wiki-query/                # 复用已有
├── docs/
│   ├── design/
│   └── research/
├── scripts/
│   ├── create-task.sh             # CLI: 创建任务
│   ├── status.sh                  # CLI: 查看状态
│   └── bootstrap.sh               # 初始化脚本
└── README.md
```

### 3.6.1 执行历史归档机制

**目标**：每个步骤的完整执行过程都归档到任务目录，可追溯、可检索、可提炼经验。

```
执行流程：

1. Daemon 调度 Agent 执行步骤（sub-agent 或主 session）
2. Agent 执行完毕，回报结果
3. Daemon archiver 做以下事情：
   a. 读取 OpenClaw session transcript（.jsonl 文件）
   b. 提取与该步骤相关的部分（按时间范围裁剪）
   c. 写入 artifacts/task-{id}/steps/{step_id}/transcript.jsonl
   d. 如果是 sub-agent，transcript 包含完整对话历史
   e. 如果是主 session，只裁剪该步骤执行期间的对话
4. 经验沉淀时，读取 transcript.jsonl 做 AI 分析
```

**transcript.jsonl 包含什么**：
- user 消息（用户的指令/反馈）
- assistant 消息（Agent 的回复/决策）
- tool 调用及结果（执行的命令、文件操作、API 调用）
- token 消耗统计
- 错误和异常信息

**价值**：
- 🔍 可追溯：每个步骤的每个决策都有据可查
- 📚 可学习：经验提取时能看完整上下文，不只是结论
- 🐛 可复盘：坑和踩坑过程一目了然
- 🧹 可清理：归档后 OpenClaw 原始 session 文件可以安全删除

### 3.6.2 Agent 调度混合方案

简单步骤用主 session，复杂步骤用 sub-agent：

| 步骤类型 | 调度方式 | 原因 |
|---------|---------|------|
| 数据获取/文件操作 | 主 session + Gateway 发消息 | 简单快速，不需要隔离 |
| 编码/文档/调研 | sessions_spawn + cleanup=delete | 复杂任务需要隔离，防上下文污染 |
| 用户自己执行 | takeover，不调度 | 用户说"这部分我来" |

sub-agent 完成后，archiver 自动把 transcript 归档到任务目录。

### 3.7 关键交互流程

#### 流程 1：完整任务生命周期

```
用户: "帮我做一个均线策略回测"
  │
  ▼
庞统 Phase 1（需求探索）
  ├── 苏格拉底对话 2-3 轮
  ├── 澄清：标的？周期？资金？评价指标？
  ├── 写入 context.json，confidence=0.9
  └── 转入 Phase 2
  │
  ▼
庞统 Phase 2（动态规划）
  ├── 检索经验库 → 找到"数据清洗应先于策略编码"
  ├── 生成 plan.json（5步）
  ├── 用户确认（或跳过）
  └── 转入 Phase 3
  │
  ▼
庞统 Phase 3（自主执行）
  │
  ├── Step s1: 数据获取 → 选择赵云（data_fetch 能力）
  │   ├── `openclaw agent` CLI 调度赵云
  │   ├── 赵云执行，写入 output/hs300_daily.csv
  │   ├── 赵云 propose → 庞统 validate → commit
  │   ├── 幻觉门控：文件存在？大小合理？ ✓
  │   └── confidence=0.95 ✓
  │
  ├── 发现：数据有缺失值（anomaly_detected）
  │   └── 庞统动态添加 s1.5 数据清洗步骤
  │
  ├── Step s1.5: 数据清洗 → 选择赵云
  │   └── ... 执行并完成
  │
  ├── Step s2: 策略编码 → 选择张飞
  │   └── ... 执行并完成
  │
  ├── Step s3: 风控审查 → 选择关羽
  │   └── ... 执行并完成
  │
  ├── Step s4: 质量评审 → 选择司马懿
  │   ├── 司马懿发现问题 → challenge_raised
  │   ├── 庞统裁决 → 要求张飞修正
  │   ├── 张飞修正 → 重新评审
  │   └── 司马懿通过 ✓
  │
  └── 转入 Phase 4
  │
  ▼
庞统 Phase 4（主动汇报）
  ├── 生成最终报告
  ├── 经验沉淀：提取 3 条经验写入 experience/
  ├── 向用户推送完成通知
  └── 用户验收
```

#### 流程 2：异常处理

```
场景：赵云执行超时

1. health scanner 检测到 zhaoyun state.json 30分钟未更新
2. daemon 事件循环检测到超时，通知庞统
3. 庞统：
   a. 检查赵云 session 是否存活（sessions_list）
   b. 存活 → `openclaw agent --agent zhaoyun` 询问进度
   c. 不存活 → 标记 s1 为 failed，重新分配给其他 Agent 或调整计划
   d. 记录 decision: "赵云超时，重新分配"
4. 追加 Moment: agent_failed + decision_made
```

#### 流程 3：用户中途干预

```
场景：执行到 s2 时用户说"改成 MACD 策略"

1. 用户消息注入庞统 session
2. 庞统：
   a. 暂停当前执行（通知张飞停止）
   b. 修改 context.json（goal 改为 MACD 策略）
   c. 重新规划 plan.json（s2 需要修改）
   d. 向用户确认修改方案
   e. 用户确认后继续执行
3. 追加 Moment: user_steer + plan_adjusted
```

### 3.8 与 OpenClaw 的集成点（v2.3 修正）

> ⚠️ v2.3 关键修正（司马懿第二轮评审反馈）：
> - ❌ 废弃自建 Gateway WS Client（不稳定、需维护长连接）
> - ✅ 改用 `openclaw agent` CLI 命令（Gateway 原生、有超时和 fallback、零连接管理）
> - ✅ 全程推送式事件链路，零轮询零 cron

| v2.0 功能 | 实现方式 | 说明 |
|-----------|---------|------|
| 庞统对话 | 庞统主 session (webchat) | 用户通过 Control Center 对话 |
| 庞统查进展 | curl GET daemon API | 实时查询 SQLite，AI 生成汇报 |
| 庞统操作任务 | curl POST daemon API | 创建/规划/启动/暂停/恢复任务 |
| **Daemon 调度 Agent** | **`openclaw agent` CLI** | daemon 调用 CLI 发消息到 Agent 主 session |
| Agent 调度(复杂) | sessions_spawn + cleanup=delete | 复杂步骤用 sub-agent 隔离 |
| Agent 回报 | curl POST daemon API | 完成/失败/进度上报 |
| Agent 查黑板 | curl GET daemon API | 查询任务上下文/计划/产出物 |
| **Daemon 通知庞统** | **`openclaw agent` CLI** | daemon 调用 CLI 注入消息到庞统 session |
| Agent 上下文管理 | Gateway reset | 定期 reset Agent 主 session 防止膨胀 |
| 知识检索 | wiki-query skill (Agent 侧) | Agent 需要时可调用 |
| 数据持久化 | SQLite (daemon) + 文件系统 (artifacts) | 状态在 SQLite，产出物在文件系统 |
| 执行历史归档 | daemon archiver | 归档后物理删除原始 session 文件 |

#### 3.8.1 Agent 调度的具体实现

```bash
# Daemon 调度 Agent（简单步骤：主 session）
openclaw agent --agent zhangfei-dev \
  --message "执行步骤 s2: 编码均线策略逻辑。上下文见 http://localhost:8080/api/steps/s2" \
  --json

# Daemon 通知庞统
openclaw agent --agent pangtong-fujunshi \
  --message "[systemEvent] 步骤 s1 完成，zhaoyun 回报：数据获取成功" \
  --json
```

**并行调度**：daemon 用 `subprocess.Popen` 异步启动多个 `openclaw agent` 命令，poll 等待结果。

**事件传播链（全程推送，零轮询）**：
```
Agent 完成任务
  → curl POST http://localhost:8080/api/steps/{id}/complete（回报 daemon）
  → daemon 更新 SQLite + 验证产出
  → daemon 调 openclaw agent --agent pangtong-fujunshi（通知庞统）
  → 庞统收到消息，决定下一步
  → daemon 调 openclaw agent --agent zhangfei-dev（调度下一个 Agent）
```

#### 3.8.2 庞统上下文恢复协议

庞统是"无任务状态"的（状态在 daemon SQLite），但需要"推理上下文"。
庞统每次被 daemon 通知时，第一步总是 `GET /api/tasks/{id}/status` 重建认知。

#### 3.8.3 Agent 任务消息模板

Daemon 调度 Agent 时发送的标准消息格式：

```
[moziplus v2] 任务步骤分配

任务: {task_title}
步骤: {step_id} - {step_title}
目标: {step_intent}
预期产出: {step_end_state}

上下文获取:
  任务状态: curl http://localhost:8080/api/tasks/{task_id}
  步骤详情: curl http://localhost:8080/api/steps/{step_id}
  前序产出: curl http://localhost:8080/api/steps/{prev_step_id}/output

约束:
  产出物必须写到 artifacts/task-{task_id}/steps/{step_id}/ 目录
  完成后回报: curl -X POST http://localhost:8080/api/steps/{step_id}/complete
  失败回报: curl -X POST http://localhost:8080/api/steps/{step_id}/fail
``` |

---

### 3.9 共享意识空间物理结构

> "可预测骨架 + AI 动态填充" 的物理载体。
> SQLite 存状态（查询快、事务安全），文件系统存内容（代码/数据/文档，git 可追踪）。
> 同一信息只存在一个地方，不重复。

#### 3.9.1 SQLite 表结构

```sql
-- 任务表
CREATE TABLE tasks (
    id TEXT PRIMARY KEY,               -- UUID
    title TEXT NOT NULL,
    goal TEXT NOT NULL,                 -- 用户原始需求
    state TEXT NOT NULL DEFAULT 'exploring',
    phase INTEGER NOT NULL DEFAULT 1,  -- 1=探索, 2=规划, 3=执行, 4=验收
    context_json TEXT,                  -- {goal, constraints, clarifications, confidence}
    plan_json TEXT,                     -- {steps: [{id, title, intent, agent_hint, depends_on}]}
    created_at TEXT NOT NULL,
    updated_at TEXT NOT NULL,
    created_by TEXT DEFAULT 'user',     -- user | pangtong
    token_budget_used INTEGER DEFAULT 0,
    token_budget_limit INTEGER DEFAULT 500000
);

-- 步骤表
CREATE TABLE steps (
    id TEXT PRIMARY KEY,               -- "{task_id}-s{seq}"
    task_id TEXT NOT NULL REFERENCES tasks(id),
    seq INTEGER NOT NULL,
    title TEXT NOT NULL,
    intent TEXT NOT NULL,               -- 步骤目标（给 Agent 的指令）
    end_state TEXT,                     -- Agent 应该达到的产出状态
    state TEXT NOT NULL DEFAULT 'pending',
    assigned_agent TEXT,                -- agent-id 或 null（待分配）
    execution_mode TEXT DEFAULT 'sub_agent',  -- sub_agent | main_session | human
    depends_on TEXT,                    -- JSON array of step_ids
    output_json TEXT,                   -- {artifacts: [...], confidence, summary}
    started_at TEXT,
    completed_at TEXT,
    retry_count INTEGER DEFAULT 0,
    max_retries INTEGER DEFAULT 3
);

-- 事件流（Moments）
CREATE TABLE moments (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    task_id TEXT NOT NULL REFERENCES tasks(id),
    step_id TEXT,                       -- nullable（任务级事件没有 step_id）
    type TEXT NOT NULL,                 -- 事件类型（从 events.yaml 加载）
    agent TEXT,                         -- 触发 Agent
    data_json TEXT NOT NULL,            -- 事件详情
    created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
CREATE INDEX idx_moments_task ON moments(task_id, created_at);

-- Agent 状态（心跳）
CREATE TABLE agent_status (
    agent_id TEXT PRIMARY KEY,
    status TEXT NOT NULL DEFAULT 'idle',  -- idle | busy | offline
    current_task_id TEXT,
    current_step_id TEXT,
    last_heartbeat TEXT,
    capabilities TEXT                    -- JSON array（从 agent-registry.json 加载）
);

-- AI 决策记录（可追溯）
CREATE TABLE decisions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    task_id TEXT NOT NULL REFERENCES tasks(id),
    step_id TEXT,
    decision_type TEXT NOT NULL,        -- agent_selected | plan_adjusted | anomaly_handled | escalated
    reasoning TEXT NOT NULL,             -- AI 的思考过程
    outcome TEXT NOT NULL,               -- 决策结果
    model TEXT,                          -- 使用的模型
    token_cost INTEGER,
    created_at TEXT NOT NULL DEFAULT (datetime('now'))
);

-- 经验库
CREATE TABLE experiences (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    source_task_id TEXT NOT NULL,
    source_step_id TEXT,
    category TEXT NOT NULL,              -- pattern | pitfall | best_practice | tool_usage
    title TEXT NOT NULL,
    content TEXT NOT NULL,               -- Markdown 格式
    tags TEXT,                           -- JSON array
    relevance_score REAL DEFAULT 0.5,
    created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
```

#### 3.9.2 文件系统结构

```
sanguo_moziplus_v2/
└── artifacts/
    └── task-{uuid}/
        ├── context.json                # 任务上下文（冗余 SQLite 的 context_json，供 Agent 直接 read）
        │   # {goal, constraints, clarifications, confidence, phase_history}
        │
        ├── plan.json                   # 执行计划（冗余 SQLite 的 plan_json，供 Agent 直接 read）
        │   # {steps: [{id, title, intent, end_state, assigned_agent, depends_on, state}]}
        │
        ├── steps/                      # 各步骤产出物
        │   ├── s1/
        │   │   ├── output.json         # {artifacts: [{path, type, size}], confidence, summary, duration_s}
        │   │   ├── transcript.jsonl     # 执行历史归档（从 OpenClaw session transcript 复制）
        │   │   ├── hs300_daily.csv      # ← 实际产出文件（Agent 直接写到这里）
        │   │   └── data_quality.json    # ← 数据质量报告
        │   ├── s2/
        │   │   ├── output.json
        │   │   ├── transcript.jsonl
        │   │   ├── strategy.py         # ← 策略代码
        │   │   └── backtest_result.json
        │   └── s3/
        │       └── ...
        │
        ├── observations/                # Agent 主动观察与建议（v2.4 新增）
        │   # Agent 执行中发现的异常、建议、洞察
        │   # 其他 Agent 和庞统可直接 read 获取
        │   ├── zhaoyun-001.md           # "数据有缺失值，建议加清洗步骤"
        │   ├── zhangfei-001.md          # "建议用 MACD 替代均线"
        │   └── ...
        │
        ├── status.json                  # 全局状态摘要（v2.4 新增，daemon 实时维护）
        │   # {phase, steps: {s1: {state, agent}, ...}, anomalies, observations}
        │   # Agent 执行前第一步 read 此文件获取全局视野
        │
        ├── moments.jsonl               # 原子事件流（冗余 SQLite moments 表，追加写入）
        │   # 每行: {"type":"step_completed","ts":"...","agent":"zhaoyun","data":{...}}
        │
        ├── decisions.jsonl             # AI 决策记录（冗余 SQLite decisions 表）
        │   # 每行: {"type":"agent_selected","ts":"...","reasoning":"...","outcome":"zhangfei"}
        │
        └── experience.md               # 任务完成后 AI 提取的经验（Markdown）
```

**为什么 SQLite 和文件都有？**
- **SQLite**：给 daemon 内部用（查询、事务、索引、复杂条件筛选）
- **文件系统**：给 Agent 用（`read` 工具直接读，Agent 不能访问 daemon 的 SQLite）
- 两者通过 daemon API 同步，SQLite 是权威源，文件是缓存/视图

#### 3.9.3 产出物门控（Gating）设计

> 参考 OpenAI Codex Cookbook 的 gating check："Do not advance until required files are present"

```
步骤完成回报 POST /api/steps/{id}/complete
  │
  ▼
Daemon validator 做三层检查：
  1. 文件存在性检查
     - output_json 中声明的每个 artifact.path 都必须存在
     - ls -la 验证
  2. 内容完整性检查
     - 文件大小 > 0（空文件不算）
     - 文件大小在合理范围内（非异常值）
     - 如果是 JSON/CSV，验证 schema/parsing
  3. 语义检查（可选，消耗 token）
     - AI 检查产出物是否与 end_state 描述匹配
     - 只在 confidence < 0.7 时触发
  │
  ▼
三层全过 → 同一事务内：
  - UPDATE steps SET state='completed'
  - INSERT INTO moments (type='step_completed')
  - INSERT INTO moments (type='validation_passed')
任何一层失败 → 回报 validation_failed，步骤保持 executing
```

---

### 3.10 Daemon API 接口定义

> RESTful + JSON，端口 8080（沿用 v1.0）。
> 所有请求/响应都记录到 moments 表。

#### 3.10.0 API 设计原则（调研审视）

| 原则 | 来源 | 实现方式 |
|------|------|----------|
| **幂等性** | Wanman JSON-RPC | 所有写操作可安全重试，重复回报不产生副作用 |
| **标准错误码** | Wanman JSON-RPC | 统一错误格式 `{ok: false, error: {code, message}}` |
| **事务保护** | Edict Outbox | 关键写操作（步骤完成）原子化：产出验证 + 状态更新 + 事件记录同一事务 |
| **版本化** | Gstack | API 版本号前缀 `/api/v1/...`，未来升级不破坏兼容性 |
| **Agent 零SDK** | Wanman CLI | Agent 只需 curl，不需要任何 SDK |

#### 3.10.1 任务生命周期 API

```
POST   /api/tasks                          # 创建任务
GET    /api/tasks/{id}                      # 查询任务状态
GET    /api/tasks/{id}/status               # 轻量状态查询（给庞统用）
PUT    /api/tasks/{id}/context              # 更新任务上下文
POST   /api/tasks/{id}/plan                 # 提交执行计划
POST   /api/tasks/{id}/start                # 启动执行（Phase 3）
POST   /api/tasks/{id}/pause                # 暂停
POST   /api/tasks/{id}/resume               # 恢复
POST   /api/tasks/{id}/cancel               # 取消
POST   /api/tasks/{id}/replan               # 重新规划（用户改需求或异常调整）
GET    /api/tasks/{id}/moments               # 查询事件流
GET    /api/tasks/{id}/decisions             # 查询决策记录
```

**POST /api/tasks** — 创建任务
```json
// Request
{
  "title": "均线策略回测",
  "goal": "对沪深300做双均线交叉策略回测",
  "constraints": ["5年日线数据", "滑点0.2%"],
  "metadata": {}  // 可选
}
// Response
{
  "ok": true,
  "task_id": "t-uuid-001",
  "state": "exploring"
}
```

**GET /api/tasks/{id}/status** — 轻量状态查询（庞统用，返回人类可读摘要）
```json
{
  "task": { "title": "均线策略回测", "state": "executing", "phase": 3 },
  "plan": {
    "steps": [
      { "id": "s1", "title": "数据获取", "state": "completed", "agent": "zhaoyun" },
      { "id": "s2", "title": "策略编码", "state": "executing", "agent": "zhangfei" }
    ],
    "completed": 1, "total": 4
  },
  "current_step": {
    "id": "s2", "agent": "zhangfei", "started_at": "...",
    "progress": null  // Agent 可选上报进度
  },
  "recent_moments": [
    { "type": "step_completed", "agent": "zhaoyun", "summary": "数据获取完成" }
  ],
  "anomalies": [],
  "token_budget": { "used": 120000, "limit": 500000 }
}
```

#### 3.10.2 步骤执行 API

```
POST   /api/steps/{id}/assign              # 分配 Agent
POST   /api/steps/{id}/start                # 标记开始执行
POST   /api/steps/{id}/complete             # Agent 回报完成
POST   /api/steps/{id}/fail                 # Agent 回报失败
POST   /api/steps/{id}/block                # Agent 回报阻塞
POST   /api/steps/{id}/progress             # Agent 上报进度（可选）
POST   /api/steps/{id}/escalate             # Agent 请求人工介入
GET    /api/steps/{id}                       # 查询步骤详情
GET    /api/steps/{id}/output                # 查询步骤产出
```

**POST /api/steps/{id}/complete** — Agent 回报完成
```json
// Request
{
  "artifacts": [
    { "path": "artifacts/task-xxx/steps/s1/hs300_daily.csv", "type": "data", "size_bytes": 1048576 }
  ],
  "confidence": 0.95,
  "summary": "获取沪深300 5年日线数据，共1218条记录，含缺失值处理报告"
}
// Response
{
  "ok": true,
  "state": "completed",
  "validation": {
    "files_exist": true,
    "sizes_reasonable": true,
    "passed": true
  }
}
```

**POST /api/steps/{id}/fail** — Agent 回报失败
```json
// Request
{
  "error": "数据源返回403，权限不足",
  "retry_suggested": true,
  "partial_artifacts": []
}
```

#### 3.10.3 查询 & 管理API

```
GET    /api/agents                          # 所有 Agent 状态
GET    /api/agents/{id}/status               # 单个 Agent 状态
POST   /api/agents/{id}/heartbeat            # Agent 心跳

GET    /api/experiences                      # 经验检索（给 AI 用）
POST   /api/experiences                      # 写入经验

GET    /api/health                           # Daemon 健康检查
GET    /api/stats                            # 统计信息（任务数、成功率等）
```

**GET /api/experiences** — 经验检索
```json
// Query: ?tags=data_cleaning,backtest&limit=5
{
  "experiences": [
    {
      "id": 1,
      "source_task": "t-uuid-001",
      "category": "pitfall",
      "title": "数据缺失值必须在策略编码前处理",
      "content": "...",
      "tags": ["data_cleaning", "backtest"],
      "relevance_score": 0.92
    }
  ]
}
```

#### 3.10.4 AI Native 扩展 API

```
POST   /api/tasks/{id}/steer                # 用户中途改方向（不改 goal）
POST   /api/tasks/{id}/takeover/{step_id}   # 用户接管某步骤
POST   /api/tasks/{id}/intervene             # 用户主动干预
POST   /api/steps/{id}/review                # 触发 challenge 审查
POST   /api/tasks/{id}/distill               # 触发经验蒸馏
```

**POST /api/tasks/{id}/steer** — 用户改方向
```json
// Request
{
  "direction": "改用MACD策略",
  "reason": "用户要求",
  "affected_steps": ["s2"]  // 哪些步骤受影响（可选，AI自动判断）
}
// Response
{
  "ok": true,
  "action": "replanning",
  "paused_steps": ["s2"],
  "message": "正在重新规划受影响的步骤..."
}
```

---

### 3.11 经验沉淀引擎

> 每次任务完成后自动触发，提取可复用的经验存入经验库。

#### 3.11.1 沉淀流程

```
任务完成
  │
  ▼
Daemon 检测到任务 state = completed
  │
  ▼
Daemon 通过 Gateway 触发 AI session 做经验蒸馏
  - 输入: task context + plan + 所有 steps 的 transcript.jsonl + moments
  - AI 分析：
    1. 哪些决策是好的？（pattern）
    2. 哪些坑踩了？（pitfall）
    3. 有什么可复用的做法？（best_practice）
    4. 工具使用技巧？（tool_usage）
  - 输出: 3-5 条经验
  │
  ▼
Daemon 写入 SQLite experiences 表 + 生成 experience.md
  │
  ▼
下次创建类似任务时，Daemon 自动检索相关经验注入 context
```

#### 3.11.2 经验检索时机

| 时机 | 触发者 | 检索内容 |
|------|--------|----------|
| Phase 2 规划 | Daemon | 检索与任务 goal 相关的经验，注入 plan 上下文 |
| Phase 3 Agent 选择 | Daemon | 检索与步骤类型相关的经验（如"这类任务哪个 Agent 做得好"） |
| Agent 执行前 | Daemon | 注入与步骤相关的经验到 task 描述 |
| 异常处理 | Daemon/庞统 | 检索类似异常的历史处理方式 |

#### 3.11.3 调研审视：经验沉淀引擎的改进方向

基于 wiki 知识管理体系 + Nuwa 五层蒸馏 + Corpus2Skill + A-MEM + MemAgents ICLR 2026 的调研：

**改进 1：闭环四阶段（当前只有 DISTILL+APPLY）**

```
DISCOVER（发现问题）:
  - 异常即知识源：步骤失败、数据质量异常、Agent 超时都是潜在的待沉淀知识
  - 反向触发：Agent 主动发现好实践时建议"这个做法可以固化"
  - 外部注入：用户丢链接/文章，评估适用性

DISTILL（蒸馏提取）:
  - 参考 Nuwa 五层：表象 → 模式 → 决策启发式 → 反模式 → 边界
  - 不是简单的"踩坑记录"，而是提炼出可复用的决策规则
  - AI 分析 transcript.jsonl，不只是看结论，看完整决策过程

APPLY（应用）:
  - 规划时：检索与 goal 相关的经验注入 plan 上下文
  - 执行时：检索与步骤相关的经验注入 task 描述
  - 异常时：检索类似异常的历史处理方式

IMPROVE（持续改进）:
  - 新经验可能让旧经验过时（A-MEM 的 Zettelkasten 思路）
  - 检测冲突：新经验与旧经验矛盾时，标注差异，等待下次应用时验证
  - 不删除旧经验，标记为 superseded + 关联新经验
```

**改进 2：经验→Skill 转化（参考 Corpus2Skill）**

高频使用的经验可以自动转化为 Agent Skill：

```
经验使用频率 >= 5次
  → 自动转化为 skills/auto-generated/{experience-name}/SKILL.md
  → 下次同类任务直接注入 Skill，不需要检索经验库
  → 减少 token 消耗（Skill 注入比检索更精炼）
```

**改进 3：经验蒸馏的五层结构（参考 Nuwa）**

```yaml
experience:
  title: "数据清洗应先于策略编码"
  layers:
    - layer: surface          # 表象：发生了什么
      content: "赵云获取数据后有缺失值，张飞直接编码导致回测结果异常"
    - layer: pattern           # 模式：这类问题的通用模式
      content: "数据质量和策略逻辑是两个独立关注点，应串行处理"
    - layer: heuristic         # 决策启发式：下次怎么做
      content: "IF 任务涉及数据分析 THEN 第一步必须是数据质量检查"
    - layer: anti_pattern      # 反模式：绝对不做的事
      content: "绝对不要假设数据是干净的，即使数据源声称已清洗"
    - layer: boundary          # 边界：什么时候不适用
      content: "如果是纯模拟数据回测，不需要数据清洗步骤"
```

### 3.12 中央协调 + Agent 自主（v2.4 核心设计修正）

> **问题**：v2.3 设计在三轮评审后逐渐妥协了三个 AI native 核心目标：
> 1. Agent 自主协作 → 退化为中央调度
> 2. 实时共享感知 → 退化为按需查询
> 3. AI 持续参与 → 退化为完成时通知
>
> **根因**：遇到技术难点时采纳降级方案，而非在约束下找实现目标的方法。
>
> **v2.4 修正**：技术栈不变（Daemon + SQLite + `openclaw agent` CLI + 文件系统），变的是**设计理念**——
> 从“中央控制”变为“中央协调 + Agent 自主”。
>
> **调研来源**：
> - Edict 朝堂议政：TurnScheduler + phaseMask（Agent 声明在哪些阶段主动发言）
> - Ouroboros：后台意识循环 consciousness.py（任务间主动思考）
> - Network-AI：Blackboard + CRDT（Agent 读黑板、看到变化、自己决定行动）
> - Open Multi-Agent：sharedMemory + delegate_to_agent（Agent 可主动委派）
> - oh-my-claudecode：Team staged pipeline（team-plan → team-prd → team-exec → team-verify → team-fix）
> - Hermes Agent：kanban board + dispatcher（Agent 通过 kanban_* 工具集自主 claim task）
> - Claude Code：Grove（共享项目工作区）、Swarm/Team（hub-spoke 协调）
> - MCP + A2A：MCP 提供上下文共享，A2A 提供 Agent 间直接通信
> - 学术：Multi-Agent Blackboard System (arXiv:2510.01285) 消除中央协调器先验知识需求

#### 3.12.1 三层自主模型

```
┌──────────────────────────────────────────────────────┐
│                  庞统（中央协调）                       │
│  定方向、定约束、异常干预、持续观察                       │
│  不微观管理：不指定每一步怎么做                          │
└────────────┬─────────────────────┬───────────────────┘
             │                     │
    ┌────────▼────────┐  ┌────────▼────────┐
    │   Agent 自主权    │  │   Agent 自主权    │
    │ 执行方式自主决定   │  │ 执行方式自主决定   │
    │ 可主动发现问题    │  │ 可主动发现问题    │
    │ 可主动建议       │  │ 可主动建议       │
    └────────┬────────┘  └────────┬────────┘
             │                     │
    ┌────────▼─────────────────────▼────────┐
    │        共享意识空间（文件系统）            │
    │  status.json    → 全局状态实时摘要       │
    │  observations/  → Agent 主动观察        │
    │  moments.jsonl  → 原子事件流           │
    │  steps/         → 各步骤产出物          │
    └──────────────────────────────────────┘
```

**与 v2.3 的核心区别**：

| 维度 | v2.3（妥协版） | v2.4（AI native） |
|------|-------------|----------------|
| 调度模式 | daemon 全权调度 | 庞统定方向，Agent 自主执行 |
| 信息获取 | Agent curl 查 API | Agent 直接 read 共享目录文件 |
| AI 参与 | 步骤完成后通知 | 持续推送执行摘要，庞统主动干预 |
| Agent 主动性 | 无 | observations 目录 + 主动建议机制 |
| 协作方式 | 庞统串行分配 | Agent 可观察其他 Agent 产出并主动调整 |

#### 3.12.2 Agent 自主执行协议

Agent 被调度后，不只是“执行指令”，而是执行一套自主行为协议：

```
Agent 收到任务消息后：

1. 【感知】read artifacts/task-{id}/status.json
   → 了解全局：当前 phase、各步骤状态、异常列表

2. 【感知】read artifacts/task-{id}/observations/
   → 了解其他 Agent 的观察和建议
   → 特别是前序步骤 Agent 的发现

3. 【感知】read artifacts/task-{id}/steps/{前序步骤}/output.json
   → 获取前序步骤的具体产出

4. 【执行】基于全局信息自主决定执行方式
   → 不需要庞统指定“用什么工具、什么方法”
   → 根据任务意图 + 全局上下文自行判断

5. 【主动观察】如果执行中发现异常/有价值的发现：
   → write artifacts/task-{id}/observations/{agent}-{seq}.md
   → 内容：发现的问题、建议的调整、重要的洞察
   → 格式自由（Markdown），由庞统或其他 Agent 读取

6. 【回报】完成/失败后回报 daemon API
   → POST /api/steps/{id}/complete 或 /fail
```

**关键设计**：步骤 1-3（感知）是**强制的**，写入 Agent 的 task-bootstrap Skill。
这确保每个 Agent 执行前都有全局视野，而不是盲人摸象。

#### 3.12.3 Agent 任务消息模板（v2.4 增强）

调度 Agent 时，消息内容不仅是“执行 X”，还包含：

```markdown
## 任务：{step_title}

### 意图
{step_intent} → 目标状态：{end_state}

### 全局上下文
- 任务：{task_title}
- Phase：{current_phase}
- 前序步骤：{completed_steps_summary}
- **请先感知全局**：read artifacts/task-{id}/status.json 和 observations/

### 你的自主权
- 执行方式由你决定（工具、方法、顺序）
- 发现异常请写入 observations/
- 遇到专业外的问题主动回报，不硬撑

### 约束
- 产出物必须写到 artifacts/task-{id}/steps/{step_id}/
- 超时 {timeout_minutes} 分钟自动标记 blocked

### 完成后
POST /api/steps/{step_id}/complete
body: {artifacts: [...], confidence: 0-1, summary: "...", observations: [...]}
```

#### 3.12.4 庞统持续意识机制

庞统不是被动的审批节点，而是持续观察的指挥官。

**实现方式**：daemon 通过 `openclaw agent` CLI 定期推送执行摘要给庞统。

```
触发时机（不是 cron，是事件驱动）：

1. 步骤完成事件
   → daemon 立即通知庞统
   → 庞统判断：正常→无干预 / 异常→主动发指令

2. Agent 写入 observation
   → daemon 检测到新文件（inotify/fswatch）
   → 推送给庞统："赵云发现数据异常"
   → 庞统决定：加步骤 / 调整方案 / 通知用户

3. 定期心跳（每 N 分钟，可配置）
   → daemon 推送当前全局摘要
   → 庞统判断是否有异常趋势（如某步骤超时、Agent 连续失败）
   → 正常→回"继续" / 异常→主动干预

4. AI 质量评估点（Phase 2/3 交界处）
   → 庞统审查当前执行计划 vs 实际进展
   → 主动调整步骤、重新分配 Agent、升级问题
```

**Token 消耗控制**（通过质量分级）：
- `critical` 任务：每个事件都推送
- `standard` 任务：步骤完成 + observation 时推送
- `exploratory` 任务：仅步骤完成时推送

#### 3.12.5 文件系统 = 实时共享感知

**核心洞察**：文件系统天然就是“实时共享”的——一个 Agent write 了文件，另一个 Agent 立刻可以 read。
不需要 WebSocket、不需要推送、不需要轮询 API。

关键在于让 Agent **知道去读什么**。这就是 `status.json` + `observations/` 的作用：

- `status.json`：daemon 在每次状态变化后立即更新，Agent read 即可获得全局视野
- `observations/`：Agent 发现问题时主动写入，其他 Agent read 即可感知
- `steps/`：前序步骤的产出物就在文件系统里，不需要通过 API 传输

**为什么不用 WebSocket/实时推送？**
因为 Agent 的执行是 `openclaw agent` CLI 调用——每次调用是一个独立进程。
Agent 不需要“订阅”事件流，而是在被调用时通过 read 文件获取全部所需上下文。
这比实时推送更简单、更可靠（无连接断开问题）。

#### 3.12.6 Agent 主动协作场景

```
场景 1：赵云发现数据异常
  → 赵云写入 observations/zhaoyun-001.md
  → daemon 检测到 → 通知庞统
  → 庞统判断：需要加清洗步骤
  → 庞统调整计划 → daemon 更新 status.json + plan.json
  → 张飞被调度时 read status.json，看到新增的清洗步骤
  → 张飞 read observations/zhaoyun-001.md，了解数据异常详情
  → 张飞自主决定：在策略编码前加入数据清洗逻辑

场景 2：张飞主动建议
  → 张飞执行策略编码时，发现更好的技术指标
  → 张飞写入 observations/zhangfei-001.md
  → daemon 通知庞统
  → 庞统判断：值得尝试，修改计划允许探索
  → 关羽审核时 read observations/，看到张飞的建议，针对性审查

场景 3：关羽主动拦截
  → 关羽审核代码时发现风险
  → 关羽写入 observations/guanyu-001.md（标记为 blocking）
  → daemon 立即通知庞统
  → 庞统决定：暂停后续步骤，要求张飞修改
  → 不需要等步骤“完成”才发现问题
```

#### 3.12.7 实现注意事项（司马懿第四轮评审反馈，v2.4 补充）

> 司马懿判定：v2.4 设计方向正确，可进入实现。以下为实现时必须注意的 5 个细节。

**1. Agent 自主的真实边界**

Agent 在执行开始时获取全局快照（read status.json + observations/），**执行过程中不感知变化**。
并行执行场景下，如果需要运行时感知，由庞统通过 steer 触发。
不在文件监控或实时推送上过度承诺。

**2. Observation 通知机制**

不依赖 inotify/fswatch（macOS 可靠性存疑，SMB 挂载不工作）。
改为：**Agent 写入 observation 后主动 POST `/api/observations` 通知 daemon**，daemon 再通知庞统。
更简单、更可靠、不依赖文件系统事件。

**3. daemon vs 庞统的角色透明化**

不要把 daemon 的确定性决策包装成"庞统定方向"。

| 决策类型 | 执行者 | 性质 |
|---------|-------|------|
| Agent 选择算法 | daemon (selector.py) | 确定性 |
| 状态流转规则 | daemon (orchestrator.py) | 确定性 |
| 超时检测 | daemon (watchdog.py) | 确定性 |
| 产出验证 | daemon (validator.py) | 确定性 + 可选 AI |
| Phase 2 规划 | **庞统 AI** | AI 决策 |
| Phase 3 异常裁决 | **庞统 AI** | AI 决策 |
| 计划调整审批 | **庞统 AI** | AI 决策 |
| 用户意图一致性检查 | **庞统 AI** | AI 决策 |

**4. 文件系统可靠性细节**

- `status.json` 更新必须使用 `atomic_write`（tmp → rename），复用 Section 2.1.4 的实现
- observations 文件命名改为 `{agent}-{timestamp}-{uuid短}.md`，避免命名冲突
- artifacts 目录在本地文件系统（Mac mini SSD），不写在 SMB 挂载上

**5. Observation 写入标准与频率限制**

task-bootstrap Skill 中必须明确写入标准：
```
observation 写入条件（必须满足至少一条）：
- 发现了可能影响后续步骤的问题
- 有能提升最终产出质量的建议
- 遇到了专业外需要上报的问题
禁止写入：进度报告、正常状态确认、无关细节
```

频率限制：每个步骤每个 Agent 最多 3 个 observation，超过由 daemon 丢弃并记录 warning。

**6. 庞统上下文管理**

每次被触发时，不把历史推理过程带入上下文，只带入当前状态快照。
类似"每次被唤醒都是全新视角"——避免庞统 session 的上下文膨胀。

**7. B1 贯穿性：用户意图一致性检查**

当用户在执行中途改方向时（steer），庞统不只重新规划，还应先评估影响并帮用户决策：
- "改成周线意味着数据量减少到 1/5，统计显著性可能不够。你确定吗？"
- "增加止损条件会导致策略复杂度上升，回测时间可能翻倍。要继续吗？"

这是 PRD B1（AI 帮用户想清楚要什么）的全程贯穿，不限于 Phase 1。
在庞统的 prompt 中加入"用户意图一致性检查"规则。

#### 3.12.8 AI native Skill 体系（v2.6 修订）

> **v1.0 的 Skill 问题**：把命令操作手册写到 Skill 里——"数据获取步骤：1. 连接数据库 2. 执行 SQL 3. 保存 CSV"。
> 这不是 AI native，这是给 AI 写操作流程。AI 自己会决定怎么操作。
>
> **v2.0 AI native Skill**：不是告诉 AI 怎么做，而是设定边界——做什么是好的、做什么是错的、遇到什么情况该怎么想。
> AI 自己决定具体步骤。

**三层 Skill 模型**：

| 层级 | 名称 | 内容 | 类比 |
|------|------|------|------|
| L1 | **Principles**（原则） | 做事的底线和方向 | 宪法 |
| L2 | **Patterns**（模式） | 遇到什么情况应该怎么想 | 判例法 |
| L3 | **Anti-patterns**（反模式） | 绝对不能做的事 | 刑法 |

**具体 Skill 内容示例**（`data-acquisition/SKILL.md`）：

```markdown
# 数据获取 Skill（赵云）

## L1 原则
- 数据获取后必须先检查质量再回报
- 任何数据源声称已清洗都不能信任
- 产出物必须包含数据质量报告

## L2 模式
- 如果发现缺失值 < 5%：前值填充，记录在 observation
- 如果发现缺失值 > 5%：标记异常区间，在 observation 中建议后续步骤如何处理
- 如果发现数据时间范围与任务要求不符：立即回报，不自行裁剪
- 如果数据源有多个版本：选择最完整的，在 observation 中说明选择理由

## L3 反模式
- 绝不能假设数据是干净的
- 绝不能默默修复数据问题而不在 observation 中记录
- 绝不能返回未经检查的数据
- 绝不能跳过数据质量报告直接标记步骤完成
```

**与 v1.0 的核心区别**：
- v1.0："连接 jqdatasdk，执行 get_price()，保存到 CSV"（操作手册）
- v2.0："获取后必须检查质量，缺失值要记录"（行为准则）
- AI 自己决定用什么工具、什么 API、什么格式

**v2.0 预设 Skill 目录**：

```
skills/
├── task-bootstrap/SKILL.md          # Agent 启动协议（感知→执行→观察）
├── task-report/SKILL.md             # Agent 完成报告协议
├── quality-gate/SKILL.md            # 产出物自检协议
├── orchestration-strategy/SKILL.md  # 庞统调度策略（五原则 + 防降级）
├── data-acquisition/SKILL.md        # 数据获取行为准则（赵云）
├── strategy-coding/SKILL.md         # 策略编码行为准则（张飞）
├── risk-review/SKILL.md             # 风控审核行为准则（关羽）
├── infra-management/SKILL.md        # 基础设施管理行为准则（姜维）
└── experience-distill/SKILL.md      # 经验蒸馏行为准则
```

**Skill 格式**：Markdown（LLM 理解最好、token 最省、自由度最高）。
每个 Skill 包含完整的 L1 + L2 + L3 三层。

**Skill 加载方式**：
- 每个 Agent 的 SOUL.md 中引用自己的专属 Skill
- task-bootstrap 和 quality-gate 通过任务消息模板注入（所有 Agent 通用）
- orchestration-strategy 通过庞统的 SOUL.md 注入
- 经验蒸馏完成后，相关经验自动注入到后续任务的上下文中（半自动 Skill 更新）

#### 3.12.9 庞统调度策略 Skill（v2.5 新增）

> 综合 Microsoft Azure Checker Pattern、Google RouterAgent、oh-my-claudecode Team pipeline、AWS Strands ReWOO。

**调度五原则**：

| # | 原则 | 说明 | 业界来源 |
|---|------|------|---------|
| 1 | **Capability Matching** | 根据 Agent 能力画像匹配任务，不是轮询分配 | Google RouterAgent |
| 2 | **Dependency-Aware Scheduling** | 先调度无依赖步骤（可并行），有依赖的等前置完成 | AWS Strands ReWOO |
| 3 | **Iterative Refinement** | 执行→验证→如有问题→第二轮修正→再验证（设上限） | Microsoft Azure Checker Pattern |
| 4 | **Quality-Gated Advancement** | 当前步骤通过门控后才调度下一步 | oh-my-claudecode verify→fix loop |
| 5 | **Escalation Over Failure** | 失败不放弃：重试→换 Agent→升级到用户 | Hermes per-task retry |

**Iterative Refinement 具体流程**：

```
庞统调度张飞 → 张飞产出 → 庞统/司马懿审核
  → 通过：调度下一步
  → 未通过：调度张飞第二轮（带上审核意见 + 相关 observation）
    → 张飞 read observations/ → 自主调整 → 再提交
    → 通过：调度下一步
    → 未通过 + 达到迭代上限（3次）：升级到用户
```

**并行步骤的处理**：
并行步骤间不需要实时感知。庞统在两个并行步骤都完成后，
检查 observation 是否有关联。如果有关联，调度受影响的 Agent 做第二轮。

#### 3.12.10 Observation 设计方案（v2.5 完善）

**Observation 生命周期**：

```
1. Agent 执行中发现问题
   → 判断是否符合写入标准（影响后续步骤/提升质量/专业外问题）
   → 不符合标准就不写（禁止进度报告、正常确认、无关细节）

2. 写入 observation
   → write artifacts/task-{id}/observations/{agent}-{timestamp}-{uuid短}.md
   → 唯一强制：第一行必须是 [SEVERITY: blocking/warning/info]
   → 内容格式完全自由（不固定 JSON 或 Markdown）
   → POST /api/observations 通知 daemon

3. daemon 收到通知
   → blocking：立即通知庞统
   → warning/info：步骤完成时一起通知

4. 庞统处理
   → 评估影响 → 决策（忽略/调整计划/通知后续 Agent/调度第二轮）

5. 后续 Agent 感知
   → 被调度时 read observations/ → 自主决定是否调整
```

**为什么内容格式不固定**：
固定 JSON 或 Markdown 格式会束缚 AI 的表达能力。
Agent 根据发现的情况自由选择最合适的表达方式。
唯一强制 severity 标记是因为 daemon 需要它来决策通知级别。

**频率限制**：每个步骤每个 Agent 最多 3 个 observation。

**observation 的 pav 执行记录**（v2.5 新增）：
Agent 执行过程中的关键决策点用 severity=audit 记录：
- 为什么选这个方法
- 做了什么取舍
- 发现了什么
audit 级别不通知庞统，只记录在文件系统供事后审查。

#### 3.12.11 Agent 调度方式（v2.6 终版确认）

**实验结论**（2026-05-14 两轮 spawn 实验）：
- `sessions_spawn` 配置 `allowAgents: ["*"]` 后可以指定其他 agentId
- 跨 Agent spawn 读写文件、结论回传、cleanup:delete 全部正常
- **spawn 是 v2.0 调度将军的首选方式**

**Gateway 配置**（已应用）：
```json
// ~/.openclaw/openclaw.json → agents.list[id=pangtong-fujunshi]
{ "subagents": { "allowAgents": ["*"] } }
```

**v2.0 调度方式（按优先级排序）**：

| 优先级 | 方式 | 用途 | 特点 |
|--------|------|------|------|
| **首选** | `sessions_spawn(agentId="xxx", cleanup="delete")` | 调度将军执行步骤 | 不走 Gateway、并行、自动清理、结论回传 |
| Fallback | `openclaw agent --agent xxx --local --json` | spawn 不可用时 | `--local` 本地运行，自动 fallback |
| 内部 | `sessions_spawn()` (无 agentId) | 庞统内部复杂分析 | 子 session 继承上下文 |

**spawn 的关键优势**（vs `openclaw agent` CLI）：
- 不依赖 Gateway（Gateway 挂了也能调度）
- 庞统可以通过 `subagents list` 实时监控子 session 状态
- 完成后自动回传结果，不需要轮询
- 支持嵌套调度（`maxSpawnDepth: 2`）
- 支持并行（`maxConcurrent: 8`）

#### 3.12.12 庞统上下文管理（v2.6 新增）

> **核心问题**：庞统在一个 session 里处理多个任务时，上下文会膨胀。如果“每次唤醒全新视角”，
> 之前的推理过程丢失，决策质量下降。如果保留全部上下文，token 爆炸。
> **必须找到平衡**。

**调研来源**：
- **get-shit-done**：Wave Execution——每个 plan 用独立新鲜上下文，避免 context rot
- **Claude Code**：session linked by parent_session_id + auxiliary-LLM compression
- **学术：Episodic Memory**（arXiv:2502.06975）：episodic memory 是长期 Agent 的缺失拼图
- **学术：Memory as Action**（arXiv:2509.25250）：自主上下文策展

**方案：三层上下文架构**

```
┌───────────────────────────────────────────┐
│ L1: 永久记忆（跨任务保留）                    │
│ MEMORY.md + 经验库 + Skill 体系               │
│ 每次启动自动注入，不受上下文窗口限制             │
└───────────────────────────────────────────┘

┌───────────────────────────────────────────┐
│ L2: 任务工作记忆（单任务内保留）                │
│ decisions.jsonl + moments.jsonl + status.json  │
│ 存文件系统，庞统被唤醒时 read 获取              │
│ → 这就是“上下文恢复协议”的实质                  │
└───────────────────────────────────────────┘

┌───────────────────────────────────────────┐
│ L3: 推理上下文（每次唤醒重建）                  │
│ 当前推理过程，对话历史中的近期部分               │
│ 通过 OpenClaw compaction 自动管理              │
└───────────────────────────────────────────┘
```

**具体机制**：

1. **庞统被唤醒时**：
   - read `status.json`（当前全局状态）
   - read `decisions.jsonl`（之前做过的决策及理由）
   - read `moments.jsonl`（最近 10 条事件）
   - 这三步重建 L2 工作记忆

2. **庞统做决策时**：
   - 关键决策写入 `decisions.jsonl`（不只在对话历史里）
   - 格式：`{decision, reason, alternatives_rejected, timestamp}`
   - 下次被唤醒时能看到自己之前为什么做这个决策

3. **防止“忘了”的兜底**：
   - 每个 observation 写入时，daemon 同时记录到 `moments.jsonl`
   - 庞统被唤醒时看到的 moments 包含所有 Agent 的 observation 摘要
   - 即使庞统“忘了”对话中的推理，通过文件系统能找回来

4. **并行步骤完成后的识别**：
   - 两个并行步骤都完成后，daemon 生成一个“并行步骤关联分析”
   - 检查两个步骤的 observation 是否有关联
   - 如果有关联，写入 moments 并通知庞统
   - 庞统不需要“记住”并行步骤的关系——文件系统替他记着

**与之前“全新视角”方案的区别**：
- 之前：每次唤醒清空一切，只看 status.json
- 现在：每次唤醒有 L1（永久）+ L2（文件系统工作记忆）+ L3（对话上下文）
- L2 是关键创新——决策理由和 observation 摘要存在文件里，不依赖对话历史

#### 3.12.13 防降级机制（v2.6 新增）

> **核心问题**：调度策略本身如何防止在执行过程中逐渐妥协？
> 庞统如何保证不为了“完成任务”而降级目标？

**四个防降级机制**：

**机制 1：反合理化表（Anti-Rationalization Table）**

来源：Agent Skills 生命周期实践

写入 orchestration-strategy Skill 的 L3（反模式）层：

```
庞统自检清单——每个调度决策前必须过：
❌ “这个步骤简化一下”   → 问：PRD 目标是否被覆盖？
❌ “时间不够跳过验证”   → 没有验证的产出不算完成
❌ “这个Agent做不到就算了” → 换 Agent 或拆步骤
❌ “先用简单方案后续优化” → v2.0 就是完整实现
❌ “用户应该不在意”     → 你的判断 ≠ 用户需求
```

**机制 2：目标锚定（Goal Anchoring）**

每个任务的原始 goal 和 PRD 需求写入 `context.json`，不可修改。
庞统每次做调度决策时必须对照 goal：
- 决策是否更接近 goal？
- 如果偏离 goal，必须升级到用户，不能自行降级

**机制 3：范围缩减检测（Scope Reduction Detection）**

来源：get-shit-done 实践

planner.py 在 Phase 2 生成计划时，每个步骤必须标注覆盖哪些需求。
daemon 在执行完所有步骤后，反向检查：每个需求是否被至少一个步骤覆盖。
如果有遗漏，不允许进入 Phase 4，必须 replan。

**机制 4：验证前不完成（Verification-Before-Completion）**

来源：superpowers 实践

Agent 声称完成时，validator.py 检查：
1. 产出物文件存在且非空
2. 产出物与 end_state 描述匹配（AI 语义检查）
3. 没有未处理的 blocking observation
任何一项不通过，步骤状态不变为 completed。

---

## 4. 已决策（全部）

| # | 决策 | 结论 | 理由 |
|---|------|------|------|
| 1 | 黑板载体 | **SQLite + 文件系统** | SQLite 存状态（查询快、事务安全），文件系统存产出物（git 可追踪） |
| 2 | 庞统运行方式 | **主 session + daemon API** | 庞统在正常 session 里与用户对话，通过 HTTP API 调度 daemon |
| 3 | Agent 调度 | **`openclaw agent` CLI（简单）+ sessions_spawn（复杂）** | CLI 是 Gateway 原生能力，有超时和 fallback；复杂步骤用 sub-agent 隔离 |
| 4 | 事件触发 | **daemon 内部事件循环** | Agent 回报时触发下一步，不用 cron |
| 5 | 配置化 | **YAML/JSON 配置文件** | 状态/流转/事件/模板全部配置化，代码零硬编码 |
| 6 | Agent 团队 | 复用三国角色 | 角色映射清晰 |
| 7 | v1.0 共存 | 独立 session，并行运行 | v1.0 和 v2.0 互不干扰 |
| 8 | 前端 | 先纯对话（Control Center） | 后续加可视化 |
| 9 | 状态机 | 继承 v1.0 + AI native 扩展 | steer/takeover/intervene/replan 等 |
| 10 | 执行历史 | sub-agent transcript 归档到任务目录 | 可追溯、可学习、可复盘 |
| 11 | Daemon 通知庞统 | `openclaw agent` CLI | 步骤完成/异常/需要裁决时 |
| 12 | 经验沉淀 | 任务完成后自动触发 AI 蒸馏 | + 规划/执行/异常时自动检索 |
| 13 | 实现方式 | **一次性完整实现** | 不做最小集迭代，避免做着做着偏离 |
| 14 | 治理原则 | **质量优先，成本和工期为质量让步，但有硬性上限** | 见 4.1 治理框架 |
| 15 | Agent 调度机制 | **`openclaw agent` CLI** | 司马懿评审：废弃自建 WS Client，改用 CLI |
| 16 | 数据存储 | **SQLite 为唯一权威，文件系统为索引缓存** | 司马懿评审：消除双写一致性问题 |
| 17 | 经验蒸馏 | **先两层（surface+heuristic），验证后扩展** | 司马懿评审：五层过重，YAGNI |
| 18 | 实施策略 | **分批集成（设计一次做完，实现分批验证）** | 司马懿评审：骨架→智能→高级 |
| 19 | Agent 协作模式 | **中央协调 + Agent 自主**（非纯中央调度） | v2.4 修正：庞统定方向约束，Agent 自主执行+主动观察 |
| 20 | 信息共享方式 | **文件系统直读**（非 API 查询） | v2.4 修正：status.json + observations/ 目录，Agent 直接 read |
| 21 | AI 参与方式 | **事件驱动持续参与**（非完成时通知） | v2.4 修正：步骤完成/observation/心跳/质量评估点四类触发 |
| 22 | Agent 主动性 | **observations 目录 + 自主行为协议** | v2.4 新增：Agent 可主动写观察、建议、异常，其他 Agent 可感知 |
| 23 | Skill 体系 | **三层模型（Principles + Patterns + Anti-patterns）** | v2.5 新增：综合 oh-my-claudecode/Hermes/Nuwa/Agent Skills |
| 24 | 调度策略 | **五原则（Capability/Dependency/Iterative/QualityGate/Escalation）** | v2.5 新增：综合 Azure/Google/OMC/AWS |
| 25 | Observation 格式 | **自由格式 + 强制 severity 标记** | v2.5 确认：不固定 JSON/MD，唯一强制 [SEVERITY: xxx] |
| 26 | Agent 调度方式 | **双模式（openclaw agent CLI + sessions_spawn）** | v2.5 确认：CLI 调度将军，spawn 庞统内部分析 |
| 27 | 并行感知方案 | **多轮迭代（非实时感知）** | v2.5 确认：庞统判断是否需第二轮，不依赖运行时感知 |
| 28 | 信息隔离预留 | **agent-registry.json 中 visibility 字段** | v2.6 预留：v2.0 全部 full，v2.1+ 按需开启 |
| 29 | Agent 调度首选 | **sessions_spawn（allowAgents配置已生效）** | v2.6 确认：实验验证跨 Agent spawn 可用 |
| 30 | 庞统上下文管理 | **三层架构（永久记忆+文件工作记忆+对话上下文）** | v2.6 新增：防止“全新视角”丢信息 |
| 31 | 防降级机制 | **四个机制（反合理化+目标锚定+范围缩减+验证前不完成）** | v2.6 新增：确保调度不降级 |
| 32 | Skill 本质 | **行为准则（L1原则+L2模式+L3反模式），非操作手册** | v2.6 明确：告诉 AI 做什么是对的，不告诉怎么做 |
| 33 | 评审模式 | **单任务单评审+汇总后再评审，交叉评审按需** | v2.6 确认 |

### 4.1 质量/成本/工期治理框架

> 核心原则：**质量是第一优先级，成本和工期可以为质量妥协，但不能无限妥协。**
>
> 参考：Wanman TokenBudget（per-agent ceiling + 全局 ceiling）、Network-AI FederatedBudget（双层预算）、Network-AI QualityGate（两层门控：规则+AI）。

#### 三层预算体系

每个任务创建时分配三重预算，任何一重耗尽都触发干预：

```yaml
# config/settings.yaml 中的默认预算
budget_defaults:
  token:
    per_task_ceiling: 500000       # 单任务总 token 上限
    per_step_ceiling: 100000        # 单步骤 token 上限
    per_agent_ceiling: 200000       # 单 Agent token 上限
  time:
    per_task_ceiling: 3600          # 单任务总时间上限（秒）
    per_step_ceiling: 600           # 单步骤时间上限（秒）
  depth:
    max_plan_adjustments: 5         # 计划调整次数上限
    max_retries_per_step: 3         # 单步骤重试次数上限
    max_challenge_rounds: 3         # 挑战循环次数上限
```

**预算耗尽时的行为**：

| 预算类型 | 耗尽行为 | 谁干预 |
|---------|---------|--------|
| step token 耗尽 | 步骤标记 failed，触发异常处理 | Daemon 自动 |
| step 时间耗尽 | 步骤标记 failed，检查 Agent 存活 | Daemon 自动 |
| task token 耗尽 | 任务暂停，通知庞统 + 用户 | Daemon → 庞统 → 用户 |
| task 时间耗尽 | 任务暂停，通知庞统 + 用户 | Daemon → 庞统 → 用户 |
| 计划调整次数耗尽 | 停止调整，用当前最佳计划继续 | Daemon 自动 |
| 重试次数耗尽 | 步骤标记 failed，升级到庞统 | Daemon → 庞统 |

#### 质量门控（Quality Gate）

参考 Network-AI 两层门控：

```
Agent 提交产出物
  │
  ▼
Layer 1: 规则验证（确定性，零成本，毫秒级）
  ├── 文件存在性检查
  ├── 文件非空检查
  ├── Schema 校验（JSON/CSV 格式正确）
  ├── Placeholder 检测（TODO/FIXME/...）
  └── 基础完整性（字段非空、数值范围合理）
  │
  ├─ 通过 → 进入 Layer 2
  └─ 失败 → reject（退回 Agent 修复）
  │
  ▼
Layer 2: AI 审查（有成本，秒级，仅当 confidence < 阈值时触发）
  ├── 产出物是否与 end_state 描述匹配
  ├── 代码质量（变量命名、异常处理、逻辑正确性）
  └── 幻觉检测（声称的结论是否有数据支撑）
  │
  ├─ approve → 完成
  ├─ quarantine → 隔离待人工审查（通知庞统 + 用户）
  └─ reject → 退回 Agent 修复
```

**成本控制**：Layer 2 不是每次都跑。默认只在以下情况触发：
- Agent 回报 confidence < 0.7
- 步骤是关键步骤（用户明确指定要审查的）
- 连续多个步骤 Layer 1 都一次通过（抽样审查，防止 Agent 学会绕规则）

#### 质量提升的分级投入

不是所有任务都需要极致质量。根据任务重要性分级投入：

```yaml
# config/settings.yaml
quality_levels:
  critical:          # 资金安全、实盘交易
    layer2_threshold: 0.8
    max_retries: 5
    always_ai_review: true
    human_approval_required: true
    token_budget_multiplier: 2.0
    
  standard:          # 策略回测、数据分析
    layer2_threshold: 0.7
    max_retries: 3
    always_ai_review: false
    human_approval_required: false
    token_budget_multiplier: 1.0
    
  exploratory:       # 探索性研究、快速验证
    layer2_threshold: 0.5
    max_retries: 1
    always_ai_review: false
    human_approval_required: false
    token_budget_multiplier: 0.5
```

任务创建时，AI 根据内容自动判定 quality_level，用户也可以手动指定。

#### 成本回收机制

高质量的产出如果被后续任务复用，相当于摊薄了成本：

- **经验沉淀**：高质量任务的产出自动蒸馏为经验，下次同类任务减少 token 消耗
- **Skill 转化**：高频经验固化为 Skill，直接注入减少检索成本
- **模板复用**：高质量的计划结构可以保存为模板，下次直接使用

#### 工期控制：何时干预

| 场景 | 判断标准 | 干预方式 |
|------|---------|----------|
| 明显死循环 | 同一步骤 retry > max_retries | 强制终止 + 升级 |
| 计划反复调整 | plan_adjustments > max | 锁定当前计划继续 |
| Agent 超时无响应 | step 执行时间 > per_step_ceiling | 检查存活 → 重试或换 Agent |
| 质量长期不达标 | 连续 3 个步骤 AI 审查 reject | 暂停任务 + 通知用户 |
| 成本超预期 | task token > 80% ceiling | 通知庞统评估是否值得继续 |
| 接近 deadline | task 时间 > 80% ceiling | AI 判断：是否降级质量等级以保工期 |

#### AI 决策结构化

每个 AI 决策必须记录完整的推理过程（司马懿评审意见）。

```sql
-- decisions 表结构化扩展
CREATE TABLE decisions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    task_id TEXT NOT NULL,
    step_id TEXT,
    decision_type TEXT NOT NULL,  -- agent_selected / plan_adjusted / anomaly_classified / quality_review
    
    -- 结构化推理（司马懿要求：输入、选项、选择、原因、置信度）
    input_summary TEXT NOT NULL,       -- AI 看到了什么
    options_considered TEXT NOT NULL,   -- 考虑了哪些选项（JSON array）
    selected TEXT NOT NULL,            -- 选了什么
    reason TEXT NOT NULL,              -- 为什么选这个
    confidence REAL NOT NULL,          -- 置信度 0.0-1.0
    
    model TEXT,
    token_cost INTEGER,
    created_at TEXT NOT NULL DEFAULT (datetime('now'))
);
```

#### 经验生命周期

经验不是写进去就永远有效：

```sql
-- experiences 表扩展
ALTER TABLE experiences ADD COLUMN lifecycle TEXT DEFAULT 'draft';  -- draft / verified / superseded / expired
ALTER TABLE experiences ADD COLUMN verified_at TEXT;
ALTER TABLE experiences ADD COLUMN verified_by TEXT;  -- ai / human
ALTER TABLE experiences ADD COLUMN expires_at TEXT;   -- TTL，过期自动降权
ALTER TABLE experiences ADD COLUMN superseded_by INTEGER REFERENCES experiences(id);
```

| 生命周期 | 说明 | 检索权重 |
|---------|------|---------|
| draft | AI 自动蒸馏，未验证 | 0.5x |
| verified | 经过实际任务验证（引用 >= 2 次） | 1.0x |
| superseded | 被更好的经验替代 | 0.1x |
| expired | TTL 过期，自动降权 | 0.0x（不检索） |

#### 异常处理策略表

异常分类用确定性逻辑，处理策略用预设决策表（司马懿评审意见）：

```yaml
# config/exceptions.yaml
exceptions:
  - type: agent_timeout
    detection: "step execution time > per_step_ceiling"
    strategy:
      - action: check_agent_alive
      - action: retry
        max: 3
        backoff: exponential
      - action: reassign_agent  # 换一个 Agent
      - action: escalate_to_human
    
  - type: validation_failed
    detection: "quality gate Layer 1 failed"
    strategy:
      - action: reject_to_agent
        max: 3
      - action: escalate_to_human
    
  - type: ai_judgment_conflict
    detection: "two AI decisions contradict"
    strategy:
      - action: escalate_to_human  # AI 冲突必须人工裁决
    
  - type: resource_deadlock
    detection: "circular dependency detected"
    strategy:
      - action: break_cycle  # 随机释放一个等待
      - action: reassign_agent
      - action: escalate_to_human
    
  - type: budget_exceeded
    detection: "any budget ceiling reached"
    strategy:
      - action: pause_task
      - action: notify_pangtong
      - action: await_human_decision
    
  - type: unknown
    detection: "unclassified exception"
    strategy:
      - action: ai_classify  # 只有未知异常才让 AI 分类
      - action: apply_strategy  # 应用 AI 选择的策略
      - action: escalate_to_human  # 兜底
```

---

## 5. 实现清单

> 用户决策：一次性完整实现，不做最小集迭代。

```
核心基础设施:
  [x] Daemon HTTP API (FastAPI + uvicorn + SQLite WAL)
  [x] config/ 配置化体系（states.yaml / step-states.yaml / events.yaml / agent-registry.json）
  [x] SQLite 表结构（tasks / steps / moments / agent_status / decisions / experiences）
  [x] artifacts/ 文件系统结构
  [x] `openclaw agent` CLI 封装（daemon → Agent session 通信）
  [x] daemon 启动时补偿归档（检查未归档的 transcript）
  [x] observations/ 目录（Agent 主动观察与建议）
  [x] status.json 实时全局摘要（daemon 每次事件后更新）
  [x] Agent 自主行为协议（task-bootstrap Skill 中注入感知+执行+观察三段式）
  [x] 庞统持续意识机制（事件驱动通知 + 定期心跳）

四相循环:
  [x] Phase 1 需求探索（庞统苏格拉底对话）
  [x] Phase 2 动态规划（AI 生成 plan + 用户审批）
  [x] Phase 3 自主执行（daemon 事件循环 + Agent 调度）
  [x] Phase 4 主动汇报（AI 生成报告 + 用户验收）

Agent 管理:
  [x] agent-registry.json 能力画像
  [x] Agent 选择算法（基于能力匹配 + 历史表现）
  [x] 主 session 调度（简单步骤）
  [x] sub-agent 调度（复杂步骤 + cleanup=delete）
  [x] 执行历史归档（transcript → artifacts）

智能特性:
  [x] 幻觉门控（产出验证）
  [x] 挑战循环（reviewing → challenge pass/iterate/fail）
  [x] 动态计划调整（异常时 replan）
  [x] AI 决策记录（可追溯）
  [x] 经验沉淀引擎（任务完成后自动蒸馏）
  [x] 经验检索（规划/执行/异常时自动注入）

人工介入:
  [x] steer（用户改方向）
  [x] takeover（用户接管步骤）
  [x] intervene（用户主动干预）
  [x] escalated（AI 主动升级）
  [x] waiting_human（Agent 请求确认）

监控 & 运维:
  [x] 健康检查（daemon 内部定时 + API）
  [x] Token 预算管理
  [x] Agent 心跳
  [x] 与 v1.0 并行运行验证
```

---

## 附录：术语表

| 术语 | 含义 |
|------|------|
| Blackboard | 共享意识空间，所有 Agent 的唯一信息共享中枢 |
| Control Unit | AI 指挥官（庞统），负责动态规划、Agent 选择、异常处理 |
| Moment | 原子事件，任务执行过程中的最小信息单元 |
| Fidelity | 信息保真度，控制不同 Agent 看到多少信息 |
| propose→validate→commit | 三阶段原子写入，防止并发竞态 |
| Boids | 群体智能规则，让 Agent 自行涌现协作行为 |
| Auftragstaktik | 任务式指挥，只给目标不给步骤 |
| 幻觉门控 | 验证 Agent 产出是否真实存在 |
| Observations | Agent 主动观察与建议，写入共享目录供其他 Agent 和庞统感知 |
| Status.json | 全局状态摘要，daemon 实时维护，Agent 执行前必读 |
| 自主行为协议 | Agent 三段式行为：感知(read 全局) → 执行(自主决定) → 观察(write observations) |
| Ralph Loop | 持久目标跨 turn 保持机制 |

---

## 附录 B：调研参考来源

### 共享意识空间物理结构
- **OpenAI Codex Cookbook** — PM Agent 写 REQUIREMENTS.md / AGENT_TASKS.md，产出物 gating check
- **Wanman Agent Matrix** — `artifact.put` CLI，Agent 通过 bash 与系统交互，per-agent workspace 隔离
- **Wiki 知识管理体系** — 四层金字塔 L0-L3 + 7 种知识产物类型 + DISCOVER→DISTILL→APPLY→IMPROVE 闭环

### Daemon API 设计
- **Edict (三省六部)** — Transactional Outbox Pattern + Redis Streams 消费者组 + 死信队列
- **Wanman** — 30+ JSON-RPC 方法 + 标准错误码体系 + Agent 零SDK CLI 模式
- **Gstack** — 长存活守护进程模型 + 状态文件持久化 + 版本自动重启
- **Multica** — 任务生命周期状态机 + 分层事件总线（进程内同步 + WebSocket 实时推送）

### 经验沉淀引擎
- **Nuwa Skill (女娲)** — 五层蒸馏框架（表象→心智模型→决策启发式→反模式→诚实边界）
- **Corpus2Skill** (arXiv 2604.14572) — 离线蒸馏为可导航的层级 Skill 目录
- **A-MEM** (arXiv 2502.12110) — Zettelkasten 式记忆，新记忆触发已有记忆的更新
- **MemAgents** (ICLR 2026 Workshop) — 单次学习 + 上下文感知检索 + 整合为可泛化知识
- **Hermes** — skill_manage 使用中发现过时立即修复

### 中央协调 + Agent 自主（v2.4 新增）
- **Edict 朝堂议政** — TurnScheduler + phaseMask（Agent 声明在哪些阶段主动发言），MessageBus 消息总线
- **Ouroboros (joi-lab)** — 后台意识循环 consciousness.py，任务间主动思考，宪法驱动
- **Network-AI** — Blackboard + CRDT，Agent 读黑板、看到变化、自己决定行动
- **Open Multi-Agent** — sharedMemory + delegate_to_agent，Agent 可主动委派给其他 Agent
- **oh-my-claudecode** — Team staged pipeline（team-plan→team-prd→team-exec→team-verify→team-fix），hub-spoke 协调
- **Hermes Agent** — Durable SQLite-backed kanban board，Agent 通过 kanban_* 工具集自主 claim task，dispatcher 驱动
- **Claude Code** — Grove 共享项目工作区、Swarm/Team hub-spoke 协调、sidechain transcript 隔离
- **Claude Code Sub-Agent Collective** — task-orchestrator 路由枢纽 + 30+ 专业化 Agent + hook TDD 强制
- **agent-kanban (saltbo)** — Agent-first task board，Mission control for AI workforce
- **AgentsMesh** — PTY sandbox + git worktree 隔离 + ticket-pod binding + 内置 Kanban
- **Operator (untra)** — kanban-shaped git-versioned 软件开发，Agent 自主认领工单
- **MCP + A2A 协议** — MCP 提供上下文共享，A2A 提供 Agent 间直接通信（2026 H2 成熟）
- **Multi-Agent Blackboard System (arXiv:2510.01285)** — 消除中央协调器对 Agent 先验知识的需求
- **awesome-agent-orchestrators** — 2026 年活跃的 Agent 编排器汇总（nullclaw, agentsmesh 等）
