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

8.3 KiB
Executable File
Raw Permalink Blame History

集成测试阶段 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 工具报<EFBFBD><EFBFBD>时应显示错误而非成功

建议改进 (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