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

304 lines
16 KiB
Markdown
Executable File
Raw 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 系统详细设计与 UML 类图全量审查复查
Date: 2026-06-01
Reviewer: Claude Opus 4.8 (independent full-scope re-audit)
Scope: 全量复查 — 覆盖性 + 内在一致性 + 基线遵守 + 架构合理性 + 内在冲突
Target commit: `af99aed`R 系列回归修复后)
Inputs:
- 详细设计:`system-detailed-design.md`2290 行23 章节,含 §22 8 张 Mermaid 类图)
- 冻结基线:`interface-contracts-v1.md``event-registry-v1.md``db-schema-v1.md`
`runtime-semantics-v1.md``scheduler-state-machine-v1.md``main-agent-state-machine.md`
`prompt-layering-v1.md``scope-escalation-v1.md``security-model-v1.md``tool-registry-v1.md`
`capability-trust-v1.md``artifact-naming-v1.md``error-taxonomy-v1.md``baselineV1.md`
- 冻结概要设计:`system-overview-design.md`
- 此前审查DeepSeek / MIMO 2.5 Pro / GPT-5.5 Pro / Opus 4.8(R4) / Opus 4.7(R5 回归)
---
## 1. 审查方法
本次为**独立全量复查**,不预设此前 5 轮审查已经完备。从零重建以下证据链:
1. **逐行通读 DD 全文**§0-§232290 行)
2. **枚举式覆盖核对**:用脚本从基线提取契约接口名 / 事件名 / DB 表名 / 状态机,再与 DD 逐一比对(`comm -23` / `comm -13` 差集法)
3. **基线遵守抽样核验**:对 DD 中所有 `Class.method()` 形式的引用,回查契约是否真实存在该方法(这正是 R5 发现 `current_profile()` 越界的同类问题,本次扩大到全部点名方法)
4. **架构合理性**:依赖方向、职责分离、事件流时序、跨 DB outbox、FK-off 不变式
5. **UML 逐张审查**8 张类图的语法、类数、边与正文一致性
6. **内在冲突**:同一概念跨章节是否自洽
---
## 2. 总览结论
| 维度 | 状态 |
|---|---|
| 契约覆盖 | ✅ 100%23 个契约章节全部映射) |
| 事件覆盖 | ✅ 100%55 durable + 7 ephemeral含聚合写法 |
| DB Schema 覆盖 | ✅ 100%16 张主表 + 2 项目级 DBschema_meta 归 MigrationRunner |
| 状态机覆盖 | ✅ 100%main / scheduler / task / agent / workspace / capability 共 6 个) |
| PromptLayer L0-L9 覆盖 | ✅ 100% |
| 10 条禁止边 | ✅ 100% 显式继承 |
| UML 类图 | ✅ 8/8 存在且语法可解析 |
| R 系列(R1-01~R2-02) 回归修复 | ✅ 5/5 已闭合(本次复验) |
| 架构合理性 | ✅ 无循环依赖,职责分离清晰 |
| **新增 P0** | **0** |
| **新增 P1** | **0** |
| **新增 P2** | **4**F1/F5 契约方法越界F2/F3 类图欠完整) |
| 综合判定 | **CONDITIONAL PASS** — 4 项 P2 不阻断实现,建议合并修复 |
---
## 3. 覆盖性矩阵
### 3.1 契约覆盖interface-contracts-v1 → DD
`interface-contracts-v1.md` 共 23 个章节§2-§23DD §21.1 逐一映射,复验全部命中:
| 契约章节 | DD 章节 | 复验 |
|---|---|---|
| §2-§4 原语 / 错误 / 实体引用 | §3、§18.1 | ✓ |
| §6 事务存储 | §4、§18.2 | ✓ |
| §7 Event Bus/Store/Ingestor | §5 | ✓ 三接口签名逐字一致 |
| §8 项目/会话 | §6 | ✓ |
| §9 Task/Scheduler | §7 | ✓ |
| §10-§11 Worker/IPC/Result | §8 | ✓ exit code 与 baselineV1 §8 逐行一致 |
| §12-§13 Tool/Permission | §9 | ✓ |
| §14 Artifact/Evidence | §11 | ⚠ 见 F1 |
| §15 Provider | §12 | ✓ |
| §16 Context | §10 | ✓ PromptLayerLoader 4 方法签名逐字一致 |
| §17 Projection/UI | §13 | ✓ ProjectionSnapshot 8 个投影字段全覆盖 |
| §18 Capability | §9.5 | ✓ |
| §19 Doctor | §16 | ⚠ 见 F5 |
| §20 Debug/Memory | §11.3 | ✓ lookup_by_signature/by_task 存在 |
| §21 Diagnostic | §15 | ✓ |
| §22-§23 版本/边界规则 | §3、§18.5 | ✓ 10 条禁止边全继承 |
### 3.2 事件覆盖event-registry-v1 → DD
差集法核对registry §6 索引 55 durable + 7 ephemeral
- DD §5.4 Table A/B 显式列出 46 个事件名;
- 差集中 12 个"未直接出现"的事件(`agent.completed/failed/lost/cancelled`、6 个 `doctor.*``permission.prompt.requested/resolved`)经核查均由 DD 的**聚合写法**覆盖:
- `| agent.completed/failed/lost/cancelled | update agents.status |`§5.4 L384
- `| doctor.* | append (+ optional ...) |`§5.4 L409
- `| permission.prompt.requested/resolved | append |`§5.4 L408
- 7 个 ephemeral 全部在 §5.5 与 §13.1 列出(含 `command.stdout.delta`/`command.stderr.delta`)。
**结论**55 + 7 全覆盖,无遗漏。差集中出现的 `agents.status`/`sessions.status`/`events_session.db` 为投影目标列/库名,非事件名,属正常。
### 3.3 DB Schema 覆盖db-schema-v1 → DD repositories
db-schema §2-§18 共 17 表。DD §4.3 仓库清单覆盖 §3-§18 的 16 张业务表(一一对应),`schema_meta`§2`MigrationRunner` 持有DD §4.2、§21.3 明确)。两张项目级 DB`debug-records.db`/`learned-memory.db`§20`DebugKnowledgeStore`/`LearnedMemoryStore` 持有§11.3)。
**结论**17/17 表 + 2 项目级 DB 全覆盖。
### 3.4 状态机覆盖
| 状态机 | 基线 | DD |
|---|---|---|
| Main Agent | main-agent-state-machine.md | §14.1、§20.1 ✓ |
| Scheduler | scheduler-state-machine-v1.md §4 | §7、§20.2 ✓11 状态全列) |
| Task status | db-schema §7 | §20.3 ✓ |
| Agent status | db-schema §10 | §20.4 ✓ |
| Workspace status | db-schema §16 | §20.5 ✓ |
| Capability lifecycle | capability-trust §7 | §9.5、§20.6 ✓ |
6/6 状态机全覆盖。
### 3.5 需求覆盖requirements → DD workflows
- C++ 全流程configure/build/test/static-analysis/debug/fix/reviewDD §15 + §19.5 ✓
- GUI/网络取证工具:通过 capability + tool 注册§9.5、§15
- 静态分析(`docs/staticanalysis.md``CppcheckRunner` + `DiagnosticParser`§15
- TUI/HUD 投影§13 ✓
- Linux tier-1 release gate§16Doctor/release+ overview §15 ✓
### 3.6 PromptLayer L0-L9 覆盖
DD §10.2 表 1 将 11 个 `PromptLayerLevel` 枚举值(含 `system_debug`)映射到 L0-L9与 contracts §16 枚举、prompt-layering-v1 §2 完全对应。表 2 区分 PromptLayerLoaderL0/L1/L3/L5与 ContextAssembler 内部装配L2/L4/L6/L7/L8/L9。✓
### 3.7 UML 类图覆盖§22.1-§22.8
| 图 | 类数 | 状态 |
|---|---|---|
| §22.1 契约包 | 9 | ✓ |
| §22.2 运行时核心服务 | 9 | ✓ |
| §22.3 Scheduler | 7 | ✓ |
| §22.4 Tool/Permission | 5 | ⚠ F3 |
| §22.5 Worker/IPC | 9 | ✓ 5 个 Role 继承齐全 |
| §22.6 Provider | 6 | ✓ |
| §22.7 Context/Compaction | 4 | ⚠ F2 |
| §22.8 Agents | 2 | ✓ |
8/8 存在且语法可解析。两处欠完整见 §7。
---
## 4. 基线遵守审查
抽取 DD 中所有 `ClassName.method()` 形式引用,回查契约真实性:
| DD 引用 | 契约真实性 | 判定 |
|---|---|---|
| `PromptLayerLoader.load_role()` | contracts §16 存在 | ✓ |
| `EvidenceStore.list_for_task()` | contracts §14 **只有** `list_for_entity()` | ✗ **F1** |
| `EventBus.publish()` | contracts §7 存在 | ✓ |
| `ContextAssembler.load_layers()` | DD 内部私有方法(`-`),非契约 | ✓ |
| `SessionStore.referential_check()` | SessionStore 是 DD 内部聚合,非契约接口 | ✓ |
| `ProjectLocator.locate()` / `ProjectInitializer.scaffold()` | DD 标记 `IMPL` 辅助类 | ✓ |
| `DoctorService.check_capability()` | contracts §19 **只有** `run()` | ✗ **F5** |
| `current_profile()`R5 旧问题) | DD 中已 0 处、契约 0 处 | ✓ R1-01 已闭合 |
R 系列复验:`overview §10.3`R2-01`agent.started 单状态 + §20.4`R1-02`无 phase 字段`R1-03`16 mandatory files`R2-02均已正确落地。
---
## 5. 架构合理性审查
### 5.1 依赖方向与无循环
DD §2 复述 c4/module.md 的允许导入图:`contracts ← llm/toolchain-cpp/tui/runtime ← cli``workers` 仅依赖 contracts + WorkerRuntime IPC。无逆向边、无环。✓
### 5.2 职责分离
- **Scheduler vs WorkspaceManager**§7.5):策略归 Scheduler、机制归 WorkspaceManager9 行职责矩阵清晰,无泄漏。✓
- **EventStore vs 领域服务**§5.1、§5.3EventStore 只做事务投影,不创建 task/permission/memoryfollow-up 由 owning service 发出。✓
- **ToolRegistry / PermissionEngine / CapabilityRegistry**§9所有副作用经 PermissionEnginecapability 永不绕过。✓
### 5.3 事件流一致性
producer → EventIngestor → (durable: EventStore tx + projection + post-commit publish | ephemeral: EventBus) 在 §5.1、§5.3、§18.2 三处描述一致;"publish AFTER commit"contracts §7 rule 3一致。✓
### 5.4 跨 DB outbox 一致性
§18.4 经 R1-03 修复后,采用"owning store 先外部写 → 成功后 ingest 单个完成态事件"模型;与 runtime-semantics §6.3-§6.4、event-registry §3 payload无 phase 字段一致§5.4 Table B 与之呼应。✓ 无残留矛盾。
### 5.5 FK-off 应用层不变式
§18.3 列出 8 条不变式,与 runtime-semantics §14 逐条对应;`SessionStore.referential_check()` 在启动/周期运行。✓
---
## 6. 内在一致性与冲突审查
| 检查点 | 结果 |
|---|---|
| §5.3 EventStore 正文 vs §22.2 类图 | ✓ 一致append/append_many/query + publish-after-commit 边) |
| §20.4 Agent 状态机 vs §5.4 `agent.started` 投影 | ✓ R1-02 修复后自洽(单状态 + §20.4 过渡) |
| §10.3 Compaction 时序 vs §19.3 序列图 | ✓ 一致(仅 summary.created 插行) |
| §4.4 derive_command_status vs contracts §17 CommandRunProjection.status | ✓ 五值一致 |
| §17 CLI 命令清单 vs overview §14 catalog | ✓ DD 含 6 个 catalog 命令 + 5 个基础命令(run/init/doctor/e2e/release),后者在 overview §4/§15 有据,属合理超集 |
| §8.1 exit code vs baselineV1 §8 | ✓ 6 个 code 逐行一致 |
未发现跨章节概念冲突或时序矛盾。
---
## 7. UML 类图详细审查§22.1-§22.8 逐张)
- **§22.1 契约包**`EventSource.kind` 枚举与 §2 runtime-role 表协同;`RuntimeEvent → EventSource``WorkerResult → Artifact/Evidence``AirError → EntityRef` 边正确。✓
- **§22.2 核心服务**`EventStore → EventBus : publishes after commit``ProjectionStore → EventBus : subscribes` 准确反映事件流。✓
- **§22.3 Scheduler**6 个被组合类TaskGraph/WavePlanner/RetryPlanner/WorkspaceManager/AgentMonitor/WorkerManager齐全。建议旁注 "Scheduler owns policy; WorkspaceManager owns mechanism"(与 §7.5 呼应),非必须。
- **§22.4 Tool/Permission** — **F3**:图中 `ToolRegistry` 缺少到 `ToolDefinition` / `ToolExecutor` 的关系边;正文 §9.1 明确 ToolRegistry 注册/调用这两者。建议补 `ToolRegistry --> ToolDefinition : registers``ToolRegistry --> ToolExecutor : invokes`
- **§22.5 Worker/IPC**5 个 Role 实现 `WorkerRole` 继承齐全;`docs` TaskType 复用 ExecutorRole 无需新增节点,与 §8.3 一致。✓
- **§22.6 Provider**:双 adapter 继承 + converter + normalizer 边正确。✓
- **§22.7 Context/Compaction** — **F2**:图中 `ContextAssembler` 仅连 `PromptLayerLoader`/`CompactionPolicy`,但 §10.2 表 2 明确 ContextAssembler 内部装配 L2/L6/L7/L8 需读 `EvidenceStore``SessionStore.messages/tool_runs/command_runs`。类图低估了实际耦合。建议补 `ContextAssembler --> EvidenceStore``ContextAssembler --> SessionStore`(依赖型虚线即可)。
- **§22.8 Agents**`MainAgent`/`ArchitectureDesigner` → Scheduler/ContextAssembler/ProviderManager/EventIngestor 边正确;与 §2 "runtime role 不走 load_role" 决策一致。✓
---
## 8. 新发现P0 / P1 / P2 分类)
### F1 [P2] `EvidenceStore.list_for_task()` 不在契约
- **位置**DD §10.2 表 2L6 Evidence 行L932
- **问题**:引用 `EvidenceStore.list_for_task()`,但 contracts §14 `EvidenceStore` 仅声明 `create()``list_for_entity(entity_type, entity_id)`
- **根因**:与 R5 的 `current_profile()` 同类——为给 L6 找一个明确来源,点名了不存在的方法。
- **影响**:实现 ContextAssembler 时找不到 `list_for_task()`;轻微,因为 `list_for_entity("task", task_id)` 即可替代。
- **建议**:改为 `EvidenceStore.list_for_entity("task", task_id)`(契约真实方法)。
- **工作量**2 分钟
### F5 [P2] `DoctorService.check_capability()` 不在契约
- **位置**DD §16.1L1201
- **问题**`DoctorService` 类列出 `+check_capability(capability): Promise<DoctorIssue[]>`public `+`),但 contracts §19 `DoctorService` 仅声明 `run(input): Promise<DoctorRunOutput>`
- **根因**:把内部分解步骤当成公共契约方法暴露。
- **影响**:与 §0 "不引入新公共契约" 约束冲突;轻微。
- **建议**:改为私有 `-check_capability(...)`(与同段 `-self_bootstrap()` 一致风格),或并入 `run()` 内部说明。
- **工作量**1 分钟
### F2 [P2] §22.7 类图缺 ContextAssembler 内部装配依赖边
- 见 §7。建议补 `ContextAssembler --> EvidenceStore` / `--> SessionStore` 虚线依赖。
- **工作量**3 分钟
### F3 [P2] §22.4 类图缺 ToolRegistry → ToolDefinition/ToolExecutor 边
- 见 §7。建议补两条注册/调用关系边。
- **工作量**3 分钟
无 P0、无 P1。F1/F5 是契约边界的两处"点名了不存在的方法"与本轮独立抽样法直接相关F2/F3 是类图完整度问题,不影响正文设计正确性。
---
## 9. 门禁判定
| 条件 | 状态 |
|---|---|
| P0 = 0 | **PASS** |
| 契约覆盖 100% | **PASS** |
| 事件覆盖 100% | **PASS** |
| DB Schema 覆盖 100% | **PASS** |
| 状态机覆盖 100% | **PASS** |
| L0-L9 覆盖 | **PASS** |
| 禁止路径全继承 | **PASS** |
| 架构无循环依赖 | **PASS** |
| 职责分离无泄漏 | **PASS** |
| R 系列(R1/R2)修复已闭合 | **PASS** |
| 契约/payload 不变性(无越界方法/字段) | **FAIL**F1 + F5 两处契约方法越界) |
| UML 类图完整度 | **CONDITIONAL**F2 + F3 欠边,不影响正确性) |
**门禁结果CONDITIONAL PASS** — 覆盖性、架构、状态机全部 PASS4 项 P2 不阻断实现,但建议在冻结前一并修复以保持契约纯净。
---
## 10. 多轮累积视角
| 轮次 | 模型 | 主要贡献 | P0 | P1 | P2 |
|---|---|---|---|---|---|
| R1 | DeepSeek | 全量覆盖性 | 0 | 0 | 3 |
| R2 | MIMO 2.5 Pro | 内在一致性 | 0 | 2 | 5 |
| R3 | GPT-5.5 Pro | 基线冲突检测 | 0 | 2 | 4 |
| R4 | Opus 4.8 | 验证 + 根因 | 0 | 2 | 5 |
| R5 | Opus 4.7 | 修复回归引入检测 | 0 | 3 | 2 |
| R5-fix | — | R1-01~R2-02 闭合commit af99aed | — | — | — |
| **R6** | **Opus 4.8(本次全量复查)** | **契约方法越界抽样 + 类图完整度** | **0** | **0** | **4** |
**累积说明**R1-R5 的 P1×4 + P2×9 + R 系列 5 项均已闭合。R6 在更系统的"点名方法 vs 契约"抽样下浮出 F1/F5与 R5 的 `current_profile()` 同型,说明此类问题需要一次性全表扫描),以及两处类图欠边 F2/F3。无新增 P0/P1。
---
## 11. 最终结论与建议
### 11.1 设计成熟度
详细设计在**覆盖性、架构合理性、状态机一致性、基线遵守(主体)**四个维度均达标。事件 / 表 / 契约 / 状态机 / 禁止边 / L0-L9 / UML 七类对象 100% 覆盖,依赖无环,职责分离干净,跨 DB outbox 与 FK-off 不变式自洽。
### 11.2 剩余问题
仅剩 4 项 P2全部为局部精修
- **F1 / F5**:两处"点名了不存在的契约方法"`EvidenceStore.list_for_task``DoctorService.check_capability`),合计 3 分钟可改为真实方法 / 改私有。
- **F2 / F3**:两张类图欠依赖边,合计 6 分钟补全。
### 11.3 建议
**总工作量约 9 分钟**即可收束全部 4 项 P2。这些不阻断进入实现阶段但建议在正式冻结前一并修复使契约纯净度与类图完整度达到 100%,避免实现者在 ContextAssembler / DoctorService 处遇到与 R5 同型的"找不到方法"困惑。
### 11.4 最终判定
**CONDITIONAL PASS (R6)** — 详细设计满足全量覆盖与结构正确性R 系列回归修复全部闭合;本轮新增 4 项 P22 契约方法越界 + 2 类图欠边),均为分钟级修复,不阻断实现。
---
End of full-scope re-audit.