diff --git a/docs/plans/2026-06-28-002-feat-tier2-n5收敛环-go-no-go-plan.md b/docs/plans/2026-06-28-002-feat-tier2-n5收敛环-go-no-go-plan.md index 9b649166..4e44cc95 100644 --- a/docs/plans/2026-06-28-002-feat-tier2-n5收敛环-go-no-go-plan.md +++ b/docs/plans/2026-06-28-002-feat-tier2-n5收敛环-go-no-go-plan.md @@ -111,7 +111,7 @@ U1 是前置阻断(其 smoke 段 blocking);U2/U3/U4 是可并行的前置准备( **步骤**: -- [ ] **S0(硬前置闸 · 不满足即阻塞 U1/U5、不开跑)** mini-desktop 可达 + 环境就绪:`ssh root@100.64.0.7 'echo ok'` 通;`/root/.venvs/agentscope-tier2/bin/python -c "import agentscope; print(agentscope.__version__)"` == `2.0.2`;chrome 可用(非 exit 144);new-api `http://100.64.0.8:3000` quota 够(M3 路活)。任一不满足 → 见 Risks「mini-desktop 不可达」行,不进 S1。 +- [ ] **S0(硬前置闸 · 不满足即阻塞 U1/U5、不开跑)** mini-desktop 可达 + 环境就绪:`ssh root@100.64.0.7 'echo ok'` 通;`/root/.venvs/agentscope-tier2/bin/python -c "import agentscope; print(agentscope.__version__)"` == `2.0.2`;chrome 可用(非 exit 144);new-api `http://100.64.0.8:3000` quota 够(M3 路活);**`node_modules/esbuild` 可解析**(`build-phaser.mjs` 依赖;**fresh git worktree gitignored 不带 node_modules、须 symlink 既有树或 npm install——2026-06-28 实证漏此即 build 失败、M3 全程 thrash**,phaser 走 shim external 不需)。任一不满足 → 见 Risks 行,不进 S1。 - [ ] **S1(复现 smoke · blocking)** 在 mini-desktop 用 dev/2.0.0 代码跑一款 M3 面包店: ```bash ssh root@100.64.0.7 # 真 IP,绕系统代理 fake-ip(系统代理是 198.18.x fake-ip) @@ -293,7 +293,7 @@ flowchart TD | 风险 | 影响 | 缓解 | |---|---|---| -| **mini-desktop 不可达 / venv 缺失 / chrome exit 144**(U1·U5 真跑全压它) | U1/U5 全阻塞 | U1 **S0 硬前置闸**(可达+agentscope 2.0.2+chrome+quota),不满足即停、不开跑 | +| **mini-desktop 不可达 / venv 缺 / chrome exit 144 / `node_modules` esbuild 缺**(U1·U5 真跑全压它;**fresh worktree 必缺 esbuild → build 失败 → M3 全程 thrash**,2026-06-28 实证) | U1/U5 全阻塞 或 假性 M3-不收敛 | U1 **S0 硬前置闸**(可达+agentscope 2.0.2+chrome+quota+**esbuild 可解析**),不满足即停;诊断"不收敛"先排 build/env(read 产物 + run_gates 取真九门),别据低 CPU 误判卡死 | | dev/2.0.0 tier2 代码与 feie-005 分支有差异,S1 smoke 不复现;或 harness 假阳把坏游戏判 accept | 收敛环失败归因不清(环境 vs 模型);失败计数偏低制造假 GO | U1 **S1(金标过·不假阴)+ S1b(坏游戏拒·不假阳)双绿**为可开跑闸;不双绿不进 U5 | | mini-desktop 串行跑 4 轮墙钟长(~3.4h)+ 烧 token/¥ | 资源/成本 | U2 批级 fail-closed 兜底;串行本就为省资源争用;单 gen ¥3 硬限 | | `repairs` 字段是 `model_calls` 近似、非真自纠轮数 | 收敛中位图偏差 | 仅作辅助观测;go/no-go 主判据是 KTD1 失败计数,不依赖 repairs | @@ -362,7 +362,15 @@ flowchart TD ## 执行发现 -(U1 复现 smoke 结果 / 沙箱裁定 / U5 收敛环 go/no-go 结论落此。) +**2026-06-28 执行(本机 + mini-desktop tier2-cv worktree):** + +- **U2/U3/U4 本机 TDD 全绿、已 push(`eed34d0a`)**:U3 fallback_tree 自测 9 + U2 批级护栏 3 + U4 play-scene 门 4。 +- **U1 关键发现 —— 漏掉的 env 闸(plan 自我修正)**:首跑 fresh M3 面包 smoke「FAIL」(852s、撞 max_iters=40+step_cap>60、没 finish),一度误判为 M3 不收敛 / caps 太紧 / dev 回归。**真因是环境**:新建的 `tier2-cv` git worktree **没有 `node_modules/esbuild`**(gitignored、不随 checkout 来),`build-phaser.mjs`(`import esbuild`,phaser 走 shim external)构建失败 → gen 的 build 步拿不到 bundle → M3 收到的是 build 错误而非九门反馈 → 写一堆探针脚本(`_probe_runtime.mjs`/手搓 build.sh `find / -name esbuild`)瞎试 → churn 撞熔断。 +- **铁证(env 修后)**:`ln -s` 接上 esbuild(`tier2-run/game-runtime/node_modules`)→ `build-phaser.mjs` 立即产 bundle(42KB)→ 在 M3 那份「失败」产物上 `run_gates`:**九门 7/9 过**(只 H_progress ❌ progress=false)+ **富三门 2/3 过**(只 经济 ❌ profitPathWin✗ 盈利路赢不了),decision=fix。即 **M3 本就写出接近过关的多系统富游戏、只差 2 道可修平衡门**(spike 式可据反馈自修),「M3 不收敛」是 build 坏导致拿不到反馈的假象。 +- **教训(已补 U1 S0 + Risks)**:fresh worktree 必须先备 `node_modules/esbuild`;低 CPU(3s/12min, STAT=Sl)是 I/O-bound 假象、不能据此判"卡死"——要读工作区产物 + run_gates 取真九门。 +- **U1 沙箱裁定**:收敛环走 in-process 本地 runner(spike-proven);DockerWorkspace 托管小验作 go/no-go 后 Phase B 项(in-process 兜底已足,不阻塞)。 + +(U5 收敛环 Round 1 结果 / go/no-go 结论待落。) ## 状态 diff --git a/tier2/harness/serve-and-play-phaser.sh b/tier2/harness/serve-and-play-phaser.sh index 2bf0b86d..1734f803 100755 --- a/tier2/harness/serve-and-play-phaser.sh +++ b/tier2/harness/serve-and-play-phaser.sh @@ -49,6 +49,10 @@ fi USER_DATA_DIR="$(mktemp -d -t tier2-chrome-XXXX)" SERVE_PID=""; CHROME_PID="" cleanup() { + # 杀整棵 chrome 进程树:只 kill $CHROME_PID(父)会把 renderer/gpu 子进程 reparent 给 init 成孤儿、泄漏 + # (实测串行批跑跨款累积、撞 wall_timeout)。用唯一的 $USER_DATA_DIR 精确匹配本实例【全部】chrome 进程, + # 不误伤别的 chrome 实例 / live worker 的 chrome(它们 user-data-dir 不同)。 + [ -n "$USER_DATA_DIR" ] && pkill -f "$USER_DATA_DIR" 2>/dev/null [ -n "$CHROME_PID" ] && kill "$CHROME_PID" 2>/dev/null [ -n "$SERVE_PID" ] && kill "$SERVE_PID" 2>/dev/null rm -rf "$USER_DATA_DIR" 2>/dev/null