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:
331
集成测试阶段Gpt5.5审查结果.md
Executable file
331
集成测试阶段Gpt5.5审查结果.md
Executable 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 手工 snapshot,ProjectionStore 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 会异常或 fallback,LLM 分类实际未上线 | 是 |
|
||||
|
||||
### 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 typecheck:PASS。
|
||||
- `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 必须使用 ContextAssembler,answer 分支必须携带项目/会话/工具历史上下文。
|
||||
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。**
|
||||
Reference in New Issue
Block a user