Files
AirCoding/AirPlan/docs/architecture/opus4.8系统详细设计审查.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

521 lines
18 KiB
Markdown
Raw Permalink 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.
# Opus 4.8 系统详细设计全量交叉审查
Date: 2026-05-29
Reviewer: Claude Opus 4.8 (independent multi-model cross-review)
Status: Full cross-verification with independent findings and prior-review validation
Scope: `system-detailed-design.md` against all frozen baselines, frozen overview, internal consistency, and architecture soundness
---
## 1. 审查方法
### 1.1 审查对象
`AirPlan/docs/architecture/system-detailed-design.md`2033 行23 节)
### 1.2 审查输入
| 文档 | 角色 |
|---|---|
| `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` | 能力信任 |
| `baselineV1.md` | 架构基线 |
| `c4/code-view.md` | C4 代码视图 |
| `system-overview-design.md` (FROZEN) | 概要设计 |
### 1.3 前轮审查报告
| 审查者 | 结论 | P0 | P1 | P2 |
|---|---|---|---|---|
| DeepSeek | PASS | 0 | 0 | 3 |
| MIMO 2.5 Pro | PASS (附修复建议) | 0 | 2 | 5 |
| GPT-5.5 Pro | Requires repair | 0 | 2 (High) | 4 (Medium/Low) |
### 1.4 审查方法
1. 独立全量覆盖核对(不依赖前轮结论)
2. 前轮发现的独立验证
3. 寻找前轮可能遗漏的新问题
4. 基线间冲突的根因分析
5. 架构合理性和内在一致性评估
---
## 2. 总体评估
### 2.1 评分
| 维度 | 得分 | 说明 |
|---|---|---|
| 契约覆盖 | 9.5/10 | 接口字段全覆盖PromptLayerLevel/AgentType 类型边界有缺口 |
| 事件覆盖 | 10/10 | 55 durable + 7 ephemeral 全覆盖 |
| DB Schema 覆盖 | 10/10 | 19 表全仓储 |
| 状态机覆盖 | 10/10 | 6 个状态机全覆盖 |
| 基线一致性 | 7.5/10 | 2 处基线间冲突未收束1 处详细设计放大了冲突 |
| 架构合理性 | 9.0/10 | 依赖方向正确,职责分离良好,但 EventStore 职责边界模糊 |
| 可实现性 | 8.5/10 | 方法签名可编码,但 3 处需要设计决策才能实现 |
**综合评分9.1/10**
### 2.2 结论
详细设计在覆盖性上是完整的,但存在 **3 处需要在实现前解决的基线级冲突**。这些冲突不是详细设计本身的错误,而是上游冻结文档之间的语义不一致,详细设计未能收束它们。
**建议**:在冻结详细设计前,先修复基线间冲突,或在详细设计中明确记录设计决策来收束这些冲突。
---
## 3. 前轮发现验证
### 3.1 GPT-5.5 Pro 发现验证
| Finding | GPT-5.5 判定 | Opus 4.8 验证 | 结论 |
|---|---|---|---|
| Worker exit code 语义冲突 | High | **确认** | 真实基线冲突,需要修复 |
| EventStore.project 职责越界 | High | **部分确认** | 措辞问题,非职责越界(见 §4.1 |
| `memory.promoted` outbox 语义 | Medium | **确认** | 事件阶段语义不清 |
| `docs` task 类型未闭合 | Medium | **确认** | 需要设计决策 |
| Prompt role/profile 类型不完整 | Medium | **确认** | AgentType 不覆盖 main/architecture/scheduler |
| contracts 包文件集两套命名 | Low | **确认** | 需要统一 |
### 3.2 MIMO 2.5 Pro 发现验证
| Finding | MIMO 判定 | Opus 4.8 验证 | 结论 |
|---|---|---|---|
| PromptLayerLevel 枚举与 L0-L9 不对齐 | P1 | **确认** | 真实结构性不匹配 |
| EventStore.project() 错误处理未定义 | P1 | **确认** | 需要补充错误语义 |
| agent.started 投影措辞 | P2 | **确认** | 含糊但可接受 |
| WorkspaceManager/Scheduler 职责边界 | P2 | **确认** | 隐含分工但未显式标注 |
### 3.3 DeepSeek 发现验证
| Finding | DeepSeek 判定 | Opus 4.8 验证 | 结论 |
|---|---|---|---|
| PromptLayerLevel 枚举映射 | P2 | **升级为 P1** | 同意 MIMO 的升级判定 |
| Architecture gate 无独立序列图 | P2 | **确认** | 可从文本推导,非阻塞 |
| CLI catalog 类归属 | P2 | **确认** | IMPL 范围,非阻塞 |
---
## 4. Opus 4.8 独立发现
### 4.1 Finding O1 — High — Worker exit code 基线冲突(验证 + 根因分析)
**问题**
`baselineV1.md` §8 定义的 worker exit code 语义与 `system-overview-design.md` §11 和 `system-detailed-design.md` §8.1 不一致。
**baselineV1.md:351-360**(冻结基线):
```text
0 protocol-level completion, including task failed/blocked
1 uncaught exception
2 startup/protocol error
3 permission error
4 parent cancelled
5 hard timeout killed
```
**system-overview-design.md:856-866****system-detailed-design.md:566-569**
```text
0 success
1 task failed
2 crashed
3 protocol error
4 cancelled
5 permission/policy blocked
```
**根因分析**
这不是详细设计的错误,而是 **概要设计在冻结时已经与基线冲突**。概要设计声称"frozen source documents are authoritative",但它自己定义了一套不同的 exit code 语义。详细设计沿用了概要设计的定义,从而继承了这个冲突。
**关键语义差异**
| Exit code | baselineV1 | overview/DD | 冲突点 |
|---|---|---|---|
| 0 | protocol-level completion (包括 task failed/blocked) | success | **task failed 是 0 还是 1** |
| 1 | uncaught exception | task failed | **task failed 是业务失败还是进程异常?** |
| 2 | startup/protocol error | crashed | **crashed 是否包含 startup error** |
| 3 | permission error | protocol error | **permission 和 protocol 互换了** |
| 5 | hard timeout killed | permission/policy blocked | **timeout 和 permission 互换了** |
**影响**
`WorkerManager` 实现时无法确定:
- task failed/blocked 应该返回 exit code 0baselineV1还是 1overview/DD
- permission blocked 应该返回 exit code 3baselineV1还是 5overview/DD
- Scheduler 的 retry/blocked/failed/lost 判定逻辑会因此不确定
**建议处理**
1. 确定哪份文档是权威baselineV1 还是 overview
2. 如果 baselineV1 是权威,修复 overview 和 DD
3. 如果 overview 是权威,记录 ADR 说明 baselineV1 §8 被 overview §11 取代
4. 无论哪种DD 应明确task failed/blocked 通过 WorkerResult 返回exit code 0 表示协议正常完成
---
### 4.2 Finding O2 — High — EventStore.project 职责边界澄清
**问题**
GPT-5.5 Pro 报告 EventStore.project 职责越界,但 Opus 4.8 认为这是 **措辞问题而非真正的职责越界**
**DD §5.4 投影映射表**
```text
context.compaction.requested | insert compaction task if accepted
memory.promoted | append + write rules/skill/learned-memory.db via owner (outbox §18.4)
debug.record.created | insert/update debug-records.db (outbox §18.4) + append session event
```
**runtime-semantics-v1.md:43**
```text
EventStore must not create scheduler tasks, permission decisions, memory promotions, or doctor fixes by policy.
```
**Opus 4.8 分析**
DD §5.4 的措辞确实容易误解,但仔细阅读后:
1. `context.compaction.requested | insert compaction task if accepted` — 这里的 "if accepted" 暗示 Scheduler 做决策EventStore 只是记录事件。但措辞不清。
2. `memory.promoted | append + write ... via owner (outbox §18.4)` — "via owner" 明确说明写入由 owning service 执行EventStore 只 append 事件。
3. `debug.record.created | insert/update debug-records.db (outbox §18.4)` — 同样引用 outbox 模型,说明外部写入不在 EventStore 事务内。
**真正的问题**
DD §5.4 的投影映射表混合了两种不同的内容:
- session DB domain projection应该在 EventStore.project 内)
- cross-DB/file side effects应该由 owning service 处理EventStore 只 append 事件)
这种混合导致读者误解 EventStore 的职责边界。
**建议处理**
将 DD §5.4 拆分为两个表:
1. **Session DB projection map**:只包含 session DB domain table updates
2. **Cross-store side effect triggers**:说明哪些事件触发 owning service 的外部操作
---
### 4.3 Finding O3 — Medium — PromptLayerLoader 接口与 prompt-layering 层定义不匹配
**问题**
`prompt-layering-v1.md` §2 定义了 L0-L9 共 10 层,但 `interface-contracts-v1.md` §16 的 `PromptLayerLoader` 接口只有 4 个方法:
```ts
export interface PromptLayerLoader {
load_runtime_invariant(): PromptLayer // L0
load_role(role: AgentType): PromptLayer // L1
load_project_rules(project: ProjectContext): PromptLayer[] // L3
load_task_context(spec: TaskSpec, refs: TaskContextRefs): PromptLayer[] // L5
}
```
**缺失的层**
| Layer | Name | Loader method |
|---|---|---|
| L2 | Safety and permission policy | **缺失** |
| L4 | Architecture baseline and current plan | **缺失** |
| L6 | Relevant code/artifacts/evidence | **缺失** |
| L7 | Recent conversation and decision context | **缺失** |
| L8 | Tool result history / diagnostics | **缺失** |
| L9 | Immediate instruction | **缺失** |
**DD §10.2 的处理**
DD §10.2 承认了这个差异,并用 IMPL 注释说明:
```text
IMPL note: contracts §16 enumerates 10 PromptLayerLevel symbols; prompt-layering L2 (safety) is
carried by the runtime_invariant/role immutable layers and a dedicated safety layer is loaded with
immutable=true.
```
但这只解释了 L2没有解释 L4-L9 如何加载。
**影响**
实现 `ContextAssembler` 时,需要加载 10 层,但 `PromptLayerLoader` 接口只提供 4 个方法。实现者必须:
- 扩展接口(违反冻结契约)
-`load_task_context` 中塞入所有剩余层(违反单一职责)
-`ContextAssembler` 中硬编码剩余层的加载逻辑(绕过 Loader 抽象)
**建议处理**
在 DD 中明确记录设计决策:
```text
PromptLayerLoader 接口只覆盖需要外部配置/数据的层L0, L1, L3, L5
其他层由 ContextAssembler 内部组装:
- L2 Safety: 从 PermissionEngine 获取当前 permission profile
- L4 Architecture: 从 TaskSpec.context_refs.arc_ref 加载
- L6 Evidence: 从 TaskSpec.context_refs.artifacts 加载
- L7 Conversation: 从 SessionStore.messages 加载
- L8 Tool output: 从 SessionStore.tool_runs/command_runs 加载
- L9 Immediate: 从 TaskSpec.description/acceptance_criteria 构建
```
---
### 4.4 Finding O4 — Medium — AgentType 不覆盖 runtime roles
**问题**
`interface-contracts-v1.md` §5 定义:
```ts
export type AgentType = "executor" | "reviewer" | "debugger" | "compactor" | "experience_miner"
```
`prompt-layering-v1.md` §3.1 要求 L1 role 覆盖:
```text
built-in role prompt for main/architecture/scheduler/executor/reviewer/debugger/compactor/experience_miner
```
`main`, `architecture`, `scheduler` 不在 `AgentType` 中。
**影响**
`PromptLayerLoader.load_role(role: AgentType)` 无法类型安全地加载 Main Agent、Architecture Designer、Scheduler 的 role prompt。
**DD §10.2 的处理**
DD 沿用了 contracts 的 `AgentType`,没有补充 runtime role 类型。
**建议处理**
在 DD 中明确:
```text
AgentType 只覆盖 worker roleschild process agents
Runtime rolesmain, architecture, scheduler不通过 PromptLayerLoader.load_role 加载,
而是由 MainAgent/ArchitectureDesigner/Scheduler 内部硬编码其 role prompt。
```
或者建议在 contracts 中添加:
```ts
export type RuntimeRole = "main" | "architecture" | "scheduler"
export type PromptRole = RuntimeRole | AgentType
```
---
### 4.5 Finding O5 — Low — DD §18.4 outbox 示例与 runtime-semantics 不一致
**问题**
DD §18.4 的 outbox 示例:
```text
Example: memory.promoted → session event (step 1) → LearnedMemoryStore.insert (step 3) →
memory.promoted completion evidence (step 4).
```
这暗示 `memory.promoted` 同时是 step 1 的 intent event 和 step 4 的 completion event。
`runtime-semantics-v1.md` §6.4 说:
```text
memory.promoted means:
candidate was approved/promoted by owning service
rule/skill/learned-memory write is performed by ExperienceMiner/Curator service
session event records completed promotion and target ref
```
这里 `memory.promoted` 只表示 completed promotion不是 intent。
**影响**
如果 `memory.promoted` 是 completion event那 step 1 的 intent event 是什么DD 没有说明。
**建议处理**
明确 outbox 流程:
```text
1. memory.candidate.created (intent/request)
2. ExperienceMiner/Curator 审批
3. LearnedMemoryStore.insert
4. memory.promoted (completion)
```
或者如果 `memory.promoted` 确实是 intent+completion 合一,需要在 DD 中明确说明这是一个简化设计,并解释 recovery 如何区分 pending 和 completed。
---
## 5. 覆盖性检查
### 5.1 契约覆盖
| 契约章节 | DD 覆盖 | 状态 |
|---|---|---|
| §2 Core primitives | §3 ids.ts | ✓ |
| §3 Error | §3 error.ts, §18.1 | ✓ |
| §4 EntityRef | §3 event.ts | ✓ |
| §5 RuntimeEvent | §3 event.ts, §5 | ✓ |
| §6 Transaction/Repository | §4.1-§4.3, §18.2 | ✓ |
| §7 EventBus/Store/Ingestor | §5.1-§5.5 | ✓ |
| §8 Project/Session | §6 | ✓ |
| §9 Task/Scheduler | §7 | ✓ |
| §10 IPC | §8.1-§8.3 | ✓ |
| §11 WorkerResult | §8.3 | ✓ |
| §12 Tool | §9.1 | ✓ |
| §13 Permission | §9.2-§9.3 | ✓ |
| §14 Artifact/Evidence | §11.1-§11.2 | ✓ |
| §15 Provider | §12 | ✓ |
| §16 Context/Prompt | §10 | ✓ |
| §17 Projection | §13 | ✓ |
| §18 Capability | §9.5 | ✓ |
| §19 Doctor | §16 | ✓ |
| §20 Knowledge | §11.3 | ✓ |
| §21 Diagnostic | §15 | ✓ |
| §22 Versioning | §3 | ✓ |
| §23 Forbidden paths | §2, §18.5 | ✓ |
**结果23/23 契约章节全覆盖**
### 5.2 事件覆盖
55 个 durable 事件全部在 DD §5.4 投影映射表中覆盖。
7 个 ephemeral 事件全部在 DD §5.5 中列出。
**结果62/62 事件全覆盖**
### 5.3 DB Schema 覆盖
19 张表全部有对应的 Repository 或 Store。
**结果19/19 表全覆盖**
### 5.4 状态机覆盖
| 状态机 | DD 覆盖 | 状态 |
|---|---|---|
| Main Agent (9 states) | §14.1, §20.1 | ✓ |
| Scheduler (11 states) | §7, §20.2 | ✓ |
| Task status (7 values) | §20.3 | ✓ |
| Agent status (6 values) | §20.4 | ✓ |
| Workspace status (5 values) | §20.5 | ✓ |
| Capability lifecycle (8 phases) | §9.5, §20.6 | ✓ |
**结果6/6 状态机全覆盖**
### 5.5 禁止路径覆盖
10 条 contracts §23 禁止路径全部在 DD §2 和 §18.5 中强制执行。
**结果10/10 禁止路径全覆盖**
---
## 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)
```
**评估**:完全正确。无循环依赖。
### 6.2 职责分离
| 组件 | 职责边界 | 评估 |
|---|---|---|
| EventIngestor | 不创建 scheduler/permission/memory 决策 | ✓ |
| EventStore | 持久化 + session DB projection | ✓ (但措辞需澄清) |
| EventBus | 不是恢复源 | ✓ |
| SessionStore | 不含调度/权限/投影策略 | ✓ |
| Scheduler | 不是编码代理 | ✓ |
| ToolRegistry | 所有 side effect 经过 PermissionEngine | ✓ |
| PermissionEngine | 不绕过 credential/system-sensitive override | ✓ |
| TUI | 只依赖 ProjectionClient/contracts | ✓ |
| ContextAssembler | 不自行压缩 | ✓ |
**评估**:职责分离良好,无泄漏。
### 6.3 事务语义
所有 durable event + domain update 在同一 SQLite transaction 内。
EventBus publish 在 commit 后。
Cross-DB writes 使用 outbox 模型。
**评估**:事务语义正确。
---
## 7. 门禁判定
| 条件 | 状态 |
|---|---|
| P0 = 0 | **PASS** |
| 契约覆盖 100% | **PASS** |
| 事件覆盖 100% | **PASS** |
| DB Schema 覆盖 100% | **PASS** |
| 状态机覆盖 100% | **PASS** |
| 禁止路径全执行 | **PASS** |
| 架构无循环依赖 | **PASS** |
| 职责分离无泄漏 | **PASS** |
| 基线间冲突已收束 | **FAIL** (3 处未收束) |
**门禁结果CONDITIONAL PASS**
详细设计在覆盖性和架构合理性上通过,但存在 3 处基线间冲突需要在冻结前解决:
1. Worker exit code 语义冲突baselineV1 vs overview/DD
2. PromptLayerLoader 接口与 prompt-layering 层定义不匹配
3. `memory.promoted` outbox 阶段语义不清
---
## 8. 修复建议优先级
| 优先级 | Finding | 建议处理 |
|---|---|---|
| **P0** | Worker exit code 冲突 | 发布 ADR 明确 baselineV1 §8 被 overview §11 取代,或修复 overview/DD |
| **P1** | EventStore.project 措辞 | 拆分 DD §5.4 为 session DB projection 和 cross-store triggers 两个表 |
| **P1** | PromptLayerLoader 接口 | 在 DD §10.2 明确记录 L2/L4-L9 的加载方式 |
| **P2** | AgentType 不覆盖 runtime roles | 在 DD 中明确 runtime roles 的 prompt 加载方式 |
| **P2** | `memory.promoted` outbox 语义 | 明确 intent event 和 completion event 的区分 |
| **P3** | contracts 包文件集命名 | 在 DD 中冻结唯一文件树 |
| **P3** | `docs` task 类型 | 决定是正式 task type 还是移除 |
---
## 9. 与前轮审查的一致性总结
| 审查者 | P0 | P1 | P2 | 综合评分 | Opus 4.8 验证 |
|---|---|---|---|---|---|
| DeepSeek | 0 | 0 | 3 | 9.6/10 | 过于乐观,遗漏了基线冲突 |
| MIMO 2.5 Pro | 0 | 2 | 5 | 9.4/10 | 准确,但未深入基线冲突根因 |
| GPT-5.5 Pro | 0 | 2 | 4 | — | 准确,发现了基线冲突 |
| **Opus 4.8** | 0 | 2 | 5 | 9.1/10 | 验证前轮 + 根因分析 + 修复建议 |
**多模型审查结论**
四轮审查在覆盖性上一致100%在基线冲突上逐步深入。Opus 4.8 确认 GPT-5.5 Pro 发现的 Worker exit code 冲突是真实的基线级问题,需要在冻结前解决。