fix: integrate audit findings round 1 - tools, worker, scheduler, main agent

- Unify ToolResultEnvelope (output vs content) for built-in tools
- Fix shell.run AsyncGenerator consumption in ToolRegistry.call/streaming
- Scheduler: consume WorkerResult.status instead of marking all running tasks completed
- WorkerProcess/WorkerManager: surface exit events and generate failed/cancelled result
- MainAgent: integrate ContextAssembler, Chinese destructive regex, ArchitectureDesigner impact gate
- run.ts: pendingConfirmation flow, dispatch extracted, .air files filtered from /results
- CapabilityRegistry wired into RuntimeApp and ServiceRegistry; DoctorService uses it
- release.ts: findRepoRoot/findBun, run air e2e + depcruise + runtime regression
- New gates: release-critical-gates, CLI run command regression
- 14/14 e2e gates pass; 3/3 release dry-run pass

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
AirCoding
2026-06-05 18:39:10 +08:00
parent a2d7aa0339
commit ddefcbb2b1
24 changed files with 1992 additions and 186 deletions

View File

@@ -0,0 +1,331 @@
# 集成测试阶段 Gpt5.5 审查结果
**审计日期**: 2026-06-05
**项目**: AirCoding V1.0.0 Alpha
**审计模式**: 四视角交叉审计(系统架构师 / 开发工程师 / 真实用户 / QA 测试工程师)
**审计范围**: 原始需求、baselineV1、核心源码、既有 MiniMax-M3 / Deepseek / GLM5.1 审查报告、真实用户临时目录 UAT
---
## 0. 总体结论
**不建议发布 V1.0.0 Alpha也不建议作为完整产品对外演示。**
本轮四视角结论高度一致AirCoding 已具备 monorepo、contracts、RuntimeApp、Worker IPC、ToolRegistry、TUI 渲染等骨架能力,但核心产品闭环仍不可信:
1. **任务失败可能被标记为完成**Scheduler 仍可能在 worker 停止后直接把 running task 标为 completed。
2. **shell.run 不可靠**shell executor 是 AsyncGenerator但 ToolRegistry.call 直接 await executor普通工具调用路径无法得到最终 ToolResultEnvelope。
3. **工具结果契约不统一**BuiltInToolRegistrar 多个工具返回 `content`contracts 要求 `output`
4. **MainAgent answer 无项目上下文**`chat_with_llm()` 未接入 ContextAssembler。
5. **危险操作确认门失效**`air run` 直接调度 delegate用户 y/n 不会进入 `handle_confirmation()`
6. **E2E gates 失真**13/13 PASS 不能证明真实用户任务成功。
当前只能称为**架构骨架技术预览**,不能称为满足原始需求和 baseline 的 Alpha 发布版。
---
## 1. 系统架构师审查
### 1.1 架构结论
AirCoding 的包结构、基础状态机、工具注册、Worker IPC、EventStore/ProjectionStore 类都存在,但关键 baseline 承诺没有在运行路径闭合:
- FR-004 事件驱动运行时未闭合Scheduler 主路径大量修改内存 TaskGraph而不是以 durable event 作为唯一事实源。
- FR-005 / FR-014 MainAgent 对话未接 ContextAssembler。
- FR-006 ArchitectureDesigner 仍未进入 MainAgent/Scheduler 主路径。
- FR-007 Scheduler 完成判定仍不读取 WorkerResult.status。
- FR-008 IPC 与 contracts 存在实际协议偏差。
- FR-010 / FR-017 C++ 工具链存在双实现且未形成 detect→configure→build→test→debug→fix→review 闭环。
- FR-012 CapabilityRegistry 未被 RuntimeApp 真实接入。
- FR-016 TUI 渲染存在,但 `air run` 手工推送 snapshot绕过 ProjectionStore/DB/EventStore 投影事实源。
- FR-020 release/e2e gates 仍偏静态检查,不能证明产品成功场景。
### 1.2 架构 P0/P1/P2
| 优先级 | 问题 | 影响 | 证据 |
|---|---|---|---|
| P0 | MainAgent answer 路径未接入 ContextAssembler | 追问项目状态会幻觉FR-005/FR-014 不成立 | `packages/runtime/src/agents/main/MainAgent.ts:70-73`, `packages/runtime/src/agents/main/MainAgent.ts:102-118`, `packages/runtime/src/context/ContextAssembler.ts:74-105` |
| P0 | Scheduler 直接把 running 标 completed | 失败/blocked/cancelled 可假完成 | `packages/runtime/src/scheduler/Scheduler.ts:251-260`, `packages/runtime/src/workers/WorkerManager.ts:237-243` |
| P0 | durable task events 未形成主路径 | FR-004 / INV-1 被削弱SQLite 不是真正调度事实源 | `packages/runtime/src/scheduler/Scheduler.ts:65-78`, `packages/runtime/src/scheduler/Scheduler.ts:251-260`, `packages/runtime/src/events/EventStore.ts:622-705` |
| P0 | Worker IPC 与 contracts 不一致,事件/心跳未完整进入父进程事件流 | 恢复、投影、审计不可依赖 | `packages/contracts/src/ipc.ts:37-48`, `packages/workers/src/WorkerRuntime.ts:207-219`, `packages/runtime/src/workers/WorkerManager.ts:160-253` |
| P0 | C++ 完整工作流未进入主链路 | FR-017 未达成 | `packages/runtime/src/tools/BuiltInToolRegistrar.ts:260-314`, `packages/toolchain-cpp/src/CppToolRegistrar.ts:31-95`, `packages/workers/src/roles/ExecutorRole.ts:51-57` |
| P0 | ToolResultEnvelope 不统一 | Worker 侧工具输出丢失 | `packages/contracts/src/tool.ts:76-83`, `packages/runtime/src/tools/BuiltInToolRegistrar.ts:180-183`, `packages/runtime/src/tools/BuiltInToolRegistrar.ts:237-239`, `packages/runtime/src/workers/WorkerManager.ts:188-192` |
| P1 | `shell.run` AsyncGenerator 与 `ToolRegistry.call()` 不兼容 | shell 可用性不可靠 | `packages/runtime/src/tools/shell/index.ts:33-110`, `packages/runtime/src/tools/ToolRegistry.ts:248-255` |
| P1 | ArchitectureDesigner 是运行路径死代码 | FR-006 不成立 | `packages/runtime/src/agents/main/MainAgent.ts:1-265`, `packages/runtime/src/agents/architecture/ArchitectureDesigner.ts:22-76` |
| P1 | CapabilityRegistry 未接入 RuntimeApp | FR-012 运行级不成立 | `packages/runtime/src/app/RuntimeApp.ts:65-92`, `packages/runtime/src/capabilities/CapabilityRegistry.ts:29-154` |
| P1 | TUI/HUD 不符合 ProjectionStore-only 链路 | TUI 状态可与 DB/EventStore 不一致 | `packages/cli/src/commands/run.ts:58-72`, `packages/cli/src/commands/run.ts:174-189`, `packages/runtime/src/app/RuntimeApp.ts:81-84` |
| P1 | TUI 与 readline 抢 stdin | TUI 是 viewer不是完整 coding session 输入界面 | `packages/tui/src/TuiApp.tsx:110-146`, `packages/cli/src/commands/run.ts:99-115` |
| P2 | release/e2e gates 不证明 Alpha 产品可用 | 13/13 PASS 仍可能真实失败 | `packages/cli/src/commands/e2e.ts:81-141`, `packages/cli/src/commands/release.ts:15-27` |
| P2 | ContextAssembler 输出仍偏 string content不是完整 canonical content blocks | FR-013/FR-014 一致性不足 | `packages/runtime/src/context/ContextAssembler.ts:22-26`, `packages/runtime/src/context/ContextAssembler.ts:263-307` |
### 1.3 FR-001~FR-020 覆盖度
| FR | 判断 |
|---|---|
| FR-001 CLI Startup/Init | 部分达成。CLI/init/start 有实现,但 doctor/project layout/recovery 仍不完整。 |
| FR-002 Project-Local State | 部分达成。`.air` 能创建,但 layout 与 baseline 有偏差,状态事实源未完全闭合。 |
| FR-003 Session Persistence | 部分达成。DB/schema 能力存在,但主路径不完整写入 messages/tasks/tool_runs/artifacts。 |
| FR-004 Event-Driven Runtime | 未达成。EventStore 能力存在,主链路仍大量内存状态/手工 snapshot。 |
| FR-005 Main Agent Conversation | 部分达成。分类/回答存在,但无上下文、无完整 message persistence。 |
| FR-006 Architecture Designer | 未达成。类存在,未进入主运行路径。 |
| FR-007 Scheduler/TaskGraph | 部分达成。状态机骨架存在,完成判定/WorkerResult/事件持久化不足。 |
| FR-008 Independent Worker Agents | 部分达成。子进程/角色存在,但 IPC contract 与结果事件链不完整。 |
| FR-009 Execution Primitives | 部分达成偏低。ToolRegistry/PermissionEngine 有入口,但 read-before-edit、verification-before-completion 不能保证。 |
| FR-010 Built-in Tools | 部分达成。工具注册数量覆盖,但结果 shape、streaming、C++/debug/gui/network 深度不足。 |
| FR-011 Permission/Security | 部分达成。引擎存在,默认/交互闭环/备份策略不足。 |
| FR-012 Plugin/Capability Foundation | 未达成运行级。CapabilityRegistry 未接 RuntimeApp。 |
| FR-013 Provider Layer | 部分达成。Adapter 路径存在,但 canonical content blocks 未贯穿。 |
| FR-014 Context/Compaction | 部分达成。ContextAssembler/CompactionPolicy 有骨架,但 MainAgent/Worker 主路径未使用。 |
| FR-015 Artifact/Evidence | 部分达成。Store/事件类型存在,但主任务完成未强制 evidence-backed。 |
| FR-016 TUI/HUD | 部分达成。渲染可用,输入和 ProjectionStore-only 真实链路不足。 |
| FR-017 C++ Complete Workflow | 未达成。工具存在但未形成完整 detect→configure→build→test→debug→fix→review→verify。 |
| FR-018 Doctor | 部分达成。诊断存在fix/capability/display/network/toolchain 集成不足。 |
| FR-019 Logging/Diagnostics | 部分达成。Logger/DeveloperLogEncryptor 存在,但完整日志策略未证实闭合。 |
| FR-020 Release Gate | 未达成。当前 gates 不覆盖真实 Alpha 成功条件。 |
### 1.4 Domain Invariants 核对
| Invariant | 判断 |
|---|---|
| INV-1 Session-DB state columns only by EventStore projection | 运行路径未满足。EventStore.project 有能力,但 Scheduler 主路径不完整使用 durable events。 |
| INV-2 Cross-DB/external writes outbox single writer | 部分满足。KnowledgeStore/ArtifactStore 有意图,但主路径 evidence/artifact 不强制闭合。 |
| INV-3 Side effects only through ToolRegistry + PermissionEngine | 部分满足。Worker 工具走 parent ToolRegistry但 Permission ask_user 无闭环verification/read-before-edit 不足。 |
| INV-4 Import/dependency one-way | 静态上大体满足,但 toolchain-cpp 未以 capability boundary 真实接入。 |
| INV-5 EventBus transport only, SQLite source of truth | 原则部分实现真实运行未满足。run.ts 手工 snapshotProjectionStore rebuild/repos 链路不完整。 |
---
## 2. 开发工程师审查
### 2.1 工程结论
工程视角判定:**核心执行链路存在多个发布阻断缺陷**。尤其是 Worker 结果无法可靠进入 Scheduler 状态机、`shell.run` 流式工具接口与 `ToolRegistry` 不兼容、CLI 确认流失效、MainAgent 未使用真实 ContextAssembler。现有 E2E 门禁包含源码字符串检查和 mock lifecycle不能证明端到端可运行。
### 2.2 工程 P0
| ID | 问题 | 证据 | 影响 | 阻断发布 |
|---|---|---|---|---|
| P0-1 | `ToolRegistry.call()` 不能执行 `shell.run`,因为 executor 是 `async function*` | `packages/runtime/src/tools/shell/index.ts:35`, `packages/runtime/src/tools/ToolRegistry.ts:254`, `packages/runtime/src/tools/ToolRegistry.ts:302` | Worker 调 shell.run 时父进程会把 generator 当 result 处理 | 是 |
| P0-2 | `shell.run` 声称 streaming但没有 yield stdout/stderr chunk最终 envelope 缺 `metadata.is_final` | `packages/runtime/src/tools/shell/index.ts:64-76`, `packages/runtime/src/tools/shell/index.ts:98-109`, `packages/runtime/src/tools/ToolRegistry.ts:152-166` | `call_streaming()` 可能返回 `no_final_result` | 是 |
| P0-3 | Scheduler 不检查 worker exit/result直接 completed | `packages/runtime/src/scheduler/Scheduler.ts:251-260`, `packages/runtime/src/workers/WorkerManager.ts:237-244`, `packages/workers/src/main.ts:93-96` | Worker 失败/blocked/未上报都可显示成功 | 是 |
| P0-4 | Worker 完成结果只更新内存 handle没有 durable task event | `packages/runtime/src/workers/WorkerManager.ts:237-244`, `packages/runtime/src/events/EventSchemaRegistry.ts:59-61`, `packages/runtime/src/scheduler/Scheduler.ts:274-277` | 投影、恢复、任务状态与真实结果脱节 | 是 |
| P0-5 | WorkerResult 字段映射错误 | `packages/workers/src/roles/ExecutorRole.ts:11-17`, `packages/workers/src/roles/ExecutorRole.ts:139-143`, `packages/runtime/src/workers/WorkerManager.ts:324-339`, `packages/contracts/src/worker-result.ts:74-88` | changed_files 为空、verification 类型不符、证据丢失 | 是 |
| P0-6 | CLI destructive confirmation 没有 y/n 流程 | `packages/runtime/src/agents/main/MainAgent.ts:77-80`, `packages/cli/src/commands/run.ts:118-132`, `packages/runtime/src/agents/main/MainAgent.ts:204-211` | delete/remove/drop 提示确认但实际不等确认直接执行 | 是 |
| P0-7 | `classify_via_llm` 调 ProviderManager API 错误 | `packages/runtime/src/agents/main/MainAgent.ts:184-189`, `packages/contracts/src/provider.ts:179-190`, `packages/llm/src/ProviderManager.ts:83-92` | 启用 LLM classify 会异常或 fallbackLLM 分类实际未上线 | 是 |
### 2.3 工程 P1
| ID | 问题 | 证据 | 影响 |
|---|---|---|---|
| P1-1 | MainAgent `chat_with_llm` 未使用 ContextAssembler | `packages/runtime/src/agents/main/MainAgent.ts:102-118`, `packages/runtime/src/context/ContextAssembler.ts:74-105` | 主 Agent 对项目上下文失明 |
| P1-2 | `context.assemble` 工具是 stub | `packages/runtime/src/tools/context/index.ts:46-56`, `packages/runtime/src/tools/BuiltInToolRegistrar.ts:62` | 不能作为真实上下文工具 |
| P1-3 | ExecutorRole DONE false-positive | `packages/workers/src/roles/ExecutorRole.ts:136-144`, `packages/workers/src/roles/ExecutorRole.ts:151-152` | 工具失败也可能 completed |
| P1-4 | ExecutorRole 转义顺序破坏源码 | `packages/workers/src/roles/ExecutorRole.ts:222` | 字符串字面量、JSON、正则、路径可能被篡改 |
| P1-5 | 多文件协调缺少验收闭环 | `packages/workers/src/roles/ExecutorRole.ts:147-153`, `packages/workers/src/roles/ExecutorRole.ts:162-168` | 缺文件/缺 build/缺 test 仍成功 |
| P1-6 | Worker IPC 未处理 heartbeat/event | `packages/workers/src/WorkerRuntime.ts:113-135`, `packages/runtime/src/workers/WorkerManager.ts:160-253`, `packages/runtime/src/scheduler/Scheduler.ts:176-177` | 长任务会被误判 stalled/lost |
| P1-7 | `send_and_wait()` 不等 ACK只 sleep 100ms | `packages/runtime/src/workers/WorkerManager.ts:367-379` | agent.start race condition |
| P1-8 | BuiltInToolRegistrar additional tools 返回非合同 envelope | `packages/runtime/src/tools/BuiltInToolRegistrar.ts:180-183`, `packages/runtime/src/tools/BuiltInToolRegistrar.ts:237-239`, `packages/contracts/src/tool.ts:76-83` | WorkerManager 读取 output 时丢失 content |
| P1-9 | `ToolRegistry` ask_user/deny 返回空 call_id | `packages/runtime/src/tools/ToolRegistry.ts:270-275` | 权限错误不可关联原始 call |
| P1-10 | E2E gates 中 worker lifecycle 是 mock | `packages/cli/src/commands/e2e.ts:121-123`, `packages/runtime/test/e2e/worker-fixture.test.ts:107-141` | 门禁通过不证明真实链路工作 |
### 2.4 工程修复优先级
1. 统一工具执行合同:普通 executor 与 streaming executor 明确分离,`shell.run` 必须可通过 `call_streaming()` 产出 final envelope。
2. 重做 WorkerManager/Scheduler 结果闭环:监听 exit、`worker.result`、heartbeat、event并按 WorkerResult.status 发 durable task events。
3. 修复 CLI confirmation确认态只显示提示并等待 y/n拒绝不创建任务。
4. 对齐 WorkerResult/ExecutorResult envelope。
5. MainAgent 和 context.assemble 统一接入 ContextAssembler。
6. 修复 `classify_via_llm` Provider API。
7. 修复 ExecutorRole DONE 判定、失败处理、acceptance criteria 验证。
8. 替换假 E2E加入真实 worker spawn、tool.call roundtrip、shell.run、worker.result→event→projection 测试。
---
## 3. 真实用户 / UAT 审查
### 3.1 用户体验评分
**4/10**
UAT 在临时目录 `/tmp/aircoding-uat-xOnpw0` 完成,未修改仓库源码。运行入口为 `/home/airlongdian/.local/bin/air`,指向项目源码 `packages/cli/src/index.ts`
基础 CLI 能启动、初始化、创建文件、显示 slash 命令和状态但自然语言追问、C++ 编译运行闭环、危险操作确认门、TUI 输入模型都存在明显失败或误导性成功。
### 3.2 UAT 测试矩阵
| 场景 | 结果 | 观察 |
|---|---|---|
| `air init` | PASS | 成功创建 `.air/shared``.air/local``.air/sessions``.air/logs``.air/workspaces``project.json`。 |
| `air run` 任意目录启动 | PARTIAL | 未初始化目录会自动 init 并启动,体验上可用。 |
| 创建 `hello.txt` | PASS with noise | 文件成功创建,但 worker 输出 `[Worker] exited with code 0 (error): Unrecoverable error occurred`,随后 CLI 显示 `Task complete. Scheduler: COMPLETED`。 |
| 追问“我的项目有哪些文件?” | FAIL | 被分类为 `[answer]`,没有调用 `fs.list` / `project.scan`,无法真实回答项目文件。 |
| C++ hello world 编译运行修复闭环 | FAIL | 创建 `main.cpp``CMakeLists.txt`,但没有生成 `build/hello`CLI 仍报告 `Scheduler: COMPLETED`。 |
| 危险操作确认门 | FAIL | 输入 `请删除 hello.txt` / `delete hello.txt` 直接派发任务,输入 `n` 被当普通问答处理。 |
| `/help` | PASS | 输出清晰。 |
| `/status` | PARTIAL | 显示 Scheduler/workers/DB但普通用户解释性一般。 |
| `/tools` | PASS | 列出 39 个工具和分类。 |
| `/tasks` | PARTIAL | 空任务图无“暂无任务”说明,历史感弱。 |
| `/results` | PARTIAL | 会把 `.air/logs/air.log``.air/shared/project.json``rules.md` 等系统文件当任务产物。 |
| TUI 是否可输入任务 | FAIL | TUI 和 readline 共享 stdin输入 `h``1` 被当成自然语言任务。 |
| TUI 状态反馈 | PARTIAL | 能渲染状态,但 worker error 与 task completed 冲突。 |
| `history` | PARTIAL | 显示 session id 和 DB 大小,但没有任务摘要/时间/项目路径。 |
| `session list/inspect` | PARTIAL | 能列 active session 和 DB 路径,但用户不易理解。 |
| `doctor` | PARTIAL | 临时目录缺 `package.json` / `tsconfig.json` 报 FAIL对“任意目录”用户可能误导。 |
### 3.3 用户最痛问题
1. **危险操作确认门不可用**:用户拒绝 `n` 不会取消,破坏性操作不能发布。
2. **完成状态不可信**C++ 没有实际 build/run 产物仍显示 COMPLETED。
3. **追问项目文件不走工具**:典型项目查询被普通 LLM 问答处理。
4. **TUI 与命令行输入冲突**:快捷键看似存在,实际被 readline 吃掉。
5. **结果列表污染**`.air` 内部日志/配置被当作 Produced files。
### 3.4 false-positive 风险
- fake LLM 明确返回了 `shell.run("cmake -S . -B build && cmake --build build && ./build/hello")`,但 AirCoding 没有产生 build 产物,说明问题在工具执行/Worker 结果处理,不是模型质量。
- `air doctor` 在任意目录将缺少 `package.json` / `tsconfig.json` 标为 FAIL对任意目录启动场景会误导用户。
- CLI 的 `Scheduler: COMPLETED` 与 worker “error” 同时出现,用户无法判断真实状态。
### 3.5 是否可演示/可发布
- **可演示**:只适合内部有限演示 `air init``air run``/help``/tools`、简单创建 `hello.txt`
- **不可发布**不能演示危险操作、C++ 编译闭环、TUI 快捷键、复杂追问。
---
## 4. QA / 发布门禁审查
### 4.1 QA 总结
- TypeScript typecheckPASS。
- `air e2e`13/13 PASS。
- 结论:现有 gates 不能作为 V1.0.0 Alpha 发布门禁。它们主要覆盖类型、依赖边界、静态源码断言和小范围单元测试,未覆盖真实用户成功完成任务。
### 4.2 QA 测试矩阵
| 项 | 现状 | 审计结果 |
|---|---|---|
| TypeScript typecheck | `tsconfig.check.json` 覆盖 7 个 package references | PASS |
| `air e2e` | 13/13 PASS | PASS但门禁有效性不足 |
| P1 Storage/Events | regression/storage 类测试 | PASS但偏单元 |
| P2 Tools/Permission | permission / command risk / tool stubs | PASS但没有真实 output shape gate |
| P3 Provider/Context | llm tests + ContextAssembler regression | PASS但没有 answer-mode 上下文追问 gate |
| P4 Worker IPC | worker fixture + exit/result envelope regression | PASS但 worker fixture 是 mock不是真 spawn round-trip |
| P5 C++ Toolchain | toolchain-cpp tests | PASS但没有复杂 C++ 用户任务生成→构建→验证闭环 |
| P6 Projection/TUI | e2e.ts 引用 `projection-store-apply.test.ts` | 可疑:该文件不存在,当前 P6 实际覆盖弱化 |
| P7 Agents | direct-mode / architecture-review fixtures | PASS但未覆盖 run.ts confirmation 交互路径 |
| P8 Full regression | runtime regression directory | PASS但大量测试是源码字符串断言 |
| ToolResultEnvelope shape gate | 无完整 gate | FAIL/缺失 |
| shell.run functional gate | 无真实 functional gate | FAIL/缺失 |
| answer-mode context gate | 无 | FAIL/缺失 |
| simple file create gate | 不是 e2e gate 的一部分 | 缺失 |
| complex C++ generate gate | 不是 e2e gate 的一部分 | 缺失 |
| Worker IPC llm/tool round-trip | mock fixture不是真 WorkerManager + WorkerRuntime + ToolRegistry 往返 | 缺失 |
| false-positive 成功测试 | 无 | 缺失 |
### 4.3 缺失发布 gates
1. `gate:tool-envelope-shape`:遍历所有注册工具,断言成功结果必须符合 `ToolResultEnvelope{status, output, metadata}`
2. `gate:shell-run-functional`:通过 ToolRegistry 调用 `shell.run("printf ok")`,断言 exit_code/stdout。
3. `gate:answer-context`:追问项目文件/上一步结果必须引用真实上下文。
4. `gate:simple-file-create`:真实执行创建文件任务,断言磁盘内容和 task result。
5. `gate:complex-cpp`:生成 C++ + CMake断言多文件、非 stub、可 build/run 或明确失败。
6. `gate:worker-ipc-roundtrip`:真实 spawn worker覆盖 `worker.ready → agent.start → llm.request → tool.call → tool.result → worker.result`
7. `gate:confirmation`:破坏性请求必须停在确认态,拒绝后不得执行。
8. `gate:false-positive-success`:工具失败时 CLI/agent 结果必须 failed/blocked不得打印成功。
### 4.4 QA P0/P1/P2
| 优先级 | 问题 |
|---|---|
| P0 | e2e gates 失真13/13 PASS 不能证明用户成功场景。 |
| P0 | ToolResultEnvelope shape 不一致未被 gate 捕获。 |
| P0 | shell.run functional gate 缺失且实现存在 AsyncGenerator 解包风险。 |
| P0 | Worker IPC tool.call / llm.request 未真实端到端验证。 |
| P0 | confirmation CLI 路由缺失。 |
| P0 | false-positive 成功缺少门禁。 |
| P1 | answer-mode context gate 缺失。 |
| P1 | complex C++ generate gate 缺失。 |
| P1 | Scheduler 完成判定偏乐观。 |
| P1 | P6 gate 引用缺失测试文件,覆盖弱化。 |
| P2 | release command 比 `air e2e` 更弱,只跑少量静态/回归门。 |
| P2 | e2e gate 标签 P1-P8 粒度粗,缺少用户场景诊断输出。 |
---
## 5. 与前几轮审查对比
已有报告:
- `集成测试阶段MiniMax-M3审查结果.md`
- `集成测试阶段Deepseek审查结果.md`
- `集成测试阶段GLM5.1审查结果.md`
| 问题 | MiniMax-M3 | Deepseek | GLM5.1 | Gpt5.5 本轮 |
|---|---|---|---|---|
| MainAgent 无上下文 | 已指出 | 已指出 | 已指出 | 仍成立 |
| shell.run 不可用 / 生成器未解包 | 已指出 | 已指出 | 已指出 | 仍成立,且 streaming final envelope 也有问题 |
| BuiltInToolRegistrar content vs output | 已指出 | 已指出 | 已指出 | 仍成立 |
| Scheduler MONITORING 假完成 | 已指出 | 已指出 | 已指出 | 仍成立 |
| ArchitectureDesigner 死代码 | 已指出 | 已指出 | 已指出 | 仍成立 |
| PermissionEngine 未完整闭环 | 已指出 | 已指出 | 已指出 | 部分有 evaluate但 ask_user/交互/事件闭环仍不足 |
| TUI 无输入 / ProjectionStore 偏离 | 已指出 | 已指出 | 已指出 | 仍成立UAT 确认快捷键与 readline 冲突 |
| FR-017 C++ 主链路不联动 | 已指出 | 已指出 | 已指出 | 仍成立UAT 确认未 build/run |
| E2E gates 失真 | 已指出 | 已指出 | 已指出 | 仍成立13/13 PASS 仍不能证明可发布 |
| WorkerResult envelope 映射错误 | 部分涉及 | 部分涉及 | 部分涉及 | 本轮工程视角明确列为 P0 |
| Worker real IPC round-trip 缺失 | 部分涉及 | 部分涉及 | 部分涉及 | 本轮 QA 明确确认 P4 fixture 是 mock |
本轮新增/强化结论:
1. `shell.run` 不只是 AsyncGenerator 未解包streaming 路径也缺 final envelope 约定。
2. WorkerResult/ExecutorResult 字段映射错误会导致 changed_files、verification、evidence 丢失。
3. Worker checkpoint/heartbeat/event 未完整处理,会影响长任务状态判断。
4. UAT 实测确认 TUI 快捷键会被 readline 当成自然语言任务。
5. QA 确认 P4 worker lifecycle gate 仍是 mock不是真实发布级 round-trip。
---
## 6. 发布建议与最小阻断修复清单
### 6.1 发布建议
**不发布 V1.0.0 Alpha。**
当前可对外表述只能是:
> 基础 monorepo、contracts、工具注册、Worker IPC、TUI 渲染骨架已存在;尚未达到 baseline 所要求的完整 Alpha 产品闭环。
### 6.2 最小阻断修复清单
1. 修复 ToolResultEnvelope 统一性:所有工具必须返回 `status/output/error/metadata`,消除非契约 `content` shape。
2. 修复 `shell.run`:普通调用和 streaming 调用都必须产出可消费的最终结果ToolRegistry 不得返回裸 AsyncGenerator。
3. Scheduler 必须基于 WorkerResult.status 产生 durable `task.completed/task.failed/task.blocked/task.cancelled` events不允许 `has_running()==false` 直接完成任务。
4. WorkerResult/ExecutorResult 必须对齐 contracts保留 changed_files、verification、evidence_refs。
5. MainAgent/Executor/Reviewer/Debugger 必须使用 ContextAssembleranswer 分支必须携带项目/会话/工具历史上下文。
6. ArchitectureDesigner 必须进入 MainAgent DELEGATING 前的 architecture impact gate。
7. RuntimeApp 必须实例化并接入 CapabilityRegistry统一 toolchain-cpp 与 BuiltInToolRegistrar 的 C++ 工具路径。
8. TUI 输入与 CLI readline 必须合并为单一交互通道,或明确将 TUI 降级标识为非交互 HUD但这会违背原始需求不建议
9. PermissionEngine `ask_user` 必须有 permission.prompt.requested/resolved 事件与 CLI/TUI 交互闭环。
10. Release gates 必须新增真实用户成功场景:
- `air init` 初始化目录布局校验;
- 简单文件创建并验证内容;
- `shell.run("echo ok")`
- `project.scan` / `cpp.detect` output shape
- C++ fixture configure/build/test
- 失败工具不能显示成功;
- 上下文追问能回答真实文件;
- destructive request confirmation
- WorkerResult failed/blocked 不得被标 completed
- ProjectionStore 从 SQLite rebuild 后 TUI snapshot 一致。
---
## 7. 最终判断
本轮 Gpt5.5 审查与 MiniMax-M3、Deepseek、GLM5.1 三轮结论一致:
- **不是测试覆盖不足的小问题而是主链路事实源、工具契约、Worker 结果、上下文、确认门、发布门禁共同未闭合。**
- 继续只跑现有 `air e2e` 得到 13/13 PASS 没有发布意义。
- 修复必须进入源码主路径,不能通过新增旁路命令、文档说明或演示规避。
**发布状态BLOCKED。**