Files
AirCoding/AirPlan/docs/architecture/Mimo2.5pro系统详细设计审查.md
AirCoding b668b185e1 System detailed design: four-model cross-review complete
Add system-detailed-design.md (2033 lines, 23 sections) derived from
frozen baselines and overview. Complete four-model cross-review:
- DeepSeek: baseline coverage audit (PASS, 9.6/10)
- MIMO 2.5 Pro: internal consistency (PASS, 9.4/10)
- GPT-5.5 Pro: baseline conflict detection (Requires repair)
- Opus 4.8: validation + root cause analysis (CONDITIONAL PASS, 9.1/10)

Key findings requiring resolution before freeze:
- P1-01: Worker exit code semantic conflict (baselineV1 vs overview)
- P1-02: PromptLayerLevel enum vs L0-L9 layer name mismatch
- P1-03: EventStore.project() error handling undefined
- P1-04: PromptLayerLoader interface incomplete for 10 layers

Coverage verified: 100% contracts, events, DB schema, state machines.
Architecture validated: no circular dependencies, proper separation.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-29 18:57:13 +08:00

354 lines
16 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# MIMO 2.5 Pro 系统详细设计全量交叉审查
Date: 2026-05-29
Reviewer: MIMO 2.5 Pro (single-model, independent pass)
Status: Full cross-verification of `system-detailed-design.md` against all frozen baselines, frozen overview, and internal architectural consistency
Scope: Coverage + consistency + architecture soundness audit
---
## 1. 审查方法
审查对象:`AirPlan/docs/architecture/system-detailed-design.md`2033 行23 节)
审查三维度:
1. **覆盖性**:基线/概要设计的每个 item 是否在详细设计中有对应项
2. **一致性**:详细设计内部是否存在矛盾、基线引用是否准确
3. **架构合理性**:类职责划分、依赖方向、边界执行是否合理,是否存在内在冲突
审查输入:
| 文档 | 角色 |
|---|---|
| `interface-contracts-v1.md` (23 节) | 接口契约 |
| `event-registry-v1.md` (55 durable + 7 ephemeral) | 事件注册表 |
| `db-schema-v1.md` (19 表, 18 个关闭枚举) | 数据库 Schema |
| `runtime-semantics-v1.md` (19 节) | 运行时语义 |
| `scheduler-state-machine-v1.md` (11 节) | 调度器状态机 |
| `main-agent-state-machine.md` | 主代理状态机 |
| `prompt-layering-v1.md` (L0-L9) | 提示分层 |
| `scope-escalation-v1.md` (13 节) | 作用域升级 |
| `security-model-v1.md` (8 PathRisk + 10 CommandRisk) | 安全模型 |
| `capability-trust-v1.md` | 能力信任 |
| `system-overview-design.md` (FROZEN, 1222 行) | 概要设计 |
| `DeepSeek系统详细设计审查.md` | 前一轮审查报告 |
方法:
- 逐契约接口字段比对
- 逐事件投影映射核对
- 逐表仓储核对
- 逐状态机转换核对
- PromptLayer 三方比对contracts / prompt-layering / overview
- 依赖方向一致性验证
- 内在冲突检测
---
## 2. 总体评估
### 2.1 评分
| 维度 | 得分 | 说明 |
|---|---|---|
| 契约覆盖 | 9.5/10 | 接口字段全覆盖1 处 PromptLayerLevel 枚举与层名不完全对齐 |
| 事件覆盖 | 10/10 | 55 durable + 7 ephemeral 全覆盖 |
| DB Schema 覆盖 | 10/10 | 19 表全仓储 |
| 状态机覆盖 | 10/10 | 6 个状态机全覆盖 |
| 内在一致性 | 8.5/10 | 1 处真实内部矛盾PromptLayer1 处架构弱点EventStore 错误隔离) |
| 架构合理性 | 9.5/10 | 边界清晰、职责分离良好、依赖方向正确 |
| 序列图覆盖 | 8.0/10 | 4 个关键序列覆盖2 个可补充 |
| 可实现性 | 9.5/10 | 方法签名可直接编码,无歧义 |
**综合评分9.4/10**
### 2.2 结论
详细设计是一个高质量的实现导向文档。架构边界清晰,依赖方向正确,类职责分离良好。发现了 **1 处真实内部矛盾****1 处架构弱点** 需要解决,但均不阻塞实现阶段——可以通过明确的设计决策澄清来修复。
---
## 3. P0 发现0 项)
未发现 P0 项。
---
## 4. P1 发现2 项)
### P1-01: PromptLayerLevel 枚举与 L0-L9 层名结构性不对齐
**严重度**P1真实内部矛盾影响实现一致性
**问题**`interface-contracts-v1.md` §16 定义了 10 个 `PromptLayerLevel` 枚举值,`prompt-layering-v1.md` §2 定义了 L0-L9 共 10 个层名。概要设计 §13 已将 L0-L9 逐层与基线对齐。但三方存在结构性不匹配:
| L# | prompt-layering-v1 §2 | contracts §16 枚举值 | 对齐状态 |
|---|---|---|---|
| L0 | Runtime invariant | `runtime_invariant` | ✓ |
| L1 | Role / agent mode | `role` | ✓ |
| L2 | Safety and permission policy | **(无对应枚举值)** | ✗ |
| L3 | Project rules and user preferences | `project_rules` | ✓ |
| L4 | Architecture baseline and current plan | `architecture` | ✓ |
| L5 | Task specification and acceptance criteria | `task_spec` | ✓ |
| L6 | Relevant code / artifacts / evidence | `evidence` | ✓ |
| L7 | Recent conversation and decision context | `conversation` | ✓ |
| L8 | Tool result history / diagnostics | `tool_output` | ✓ |
| L9 | Immediate instruction | `user_override`(名字不同) | △ |
| — | (无对应层) | `system_debug` | ✗ |
**矛盾点**
1. L2 "Safety and permission policy" 没有对应的 `PromptLayerLevel` 枚举值——但它是 prompt-layering-v1 定义的独立层
2. `user_override` 映射到 L9但概要设计 §13 说 L9 = "Immediate instruction",名字不一致
3. `system_debug` 枚举值没有对应的 L 层——DD §10.2 说"applied within L9 when present",但这是一个缩写而非结构映射
**影响**:实现时 `ContextAssembler.load_layers()` 需要 10 个加载点,但 `PromptLayerLoader` 接口只有 4 个方法(`load_runtime_invariant`, `load_role`, `load_project_rules`, `load_task_context`。L2 safety、L4 architecture、L6 evidence、L7 conversation、L8 tool_output、L9 immediate instruction 都没有明确的 loader 方法。
**修复建议**(需要设计决策):
- 选项 A在 contracts §16 添加 `safety_permission` 枚举值,将 `user_override` 改名为 `immediate_instruction`,删除 `system_debug` 或并入 L9
- 选项 B保持枚举不变在实现层将 L2 映射到 `runtime_invariant`immutable=trueL9 由 `user_override` + `system_debug` 合并
- 选项 C扩展 `PromptLayerLoader` 接口添加 L2/L4-L9 的显式加载方法
无论选哪个,需要一个明确的设计决策记录。
---
### P1-02: EventStore.project() 错误处理未定义
**严重度**P1架构弱点影响运行时鲁棒性
**问题**DD §5.3 `EventStore.append()` 在事务内执行 `EventRepository.insert()``project(event, tx)`。但 `project()` 执行的是多行 domain update`task.started` 需要更新 `tasks` 表 + 插入 `task_attempts` 行)。如果 `project()` 中间步骤失败,事务会回滚——但此时 `EventBus.publish()` 不会执行(正确行为),然而 **没有描述 `project()` 内部的错误语义**
- 如果 `project()` 抛出异常,是整个 `append()` 回滚?(应该)
- 如果 domain update 因 FK-off 不一致失败(如引用了不存在的 `tasks.id`),错误如何传播?
- `project()` 是否有部分失败的恢复逻辑?
**影响**:在高并发或重启恢复场景下,如果 `project()` 的某一步 domain update 失败(如引用的 task 已被删除),整个事件追加会回滚——这是正确的原子行为,但 DD 没有显式描述这个错误路径。
**修复建议**:在 DD §5.3 或 §18.2 添加:`project()` 异常 → 事务回滚 → `EventBus.publish()` 不执行 → 返回 `AirError{kind: "system_error"}`。如果是因为 FK-off 不一致导致,记录到 developer log 并触发 `referential_check()`
---
## 5. P2 发现5 项)
### P2-01: DeepSeek 审查报告中的 3 项 P2 已验证
DeepSeek 审查报告的 3 项 P2 均确认属实:
| ID | DeepSeek 发现 | MIMO 验证 |
|---|---|---|
| DeepSeek P2-01 | PromptLayerLevel 枚举与 L0-L9 不完全 1:1 | 确认(已升级为 MIMO P1-01 |
| DeepSeek P2-02 | Architecture Designer gate 无独立序列图 | 确认P2 |
| DeepSeek P2-03 | CLI catalog 命令类归属未指定 | 确认P2 |
### P2-04: `agent.started` 投影映射措辞
DD §5.4 投影映射表中 `agent.started` 的域更新描述为 "insert `agents` (starting/running)"。这暗示 `project()` 可能选择 `starting``running`,但 event-registry §3.3 固定为 "insert `agents` row with `status = running` or `starting`"——具体选择哪个取决于调度器上下文spawn 前 vs 握手后)。
建议DD 应明确 `starting` 是初始状态,`running` 是握手完成后的状态(与 db-schema §10 agent status 一致)。当前描述可接受但含糊。
### P2-05: `WorkspaceManager` 与 `Scheduler` 状态机 MERGING 阶段的职责边界
DD §7.5 `WorkspaceManager.merge_workspace()` 和 DD §20.2 Scheduler 的 MERGING 状态都描述了合并逻辑。但 Scheduler 状态机的 MERGING 包含了冲突处理路由trivial → repair/debugger, semantic → Reviewer/Architecture Designer, architecture → block, user → Main Agent——这些是 Scheduler 级别的决策,而 `WorkspaceManager` 只负责 git 操作。
建议:明确 `WorkspaceManager` 返回 `MergeResult{status: success|conflict, conflict_files?, conflict_type?}`Scheduler 根据 `conflict_type` 做路由决策。当前描述隐含了这个分工但没有显式标注。
---
## 6. 架构合理性分析
### 6.1 依赖方向
```text
contracts → (none)
llm → contracts
toolchain-cpp → contracts
tui → contracts
runtime → contracts, llm (facade only)
cli → contracts, runtime, tui, llm, toolchain-cpp
workers → contracts + WorkerRuntime IPC (no direct runtime import)
```
**评估**:完全正确。`contracts` 是叶节点,`cli` 是根节点,`runtime` 依赖 `llm` 但仅通过 facade`ProviderManager` 接口),`workers` 通过 IPC 间接依赖 `runtime`(不直接 import。这个依赖方向避免了循环依赖允许各包独立编译。
### 6.2 职责分离
| 组件 | 职责 | 边界 | 评估 |
|---|---|---|---|
| EventIngestor | 事件入口 | 不创建 scheduler/permission/memory 决策 | ✓ 正确隔离 |
| EventStore | 持久化事件 + 投影 | 不直接暴露 EventBus | ✓ 正确(投影在事务内,发布在事务后) |
| EventBus | 实时发布/订阅 | 不是恢复源 | ✓ 正确 |
| SessionStore | 聚合所有仓储 | 不含调度/权限/投影策略 | ✓ 正确code-view §9 |
| Scheduler | 编排服务 | 不是编码代理 | ✓ 正确scheduler-state-machine §intro |
| ToolRegistry | 工具调用 | 所有 side effect 必须经过 PermissionEngine | ✓ 正确contracts §23 |
| PermissionEngine | 权限决策 | 不绕过 credential/system-sensitive override | ✓ 正确 |
| TUI | UI 渲染 | 只依赖 ProjectionClient/contracts | ✓ 正确contracts §23 |
| ContextAssembler | 上下文组装 | 不自行压缩 | ✓ 正确(概要设计 §13 |
**评估**:所有组件的职责边界与基线一致。没有发现职责泄漏或边界违反。
### 6.3 状态机一致性
6 个状态机之间的交互路径:
| 源状态机 | 目标状态机 | 事件/数据流 | 一致性 |
|---|---|---|---|
| Main Agent → Scheduler | DELEGATING → SCHEDULING | `task.created` | ✓ |
| Scheduler → Worker | DISPATCHING → worker spawn | `agent.start` IPC | ✓ |
| Worker → Scheduler | worker.return → COLLECTING_RESULTS | `worker.result` IPC | ✓ |
| Scheduler → Architecture Designer | architecture-sensitive review | `architecture.impact.completed` | ✓ |
| Architecture Designer → Scheduler | impact assessment done | Scheduler consumes impact | ✓ |
| Main Agent ← Scheduler | progress/blocked/complete | `task.progress/blocked/completed` events | ✓ |
| EventBus → ProjectionStore | all events | subscribe/apply | ✓ |
| ContextAssembler → Scheduler | `compaction_requested` | Scheduler creates compact task | ✓ |
**评估**:所有状态机交互路径的事件名称、方向和触发条件一致。没有发现状态机之间的死锁或悬空事件路径。
### 6.4 事务语义一致性
关键事务边界:
| 操作 | 事务范围 | 后置操作 | 一致性 |
|---|---|---|---|
| EventStore.append | event insert + domain projection | EventBus.publish (after commit) | ✓ |
| ArtifactStore.create | temp→rename→DB record | event ingest | ✓ |
| Task.start | task.started event + tasks update + task_attempts insert | agent.started event | ✓ |
| Compaction | summary.created event + summaries insert | context.compaction.completed | ✓ |
| Cross-DB write (outbox) | session event → external DB → completion event | recovery on restart | ✓ |
**评估**:所有事务边界遵循 runtime-semantics §3 规则durable event + domain update 同事务EventBus 发布在事务后)。
---
## 7. 与 DeepSeek 审查的交叉验证
| 发现 | DeepSeek 判定 | MIMO 判定 | 差异 |
|---|---|---|---|
| PromptLayerLevel 结构性不对齐 | P2 | **P1** | MIMO 升级:这不是"措辞差异"而是真实内部矛盾,影响实现一致性 |
| Architecture gate 无独立序列图 | P2 | P2 | 一致 |
| CLI catalog 类归属 | P2 | P2 | 一致 |
| EventStore.project() 错误处理 | **未报告** | **P1** | MIMO 独立发现 |
| agent.started 投影措辞 | **未报告** | P2 | MIMO 独立发现 |
| WorkspaceManager/Scheduler 职责边界 | **未报告** | P2 | MIMO 独立发现 |
**差异分析**DeepSeek 将 PromptLayer 问题标记为 P2理由是"DD §10.2 正确记录了此映射"。MIMO 认为这是 P1因为虽然 DD 记录了差异,但没有给出明确的解决决策——实现时仍然面临"枚举值和层名不完全对应"的问题而这个差异发生在两个已冻结的基线之间contracts 和 prompt-layering属于需要明确澄清的架构级问题。
---
## 8. 覆盖性检查
### 8.1 契约接口字段抽样
| 接口 | 基线字段数 | DD 覆盖数 | 缺失 |
|---|---|---|---|
| TaskSpec | 9 fields | 9 | 0 |
| WorkerResult<T> | 12 fields | 12 | 0 |
| IpcEnvelope<T> | 9 fields | 9 | 0 |
| PermissionDecision | 7 fields | 7 | 0 |
| AirError | 11 fields | 11 | 0 |
| ProviderCapabilityMatrix | 10 fields | 10 | 0 |
| CapabilityManifestV1 | 13 fields | 13 | 0 |
| DebugRecord | 10 fields | 10 | 0 |
| LearnedMemory | 9 fields | 9 | 0 |
| Diagnostic | 14 fields | 14 | 0 |
**10/10 接口字段完整性抽样全部通过。**
### 8.2 事件投影映射核对
55 个持久化事件逐一对比 event-registry §3 的 Domain update 描述。全部 55/55 覆盖且域更新描述准确。
### 8.3 DB Schema 表核对
19 张表db-schema §2-§18 + §20.1-§20.2)逐一对比 DD §4.3 仓储清单 + §11.3 项目级 DB Store。19/19 全覆盖。
### 8.4 禁止路径核对
10 条 contracts §23 禁止路径逐一对比 DD §2 + §18.5。10/10 全覆盖。DD 额外添加 1 条 C4 规则runtime → TUI import
---
## 9. 与前轮审查的一致性
| 维度 | DeepSeek | MIMO 2.5 Pro |
|---|---|---|
| P0 | 0 | 0 |
| P1 | 0 | 2 |
| P2 | 3 | 5 |
| 综合评分 | 9.6/10 | 9.4/10 |
| 新发现 | — | P1-02, P2-04, P2-05 |
**一致性结论**:两轮审查在 P0 层面一致0 项。MIMO 发现了 DeepSeek 未报告的 P1 级 EventStore 错误处理问题,并将 PromptLayer 结构性矛盾从 P2 升级为 P1。
---
## 10. 门禁判定
| 条件 | 状态 |
|---|---|
| P0 = 0 | PASS |
| P1 ≤ 2均有明确修复路径| PASS |
| 契约覆盖 100% | PASS |
| 事件覆盖 100% | PASS |
| DB Schema 覆盖 100% | PASS |
| 状态机覆盖 100% | PASS |
| 禁止路径全执行 | PASS |
| 架构无循环依赖 | PASS |
| 职责分离无泄漏 | PASS |
| 状态机交互无死锁 | PASS |
| 事务语义一致 | PASS |
**门禁结果PASS附 2 项 P1 修复建议)**
详细设计可以进入实现阶段,但建议在实现开始前明确 P1-01PromptLayer 设计决策)和 P1-02EventStore 错误路径文档化)。
---
## 11. P1 修复建议
### P1-01 修复路径
需要一个设计决策ADR 或详细设计补充):
**推荐方案 B**:保持枚举不变,在实现层建立映射:
```text
L0 → runtime_invariant (immutable=true)
L1 → role (immutable=true)
L2 → (safety layer loaded by ContextAssembler as a runtime_invariant variant with immutable=true,
source from ~/.air/permissions.yaml + project permissions)
L3 → project_rules
L4 → architecture (loaded from plan/todo/ADR context)
L5 → task_spec
L6 → evidence (loaded from artifacts/diagnostics/evidence_refs)
L7 → conversation (loaded from messages/summaries)
L8 → tool_output (loaded from recent tool_runs/command_runs/diagnostics)
L9 → user_override + system_debug (merged, highest priority non-immutable layer)
```
PromptLayerLoader 接口扩展为:
```text
load_safety_policy(): PromptLayer // L2
load_architecture_context(refs): PromptLayer[] // L4
load_evidence_context(refs): PromptLayer[] // L6
load_conversation(session_id): PromptLayer[] // L7
load_tool_output(recent_runs): PromptLayer[] // L8
load_immediate_instruction(): PromptLayer // L9
```
### P1-02 修复路径
在 DD §5.3 或 §18.2 补充:
```text
EventStore.append error semantics:
- project() 内部异常 → 整个事务回滚
- EventBus.publish() 不执行正确post-commit only
- 返回 AirError{kind: "system_error", message: "event projection failed"}
- 如果是因为 FK-off 不一致(如引用不存在的 task_id
- 记录到 developer log
- 触发 SessionStore.referential_check()
- Scheduler 将受影响的 task 标记为 interrupted/blocked
- 不会部分投影SQLite 事务保证原子性
```