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

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 31, 2026 3:56am

Request Review

@github-actionsgithub-actionsBot 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/xlteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude