You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
main push CI 两处时间型 flake:follow-through 群回合恢复 settle / social hide-remote 等 room leave #2102
Activity
Birfy commentedon Nov 2, 2026
Written-by: Triage
Triage —
agent-ready,只做选项 1,选项 2 排除在本单之外两处都是测试侧等待写死(不是产品回归):main
1778add0同一条链全绿,且两处失败的等待都自带可疑模式。最小修法 = 把「等多久」换成「等什么事件」,不碰任何产品代码。范围(test-only,两个文件,别扩)
core/test/follow-through.test.jswaitFor()(第 112–136 行)在 mocked 分支里是固有 5 秒自旋:for (let i = 0; !check() && (i < rounds || Date.now() < deadline); i++) { mockedTimers.tick(1); await setImmediate }。条件没满足时它并不"等",而是把 20000 轮setImmediate+tick烧满REAL_WAIT_MS=5000——在 2 核 CI 上这 5 秒 CPU 正好跟它要等的真实工作(inflight.json/state.json写盘、Session flush、resolve Agent)抢核,于是越等越慢,settle()抛condition not reached(栈test/follow-through.test.js:137:42)。改法:把自旋换成真让出 CPU 的步进——文件里已有
const realSetTimeout = setTimeout(第 98 行,mock.timers不会冻结它,第 528 行已在用):每步await new Promise(r => realSetTimeout(r, REAL_WAIT_STEP_MS))并mockedTimers.tick(1),删掉轮数下限、只保留真实时钟 deadline,budget 提到 15000ms。语义不变(真丢的调用照样超时失败),只是不再抢 CPU。plugins/social/test/social.test.js—#90: hide-remote leaves independent rooms in parallel…(第 5391 行)用
Promise.race([..., setTimeout(reject, 60)])(5424) +assert.ok(Date.now() - started < 60)(5427) 判"没有等 room leave"。60ms 墙钟本身就在测调度延迟:慢机上即使实现完全正确也会红(报Error: hide-remote waited for room leave)。改法:跟同文件第 5353 行的兄弟用例一样用门闩证明非阻塞——把 room leave 挡住(
hide-remote走的 leave 路径上挂一个heldpromise,参照 5357/5382 的写法),断言hide-remote在门闩未放开时就返回leftRooms含两个 room,再release()让waitUntil()(第 188 行已有 helper)等到leftSeq落定。删掉 60ms 的 race 与墙钟断言。顺带:同一文件 5382 行那个 200ms race 属同类,若一行能顺手换掉就换,改不动不必强求(不算本单失败)。
不做:选项 2(push 的
Test自动重跑 + 已知 flake 名单)是 CI 策略变更,需要 owner 拍板,另开单;本单不合入任何 workflow 改动。验收(可执行,红先)
node --test core/test/follow-through.test.js与cd plugins/social && node --test test/social.test.js各连跑 30 遍全绿;再npm run verify全绿。src/host/turns.js里 resume 那段短路 / 注释掉openRoomTurn的重放),用例仍然要在 deadline 内红——证明放宽的是等待方式不是判定条件;hide-remote先awaitroom leave 再返回,5386/5429 这两条断言必须红。Test跑两遍,两次绿。风险档
diff 只在
core/test/follow-through.test.js+plugins/social/test/social.test.js,无产品代码、无 workflow,预期 T1(tests-ok绿 + 可合并即可,无 PASS);tier 以risk-gate.mjs实算为准。Birfy commentedon Nov 2, 2026
Written-by: Dev
Dev — 认领,分支
dev/2102-time-flake-tests按 Triage 的范围只改两个测试文件,不碰产品代码、不碰 workflow:
core/test/follow-through.test.js—waitFor()mocked 分支去掉 20000 轮setImmediate自旋,改为realSetTimeout步进 + 每步tick(1),只留真实时钟 deadline(15s)。plugins/social/test/social.test.js— hide-remote 用例改门闩(held/release+waitUntil),删掉 60ms race 与墙钟断言。验收按单上执行:两文件各 30 遍 +
npm run verify+ 两份反证日志(打断 resume / 让 hide-remote await leave 必须红)+ 分支连推两次 push Test 绿。选项 2 不做。Base: main
1778add0ac