Skip to content

test(verify): 删掉 checkDateBucketParity / checkReadCoercion 全部调用点的 as never (#6354) - #6396

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-6354-date-bucket-parity-as-never
Aug 7, 2026
Merged

test(verify): 删掉 checkDateBucketParity / checkReadCoercion 全部调用点的 as never (#6354)#6396
os-zhuang merged 2 commits into
mainfrom
claude/issue-6354-date-bucket-parity-as-never

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #6354

观察类(p3),不是缺陷。 运行期行为此前就完全正确:checkDateBucketParity 照常跑,date-bucket 一致性照常被验证(dogfood 520 全绿,改动前后一致)。本 PR 恢复的只是编译期的一致性检查,零运行时改动

前提复核:论断成立,但立单时的计数偏低

立单表里列了 3 个调用点。实测全仓是 10 个 —— 立单人的表只覆盖了「传真实驱动」的那几处,漏掉了同一文件里 5 个传假驱动(负向控制)的调用点,以及 checkReadCoercion 的 2 处。

文件 立单表 实测
packages/qa/dogfood/test/date-bucket-parity-conformance.test.ts 1 6
packages/drivers/driver-turso/src/date-bucket-parity.test.ts 2 2
packages/qa/dogfood/test/read-coercion-conformance.test.ts(同族,见下) 未列 2

漏掉的 5 处不是无关紧要的:负向控制那几个假驱动恰恰是最需要被替身检查的对象 —— 它们是手写字面量,最容易与替身失配,而 as never 把它们全部放行了。全部 10 处一并删除,一个不留。

基线

按派工单要求,基线取已合入 #6355(批 A+E+F)之后origin/main。本分支已 merge 到 466bd9285,合并后的 BucketableDriver.aggregate 已是收窄后的形状(不再是 unknown),全套验证在该基线上重跑了一遍。

(说明:#6355 合入前我已用它的 date-bucket-parity.ts 在本地先行复核过一次,结论与合入后一致 —— 收窄不改变结果,原因见下。)

三处(实为十处)各自独立复核

turso 两处没有沿用 dogfood 的结论:driver-turso 是独立的 tsc program,跑的是它自己的 typecheck

### @objectstack/verify        -> exit=0   (zero tsc diagnostics)
### @objectstack/dogfood       -> exit=0   (zero tsc diagnostics)
### @objectstack/driver-turso  -> exit=0   (zero tsc diagnostics)

没有任何一处报错。 派工单说「若某处去掉后真的报错,那个报错就是本单最有价值的产出」—— 本单没有拿到这个产出:替身与三个真实驱动(SqlDriver / SqliteWasmDriver / TursoDriver)以及 5 个手写假驱动的形状本来就一致。10 个 cast 全是死的。

为什么 #6355 的收窄不改变结论,值得写下来:接口里以方法简写语法声明的成员,其参数按双变比较,所以把 aggregate 的 query 参数从 unknown 收到更窄的类型,并不会让一个原本满足替身的驱动变得不满足。这也正是 #6355 自己在注释里已经说明的那件事。

「确实读到了新 d.ts」的证据(AGENTS.md §9)

绿本身不算数 —— dogfood / driver-turso 读的是 @objectstack/verify构建产物 dist/*.d.ts,读到陈旧的一份也会绿。所以先按派工单要求做了反向验证。

方向先预判:往替身里塞一个真实驱动不可能有的成员,10 个已去 cast 的调用点应当全部变红。 临时给两个替身各加一行 __freshnessProbe(): void;,重新 build @objectstack/verify,再 typecheck 两个消费方:

--- dogfood: 8 处 error TS2345
--- turso:
src/date-bucket-parity.test.ts(43,52): error TS2345: ... not assignable to parameter of type 'BucketableDriver'.
src/date-bucket-parity.test.ts(128,52): error TS2345: ... not assignable to parameter of type 'BucketableDriver'.

8 + 2 = 10,与删掉的 cast 数一一对应。 这同时证明了两件事:消费方读到的确实是刚 build 出来的新 d.ts(不是假绿),且每一个调用点现在都真的在受检 —— 不是「没报错」,是「检查活着且会咬人」。探针已还原,dist__freshnessProbe 命中数已回到 0。

顺带一项:checkReadCoercion 已并入(派工单授权)

派工单点名要实测 CoercibleDriver 是否同形。实测:同形。它就是 BucketableDriver 去掉 aggregatesupports,2 个调用点同样全是 as never,同样全是死 cast(上面的探针实验里这 2 处也一并变红)。改动 2 行,判定「同形且改动微小」,按派工单授权并入本 PR

硬约束自查

零新增逃逸口。 全 diff 只删不加:

$ git diff origin/main -- packages/ | grep '^+' | grep -E 'as any|as unknown as|@ts-ignore|@ts-expect-error|as never'
clean: no added escape hatches

未碰 content/docs/releases/;未碰 driver-memory / driver-mongodb(#5499 冻结);未碰 packages/spec

门禁

✓ query-options-erasure ratchet holds: 83 unswept non-test site(s) in 19 file(s), none new.
✓ check-type-check-coverage --re-measure: OK — 34 ledger entr(ies) re-measured in 207.8s,
    2030 raw tsc error(s) total, none above its recorded number.
✓ check-nul-bytes: OK (scanned 6047 tracked text file(s); no raw ASCII control bytes).
✓ check-empty-changeset: 1 declaring changeset(s) added.
✓ eslint(三个改动文件):零输出

关于 erasure 棘轮,有一处要如实说明:派工单预判「本单删 cast,测试面可能下降而变红」。实测没有下降,计数 267 未动。 原因是该棘轮的词汇表只匹配 query/options 参数上的 as any(及 as any as X 洗白链),不包含 as never,三个改动文件也都不在它的 baseline 里(各 grep 命中 0)。所以不需要 --update,也不应把它说成本次改动的回归护栏 —— 事实是:目前没有任何门禁会阻止有人把 as never 加回去。

测试

@objectstack/verify        Test Files  4 passed        Tests  17 passed
@objectstack/driver-turso  Test Files 25 passed        Tests 808 passed
@objectstack/dogfood       Test Files 85 passed | 1 skipped   Tests 520 passed | 3 skipped

均在合并后的基线上重跑。运行期行为与改动前完全一致 —— 本来就应该一致,这是纯类型改动。

消费半径

@objectstack/verify下游(前缀点 ...pkg)实测只有 @objectstack/dogfood@objectstack/driver-turso 两个包引用这两个导出,两处都在本 PR 内。

顺带发现(已另立单,不在本 PR 修)


🤖 Generated with Claude Code

https://claude.ai/code/session_01WyvqvKMG6asi9aXjKE6xtx


Generated by Claude Code

os-zhuang and others added 2 commits August 7, 2026 16:16
…dCoercion call site (#6354)

`@objectstack/verify` declares `BucketableDriver` / `CoercibleDriver` as
structural doubles for the driver under test. Every call site in the repo
cast the driver to `never` first, so the one thing the doubles exist to
express — "this driver really does have that set of methods" — was never
checked anywhere.

Removes all 10 casts (6 dogfood parity, 2 turso parity, 2 dogfood
read-coercion). Zero runtime change, zero new escape hatches.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WyvqvKMG6asi9aXjKE6xtx
@vercel

vercel Bot commented Aug 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Aug 7, 2026 4:47pm

Request Review

@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tests tooling labels Aug 7, 2026
@github-actions

github-actions Bot commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

No hand-written docs reference the 0 changed package(s). ✅

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

Labels

documentation Improvements or additions to documentation size/s tests tooling

Projects

None yet

2 participants