# DeepSeek V4 Pro 三角度架构审查报告 Date: 2026-05-28 Status: Third-round architecture review using DeepSeek V4-Pro model Reviewer: DeepSeek V4-Pro (1M context) Scope: All architecture documents under `AirPlan/docs/architecture/` ## 审查背景 当前架构文档集(26 个文件)是第二轮 MIMO2.5 审查后的修正版本。第二轮审查发现 6 项阻塞级和 10 项应修复问题,本文件已独立输出为 `MIMO2.5三视角审查.md`。 本轮审查旨在用新模型独立评估架构质量,覆盖三个视角: 1. 架构设计师 — 概念完整性、设计一致性和边界清晰性 2. 软件开发工程师 — 可编译性、类型完整性和实现可行性 3. 用户 — 与原始需求的对齐程度 --- ## 1. 架构设计师视角 ### 1.1 概念完整性 AirCoding V1.0.0 Alpha 架构展示了良好的概念完整性。核心原则(项目本地状态、事件驱动 + SQLite 恢复、ToolRegistry/PermissionEngine 作为统一副作用边界、独立子进程 worker)在所有文档中保持连贯。 **核心架构决策评价:** | 决策 | 质量 | 理由 | |---|---|---| | EventIngestor 作为事件摄入边界 | 优秀 | 解决了 EventStore 职责过宽问题,EventStore 不再隐式触发业务动作 | | 边列表任务依赖模型 | 优秀 | 完整表达 hard/soft/conflict/serialization,Scheduler 可动态追加持久化冲突边 | | IPC 协议含 tool.call/result | 优秀 | 使独立 worker 进程能通过父进程 ToolRegistry/PermissionEngine 安全调用工具 | | TUI 只依赖 ProjectionClient | 优秀 | TUI 不导入 runtime 内部,边界清晰 | | ProviderManager 在 packages/llm | 清晰 | runtime 通过 facade 调用 LLM,不耦合 provider 实现 | | snake_case 命名统一 | 务实 | 避免序列化层,DB/event/tool/contract 一致 | ### 1.2 依赖方向分析 包级依赖方向已收敛为单向无循环图: ```text contracts ↑ cli → runtime → llm (ProviderManager facade) cli → tui → contracts (ProjectionClient only) cli → toolchain-cpp runtime → contracts tui → contracts llm → contracts toolchain-cpp → contracts runtime 不依赖 tui tui 不依赖 DB/EventBus/runtime 内部 toolchain-cpp 不直接依赖 runtime 或 llm ``` 服务级依赖方向也已澄清: - Scheduler → WorkerManager(单向) - EventIngestor → EventStore/EventBus(单向) - DoctorService → CapabilityRegistry → ToolRegistry(单向) - CapabilityRegistry 不依赖 DoctorService(已修正) ### 1.3 跨文档一致性评估 当前文档集存在两类跨文档问题: #### 1.3.1 已收敛的领域 - IPC 协议:interface-contracts 已定义完整 envelope 类型,baseline 引用之 - Permission 模型:interface-contracts、security-model、scope-escalation、event-registry 使用一致 action+grant_scope - Error 模型:interface-contracts、tool-registry、event-registry 统一使用 AirError - Task 依赖:interface-contracts、scheduler-state-machine、event-registry、baseline 统一使用边列表 - 文档优先级:solution-architecture §2 已定义 8 级 precedence rule #### 1.3.2 仍有不一致的领域 | 问题 | 涉及文档 | 严重度 | |---|---|---| | error-taxonomy 中 cause_ref 为扁平字段对象,interface-contracts 中为 EntityRef | error-taxonomy-v1 vs interface-contracts-v1 | 高 | | event-registry 中 EntityRef 内联定义(10 个值),interface-contracts 定义 12 个值 | event-registry-v1 vs interface-contracts-v1 | 高 | | ToolCategory 和 ToolResultEnvelope 在 interface-contracts 和 tool-registry 重复定义 | interface-contracts-v1 vs tool-registry-v1 | 中 | | DebugKnowledgeStore 和 LearnedMemoryStore 接口缺失 | runtime-semantics-v1 引用但未定义 | 中 | 这些已在 MIMO2.5 审查中详细记录,此处不再逐项展开。 ### 1.4 架构风险矩阵 | 风险 | 概率 | 影响 | 现有缓解措施 | 剩余风险 | |---|---|---|---|---| | 跨 DB/文件事务原子性不足 | 中 | 中 | outbox/compensation 模型 | 低 — 已定义恢复扫描 | | worker 工具调用链路过长 | 低 | 中 | NDJSON IPC + correlation_id | 低 — 协议完整性好 | | Compaction 策略过于复杂 | 中 | 低 | copy-on-write + 显式回退引用 | 低 — 设计清晰 | | C++ 工具链覆盖不够 | 中 | 中 | cppcheck+clangd+CMake+Ninja/Make | 中 — 需要真实项目验证 | | 插件权限绕过 | 低 | 高 | capability trust model + PermissionEngine | 低 — 边界充分 | ### 1.5 架构师结论 **可以进入概要设计阶段**。架构方向正确,依赖方向已收敛,包边界清晰。剩余 4 项跨文档不一致问题应在进入概要设计前修复,但都属于工程一致性层面,不影响设计方向。 --- ## 2. 软件工程师视角 ### 2.1 可编译性评估 `packages/contracts` 在修复以下问题后可编译: #### 2.1.1 类型定义问题 **E1. `TaskInsert = TaskRecord` 类型不安全** `interface-contracts-v1.md` 第 240 行:`export type TaskInsert = TaskRecord`。这意味着调用方创建任务时必须提供所有 Record 字段,包括服务器生成的 `created_at`、`retry_count`、`status`。正确做法是定义子集类型。 **建议修复:** ```ts export type TaskInsert = Omit & { status?: TaskStatus // defaults to "pending" retry_count?: number // defaults to 0 } ``` **E2. `JsonSchema` 泛型参数 T 未使用** 第 41 行:`export type JsonSchema = JsonObject`。T 在类型体中从未引用,是 phantom type,不提供任何编译时安全检查。要么移除泛型参数,要么定义品牌化类型。 **建议修复:** ```ts declare const JsonSchemaBrand: unique symbol export type JsonSchema = JsonObject & { [JsonSchemaBrand]: T } // 用于测试/类型推导 export type InferSchemaType> = T extends JsonSchema ? U : never ``` **E3. `FollowUpTask.type` 引用不存在的 `TaskType` 成员** `FollowUpTask.type` 定义为 `TaskType | "docs"`,但 `TaskType` 不含 `"docs"`。`"docs"` 作为类型字符串存在于类型标注中,但 Scheduler 收到 `type: "docs"` 时无法创建合法的 `TaskSpec.type`(它是 `TaskType`,不含 `"docs"`)。 **建议修复:** 将 `"docs"` 加入 `TaskType`:`TaskType = ... | "docs"` #### 2.1.2 缺失接口 **E4. `DebugKnowledgeStore` 和 `LearnedMemoryStore` 无任何接口定义** `runtime-semantics-v1.md` §6.3-6.4 引用了这两个关键服务,但 `interface-contracts-v1.md` 中没有任何对应接口。开发者实现 §6 的跨 DB 事务语义时没有契约参照。 **E5. `CompactionPolicy`、`PromptLayer`、`PromptLayerLoader` 无任何接口定义** `c4/code-view.md` §4 列出了 `CompactionPolicy.ts` 和 `PromptLayerLoader.ts`,`prompt-layering-v1.md` 详细描述了 L0-L9 分层逻辑。但 `interface-contracts-v1.md` §16 只定义了极简的 `ContextAssembler` 输入输出,`PromptLayer` 和 `CompactionPolicy` 的类型形状完全空白。 #### 2.1.3 语义不完整 **E6. `PathPolicy` 类型仅有 `allow/deny`,缺失 `source` 元数据** `interface-contracts-v1.md` 中 `PathPolicy` 定义为 `{ allow?: string[], deny?: string[] }`,但 `security-model-v1.md` 和 `runtime-semantics-v1.md` 要求路径评估考虑 "从哪个角色/配置文件来的"。`PathPolicy` 需要 `source` 元数据来表达这个语义。 **E7. `PermissionEngine.record` 返回 `Promise` 无失败路径** 如果记录权限决策失败(磁盘满、DB 锁),调用方无法得知。这违反 "证据优先" 架构原则。 **建议修复:** 返回 `Promise>` 或指定抛出的类型化错误。 **E8. `ProjectionStore.apply` 接受 `RuntimeEvent` — 无类型窄化** 实现者需要猜测哪些事件触发投影更新。当前设计依赖运行时类型检查,而 contracts 包应该为关键投影提供编译时保证。 **E9. `EventBus.subscribe` handler 异常行为未定义** 如果订阅 handler 抛出异常:EventBus 吞掉错误?传播给发布者?终止订阅?contracts 未定义。 **建议:** 明确 "handler 异常被 EventBus 吞掉并记录到 developer log,不传播给发布者,不终止订阅"。 #### 2.1.4 类型别名一致性 **E10. 多处缺少 branded ID 类型** `SchedulerWavePlan.wave_id` 是 `string`,而非 `WaveID`。其他标识符都用了品牌化类型(`TaskID`、`AgentID` 等),`wave_id` 应该一致。 ### 2.2 可测试性评估 **优点:** - `Clock` 和 `IdGenerator` 接口设计良好,支持时间/ID 确定性测试 - `TransactionHandle` 接口允许测试事务边界 - Repository 接口支持 mock/stub - EventBus/EventStore/EventIngestor 边界清晰,可独立测试 **不足:** - `ToolExecutor.execute` 返回 `AsyncIterable | Promise` 未品牌化联合,测试需 duck-type - `ProviderAdapter.complete` 返回值相同问题 - 无契约定义 IPC mock/stub 边界 ### 2.3 可部署性评估 **优点:** - `Clock` 抽象使时间可控 - `IdGenerator` 抽象使 ID 可预测 - `TransactionManager` 抽象使事务边界可测试 - binary tarball 分发策略清晰 **不足:** - 无环境变量/配置文件 schema 定义(除 `~/.air/models.yaml` 外) - 无 Docker/容器化分发方案 ### 2.4 工程师结论 **必须修复(阻塞实现):E1、E3、E4、E5** **应在实现前修复:E2、E6、E7、E8、E9、E10** 其余问题可在实现过程中逐步处理。interface-contracts-v1.md 是最大的单一阻塞文件 — 一旦它稳定,package 边界就稳定了。 --- ## 3. 用户视角 ### 3.1 核心需求对齐表 按 AirCoding 原始概念文件 (`idea.md`)、讨论中确立的决策和 VibeBox 衍生分支重新评估: | # | 原始需求 | 当前架构状态 | 对齐度 | |---|---|---|---| | 1 | 自有 AI coding agent/runtime,非 Claude Code 插件包装 | 独立架构,自有运行时/调度器/工具系统/权限引擎 | 完全 | | 2 | Claude Code 级执行层代码质量 | D-059 + runtime-semantics §9(read-before-edit token、exact edit、completion gate) | 完全 | | 3 | OpenCode TUI 复用(UI 风格,非业务状态) | `@opentui/solid`,TUI 只消费 ProjectionClient,不导入 runtime 内部 | 完全 | | 4 | Hermes-style 经验挖掘/技能/Curator | ExperienceMiner 角色、candidate→promotion→rollback 生命周期、Skill/SKILL.md 格式 | 充分 | | 5 | 事件驱动 + SQLite 恢复 | EventBus 实时 + EventStore 持久化 + ProjectionStore 投影 + restart recovery | 完全 | | 6 | 独立子进程 worker + NDJSON IPC | Bun child processes + 完整 IPC envelope(control/event/log/tool.call/result/stream/worker.result/checkpoint/error) | 完全 | | 7 | C++ 为第一个深度语言 | `toolchain-cpp` 完整工作流(detect/configure/build/static-analysis/test/debug/fix/review/verify) | 完全 | | 8 | 项目本地状态可携带 | `.air/shared`(git-shareable)+ `.air/local`(project-local) | 完全 | | 9 | 多 agent 调度(Scheduler + TaskGraph) | Scheduler state machine + 边列表依赖 + write-area 冲突 + wave dispatch + merge coordination | 完全 | | 10 | 权限模型(分层确认、高权限 announce_then_run) | PermissionEngine + action + grant_scope + layered checks + 凭据/系统敏感边界 | 完全 | | 11 | AirConsole 模块化工作流 | AirPlan/AGENTS.md 入口 + AirArc/AirEng/AirDo 工作流 + AirDbg/AirNDB/AirSDB/AirXDB 调试插件 | 完全 | | 12 | VibeBox 下位分支(ARM Linux appliance) | `branchvibebox/` 独立 baseline + feasibility plan + Electron 模板 | 完全 | | 13 | 不可半成品 MVP,目标 V1.0.0 Alpha | 范围含完整 C++ 开发闭环 + 插件/能力基础 + 发布验证 | 完全 | | 14 | 参考 Codex 工具/OpenAI 工具 | `reference/openai-codex/`,tool-registry 含 Codex 风格 tool breadth | 充分 | | 15 | 参考 Anthropic Claude Skills | `reference/anthropic-skills/`,SKILL.md 格式在 ExperienceMiner 中引用 | 充分 | ### 3.2 设计质量评估 **满足/超越需求的领域:** 1. **EventIngestor 引入**:比原始需求更清晰地分离了事件摄入与持久化,是超出原始讨论的架构改进 2. **边列表任务依赖**:从原始讨论的 "hard/soft 数组" 演进到 `(hard|soft|conflict|serialization)` 边列表,表达能力更强 3. **IPC 协议**:从原始讨论的 "event/control/log" 三个 kind 扩展到 9 个 kind,覆盖了 worker 的完整通信需求 4. **跨 DB 事务语义**:主动定义了 debug-records.db、learned-memory.db 的 outbox/compensation 模型 5. **执行原语强化**:从 "原则" 级别提升到 "read observation token required for edit" 的强制契约级别 **与用户意图一致的权衡:** | 权衡 | 用户意图 | 架构决策 | 一致性 | |---|---|---|---| | 进度优先 vs 完美 | 用户多次表示 "先确定再完善" | 定义清晰的文档优先级,允许渐进式完善 | 一致 | | 复用 vs 自研 | "能复用就复用,不能就 AI 生成" | TUI 复用 OpenTUI,核心运行时自研 | 一致 | | 权限 vs 自动化 | "高权限模式 auto-run,凭据必须确认" | action + grant_scope 模型 | 一致 | | 复杂度 vs 可用性 | "V1.0.0 Alpha 不是半成品" | 完整 C++ 工作流 + 插件基础在范围内 | 一致 | ### 3.3 用户体验路径 最终开发者体验路径: ```text $ air init # 一键初始化项目 $ air # 启动 TUI/HUD > 帮我修复 src/core/parser.cpp 的编译错误 → Main Agent 分类 → Scheduler 创建 Executor 任务 → Executor 读取文件 → 精确编辑 → 构建 → 测试 → Reviewer 审查 → 通过 → 合并 workspace → 展示 diff + 构建/测试证据 ``` 这个路径在架构中完全支持,从 CLI 到 TUI 到 Scheduler 到 tools 到 workspace merge 到 evidence 展示都有覆盖。 ### 3.4 用户视角结论 **架构完全对齐原始需求,无方向性偏差。** 每一个关键决策都可以追溯到讨论中明确的选择。 --- ## 4. 三视角综合结论 ### 4.1 阻塞实现的问题(6 项) 这些必须在进入 `packages/contracts` 编码前解决: | ID | 问题 | 涉及文档 | 修复方向 | |---|---|---|---| | E1 | `TaskInsert = TaskRecord` 不安全 | interface-contracts-v1 | 定义 Omit 子集类型 | | E3 | `FollowUpTask.type` 含 `"docs"` 但 `TaskType` 无 | interface-contracts-v1 | 将 docs 加入 TaskType | | E4 | `DebugKnowledgeStore` / `LearnedMemoryStore` 缺失 | interface-contracts-v1 | 添加对应接口 | | E5 | `PromptLayer` / `CompactionPolicy` / `PromptLayerLoader` 缺失 | interface-contracts-v1 | 添加对应接口 | | E9 | `EventBus.subscribe` handler 异常行为未定义 | interface-contracts-v1 | 明确吞掉+记录 | | B3* | `debug-records.db` / `learned-memory.db` 无 DDL | db-schema-v1 | 补充 DDL | > *B3 来自上一轮审查,本节确认仍然有效。 ### 4.2 应在实现前修复的问题(6 项) | ID | 问题 | 涉及文档 | 修复方向 | |---|---|---|---| | E2 | `JsonSchema` phantom generic | interface-contracts-v1 | 品牌化或移除 | | E6 | `PathPolicy` 缺少 source 元数据 | interface-contracts-v1 | 添加 source 字段 | | E7 | `PermissionEngine.record` 无错误路径 | interface-contracts-v1 | 返回 Result 类型 | | E8 | `ProjectionStore.apply` 无类型窄化 | interface-contracts-v1 | 添加事件类型文档 | | E10 | `wave_id` 非品牌化 ID | interface-contracts-v1 | 添加 WaveID 类型 | | B1* | error-taxonomy cause_ref 冲突 | error-taxonomy-v1 | 统一为 EntityRef | > *B1 来自上一轮审查,本节确认仍然有效。 ### 4.3 可接受延迟的问题(4 项) | 问题 | 理由 | |---|---| | error-taxonomy 和 event-registry 中的 EntityRef 内联定义 | 编译时可通过 import 解决,不影响核心架构 | | ToolCategory/ToolResultEnvelope 重复定义 | 编译时结构兼容,仅需一次 import 修复 | | 无 Docker 分发方案 | V1.0.0 Alpha 仅需 binary tarball | | 无环境变量 schema | 实现时可后期补充 | ### 4.4 架构质量评分 | 维度 | 评分 | 说明 | |---|---|---| | 概念完整性 | 9/10 | 核心原则一致,包边界清晰 | | 跨文档一致性 | 7/10 | 大部分已收敛,6 项不一致待修复 | | 可编译性 | 7/10 | 修复 E1/E3 后可编译,修复 E4/E5 后完整 | | 可测试性 | 8/10 | Clock/IdGenerator 抽象好,ToolExecutor 返回值待改进 | | 可部署性 | 7/10 | binary tarball 清晰,Docker 可选 | | 需求对齐度 | 10/10 | 所有原始需求在架构中均有对应设计 | | 平均 | **8.0/10** | 充分进入概要设计阶段 | ### 4.5 与 MIMO2.5 审查的比较 | 维度 | MIMO2.5 | DeepSeek V4 Pro | |---|---|---| | 发现问题数 | 16 (6B+10S) | 16 (6E-critical + 6E-should + 4E-ok) | | 关键分歧 | — | `ForeignKeys` 问题(MIMO2.5 视为 S8),本审查认为已有合理工程解释 | | 新发现 | — | E6 (PathPolicy 缺少 source)、E9 (EventBus 异常行为) | | 共识 | B1-B3/B5/B6/S1-S7 相同 | 一致 | | 总体评分 | — | 8.0/10 | DeepSeek V4 Pro 与 MIMO2.5 两个独立模型在阻塞问题识别上高度一致,增加了审查结论的置信度。 --- ## 5. 下一步行动 ### 立即行动(进入概要设计前) 1. 修复 E1:`TaskInsert` 改为 Omit 子集 2. 修复 E3:`TaskType` 加入 `"docs"` 3. 修复 E4/E5:补充 `DebugKnowledgeStore`、`LearnedMemoryStore`、`PromptLayer`、`CompactionPolicy` 接口 4. 修复 E9:明确 `EventBus.subscribe` handler 异常行为 5. 修复 B3:补充 `debug-records.db` / `learned-memory.db` DDL 6. 修复 B1:`error-taxonomy` 中 `cause_ref` 统一为 `EntityRef` ### 概要设计中同步 7. 修复 E2/E6/E7/E8/E10 8. 修复跨文档的 EntityRef 和 ToolCategory 重复定义问题 9. 产出 `系统概要设计.md` 10. 产出 `系统详细设计.md` ### 总体建议 **进入概要设计阶段**,先修 6 项立即行动问题,再产出概要设计文档。