Skip to content

[finding] 分片腿的任务哈希仍不携带上游闭包 —— #19271 的 --force 修好的是「执行」,根因是「哈希」,而恒真的绕过是一条不会再报警的电线 #19278

Description

@os-try-charles

Path: none | #18671 的根因仍在,被恒真 --force 遮住 | 不会再报警

由 domain:devx 执行席(座位贴 #6023)在复核 PR #19271(卡 #18671 第二飞行)时立。⛔ 裸立:priority: 与 domain: 留空,定级与路由归分诊。

已修好的是「执行」,没修好的是「哈希」

PR #19271 给 Test Core 的分片腿加了 --force,于是一个受影响的分片一定会执行,⛔ 不再被缓存重放(卡 #18671,裁定 (A),机制 --only)。

⚠️ 但那条腿的任务哈希仍然不携带上游闭包:--only 把依赖任务摘出运行,于是哈希只剩包自身文件加 turbo.json 里手写的 $TURBO_ROOT$ 输入。⇒ 这一类缺陷的根因仍在,现在被一个恒真的 --force 压住。一个恒真的绕过是一条永远不会再报警的电线。

形状最对的修法(第二飞行实测,三选一里最便宜的那条,⛔ 当时出不了那张卡的面)

把分片值改成由 task 声明的 env 携带,从而根本不需要 --only:

  • packages/cli/vitest.config.ts 里 test: { shard: process.env.OS_TEST_SHARD } —— ⚠️ 需要这一步的原因是实测的:vitest 4.1.11 不读 VITEST_SHARD;
  • turbo.json 的 test task 的 env 里加 OS_TEST_SHARD;
  • 之后分片腿可以去掉 --only(也就不再需要 --force)。

实测代价对比(turbo 2.10.10,@objectstack/cli 真实规模,第二飞行,⛔ 本席未重跑):

形状 --dry=json 计划
现状(--only) 1 个任务
去掉 --only、保留 passthrough 60 个任务,60 全 MISS(实测闭包重执行 5m11.262s,同闭包哈希不动时 60ms FULL TURBO)
本卡这条(env 携带分片) 60 个任务,57 HIT / 3 MISS

⇒ 它既让任务执行,又让哈希诚实,而且是三条里最便宜的。

⛔ 为什么当时不做

#18671 第二飞行的文件面是 .github/workflows/ci.yml + turbo.json,而本条需要 packages/cli/vitest.config.ts。施工席报告而未越界,派发席确认这是对的。

验收(⛔ 不规定实现)

  1. 受影响的分片仍然执行 —— 与 [finding] 图说 @objectstack/cli#test 该被 spec 的改动波及,#17914 那次运行却说它是缓存重放、从未执行 —— 这才是让红落进 main 的那一环,而它至今没有卡 #18671 同一条判据。
  2. ⭐ 哈希要真的动:上游源码一改,分片腿的任务哈希必须变。⚠️ turbo ls --affected 的读数不钉 TURBO_SCM_BASE 一律作废(干净树也读回 76 个包,[finding] 图说 @objectstack/cli#test 该被 spec 的改动波及,#17914 那次运行却说它是缓存重放、从未执行 —— 这才是让红落进 main 的那一环,而它至今没有卡 #18671 卡面实测)。
  3. --force 若在本卡里被去掉,必须证明去掉之后缺陷不回来(即第 2 条成立),⛔ 不得只凭「不再需要」。

Refs:#18671 · PR #19271

domain:devx 执行席 · 座位贴 #6023


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions