Skip to content

refactor(spec)!: 补完 2026-06 字段剪除 — 删除两个孤儿 value schema (#3726, #3733) - #3732

Merged
os-zhuang merged 3 commits into
mainfrom
claude/dataqualityrulesschema-orphan-cleanup-tgwyfw
Jul 28, 2026
Merged

refactor(spec)!: 补完 2026-06 字段剪除 — 删除两个孤儿 value schema (#3726, #3733)#3732
os-zhuang merged 3 commits into
mainfrom
claude/dataqualityrulesschema-orphan-cleanup-tgwyfw

Conversation

@os-zhuang

@os-zhuang os-zhuang commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

Closes #3726Closes #3733。两个 issue 是同一批剪除留下的同一种残留,处置完全同构,合并在本 PR 一起走。

改了什么

@objectstack/spec 公开面上移除:

移除项 issue
DataQualityRulesSchema (const) / DataQualityRules (type) / DataQualityRulesInput (type) #3726
ComputedFieldCacheSchema (const) / ComputedFieldCache (type) #3733

以及随之停发的 data/DataQualityRules.jsondata/ComputedFieldCache.jsonapi-surface.json 4383 → 4381,恰好是两个 issue 各自预言的 3 + 2 条。

那批剪除留下的是两个孤儿,不是一个

2026-06 剪掉五个字段键(encryptionConfig / maskingRule / auditTrail / cached / dataQuality),tombstone 声明它们 "dead in both layers"。实际三个带走了自己的 value schema,两个没有:

剪除项 schema 是否仍导出 #3726 表格记录 实际
encryptionConfig 不是残留(system 层另一个独立 schema) 一致
maskingRule 已清理 一致
auditTrail 已清理 一致
cached 残留 已清理 误记#3733
dataQuality ✅ 残留 残留 一致 → #3726

cached 那一行是 #3726 核对表里唯一记错的。两者形态完全一致:键早已从 FieldSchema 删除,schema 仍在公开面 + 生成的参考文档里,全仓消费者为零。

一处事实更正:FieldSchema 并不是 .strict()

#3726 的第 1 条理由说,作者若误写会因 .strict() 直接 parse 报错。实测不是这样 —— FieldSchema 是普通 z.object({...}),没有 .strict()。两个键都实测过:

FieldSchema.safeParse({ name: 'ssn', type: 'text',
                        dataQuality: { uniqueness: true } })
→ parse success: true      dataQuality key survived? false

FieldSchema.safeParse({ name: 'total', type: 'formula',
                        cached: { enabled: true, ttl: 3600 } })
→ parse success: true      cached key survived? false

解析成功,键被静默丢弃。这比报错更糟:报错至少给作者信号,静默剥离让「source 里写了 / 契约里没有 / 没人执行」同时成立且零反馈 —— 正是 field.zod.tsaccept / maxSize 注释点名的 ADR-0104 失败类。结论不变,剪除的理由反而更强。commit message、changeset、代码 tombstone 均按实测事实措辞。

两者各有一处尖角:

验证

检查 结果
pnpm build(全仓) ✅ 71/71
pnpm test(全仓) ✅ 132/132
check:api-surface ✅ 恰好少两个 issue 预言的 5 条
check:docs ✅ 250 files in sync
check:liveness ✅ all governed-type properties classified
check:spec-changes / check:upgrade-guide / check:skill-refs / check:skill-docs

第一个 commit 推上去后的 CI 也是全绿(含 Spec property liveness、Check Changeset、Check Generated Artifacts、Build Docs、ESLint)。

json-schema ratchet(#2978)两次都如设计般拦下了停发,manifest 键的移除是它要求的 deliberate-retirement 步骤。生成物(api-surface.jsonjson-schema.manifest.jsoncontent/docs/references/data/field.mdx)均由脚本重新生成,未手改。

破坏性 & 迁移

已配 changeset(@objectstack/spec: minor + ! 标记,随 v17 major 发车,沿用 apimethod-enum-shrink 的先例),覆盖两次移除。

无运行时行为可迁移 —— 两个 schema 都从未被 FieldSchema 引用,都没有消费者。字段级唯一性用 unique(true = 租户内、'global' = 全平台,#3696);completeness / accuracy / 计算字段缓存(enabled / ttl / invalidateOn)无替代,本就从未实现。

field.zod.ts 的 tombstone 已改写为覆盖两个孤儿,并写明:若将来真做数据质量治理或计算字段缓存,键与 schema 必须连同消费者一起加回(ADR-0049 enforce 侧),不要单独恢复 schema —— 那个中间态正是这两个 issue 的由来。五个键至此在两层都真的死了,与 tombstone 一直以来的声明相符。

…ataQualityRulesSchema (#3726)

The `dataQuality` field key was pruned in 2026-06 along with `encryptionConfig`,
`maskingRule`, `auditTrail` and `cached` — "dead in both layers, aspirational
governance with no runtime consumer" (docs/audits/2026-06-dead-surface-disposition-plan.md,
P0/P2 field prune). Four of the five took their value schemas with them.
`dataQuality` did not: the key vanished from `FieldSchema` while
`DataQualityRulesSchema` stayed on the published API surface and in the generated
reference docs, with zero consumers anywhere in the tree.

Removed, matching the other four:

  - DataQualityRulesSchema (const)
  - DataQualityRules (type)
  - DataQualityRulesInput (type)
  - the published data/DataQualityRules.json schema

Of the three coherent states — key + schema + consumer, none of them, or schema
only — the surviving one was the worst, and it failed quietly rather than
loudly. `FieldSchema` is NOT `.strict()` (verified by parse: an unknown key
succeeds and is dropped), so an author who found `DataQualityRules` in the
reference docs and wrote `dataQuality: { uniqueness: true }` got no error at
all — the field parsed clean and the key was silently stripped. Declared in
source, absent from the contract, enforced by nothing: the ADR-0104 failure
class that the `accept` / `maxSize` declarations were added to close.

`uniqueness` was the sharpest edge. Described as "Enforce unique values across
all records", it reads exactly like the platform-wide scope that
`unique: 'global'` actually provides (#3696), making it the option an author was
most likely to reach for by mistake.

The json-schema ratchet (#2978) caught the retirement as designed; its manifest
key is removed here as the deliberate-retirement step. api-surface.json loses
exactly the three entries #3726 predicted, and the generated field reference
drops the DataQualityRules section. A tombstone in field.zod.ts records why, so
the schema is not restored on its own again.

Full build (71 tasks) and test suite (132 tasks) green.

Closes #3726

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

vercel Bot commented Jul 28, 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 28, 2026 2:18am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tooling size/m labels Jul 28, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

104 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/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 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/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 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/permissions/authorization.mdx (via @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/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @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/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/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.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/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.

Copy link
Copy Markdown
Contributor Author

附带发现已按 Prime Directive #10 单独开:#3733ComputedFieldCacheSchema 是同一批剪除的第二个孤儿

cached 键同样已从 FieldSchema 删除,但 ComputedFieldCacheSchema + ComputedFieldCache 仍在公开面上(api-surface.json:195-196)、仍发布 data/ComputedFieldCache.json、消费者为零 —— 与本 PR 处理的 DataQualityRules 形态完全一致。#3726 的核对表把它记为「已清理」,那一行需要更正;#3733 里附了修正后的表。

没有在本 PR 里一并删掉:那是 issue 作者明确评估过、并判定为已完成的一项,再动一次公开 API 值得单独决策。#3733 里写了照搬本 PR 的处置步骤。


顺带确认两条 bot 评论无需处理:

  • Vercel — Ignored(docs 站未受影响),非失败。
  • Docs Drift Check — advisory,按 package 粒度扇出,任何动 @objectstack/spec 的 PR 都会列出这 104 篇。实际核对过:手写文档中没有任何一篇提到 DataQualityRules / dataQuality(grep -rn 'DataQuality\|dataQuality' content/docs/ | grep -v references/ 无命中),唯一提到它的是自动生成的 content/docs/references/data/field.mdx,已由 gen:docs 重新生成。无需 re-verification。

Generated by Claude Code

…heSchema (#3733)

The 2026-06 prune left TWO orphaned value schemas, not one. #3726 caught
`dataQuality`'s and its core table recorded `cached` as already cleaned —
it was not. `ComputedFieldCacheSchema` + the `ComputedFieldCache` type were
still on the published API surface (api-surface.json:195-196), still shipping
`data/ComputedFieldCache.json`, and still occupying a section in the generated
field reference, while the `cached` key itself had been gone from `FieldSchema`
since the prune. Consumers in-tree: zero.

Removed, matching the other four keys of that prune:

  - ComputedFieldCacheSchema (const)
  - ComputedFieldCache (type)
  - the published data/ComputedFieldCache.json schema

Same failure mode as `dataQuality`, verified the same way — `FieldSchema` is not
`.strict()`, so authoring the discoverable shape succeeds and the key is dropped:

    FieldSchema.safeParse({ name: 'total', type: 'formula',
                            cached: { enabled: true, ttl: 3600 } })
    → parse success: true
    → cached key survived? false

This one is the quieter of the two and so the harder to notice: an author writing
`ttl: 3600` on a formula field would believe results were cached for an hour, get
no error, and never see a signal that nothing had happened. Declared in source,
absent from the contract, enforced by nothing — the ADR-0104 failure class.

The tombstone in field.zod.ts is generalized to cover both orphans and to record
that all five keys are now dead in both layers, as it always claimed. The
changeset is rewritten to cover both removals and renamed accordingly.

The json-schema ratchet (#2978) caught this retirement too; its manifest key is
removed as the deliberate-retirement step. api-surface.json goes 4383 → 4381
exports, exactly the two entries #3733 predicted.

Full build (71 tasks), test suite (132 tasks), all six spec drift checks and
check:liveness green.

Closes #3733

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MwkLYCx8NL3sqSvqcoBt5p
@os-zhuang os-zhuang changed the title refactor(spec)!: 补完 2026-06 字段剪除 — 删除孤儿 DataQualityRulesSchema (#3726) refactor(spec)!: 补完 2026-06 字段剪除 — 删除两个孤儿 value schema (#3726, #3733) Jul 28, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review July 28, 2026 02:18
@os-zhuang
os-zhuang merged commit f31cc8d into main Jul 28, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the claude/dataqualityrulesschema-orphan-cleanup-tgwyfw branch July 28, 2026 02:32
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/m tooling

Projects

None yet

2 participants