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>
This commit is contained in:
AirCoding
2026-05-29 18:57:13 +08:00
parent 8d9c4208fa
commit b668b185e1
11 changed files with 4323 additions and 1 deletions

View File

@@ -0,0 +1,353 @@
# 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 事务保证原子性
```