Skip to content

lint 规则:禁止对引擎/驱动查询选项做 as any / : any 擦除(#4721 的顺带项,已实测残余量) #4918

Closed

Description

@xuyushun441-sys

#4721 正文最后一段的顺带项:「一条更便宜的内部护栏是 lint 禁止对引擎查询选项 as any —— 是否值得单开一单,取决于树里这种擦除还有多少」。#4721 的执行 agent 按 06:25Z 裁决要求做了这次测量,结论是值得,故按 Prime Directive #10 单独立项,未认领。

实测(origin/main = 89d2a4e)

形状 非测试代码 测试代码
A. .find(…) / .findOne(…) / .count(…) / .aggregate(…) 调用里把参数 as any 掉 25 126
C. 局部变量声明成 const opts/options/query/queryOptions/findOptions: any 11 —

A 的样本(全部非测试):

packages/metadata/src/loaders/database-loader.ts:231  return this.engine.find(table, query as any);
packages/objectql/src/engine.ts:4170                  await driver.find(object, …, hookContext.input.options as any)
packages/objectql/src/engine.ts:3788                  ...(nestedAST.orderBy ? { orderBy: nestedAST.orderBy as any } : {}),

C 的样本:

packages/metadata-protocol/src/protocol.ts:4363  const options: any = { ...request.query };
packages/metadata-protocol/src/protocol.ts:4822  const queryOptions: any = { … };
packages/cli/src/commands/data/query.ts:75       const queryOptions: any = { … };
packages/objectql/src/hook-wrappers.ts:461       const options: any = input.options;
packages/runtime/src/domains/mcp.ts:349          const query: any = {};
packages/plugins/plugin-sharing/src/sharing-plugin.ts:735  const options: any = ctx.options;

36 处非测试擦除不是「个位数、顺手清掉」的量级,也不是可以一次性全删的量级——其中一部分(hookContext.input.options、buildDriverOptions 的返回)是真的跨了类型边界,需要的是把边界类型补上而不是删 as any。

为什么这条护栏针对的是 #4674 那一类

#4674 的两个站点都不是「缺运行时闸」漏掉的,是类型被擦掉漏掉的:} as any) 和 const opts: any。EngineQueryOptions.orderBy 声明的就是 SortNodeSchema[],tsc 本来完全有能力在写的那一刻拒绝 direction——它没拒绝,只因为那一行把类型抹平了。#4720 恢复了那两处,#4721 关掉了外部调用方那一侧;这一单是防止同一类擦除再长出来。

注意这三单的分工,不要混:

层 谁来管 状态
内部调用方(包内代码、协议、插件) tsc,前提是没人擦类型 #4720 修了两处;本单防复发
外部调用方(REST / RPC 的 orderBy) schema strict + ingress normalizer #4721 已关

建议形状(需要决定)

  1. 范围:只管「引擎/驱动查询选项」这一个语义位,还是所有 as any?后者必然要一张巨大的 baseline,而这条规则的价值恰恰在窄——它要说的是「查询选项的类型是有意义的,别抹」。倾向窄。
  2. 落点:packages/lint 里的自定义规则,还是 scripts/check-*.mjs 里的一个 AST 走查(仓里已有 check-durability-log-level / check-startup-registry-verdict 两个同形状的、带 shrink-only baseline 的走查)?后者与既有惯例一致,且天然支持「已存在的 36 处进 baseline、只禁新增」。倾向后者。
  3. 测试代码是否算:126 处在测试里。测试里 as any 常常是构造非法输入的正当手段(一个被静默丢弃的排序键对外部调用方仍然是静默的:direction 该 400 还是继续被丢掉(#4674 第 4 项) #4721 自己的拒绝测试就要这么写)。倾向排除测试,或只在测试里禁「传给真引擎的合法查询」这一子集——但这个子集不好机械识别,所以更可能就是排除。

三条都不是实现问题,是规则边界问题,建议由维护者拍板后再动手。

关联:#4674、#4720、#4721、#4363。测量于 #4721 的实现过程。

Activity

  1. xuyushun441-sys commented on Aug 3, 2026

    @xuyushun441-sys
    CollaboratorAuthor

    分诊(PM):入队,domain:devx(落 packages/lint / scripts 门禁族)。正文列的三个规则边界问题属验证策略,PM 直接定、维护者留否决窗口:① 首刀只覆盖非测试代码(25+11 处),测试里的 126 处不阻塞、以 ratchet 计数只减不增管住;② lint-rule vs check-*.mjs 走查:按 packages/lint 既有惯例由实施 dev 定,判据是「哪种在本仓已有同类先例且能双向证红」;③ 作用域=引擎查询选项(EngineQueryOptions / orderBy 一族)的 as any / : any 擦除,不外扩。若实施中发现某条边界实际改公共契约,再 needs_decision。


    Generated by Claude Code

  2. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    Contributor

    选批备注(devx 车道 PM,session_01GX3sL71LFq8m2usg6VqTSE,2026-08-05):packages/lint 文件面已随 PR #5490 合并释放,本单回到可派位,但本轮刻意压后:与在飞 #5024(better-auth 探针)都可能新增根 package.json 的 check:* 脚本条目(共享注册文件,同批禁止),#5024 落地后下一轮即派。

    派发时要点(记在此防丢):① 08-03 的三条边界裁定沿用(非测试 25+11 首刀、测试 126 走 ratchet 只减不增、作用域=引擎查询选项族不外扩、形态由 dev 按仓内先例定);② 正文测量基于 89d2a4e(08-03),两天 ~36 合并后站点数必须重测(#4251 的 slot-lookup 清扫在相邻地带持续推进,可能已消掉部分样本);③ packages/lint 今日两次大改(#5455、#5490 —— 后者新增规则 + 抽出共享 walker),注册面有位移,基于合并后 main;④ 交付物是门禁 + 存量入 baseline 只减不增,⛔ 不在本 PR 清扫那 36 处(其中一部分需要补边界类型而非删 as any,属后续批次)。


    Generated by Claude Code

  3. self-assigned this
    on Aug 5, 2026
  4. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    Contributor

    认领:PM 循环第 5 轮(devx 车道)
    会话:session_01GX3sL71LFq8m2usg6VqTSE
    分支:claude/issue-4918-query-options-erasure
    Worktree:objectstack-issue-4918
    域:domain:devx
    文件面:新门禁(scripts/check-*.mjs 或 packages/lint 新规则文件,dev 按 08-03 分诊定)+ baseline + 根 package.json 一条脚本项。⛔ 互斥声明:同批 #5020 在飞占用 packages/lint/src/validate-react-page-props.ts 及其测试 —— 本单无论选哪种形态都不得触碰该文件;若评估后确需触碰,停下返回 blocked 说明,不硬做。

    派发要点沿 08-05 选批备注:重测站点数(测量基于 89d2a4e,已隔两天)+ 存量入 baseline 只减不增 + ⛔ 不清扫存量 36 处。


    Generated by Claude Code

  5. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    Contributor

    验收(devx 车道 PM,session_01GX3sL71LFq8m2usg6VqTSE,2026-08-05):ACCEPT → PR #5600,转 ready 并挂 auto-merge。


    Generated by Claude Code

  6. 6 remaining items

  7. added a commit that references this issue on Aug 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions