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

vercel Bot commented Aug 8, 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 8, 2026 3:15am

Request Review

@qq9340100
qq9340100 enabled auto-merge August 8, 2026 03:15
@github-actions github-actions Bot added the size/l label Aug 8, 2026
@github-actions

github-actions Bot commented Aug 8, 2026

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 free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/l tests tooling

Projects

None yet

2 participants