test(objectql): 把 now 单一时刻 pin 从值相等改成按构造断言 (#5896) - #6658
Merged
Conversation
`engine.test.ts` 的 `pins \`now\` once per find (#1979)` 用值相等钉 「一次 find 只取一个 `new Date()`」,而回归形态是逐次求值各取一次时钟 —— 同毫秒内的两个 Date 值相等、对象不同,故该断言只在三次求值恰好跨毫秒 边界时才红。实测(复刻 PR #5894 探针 B):整文件跑 10 次里它绿了 3 次, 单进程 200 次 find 里 145 次三值全等 —— 按运气报警。 改为对 `ExpressionEngine.evaluate` 收到的上下文插桩:先钉求值次数(3 = 1 formula 字段 × 3 行,防止空调用列表下的空绿),再按对象同一性断言三次 求值拿到同一个 `now`。值相等保留为「调用方可见的症状」,但不再是报警来源。 保留 `#1979` 出处标记(issue 处置选项 1:加强而非退休)。 test-only:未触碰任何生产文件。 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019Q7oc7ASjh8yxyS3Yz78We
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
Contributor
📓 Docs Drift CheckNo hand-written docs reference the 0 changed package(s). ✅ |
baozhoutao
marked this pull request as ready for review
August 8, 2026 09:31
This was referenced Aug 8, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #5896
结论:前提成立,走处置选项 1(加强而非退休)
engine.test.ts的pins now once per find so every row sees the same instant (#1979)改为按构造断言单一时刻:对ExpressionEngine.evaluate收到的上下文插桩,先钉求值次数,再按对象同一性断言三次求值拿到同一个now。保留#1979出处标记。test-only,未触碰任何生产文件。前提复核(P1-P3,动手前逐条实测)
#1979的it标题),命中engine.test.ts:1931,断言体为expect(result[0].ts).toEqual(result[1].ts)/expect(result[1].ts).toEqual(result[2].ts)engine.test.ts无他席在飞占用origin/main上最近一次改动是ce5242c88(2026-08-02),推前git fetch+git log HEAD..origin/main -- packages/objectql/src/engine.test.ts复核为空git rev-parse --is-shallow-repository= true,origin/main仅 438 commit 可达),git log -- packages/objectql/src/engine.test.ts会把浅边界 commit 报成该文件的最近改动。已git fetch origin main --deepen=500(1105 commit 可达)后重读,上表 P3 出自加深后的历史。加强前后断言对照
之前 —— 值相等,判定取决于三次求值是否恰好跨毫秒:
之后 —— 按构造,判定与毫秒无关:
选型说明,三点:
[].every(...)恒真,断言「因为什么都没产生」而通过。toHaveBeenCalledTimes(3)与toBeInstanceOf(Date)把这个洞堵上,断言才是对真实发生的三次求值说话。onTestFinished而不是 describe 级afterEach。spy 的拆除限制在本用例内,不给邻近 129 条用例引入任何新的生命周期钩子 —— 这是热文件,改动面压到最小。反向验证(方向先写死,再实测)
探针复刻 PR #5894 的探针 B:把时钟读进逐次求值,即
applyFormulaPlan内层循环改成{ now: new Date(), ... }(临时改动,已回滚,不在本 PR diff 内)。RGRGRRRRRG→ pin-green=3 pin-red=7RRRRRRRRRR→ pin-green=0 pin-red=10engine-write-formula-hydration.test.ts的#5699同一性组,跑 5 次RRRRR→ green=0 red=5Test Files 1 passed / Tests 130 passed第 2 组的失败落点正是同一性那一行,而不是值比较:
派发令给了一条停止条件:若探针下旧断言恒红,则前提不成立,停下回报。第一次测量正好撞上这条:用
-t收窄到该用例、连跑 20 次,结果 20/20 全红。但那是冷启动假象。
-t会把同文件其余 129 条用例跳过,于是每次跑的都是冷进程里的第一次 find —— JIT 未热、CEL 首次编译,三次求值几乎必然跨毫秒。CI 与本地的真实跑法是整文件跑,轮到该用例时进程早已跑热。直接测底层速率把这一点坐实(临时在该用例内循环 200 次 find,只统计不断言):
即同一进程内 200 次 find,145 次(72.5%)三值全等,旧断言会放行这个回归;三行时间跨度均值仅 0.34 ms。换成整文件跑法复测(上表第 1 组),旧断言 10 次里绿 3 次 —— 与 200 次的量级一致。
结论:停止条件未触发,前提成立。「20/20 全红」量的是冷启动这一种条件下的 20 次抽样,不是该断言的真实报警率;把它当读数会得出与事实相反的结论。这也顺带解释了为什么 PR #5894 当时那一跑看到它红了 —— 那一次的运气落在红的一侧,而运气正是本单要拆掉的东西。
验证
check:type-check-debt另报了 11 条 entry 的 surplus(记账上限高于实测值,可--lower)。本 PR 未动:那是 #6376 的既有账,与本改动无关,台账只缩不抬的要求已满足(none above its recorded number)。范围
git diff origin/main只含 1 个文件、26 增 3 删:packages/objectql/src/engine.test.ts。engine.ts的临时改动已git checkout回滚,推前git status复核干净。加强不需要暴露任何插桩点:applyFormulaPlan已经把now放进传给ExpressionEngine.evaluate的上下文里,spy 现成可读。engine-write-formula-hydration.test.ts的#5699组(已必然报警,本单不重复)—— 它在本 PR 里只作为反向验证的对照被跑过,未被修改。onTestFinished、ExpressionEngine)。changeset
无 changeset(test-only):本 PR 不改变任何运行时行为,不发布任何包。
skip-changeset标签按派发口径由 PM 落。Generated by Claude Code