Files
AirCoding/AirPlan/docs/architecture/DeepSeekV4Pro三视角审查.md
AirCoding 33a76a1ebc Move project from external drive to local NVMe
迁移路径: /run/media/airlongdian/EasyU/AirCoding -> /home/airlongdian/DataDevices/AirWorkSpace/AirCoding

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-06-02 09:51:49 +08:00

18 KiB
Executable File
Raw Permalink Blame History

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/serializationScheduler 可动态追加持久化冲突边
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 依赖方向分析

包级依赖方向已收敛为单向无循环图:

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_atretry_countstatus。正确做法是定义子集类型。

建议修复:

export type TaskInsert = Omit<TaskRecord, "created_at" | "retry_count"> & {
  status?: TaskStatus  // defaults to "pending"
  retry_count?: number // defaults to 0
}

E2. JsonSchema<T> 泛型参数 T 未使用

第 41 行:export type JsonSchema<T = unknown> = JsonObject。T 在类型体中从未引用,是 phantom type不提供任何编译时安全检查。要么移除泛型参数要么定义品牌化类型。

建议修复:

declare const JsonSchemaBrand: unique symbol
export type JsonSchema<T = unknown> = JsonObject & { [JsonSchemaBrand]: T }

// 用于测试/类型推导
export type InferSchemaType<T extends JsonSchema<unknown>> = 
  T extends JsonSchema<infer U> ? U : never

E3. FollowUpTask.type 引用不存在的 TaskType 成员

FollowUpTask.type 定义为 TaskType | "docs",但 TaskType 不含 "docs""docs" 作为类型字符串存在于类型标注中,但 Scheduler 收到 type: "docs" 时无法创建合法的 TaskSpec.type(它是 TaskType,不含 "docs")。

建议修复:"docs" 加入 TaskTypeTaskType = ... | "docs"

2.1.2 缺失接口

E4. DebugKnowledgeStoreLearnedMemoryStore 无任何接口定义

runtime-semantics-v1.md §6.3-6.4 引用了这两个关键服务,但 interface-contracts-v1.md 中没有任何对应接口。开发者实现 §6 的跨 DB 事务语义时没有契约参照。

E5. CompactionPolicyPromptLayerPromptLayerLoader 无任何接口定义

c4/code-view.md §4 列出了 CompactionPolicy.tsPromptLayerLoader.tsprompt-layering-v1.md 详细描述了 L0-L9 分层逻辑。但 interface-contracts-v1.md §16 只定义了极简的 ContextAssembler 输入输出,PromptLayerCompactionPolicy 的类型形状完全空白。

2.1.3 语义不完整

E6. PathPolicy 类型仅有 allow/deny,缺失 source 元数据

interface-contracts-v1.mdPathPolicy 定义为 { allow?: string[], deny?: string[] },但 security-model-v1.mdruntime-semantics-v1.md 要求路径评估考虑 "从哪个角色/配置文件来的"。PathPolicy 需要 source 元数据来表达这个语义。

E7. PermissionEngine.record 返回 Promise<void> 无失败路径

如果记录权限决策失败磁盘满、DB 锁),调用方无法得知。这违反 "证据优先" 架构原则。

建议修复: 返回 Promise<Result<void, AirError>> 或指定抛出的类型化错误。

E8. ProjectionStore.apply 接受 RuntimeEvent<unknown> — 无类型窄化

实现者需要猜测哪些事件触发投影更新。当前设计依赖运行时类型检查,而 contracts 包应该为关键投影提供编译时保证。

E9. EventBus.subscribe handler 异常行为未定义

如果订阅 handler 抛出异常EventBus 吞掉错误传播给发布者终止订阅contracts 未定义。

建议: 明确 "handler 异常被 EventBus 吞掉并记录到 developer log不传播给发布者不终止订阅"。

2.1.4 类型别名一致性

E10. 多处缺少 branded ID 类型

SchedulerWavePlan.wave_idstring,而非 WaveID。其他标识符都用了品牌化类型(TaskIDAgentID 等),wave_id 应该一致。

2.2 可测试性评估

优点:

  • ClockIdGenerator 接口设计良好,支持时间/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 §9read-before-edit token、exact edit、completion gate 完全
3 OpenCode TUI 复用UI 风格,非业务状态) @opentui/solidTUI 只消费 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 envelopecontrol/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/sharedgit-shareable+ .air/localproject-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 用户体验路径

最终开发者体验路径:

$ 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<T> 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. 修复 E1TaskInsert 改为 Omit 子集
  2. 修复 E3TaskType 加入 "docs"
  3. 修复 E4/E5补充 DebugKnowledgeStoreLearnedMemoryStorePromptLayerCompactionPolicy 接口
  4. 修复 E9明确 EventBus.subscribe handler 异常行为
  5. 修复 B3补充 debug-records.db / learned-memory.db DDL
  6. 修复 B1error-taxonomycause_ref 统一为 EntityRef

概要设计中同步

  1. 修复 E2/E6/E7/E8/E10
  2. 修复跨文档的 EntityRef 和 ToolCategory 重复定义问题
  3. 产出 系统概要设计.md
  4. 产出 系统详细设计.md

总体建议

进入概要设计阶段,先修 6 项立即行动问题,再产出概要设计文档。