Skip to content

refactor(spec,drivers,lint): one implementation of the filter identity reduction - #6528

Merged
qq9340100 merged 1 commit into
mainfrom
claude/issue-5659-reduce-filter-verdict
Aug 8, 2026
Merged

refactor(spec,drivers,lint): one implementation of the filter identity reduction#6528
qq9340100 merged 1 commit into
mainfrom
claude/issue-5659-reduce-filter-verdict

Conversation

@qq9340100

Copy link
Copy Markdown
Collaborator

Fixes#5659

维护者 2026-08-06 裁决方案 1(跨域例外单,spec 座位整单认领,定向在飞检查已跑并留档于认领评论)。

收编

新增 packages/spec/src/data/filter-verdict.ts(与证明它的 FILTER_LOGIC_CASES 同处一地):

四消费者:driver-sql / driver-mongodb 机械替换;driver-memory 的 evaluate 前置判定(恒等元答案不再是 Array.prototype 的涌现副产物);lint 的 filterCarriesNoCondition 改问归约。

lint 补回两个漏判形状

{ $and: [] }(TRUE,整表写)与 { $or: [{}] }(TRUE 析取项吸收)现在告警;{ $or: [] } / { $not: {} }(FALSE,匹配零行)正确保持沉默——手写「是否空组合子」会把后两者误报,共享判定不会,因为它就是 driver 执行的那个判定。message 按实际形状命名,不再把非空 filter 说成 "EMPTY"。

验证(要点;完整读数见分支 commit message)

  • 反向验证(方向先写):把谓词的 $and: [] 临时改 FALSE → 预判并实测 spec 5 红 / lint 3 红 / driver-memory 1 红 / driver-sql 3 红,复原全绿。driver 侧转红证明耦合是真的——收编前动 spec 谓词碰不到任何 driver。
  • 五包全绿(spec 8758 / lint 1578 / sql 959 / mongodb 206 / memory 532)+ 继承者 sqlite-wasm、turso 全绿;五包 typecheck Done;check:type-check-debt OK(首跑 +5 是陈旧构建陷阱,全量 build 后消失);门禁族含 check:driver-conformance 全绿。
  • spec 生成物:api-surface/data.json +5(新公开导出),10/10 up to date;ADR-0122 不适用(普通 TS 函数/类型,非 zod 别名)。
  • 边界严守:未触 packages/lint/src/index.ts(在飞 PR feat(lint): view/page 可见性谓词的 CEL 语法构建期闸门 (#6253) #6472 的 barrel)及他人领地三文件。

交付通道注记

云端工头 D 会话(session_01TQ1rGJx1JZ1dYGP4r9Mmov)无 GitHub 工具,走交付降级通道:dev 实现并 push 分支,PM(session_011M7UwH25Unfi73UHim7ajY)代开本 PR 并跟进 CI 至合并。


Generated by Claude Code

…y reduction (#5659)
维护者 2026-08-06 裁决方案 1。布尔身份归约(`$and: []` 为 TRUE、`$or: []` 为
FALSE、`{}` 是吸收 `$or` 的 TRUE 析取项、`$not: {}` 为 FALSE)是 #5322/#5134 的裁
决,由 `FILTER_LOGIC_CASES` 的四条恒等元 case 钉住 —— 却被实现了四遍:driver-sql
的 `reduceFilterNode`、driver-mongodb 里同名的一份、driver-memory matcher 里
`every`/`some`/真值性涌现出的第三份,以及 lint 里差点手抄的第四份(
`lint-flow-patterns.ts` 拒绝手抄并开了本 issue)。
## 收编
新增 `packages/spec/src/data/filter-verdict.ts` —— 与证明它的 case 表同处一地:
- `reduceFilterVerdict(node, options?) -> 'true' | 'false' | 'clause'`,纯归约,
自身从不抛错;
- `reduceFilterKeyVerdict(key, value, options?)`,SQL / MongoDB 两个 emitter 在
已进入某节点时只问一个 key 的判定,需要这个入口;
- `FilterVerdictHooks` —— 各 backend 自己的拒绝(driver-sql 的未声明 `$` 组合子、
`undefined` 比较数;driver-mongodb 的 query-level key、`$null` 比较数)作为钩子
传入,并在它们原先被调用的**同一位置**调用。所以没有任何 message / code /
status 发生位移。
- 无钩子时(lint 的用法)每个无法归约的形状一律答 `'clause'`(保守方向);把不可
归约的东西答成 `'true'` 才是把垃圾提升成 match-all —— #5239 正是为此把非节点
拒绝放在 MongoDB 身份归约之前。
四个消费者收编:
1. `driver-sql/src/sql-driver.ts` —— 机械替换,拒绝留在 `classifyFilterKey`;
2. `driver-mongodb/src/mongodb-filter.ts` —— 同;
3. `driver-memory/src/memory-matcher.ts` 的 `evaluate` —— 前置一次记录无关的判定
(`'true'`/`'false'` 直接返回,`'clause'` 原样落到未改动的求值循环)。恒等元答
案不再是 `Array.prototype` 的涌现副产物,而是与另两个 driver 同一个对象;
4. `packages/lint/src/lint-flow-patterns.ts` 的 `filterCarriesNoCondition`。
## lint 补回两个漏判形状
`multi: true` 无界整表写规则(#5482)此前问的是"filter 有没有零个 key",于是
`filter: { $and: [] }`(AND 恒等元,整表写)与 `filter: { $or: [{}] }`(TRUE 析取
项吸收整个 `$or`)两种形状静默通过。现在改问归约,两者都告警;而 `{ $or: [] }`
与 `{ $not: {} }` 归约为 FALSE(匹配零行),继续保持沉默 —— 手写"是不是空组合子"
的判据会把这两个也误报,共享判定不会,因为它就是 driver 执行的那个判定。
message 按实际形状命名(``a `filter` that REDUCES TO TRUE (`{"$and":[]}`)``),
不再把非空 filter 说成 "EMPTY"。lint 测试正反两向断言,并直接断言
`reduceFilterVerdict(...) === 'true'` 与规则告警一一对应。
## 验证
- 反向验证(方向先写后跑):把共享谓词的 `$and: []` 判定临时改为 FALSE,预判
spec pin + case-set 一致性检查、lint 新告警、以及**三个 driver 的 conformance
case-set** 同向转红。实测 spec 5 红 / lint 3 红 / driver-memory 1 红 /
driver-sql 3 红,复原后全绿。driver 侧转红是关键一环:它证明这次耦合是真的,
不是装饰 —— 收编前动 spec 侧谓词碰不到任何 driver。
- 五包全绿:spec 341 files / 8758 tests,lint 62 / 1578,driver-sql 69 / 959,
driver-mongodb 10 / 206,driver-memory 18 / 532;五包 typecheck 全 Done。
- 继承 SqlDriver 的 driver-sqlite-wasm(18 / 254)与 driver-turso(27 / 828)同样
全绿。
- `pnpm check:type-check-debt` OK(34 条 ledger 重新测量,无一超出记录值 —— 首跑
报 root +5 是 AGENTS.md §9 的陈旧构建陷阱,`pnpm build` 全量后消失)。
- 门禁族全绿:eslint、check:nul-bytes、check:engine-double-contract、
check:error-code-casing、check:route-envelope、check:driver-conformance、
check:spec-parsed-alias、check:query-options-erasure、check:merge-driver。
- spec 生成物:新增 5 个公开导出,`check:generated --fix` 只重生成被证明陈旧的
`api-surface/`(data.json +5 行);其余 9 项本就最新,复跑后 10/10 up to date。
`gen:openapi` 补跑,产物在 gitignore 的 `json-schema/` 树内,无 tracked 变更。
ADR-0122 不适用:新导出是普通 TS 函数与类型,不是 Zod schema 别名,
`type-alias-convention.pin.test.ts` 的 754 计数无需变动(spec 全量测试已覆盖)。
## 边界(按认领申报严守)
未触碰 `packages/lint/src/index.ts`(在飞 PR #6472 正在改该 barrel;本改动不产生
新规则 id,实测确不需要动它)、`data-model-rules.ts`、
`validate-semantic-roles.ts`、`validate-visibility-predicates.ts`。
未触碰 `content/docs/releases/`。
## 交付
本会话无 GitHub 工具,按指示只推分支、不开 PR。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TQ1rGJx1JZ1dYGP4r9Mmov
@vercel

vercelBot commented Aug 8, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 8, 2026 3:15am

Request Review

@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 5 package(s): @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/lint, @objectstack/spec.

116 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx(via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx(via @objectstack/spec)
  • content/docs/ai/skills.mdx(via @objectstack/spec)
  • content/docs/api/client-sdk.mdx(via @objectstack/spec)
  • content/docs/api/environment-routing.mdx(via @objectstack/spec)
  • content/docs/api/error-catalog.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx(via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx(via @objectstack/spec)
  • content/docs/api/index.mdx(via @objectstack/spec)
  • content/docs/automation/approvals.mdx(via @objectstack/spec)
  • content/docs/automation/connectors.mdx(via @objectstack/spec)
  • content/docs/automation/flows.mdx(via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx(via @objectstack/lint, packages/spec)
  • content/docs/automation/hooks.mdx(via @objectstack/spec)
  • content/docs/automation/index.mdx(via @objectstack/spec)
  • content/docs/automation/webhooks.mdx(via @objectstack/spec)
  • content/docs/automation/workflows.mdx(via @objectstack/spec)
  • content/docs/concepts/architecture.mdx(via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx(via packages/spec)
  • content/docs/concepts/index.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx(via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx(via packages/spec)
  • content/docs/concepts/north-star.mdx(via @objectstack/spec)
  • content/docs/data-modeling/analytics.mdx(via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx(via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx(via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx(via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx(via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx(via @objectstack/spec)
  • content/docs/data-modeling/index.mdx(via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx(via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx(via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx(via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx(via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx(via @objectstack/spec)
  • content/docs/deployment/cli.mdx(via @objectstack/spec)
  • content/docs/deployment/tenancy-modes.mdx(via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx(via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx(via @objectstack/spec)
  • content/docs/deployment/vercel.mdx(via @objectstack/driver-memory)
  • content/docs/getting-started/build-with-claude-code.mdx(via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx(via @objectstack/spec)
  • content/docs/getting-started/examples.mdx(via @objectstack/spec)
  • content/docs/getting-started/glossary.mdx(via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql)
  • content/docs/getting-started/quick-reference.mdx(via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx(via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx(via @objectstack/spec)
  • content/docs/kernel/cluster.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx(via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx(via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx(via @objectstack/spec)
  • content/docs/kernel/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/data-service.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/email-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/examples.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/index.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx(via @objectstack/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx(via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx(via @objectstack/spec)
  • content/docs/kernel/services-checklist.mdx(via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/kernel/services.mdx(via @objectstack/spec)
  • content/docs/permissions/authentication.mdx(via @objectstack/driver-memory)
  • content/docs/permissions/authorization.mdx(via @objectstack/lint, @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx(via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx(via @objectstack/spec)
  • content/docs/permissions/positions.mdx(via @objectstack/spec)
  • content/docs/permissions/rls.mdx(via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx(via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx(via @objectstack/spec)
  • content/docs/plugins/anatomy.mdx(via @objectstack/driver-sql)
  • content/docs/plugins/development.mdx(via @objectstack/spec)
  • content/docs/plugins/index.mdx(via @objectstack/driver-memory, @objectstack/spec)
  • content/docs/plugins/packages.mdx(via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx(via @objectstack/spec)
  • content/docs/protocol/diagram.mdx(via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx(via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx(via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx(via @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx(via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx(via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx(via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx(via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx(via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx(via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx(via @objectstack/driver-memory, @objectstack/driver-mongodb, @objectstack/driver-sql, @objectstack/spec)
  • content/docs/releases/index.mdx(via @objectstack/spec)
  • content/docs/releases/v12.mdx(via @objectstack/spec)
  • content/docs/releases/v13.mdx(via @objectstack/spec)
  • content/docs/releases/v16.mdx(via @objectstack/spec)
  • content/docs/releases/v17.mdx(via @objectstack/lint, @objectstack/spec)
  • content/docs/releases/v9.mdx(via @objectstack/spec)
  • content/docs/ui/actions.mdx(via @objectstack/spec)
  • content/docs/ui/apps.mdx(via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx(via @objectstack/spec)
  • content/docs/ui/dashboards.mdx(via @objectstack/spec)
  • content/docs/ui/field-grouping-and-order.mdx(via @objectstack/spec)
  • content/docs/ui/forms.mdx(via @objectstack/spec)
  • content/docs/ui/index.mdx(via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx(via @objectstack/spec)
  • content/docs/ui/setup-app.mdx(via @objectstack/spec)
  • content/docs/ui/translations.mdx(via @objectstack/spec)
  • content/docs/ui/views.mdx(via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

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

Labels

documentationImprovements or additions to documentationprotocol:datasize/lteststooling

Projects

None yet

2 participants

@qq9340100@claude