现象
packages/spec/src/cloud/tenant.test.ts 这条用例非确定性超时:
FAIL src/cloud/tenant.test.ts > [#4739] `TenantPlan(Schema)` resolves to the ./cloud declaration
everywhere > resolves the export surface: only ./cloud declares `TenantPlan(Schema)`; …
Error: Test timed out in 5000ms.
Test Files 1 failed | 292 passed (293)
Tests 1 failed | 7350 passed (7351)
7350 条过,唯一一条红,而且是超时不是断言失败 。
它是 flaky 的硬证据(不是回归)
同一份 spec 代码,14 分钟内一过一红:
时刻
上下文
结果
06:33–06:36
PR #4788 的 PR 分支,Test Core (1/2) (2/2)
✅ 全绿
06:47
同一个 PR 变基进合并队列(gh-readonly-queue/main/pr-4788-941dec4c…)
❌ 本条超时
PR #4788 只改 packages/plugins/plugin-auth 和 docs/adr/0069,碰不到 packages/spec 的任何文件 。中间也没有任何 spec 侧改动进入 —— 后来排队的 #4783 (base 更新)CI 是绿的,main 没坏。
为什么这不是「重跑一次就行」
今晚这是第二次了 ,两次都打在不相干的 PR 上:
第 1 次:PR fix(security): permission-set 投影只写 spec 认的键;失败的 backfill 变响亮 (#4669) #4755 (permission-set backfill (ADR-0094 D4) 现在 100% 失败:行里的 active 存储列喂进了 #4001 之后严格化的 permission spec #4669 ,permission-set backfill,改 packages/metadata-protocol)—— Test Core 红。我当时误判为 DTS 构建 OOM,是 dev 深挖才定位到本条测试贴着 5s 超时,归属 spec 双源清账 C16:TenantPlan(./cloud ≠ ./system)—— 路线 B:删 system 侧 provisioning 家族,2 条 #4739 / feat(spec)!: 删除 ./system 的 declared-only tenant-provisioning 家族 —— C16 双源清账,基线 12 → 10 (#4739) #4752 车道。
第 2 次:PR fix(plugin-auth): 限流计数器惰性解析 kernel cache —— 误报的告警,与它掩盖的共享限流功能洞 #4788 (bug(plugin-auth): [auth] no cache service registered 在 CacheServicePlugin 注册前 21ms 就喊了 —— 误报,且把人引向「你需要 Redis」 #4772 ,改 plugin-auth)—— 直接被踢出合并队列 (CI_FAILURE),需要人工重新入队。
代价不是「多等一轮」,而是:
建议方向
这条用例叫 resolves the export surface,做的是导出面解析(很可能是逐个动态 import / 模块解析),天然比普通断言慢,5s 是个偏紧的默认值。两条路:
给这条(或整个文件)一个符合其真实工作量的 timeout —— 最省事,但要先量一下它正常耗时多少,确认 5s 是"偏紧"而不是"刚好"。如果正常就要 4.5s,那放宽到 10s 只是把下次踩雷推后。
让它别在测试里做重解析 —— 把导出面解析的结果做成构建期产物(spec 已经有 authorable-surface.json 一类的生成物基线),测试只比对,不现场解析。这条更符合仓内既有做法,也顺带让这个检查变快、变确定。
倾向 2,但先测量再决定 —— 不要在不知道它正常耗时的情况下直接调大数字。
车道归属
⚠️ 落点在 packages/spec/**,按 #4604 登记表归 spec 车道 (session_0176qgxgCXTJCUv4YFLtusP9),本会话(主 backlog PM)不派发 。
但它影响的是所有车道的合并队列 ,所以优先级建议高于普通 spec 清账单 —— 它每命中一次,成本就落在一个完全无关的 PR 作者头上。这条 issue 由主 backlog PM 代为立单,正是因为受害者在我这一侧。
关联
现象
packages/spec/src/cloud/tenant.test.ts这条用例非确定性超时:7350 条过,唯一一条红,而且是超时不是断言失败。
它是 flaky 的硬证据(不是回归)
同一份 spec 代码,14 分钟内一过一红:
Test Core (1/2)(2/2)gh-readonly-queue/main/pr-4788-941dec4c…)PR #4788 只改
packages/plugins/plugin-auth和docs/adr/0069,碰不到packages/spec的任何文件。中间也没有任何 spec 侧改动进入 —— 后来排队的 #4783(base 更新)CI 是绿的,main 没坏。为什么这不是「重跑一次就行」
今晚这是第二次了,两次都打在不相干的 PR 上:
active存储列喂进了 #4001 之后严格化的 permission spec #4669,permission-set backfill,改packages/metadata-protocol)——Test Core红。我当时误判为 DTS 构建 OOM,是 dev 深挖才定位到本条测试贴着 5s 超时,归属 spec 双源清账 C16:TenantPlan(./cloud ≠ ./system)—— 路线 B:删 system 侧 provisioning 家族,2 条 #4739 / feat(spec)!: 删除./system的 declared-only tenant-provisioning 家族 —— C16 双源清账,基线 12 → 10 (#4739) #4752 车道。[auth] no cache service registered在 CacheServicePlugin 注册前 21ms 就喊了 —— 误报,且把人引向「你需要 Redis」 #4772,改plugin-auth)—— 直接被踢出合并队列(CI_FAILURE),需要人工重新入队。代价不是「多等一轮」,而是:
gh-readonly-queue/*分支的 run,门槛更高。[auth] no cache service registered在 CacheServicePlugin 注册前 21ms 就喊了 —— 误报,且把人引向「你需要 Redis」 #4772 修的那类误报是同一种病:信号无法区分真假,于是所有人开始忽略它。区别只是这条更贵——它卡的是合并队列。建议方向
这条用例叫
resolves the export surface,做的是导出面解析(很可能是逐个动态 import / 模块解析),天然比普通断言慢,5s 是个偏紧的默认值。两条路:authorable-surface.json一类的生成物基线),测试只比对,不现场解析。这条更符合仓内既有做法,也顺带让这个检查变快、变确定。倾向 2,但先测量再决定 —— 不要在不知道它正常耗时的情况下直接调大数字。
车道归属
packages/spec/**,按 #4604 登记表归 spec 车道(session_0176qgxgCXTJCUv4YFLtusP9),本会话(主 backlog PM)不派发。但它影响的是所有车道的合并队列,所以优先级建议高于普通 spec 清账单 —— 它每命中一次,成本就落在一个完全无关的 PR 作者头上。这条 issue 由主 backlog PM 代为立单,正是因为受害者在我这一侧。
关联
./system的 declared-only tenant-provisioning 家族 —— C16 双源清账,基线 12 → 10 (#4739) #4752 —— 引入本用例的双源清账车道Test Corestalls mid-suite with frozen log output — three occurrences in one day, each costing a manual diagnosis + rerun #4250 ——Test Core中途卡死的既有 issue(现象不同:那条是卡住无输出,本条是单用例超时;但同属"Test Core 的稳定性在抽税"这一类,建议一并看)