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,520 @@
# 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 冲突是真实的基线级问题,需要在冻结前解决。