Skip to content

refactor(spec,plugin-security)!: QueryAST 不再声明没有执行器运行的成员 — joins/windowFunctions 墓碑化,liveness ledger 接管请求面 (#4286) - #4294

Merged
os-zhuang merged 1 commit into
mainfrom
claude/queryast-executor-liveness-ledger-tbg5sf
Jul 31, 2026
Merged

refactor(spec,plugin-security)!: QueryAST 不再声明没有执行器运行的成员 — joins/windowFunctions 墓碑化,liveness ledger 接管请求面 (#4286)#4294
os-zhuang merged 1 commit into
mainfrom
claude/queryast-executor-liveness-ledger-tbg5sf

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

落实 #4286 的第 1、2、5 步(机械层 + 闸门)。第 3 步(having)与第 4 步(cursor/distinct)按 issue 自己的定性留给维护者裁决,本 PR 只在新 ledger 里把三者记为 dead 并写明证据与待决事项——所以关闭 #4286

处置一:joins / windowFunctions 移除(墓碑化)

  • 两个键都换成 retiredKey() 墓碑(BaseQuerySchema 非 strict,裸删除会被 zod 静默剥离——ADR-0104 那一类):作者侧 tsc 直接报错,运行时 parse 给出带 FROM→TO 的处方,连 joins: [] 也拒绝。
  • 孤儿 schema 集群随键删除(refactor(spec)!: remove the plugin sandboxing / integrity / approval config that never existed (#3896 follow-up) #3950 先例):JoinNode/JoinNodeInput/JoinNodeSchema/JoinType/JoinStrategyWindowFunction/WindowSpec/WindowFunctionNode(api-surface 少 10 个导出;data/JoinNode 等 6 个 JSON schema 出清单)。
  • window 集群多查出一层:唯一活门 SqlDriver.findWithWindowFunctions() 吃的是驱动自己的扁平形状({ function, alias, partitionBy?, orderBy? },见 driver 测试与 buildWindowFunction)——spec 节点声明的 field/over/frame 那个门从未读过。保留 spec 词汇表只会一层之隔地重演「声明 ≠ 执行」,所以随键删除;文档里驱动门示例已改为真实形状。
  • ADR-0087:注册为 protocol-18 semantic migration(query-joins-retired / query-window-functions-retired)——QueryAST 是请求面、从不落盘,链无源可改写,循 [P3] data: FieldNode's nested-select object form is declared but nothing produces or consumes it — enforce or remove #4196(query-field-node-object-form-retired)先例;gen:schema 闸门 (b) 据此放行。
  • REST 兼容注记(issue 发现 4):墓碑期内两个名字仍占据 RESERVED_LIST_QUERY_PARAMS(retiredKey 保留 keyof QueryAST 成员),行为零变化;去保留发生在墓碑到期删除时,已写进 QUERY_AST_KEYS 注释提醒后人。
  • 安全侧联动(issue 发现 3):predicate-guard 删掉 windowFunctions 遍历(条款已不存在,无可泄漏);havingaggregations[].filter 的遍历保留——它们仍在声明面上,guard 就绪正是日后 enforce 的安全前提。

处置二:六个 search 旗标 + AggregationNode.filter 标记 experimental

search.{fuzzy,operator,boost,minScore,language,highlight}(ADR-0061 展开只读 query+fields)与 aggregations[].filter(SQL/内存两路都不应用)加 [EXPERIMENTAL — not enforced] describe 标记。无 wire/兼容影响;ledger 直接从标记解析状态。

处置三(第 5 步,核心):liveness ledger 接管请求面

  • QuerySchemaSPEC_ONLY_SCHEMAS 进入 governed 类型 query(webhook 先例,但这是常驻覆盖——请求面没有 registry 可回折)。issue 点名的缺口正在此:ledger 只管作者写进元数据的东西,没人管调用者写进 query 的东西。
  • liveness/query.json:27 个成员全分类——15 live(逐条 file:line 证据)/ 7 experimental(describe 标记)/ 5 deadcursor(Tier A,QueryBuilder.cursor() 在产、无驱动实现)、distinct(mis-wired 而非单纯 dead:唯一效果是 protocol.ts:3816 的 count 抑制,ADR-0078 从严)、having(engine.aggregate() 重建 AST 时根本不带它——最强的 enforce 候选)各自带 verifiedAt 与待决注记。
  • ledger README 更新为 17 个 governed 类型 + query 行。

验证

  • spec 7119 / objectql 1338(含 protocol-data 结构键用例)/ plugin-security 677 / metadata-protocol 122 / driver-sql advanced 35 全绿;tsc --noEmit 干净。
  • packages/spec 14 个闸门全 PASS(check:livenessquery 27 classified (live 15, experimental 7, dead 5));check:generated 全部最新——api-surface/docs 按其裁定窄向重生成,strictness ledger 行随四个 z.object 站点的删除更新(9→5)。
  • 墓碑 pin 测试:处方正文、joins: [] 亦拒、undefined 放行、替代写法(expand/点路径)可解析。
  • 文档同步:query-syntax.mdx / data-modeling/queries.mdx 的 joins/window 小节改为移除记录,objectstack-query skill(SKILL.md + rules/aggregation.md + evals)不再教「schema-reserved」;三处导航卡片文案不再宣传 joins(Prime Directive chore: version packages #10 的「declared ≠ enforced 不得广告」)。
  • changeset:@objectstack/spec major(FROM→TO 映射与一行修复齐备)+ @objectstack/plugin-security patch。升级指南/spec-changes 待 PROTOCOL_MAJOR 翻到 18 时由生成器自动收录(与 [P3] data: FieldNode's nested-select object form is declared but nothing produces or consumes it — enforce or remove #4196 同轨)。

🤖 Generated with Claude Code

https://claude.ai/code/session_012K2BX3WQwPBA2ZBehqJUBX


Generated by Claude Code

…cutor runs (#4286)

Tombstone `query.joins` and `query.windowFunctions` (retiredKey — authoring
either is a tsc error and the parse carries the prescription), and delete the
orphaned Join and WindowFunction schema clusters with their keys: `expand` is
the live spelling for related records, and the one live window-function door
(`SqlDriver.findWithWindowFunctions()`) consumes its own flat driver shape
that the spec vocabulary never matched. Both removals register as protocol-18
semantic migrations (`query-joins-retired`, `query-window-functions-retired`)
— QueryAST is a request shape with no stored source to rewrite (#4196
precedent). Both names stay reserved at the REST boundary while the
tombstones live (retiredKey keeps them in `keyof QueryAST`).

Mark the six search sub-flags and `AggregationNode.filter`
`[EXPERIMENTAL — not enforced]` — declared engine affordances the ADR-0061
expansion and the aggregation paths never receive.

Close the gate that let the class stay invisible: `QuerySchema` joins the
liveness ledger through SPEC_ONLY_SCHEMAS as governed type `query`
(liveness/query.json — 15 live with evidence, 7 experimental via describe
markers, 5 dead). `cursor` / `distinct` / `having` are recorded dead with
evidence pending their #4286 step-3/4 dispositions, not unilaterally removed
— `distinct` is mis-wired (its only effect is REST count-suppression) and
`having` is the strongest enforce candidate (engine.aggregate() currently
rebuilds the driver AST without it).

The FLS predicate guard drops its windowFunctions walk (the clause no longer
exists to leak through); the `having` and `aggregations[].filter` walks stay
while those members stay declared.

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

vercel Bot commented Jul 31, 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 Jul 31, 2026 3:56am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling labels Jul 31, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/metadata-protocol, @objectstack/plugin-security, @objectstack/spec.

110 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 packages/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via 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 @objectstack/metadata-protocol, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @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/plugin-security, @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • 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/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 packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/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/plugin-security, packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/access-recipes.mdx (via packages/plugins/plugin-security)
  • content/docs/permissions/authorization.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/permissions/explain.mdx (via @objectstack/plugin-security)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via packages/plugins/plugin-security, @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/plugin-security, @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/plugin-security, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/plugin-security, @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/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.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/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/plugin-security, @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/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/audience-based-interfaces.mdx (via packages/plugins/plugin-security)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/plugin-security, @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/xl tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants