Web 游戏预检遇到 browser-ws-failed 时应清理 AGC 残留 Edge 并自动恢复 #584

Open
opened 2026-10-02 12:20:21 +08:00 by suzmii · 2 comments
Member

This was generated by AI during triage.

问题概述

用户从首页点击“做游戏”时,Web 创建预检可能在浏览器启动阶段失败:

web-preflight-browser-failed:启动浏览器失败:browser-ws-failed

该错误会直接阻断项目创建和首次生成。由于该链路是首次创作前置门禁,当前处理方式风险较高。

已确认事实

  1. browser-ws-failed 表示 Edge 进程在输出:

    DevTools listening on ws://127.0.0.1:<port>/devtools/browser/...

    之前退出、关闭 stderr 或发生 stderr 读取错误。

  2. 该错误码目前是合并分类,不能单独证明根因一定是残留 Edge 进程。

  3. 当前启动失败路径会尝试回收本次启动的浏览器进程树,并且已经对 WS/CDP 类瞬态失败增加了一次独立临时 Profile 重试。

  4. 现有 sweep_stale_browser_processes 只在预检开始前执行一次,并受以下限制:

    • 仅扫描 ga-browser-* 临时目录;
    • 目录年龄不足 5 分钟时跳过;
    • owner.json 缺失时只删除目录,不终止进程;
    • 无法完整确认进程与本轮 AGC Profile 归属时会 fail-closed。
  5. 因此,启动失败后仍可能存在未被确认回收的 AGC 无头 Edge;当前重试路径没有显式执行一次失败触发的定向清理。

期望行为

当 Web 预检遇到 browser-ws-failed、WS timeout 或 CDP connect failure 时:

  1. 先确认并清理当前 AGC 能证明归属的无头 Edge 进程树;
  2. 清理残留 Profile、owner 记录和相关临时目录;
  3. 再使用新的隔离 Profile 自动启动 Edge;
  4. 恢复成功后继续 desktop/mobile 预检;
  5. 恢复失败时返回包含安全诊断信息的明确错误,而不是只返回通用阻断。

安全约束

不得直接执行全量 taskkill /IM msedge.exe,不得影响:

  • 用户正常打开的 Edge;
  • 其他 AGC 实例;
  • 其他项目或 worktree;
  • 非 AGC 创建的浏览器 Profile。

只能清理能够通过以下信息证明归属的进程:

  • AGC 临时 Profile;
  • browser PID 与启动身份;
  • owner PID 与启动身份;
  • 可信 Edge/Chrome 可执行文件路径;
  • Windows 进程树关系;
  • 必要时补充命令行 Profile 标识。

无法证明归属时必须保守跳过,并返回可行动诊断。

验收标准

  • 可构造 browser-ws-failed 后验证自动恢复成功;
  • 恢复前能确认失败进程树已退出;
  • 不杀用户已有正常 Edge;
  • owner.json 缺失、写入失败、进程刚启动、PID 退出、PID 复用等场景均有明确处理;
  • 连续失败时错误中至少包含:
    • 阶段:WS 握手 / CDP 连接;
    • 子进程是否退出;
    • 清理是否确认完成;
    • 是否执行过恢复重试;
  • 不能通过跳过浏览器验证伪造 ready;
  • 预检失败仍保持 fail-closed;
  • 覆盖 Windows 真实 Edge 安装版测试;
  • 现有正常 Edge 使用、首页预检和项目首次生成回归测试通过。

相关代码

  • apps/ai-game-creator-shell/src-tauri/src/browser/process.rs
  • apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs
  • apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs
  • apps/ai-game-creator-shell/src/features/app-shell/homeWebPreflight.ts
  • apps/ai-game-creator-shell/src/features/app-shell/useHomeProjectCreation.ts

严重性

高优先级阻断问题。该故障发生在“做游戏”入口的不可重试前置链路,会阻止用户创建项目和开始首次生成。

> *This was generated by AI during triage.* ## 问题概述 用户从首页点击“做游戏”时,Web 创建预检可能在浏览器启动阶段失败: `web-preflight-browser-failed:启动浏览器失败:browser-ws-failed` 该错误会直接阻断项目创建和首次生成。由于该链路是首次创作前置门禁,当前处理方式风险较高。 ## 已确认事实 1. `browser-ws-failed` 表示 Edge 进程在输出: `DevTools listening on ws://127.0.0.1:<port>/devtools/browser/...` 之前退出、关闭 stderr 或发生 stderr 读取错误。 2. 该错误码目前是合并分类,不能单独证明根因一定是残留 Edge 进程。 3. 当前启动失败路径会尝试回收本次启动的浏览器进程树,并且已经对 WS/CDP 类瞬态失败增加了一次独立临时 Profile 重试。 4. 现有 `sweep_stale_browser_processes` 只在预检开始前执行一次,并受以下限制: - 仅扫描 `ga-browser-*` 临时目录; - 目录年龄不足 5 分钟时跳过; - owner.json 缺失时只删除目录,不终止进程; - 无法完整确认进程与本轮 AGC Profile 归属时会 fail-closed。 5. 因此,启动失败后仍可能存在未被确认回收的 AGC 无头 Edge;当前重试路径没有显式执行一次失败触发的定向清理。 ## 期望行为 当 Web 预检遇到 `browser-ws-failed`、WS timeout 或 CDP connect failure 时: 1. 先确认并清理当前 AGC 能证明归属的无头 Edge 进程树; 2. 清理残留 Profile、owner 记录和相关临时目录; 3. 再使用新的隔离 Profile 自动启动 Edge; 4. 恢复成功后继续 desktop/mobile 预检; 5. 恢复失败时返回包含安全诊断信息的明确错误,而不是只返回通用阻断。 ## 安全约束 不得直接执行全量 `taskkill /IM msedge.exe`,不得影响: - 用户正常打开的 Edge; - 其他 AGC 实例; - 其他项目或 worktree; - 非 AGC 创建的浏览器 Profile。 只能清理能够通过以下信息证明归属的进程: - AGC 临时 Profile; - browser PID 与启动身份; - owner PID 与启动身份; - 可信 Edge/Chrome 可执行文件路径; - Windows 进程树关系; - 必要时补充命令行 Profile 标识。 无法证明归属时必须保守跳过,并返回可行动诊断。 ## 验收标准 - 可构造 `browser-ws-failed` 后验证自动恢复成功; - 恢复前能确认失败进程树已退出; - 不杀用户已有正常 Edge; - owner.json 缺失、写入失败、进程刚启动、PID 退出、PID 复用等场景均有明确处理; - 连续失败时错误中至少包含: - 阶段:WS 握手 / CDP 连接; - 子进程是否退出; - 清理是否确认完成; - 是否执行过恢复重试; - 不能通过跳过浏览器验证伪造 `ready`; - 预检失败仍保持 fail-closed; - 覆盖 Windows 真实 Edge 安装版测试; - 现有正常 Edge 使用、首页预检和项目首次生成回归测试通过。 ## 相关代码 - `apps/ai-game-creator-shell/src-tauri/src/browser/process.rs` - `apps/ai-game-creator-shell/src-tauri/src/browser/sweep.rs` - `apps/ai-game-creator-shell/src-tauri/src/environment_check/web_creation.rs` - `apps/ai-game-creator-shell/src/features/app-shell/homeWebPreflight.ts` - `apps/ai-game-creator-shell/src/features/app-shell/useHomeProjectCreation.ts` ## 严重性 高优先级阻断问题。该故障发生在“做游戏”入口的不可重试前置链路,会阻止用户创建项目和开始首次生成。
suzmii added the
Priority
High
2
Kind/Bug
labels 2026-10-02 12:20:21 +08:00
suzmii self-assigned this 2026-10-02 19:06:27 +08:00
Author
Member

原因与方案

当前 Web 游戏预检的浏览器启动失败路径虽然会尝试终止本轮 root,但不会在 WS/CDP 瞬态失败后执行一次独立的隔离 Profile 恢复;Windows 也没有在清理前确认 Job 子树已完全退出,因此 browser-ws-failed 可能直接阻断首次创建,残留进程还可能拖住临时 Profile。

本次计划:

  • 仅针对本轮 AGC 临时 Profile、owner 身份、可信 Edge/Chrome 路径和已确认进程树做 fail-closed 清理;不执行全量 taskkill,不影响用户 Edge、其它 AGC 实例或其它项目。
  • 对 WS 握手失败/超时和 CDP 连接失败/超时,在确认进程树退出、Profile/owner/临时目录清理完成后,用全新隔离 Profile 自动重试一次。
  • 连续失败或清理未确认时保持 blocked,返回阶段、子进程退出、清理确认和是否重试等安全诊断;补齐 owner 缺失、写入失败、刚启动、PID 退出/复用边界和真实 Edge smoke。

修改范围:apps/ai-game-creator-shell/src-tauri/src/browser/process.rs、sweep.rs、Web 预检错误投影、首页预检展示和对应定向测试/文档。

## 原因与方案 当前 Web 游戏预检的浏览器启动失败路径虽然会尝试终止本轮 root,但不会在 WS/CDP 瞬态失败后执行一次独立的隔离 Profile 恢复;Windows 也没有在清理前确认 Job 子树已完全退出,因此 browser-ws-failed 可能直接阻断首次创建,残留进程还可能拖住临时 Profile。 本次计划: - 仅针对本轮 AGC 临时 Profile、owner 身份、可信 Edge/Chrome 路径和已确认进程树做 fail-closed 清理;不执行全量 taskkill,不影响用户 Edge、其它 AGC 实例或其它项目。 - 对 WS 握手失败/超时和 CDP 连接失败/超时,在确认进程树退出、Profile/owner/临时目录清理完成后,用全新隔离 Profile 自动重试一次。 - 连续失败或清理未确认时保持 blocked,返回阶段、子进程退出、清理确认和是否重试等安全诊断;补齐 owner 缺失、写入失败、刚启动、PID 退出/复用边界和真实 Edge smoke。 修改范围:apps/ai-game-creator-shell/src-tauri/src/browser/process.rs、sweep.rs、Web 预检错误投影、首页预检展示和对应定向测试/文档。
Author
Member

实现与验证进度

已完成提交 2579c04c4:

  • WS 握手/超时与 CDP 连接失败仅在本轮进程树、Job、Profile 和 owner 清理确认后使用新隔离 Profile 自动恢复一次。
  • Windows 清理增加可信 Edge/Chrome 镜像、启动身份、精确 user-data-dir 命令行和 Job 子树确认;未知归属、PID 复用、owner 缺失或写入失败保持 fail-closed。
  • 连续失败返回阶段、子进程退出、清理确认和是否重试的安全诊断;预检报告与命令错误保留诊断,首页仍只显示稳定错误码并将原始诊断留日志。

已验证:浏览器定向 Rust 测试 51 passed;Web 预检 Rust 测试 9 passed;真实浏览器健康 smoke 1 passed;首页预检 Vitest 6 passed;AGC typecheck、编码检查、文档索引检查、Rust fmt 和 git diff --check 通过。

## 实现与验证进度 已完成提交 2579c04c4: - WS 握手/超时与 CDP 连接失败仅在本轮进程树、Job、Profile 和 owner 清理确认后使用新隔离 Profile 自动恢复一次。 - Windows 清理增加可信 Edge/Chrome 镜像、启动身份、精确 user-data-dir 命令行和 Job 子树确认;未知归属、PID 复用、owner 缺失或写入失败保持 fail-closed。 - 连续失败返回阶段、子进程退出、清理确认和是否重试的安全诊断;预检报告与命令错误保留诊断,首页仍只显示稳定错误码并将原始诊断留日志。 已验证:浏览器定向 Rust 测试 51 passed;Web 预检 Rust 测试 9 passed;真实浏览器健康 smoke 1 passed;首页预检 Vitest 6 passed;AGC typecheck、编码检查、文档索引检查、Rust fmt 和 git diff --check 通过。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GenarrativeAI/Genarrative#584