Files
AirCoding/集成测试阶段GLM5.1审查结果.md
AirCoding ddefcbb2b1 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>
2026-06-05 18:39:10 +08:00

220 lines
8.3 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.
# 集成测试阶段 GLM-5.1 审查结果
**审计日期**: 2026-06-05
**项目**: AirCoding V1.0.0 Alpha
**审计模型**: GLM-5.1
**审计模式**: 四视角交叉审计(系统架构师 / 开发工程师 / 真实用户 / 测试工程师)
---
## 0. 前置验证
**TypeScript 类型检查**: PASS (contracts/runtime/llm/toolchain-cpp/workers 5 包通过)
**E2E Gates**: 13/13 PASS (但与用户场景脱节)
---
## 1. 系统架构师审查报告
### 架构核心链路评估
**已建立完整闭环**:
- CLI → MainAgent → Scheduler → Worker → LLM → Tools → File
- 7-package TypeScript monorepo 结构完整
- NDJSON over stdio IPC 协议正确
- 5 Domain Invariants 基本遵守
### 关键架构偏离
| 设计 | 实际 | 影响 |
|------|------|------|
| FR-014 上下文分层 | MainAgent.chat_with_llm 无 ContextAssembler 集成 | 用户追问 100% 幻觉 |
| ToolResultEnvelope | BuiltInToolRegistrar 18 工具用 content 而非 output | Worker IPC 返回空 |
| AsyncGenerator 解包 | shell.run 生成器未处理 | shell 命令 100% 失败 |
| 事件驱动 | Scheduler MONITORING 轮询 200ms | 假完成风险 |
### 架构死代码
1. **ArchitectureDesigner** - MainAgent.classify() 从未调用
2. **PermissionEngine** - ToolRegistry.call() 未逐调用评估
### 架构师结论
V1.0.0 Alpha 架构核心可通,但存在 4 个 P0 结构性缺陷,**不建议发布**。
---
## 2. 开发工程师审查报告
### P0 问题 (阻断发布)
#### P0-1: MainAgent.chat_with_llm 无 ContextAssembler 集成
- **位置**: packages/runtime/src/agents/main/MainAgent.ts:102-122
- **问题**: chat_with_llm() 仅有硬编码 system prompt无项目上下文注入
- **影响**: 用户追问"我的项目有哪些文件" → LLM 答"我无法访问文件系统"
#### P0-2: BuiltInToolRegistrar 18 工具返回形状不一致
- **位置**: packages/runtime/src/tools/BuiltInToolRegistrar.ts:180-438
- **问题**: create_real_executor 返回 `{ content }` 而非 `{ output }`
- **影响**: WorkerManager 第 191 行 `result.output || result.error || {}` 返回空对象
- **受影响工具**: fs.stat, process.kill, git.worktree.create, git.merge_workspace, project.scan, project.profile.write, cpp.detect, cpp.cmake.configure, cpp.build, cpp.test, cpp.static.cppcheck, cpp.clangd.query, debug.run, debug.parse_logs, gui.screenshot, network.capture, permission.request, doctor.run
#### P0-3: shell.run 生成器未解包
- **位置**: packages/runtime/src/tools/shell/index.ts:35
- **问题**: createShellExecutor 返回 `async function*` (AsyncGenerator)ToolRegistry.call() 直接调用返回生成器对象而非 ToolResultEnvelope
- **影响**: shell 命令 100% 失败
#### P0-4: 危险操作确认门路由断裂 (新发现)
- **位置**: packages/cli/src/commands/run.ts:115-120
- **问题**: MainAgent.classify() 返回 CONFIRMING 状态后run.ts 直接 console.log 确认消息并 rl.prompt(),用户输入的 y/n 永远到不了 MainAgent.handle_confirmation()
- **影响**: 删除/覆盖文件等破坏性操作无防护
### P1 问题 (重要缺陷)
| ID | 问题 | 位置 | 状态 |
|----|------|------|------|
| P1-1 | Scheduler MONITORING 早判完成 | Scheduler.ts:252-260 | 未修复 |
| P1-2 | classify_via_llm API 不匹配 | MainAgent.ts:185 | **已修复** |
| P1-3 | TUI 无文本输入路径 | tui/index.ts | 部分修复 |
| P1-4 | 多文件任务协调缺失 | ExecutorRole.ts | 部分修复 |
| P1-5 | false-positive 成功 banner | ask.ts:182-186 | **新发现** |
### P2 问题 (改进项)
- 资源泄漏: run.ts progressInterval 未清理
- 空 catch 块: scanDir 丢弃所有错误
- history/session 输出无辨识度
- doctor 语义误导 (FAIL vs WARNING)
---
## 3. 真实用户测试报告
### 测试结果汇总
| 测试 | 命令 | 结果 | 观察 |
|------|------|------|------|
| 初始化 | `air init` | ✅ PASS | 创建 .air/ 目录和 project.json |
| 简单文件创建 | `air ask 创建 hello.txt` | ✅ PASS | 文件创建成功 |
| 上下文追问 | `air run: 我的项目有什么文件?` | ❌ FAIL | LLM 答"无文件系统访问" |
| C++ 多文件 | `air ask 用 C++ 写 hello world` | ⚠️ PARTIAL | main.cpp + CMakeLists.txt 创建,但 cpp.build 报错 |
| Shell 执行 | `air ask 列出当前目录` | ❌ FAIL | shell.run 返回 undefined |
| 诊断 | `air doctor` | ⚠️ PARTIAL | 5/6 通过,但 project_structure 报 FAIL模板文件缺失 |
| 历史记录 | `air history` | ⚠️ PARTIAL | session_id 无辨识度 |
### 用户最痛 3 个问题
1. **shell.run 工具完全坏死** - 任何编译/运行命令都失败
2. **工具报错但 LLM 说成功** - 用户无法区分真实成功和幻觉
3. **追问上下文失效** - LLM 每次都"失忆"
### 用户体验评分: **4.5/10**
---
## 4. QA 测试矩阵
### 测试矩阵
| Test | 描述 | 结果 | 严重度 |
|------|------|------|--------|
| T1 | TypeScript 类型检查 | PASS | - |
| T2 | E2E Gates (13门) | 13/13 PASS | - |
| T3 | 简单文件创建 | PASS | P1 |
| T4 | C++ 多文件生成 | PARTIAL | P1 |
| T5 | 上下文追问 | **FAIL** | **P0** |
| T6 | Shell 执行 | **FAIL** | **P0** |
| T7 | 工具结果形状验证 | **FAIL** | **P0** |
### E2E Gates 盲区分析
当前 13 个 gate 全部基于静态检查:
- tsc 类型检查 ✓
- depcruise 依赖检查 ✓
- 单元测试 ✓
- 存根数量检查 ✓
**缺失的 gate**:
1. ToolResultEnvelope shape 验证 (output 字段)
2. Answer-mode context 验证
3. Shell.run 功能验证
4. Worker IPC 往返完整性验证
5. 危险操作 confirmation 验证
---
## 5. 与前两轮审查对比
### 三轮审查问题对比
| 问题 | MiniMax-M3 | Deepseek | GLM-5.1 (本轮) |
|------|------------|----------|----------------|
| P0-1: chat_with_llm 无上下文 | ❌ 未修复 | ❌ 未修复 | ❌ 未修复 |
| P0-2: 18 工具结果形状不一致 | ❌ 未修复 | ❌ 未修复 | ❌ 未修复 |
| P0-3: shell.run 生成器未解包 | ❌ 未修复 | ❌ 未修复 | ❌ 未修复 |
| P0-4: 确认门路由断裂 | ❌ 未发现 | ❌ 未发现 | ⚠️ 新发现 |
| P1-1: Scheduler MONITORING 竞态 | ❌ 未修复 | ❌ 未修复 | ❌ 未修复 |
| P1-2: classify_via_llm API | ❌ 未修复 | ❌ 未修复 | ✅ 已修复 |
| P1-5: false-positive 成功 | ❌ 未发现 | ❌ 未发现 | ⚠️ 新发现 |
### 根因分析
三轮审计得到**相同的 P0 问题**,说明:
1. 问题已被明确识别,但修复优先级不足
2. E2E gates 无法捕获这些功能性问题
3. 缺少端到端集成测试验证
---
## 6. 修复优先级矩阵
### 必须立即修复 (P0, 阻塞发布)
| # | 问题 | 影响范围 | 修复方向 |
|---|------|----------|----------|
| P0-2 | 18 工具返回 content 而非 output | 50% 工具通过 Worker 返回空 | BuiltInToolRegistrar.ts: 将 `{ content }` 改为 `{ output }` |
| P0-3 | shell.run AsyncGenerator 未解包 | shell 命令 100% 失败 | shell/index.ts: 解包 generator 或改为返回 Promise |
| P0-1 | chat_with_llm 无项目上下文 | 追问 100% 幻觉 | MainAgent.ts: 集成 ContextAssembler |
| P0-4 | 确认门路由断裂 | 破坏性操作无防护 | run.ts: 将 y/n 输入路由到 handle_confirmation() |
### 需要修复 (P1)
| # | 问题 | 修复方向 |
|---|------|----------|
| P1-1 | Scheduler MONITORING 早判完成 | 检查任务实际状态而非仅 has_running() |
| P1-5 | false-positive 成功 banner | 工具报<E585B7><E68AA5>时应显示错误而非成功 |
### 建议改进 (P2)
- TUI 文本输入路径统一
- history/session 输出可辨识
- doctor 语义准确性
---
## 7. 综合结论
### 发布建议: **不推荐发布**
4 个 P0 问题阻塞 V1.0.0 Alpha 发布:
1. **shell.run 完全坏死** - 用户无法执行任何编译/运行命令
2. **50% 工具返回空结果** - cpp.detect / project.scan / doctor.run 等全部失效
3. **上下文追问 100% 幻觉** - 用户无法询问项目状态
4. **破坏性操作无防护** - 删除/覆盖文件无确认
### 修复后验证清单
- [ ] shell.run 能执行 `ls`, `echo` 等基础命令
- [ ] cpp.detect / project.scan 返回实际项目信息
- [ ] 追问"我的项目有哪些文件"返回真实文件列表
- [ ] 删除文件时弹出确认,用户确认后执行
### 核心教训
**E2E gates 检查代码质量,用户场景验证功能可用性**。两者正交,不能互相替代。
---
*审计模型: GLM-5.1*
*审计时间: 2026-06-05*