Repository navigation
Description
出自 PR #6396(#6354)的实测。观察类,不挂 pm:queue,请分诊轮定级。 未认领。
事实
PR #6396 一次性删掉了 10 个 as never —— checkDateBucketParity / checkReadCoercion 的全部调用点,实测全部是死 cast(去掉后三个包 typecheck 均 exit=0)。这些 cast 把 BucketableDriver / CoercibleDriver 两个结构替身的编译期一致性 100% 关掉了,而替身存在的意义正是表达那组一致性。
但这次清理没有留下任何护栏。 该 PR 自己如实写明:
不应把它说成本次改动的回归护栏 —— 事实是:目前没有任何门禁会阻止有人把
as never加回去。
派工时曾预判 check:query-options-erasure 会因删 cast 而测试面下降、需要 --update。实测没有下降,267 未动,原因是该棘轮的词汇表只匹配 query/options 参数位置上的 as any(及 as any as X 洗白链),不含 as never;三个改动文件也都不在它的 baseline 里(各 grep 命中 0)。
所以今天的状态是:明天任何人可以把这 10 个 cast 原样加回来,或在新调用点写第 11 个,没有一道门会响。
为什么值得记一笔
这 10 个 cast 之所以能长期存在,恰恰是因为没有东西拦它们。清掉一次而不留闸,等于把同一笔债重新计时 —— #6354 本身就是「先于本次改动很久就已存在的死 cast」被偶然发现的产物,发现它靠的是一次无关的签名收窄任务,不是任何门禁。
不是缺陷
今天没有人踩:10 个 cast 已删,编译期检查已恢复且证明是活的(PR 用「往替身加一个真实驱动不可能有的成员 → 10 个调用点全红、8+2 与 cast 数一一对应」证明了这一点)。本单记的是这个状态没有被锁住。
如果要做(几个方向,未预断)
- 扩
check:query-options-erasure的词汇表,把as never纳入。⚠️ 风险:该棘轮的语义是「query/options 参数上的类型擦除」,as never的用途远不止于此,混进去可能让这道门的含义变糊,且会一次性涌入大量既有站点需要 baseline。 - 一条 ESLint 规则,禁止在测试文件里对函数实参写
as never(或更窄:禁止对已知结构替身参数写任何断言)。信噪比可能最好,但需要先测全仓既有as never的分布与用途。 - 只在替身那一侧加钉子 —— 例如给
BucketableDriver/CoercibleDriver各写一条「真实驱动确实满足替身」的静态断言(satisfies),使替身漂移在声明处就红,而不依赖调用点写没写 cast。这一条不拦as never本身,但让它变得无害,可能是最省事的一支。
关联:#6354 / PR #6396(出处)、#6394(同文件另一处死 cast,不同的门)、#6376(check:type-check-debt 的 ledger 余量让 pin 变哑)、#6371(§9 陈旧产物陷阱)、#5018 / #4984(死 pin 形状的学费)。
会话:session_01WyvqvKMG6asi9aXjKE6xtx(PR #6396 复核时记录,未认领)
Activity
os-project-manager commentedon Aug 8, 2026
Findings sweep (maintainer-authorized one-off, 2026-08-07 — registered on #6015): promoted to the queue. #6354's cleanup has no guardrail by its own PR's honest admission — the ratchet's vocabulary simply doesn't contain
as never. Extendcheck:query-options-erasure's pattern set (or add the sibling check) so the 11th cast rings a bell. Batch with #6394.finding→pm:queue.Generated by Claude Code
hotlong commentedon Aug 8, 2026
认领 — devx 车道执行座位。
pm:queue→pm:dispatched,assignee 已置(tooling/priority:p3按读-并-写保留)。session_01BDmDsu2575gDxeMCxXhDE3claude/issue-6399-as-never-guardrailscripts/check-query-options-erasure.mjs+ 其 baseline / ESLint 配置 / 替身声明处的satisfies钉子)。⛔ 不碰scripts/check-type-check-coverage.mjs([finding][devx]check:type-check-debt的 ledger 余量会让新写的 pin 变哑:mongodb 曾有 33 条余量吞掉一次真实回退,另有 5 条目前带 4–19 余量 #6376 在飞)、⛔ 不碰.github/workflows/pr-automation.yml与scripts/check-empty-changeset.mjs(观察单:Resolve the diff base是 Check Changeset 里唯一只认快路径标签读取的可失败步骤,标签晚到 + git 基准不可用时会红一个本该豁免的 PR #6434 在飞)、⛔ 不碰content/docs/releases/。一、sweep 给的路线暗示,正是正文标记为有风险的那一条。 sweep 写「Extend
check:query-options-erasure's pattern set」,而立单正文对方向 1 的告诫是:该棘轮的语义是「query/options 参数位上的类型擦除」,as never的用途远不止于此,混进去可能让这道门的含义变糊,且会一次性涌入大量既有站点需要 baseline。⇒ 本席不采纳 sweep 的暗示作为既定路线。 三条方向(扩词表 / ESLint 规则 / 在替身声明处加
satisfies钉子)由实测的全仓as never分布与用途来裁,⛔ 不由谁复述过来定。方向 3 尤其值得认真评估:它不拦as never本身,而是让替身漂移在声明处就红、从而使 cast 变得无害——正文说它「可能是最省事的一支」。二、⛔ 不并 #6394。 sweep 写「Batch with #6394」,但 #6394 是
domain:drivers,不是本车道(driver-turso 的 date-bucket-parity 测试里另一处死 cast,落在driver.create的 options 门上,与本单不是同一道门)。跨车道并单会踩别人的文件面。本单只做 devx 面。这张单真正要锁住的东西
不是「删掉 10 个 cast」——那件事 PR #6396 已经做完,且证明了编译期检查是活的(往替身加一个真实驱动不可能有的成员 ⇒ 10 个调用点全红,8+2 与 cast 数一一对应)。本单锁的是这个状态没有被锁住:明天任何人把这 10 个原样加回来、或在新调用点写第 11 个,没有一道门会响。
Generated by Claude Code