Skip to content

feat(spec)!: converge the dual-source MetadataFormat and CacheStrategy enum declarations (#4537) - #4557

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-4537-format-cachestrategy-enum
Aug 2, 2026
Merged

feat(spec)!: converge the dual-source MetadataFormat and CacheStrategy enum declarations (#4537)#4557
os-zhuang merged 1 commit into
mainfrom
claude/issue-4537-format-cachestrategy-enum

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes#4537

#4535 A2 项:MetadataFormat/MetadataFormatSchema/CacheStrategy./shared./system 各有一份声明,且分歧在枚举值上——值不匹配不会编译错,是比形状分歧更易出静默 bug 的一类(#4411 陷阱)。三条基线行全部收敛并删除。

前置核查结论(三仓扫描:本仓 + cloud + objectui)

yml/ts/js 三个别名:零生产者 ⇒ A1 同款收窄。

  • packages/metadata/src/loaders/filesystem-loader.tsdetectFormat 在边界处归一化:.yml'yaml'.ts'typescript'.js'javascript'——扩展名别名从不进入 format 字段;
  • database/remote/memory loader 一律写 'json';
  • 三仓 grep 无任何构造/传入这三个值的位置(唯一命中是 spec 自己的枚举测试);CLI 的 --format 旗标是输出格式(json/yaml/table),不同域。

CacheStrategy 分歧 = 'adaptive'(仅 system 侧声明,零生产者)。

  • shared/enums.zod.tsCacheStrategyEnum(4 值)三仓零 importer;
  • system/cache.zod.tsCacheStrategySchema(5 值)是 CacheTier.strategy 实际引用的一份。

真源侧判定(import 语句级)

  • MetadataFormat:shared 为真源,system 收敛为 re-export(MetadataManagerConfig 模式、反向)。运行时消费者(packages/metadata 的 4 个 serializer + filesystem-loader)从 @objectstack/spec/system 导入——re-export 后符号同一,零改动;kernel/metadata-loader.zodspec 同名双源:两个 MetadataWatchEvent 形状不同、分挂两个子路径入口,其中 kernel 版零消费方(ADR-0049 enforce-or-remove) #4411 起从 shared 导入,无需回改。方向不能选 system:system 已从 kernel re-export MetadataManagerConfigSchema(system → kernel → shared 依赖链),真源放 system 会闭环成模块循环。
  • CacheStrategy:system/cache.zod 成为唯一声明。shared 侧零 importer,按同文件 AggregationFunctionEnum 先例(objectui#2945)删除而非调和——为一个概念保留第二个名字正是词汇当初漂移的成因;'adaptive' 一并收窄,枚举保留两份声明曾共同认可的 4 值(lru | lfu | fifo | ttl)。

变更清单

  • system/metadata-persistence.zod.ts:删除本地 7 值 MetadataFormatSchema,re-export shared 声明(4 值);类型同步 re-export;单一来源注释更新。
  • shared/enums.zod.ts:删除 CacheStrategyEnum + CacheStrategy 类型(附与 AggregationFunctionEnum 同款的处置注释)。
  • system/cache.zod.ts:CacheStrategySchema 收窄掉 'adaptive'
  • 测试:system 侧 canonical 4 值通过 + yml/ts/js 拒绝 pin;cache 侧 'adaptive' 拒绝 pin;shared enums 测试删除对应块。
  • dual-source-exports.baseline.json:删除 3 条基线行(shrink-only ratchet 点名的正是这 3 条,无额外 stale 行)。
  • json-schema.manifest.json:删除 shared/CacheStrategyEnum(deliberate retirement,gen:schema silently drops PageTabsProps since #2967 — references regen would delete real docs #2978 流程)。
  • 生成物:api-surface.json(./shared 少 2 个导出)、references 文档、skill refs 均由 check:generated --fix 再生。
  • changeset(major):含 FROM → TO 迁移说明('yml''yaml''ts''typescript''js''javascript';CacheStrategyEnum@objectstack/spec/systemCacheStrategySchema;'adaptive' → 4 值之一)。

无 ADR-0087 conversion / tombstone:loader envelope + 无 authorable 生产者的配置词汇,同 #4536/#4411 路线(authorable-surface.json 无涉及;存量 sys_metadata 行不携带别名值——DB loader 恒写 'json')。

验证

  • check:dual-source-exports:✅ 无新增,49 条 accepted(3 条已删)
  • check:generated:✅ 8/8 artifacts up to date
  • pnpm --filter @objectstack/spec test:285 files / 7246 tests 全绿
  • pnpm --filter @objectstack/spec typecheck(tsc --noEmit):✅
  • 全仓 pnpm build:71/71 ✅
  • 全仓 pnpm test:132/132 turbo tasks ✅(exit 0)

关联:#4535(主单)、#4506(基线)、#4411#4536(同款处置先例)


Generated by Claude Code

…y enum declarations (#4537)
Two enum vocabularies were declared on both ./shared and ./system and
had diverged on their VALUES — which accepted value set you got depended
on nothing but the import path (the #4411 trap; #4535 A2, #4506
baseline). Value-level divergence is the silent kind: a mismatched value
never fails to compile.
MetadataFormat / MetadataFormatSchema — shared declaration is the
single source:
- system/metadata-persistence.zod.ts no longer declares its own
7-member copy; it re-exports shared/metadata-types.zod (the
MetadataManagerConfig pattern, in reverse). The extension-style
aliases yml/ts/js it carried had zero producers in this repo,
objectui and cloud: FilesystemLoader.detectFormat normalizes at the
boundary (.yml -> 'yaml', .ts -> 'typescript', .js -> 'javascript')
and the database/remote/memory loaders always emit 'json'.
- Direction: shared, not system — kernel/metadata-loader.zod has
imported the shared schema since #4411 (MetadataManagerConfig.formats
needs no change), and system already re-exports
MetadataManagerConfigSchema FROM kernel, so a system-side source
would close a module cycle (shared -> system -> kernel -> shared).
CacheStrategy — system/cache.zod.ts (CacheStrategySchema) is the
single declaration:
- shared/enums.zod.ts CacheStrategyEnum (+ its CacheStrategy type
export) removed: zero importers in all three repos, while the system
schema is the one CacheTier.strategy gates on. Same disposition as
AggregationFunctionEnum in the same file (objectui#2945): removed
rather than reconciled.
- 'adaptive', declared only on the system side with zero producers,
is dropped — the enum carries the four values both declarations
agreed on (lru | lfu | fifo | ttl).
Bookkeeping:
- dual-source-exports.baseline.json: the three converged rows deleted
(shrink-only ratchet).
- json-schema.manifest.json: shared/CacheStrategyEnum key deleted
(deliberate retirement, #2978 flow).
- Pin tests: yml/ts/js rejected on the system entry; 'adaptive'
rejected on CacheStrategySchema.
- api-surface.json, references docs, skill refs regenerated via
check:generated --fix.
- Changeset (major) carries the FROM -> TO migration lines.
- No ADR-0087 conversion / tombstone: loader envelope + config
vocabulary with no authorable-metadata producers (the #4411/#4536
route).
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01M9uWvoEp9CoLzYjNExj9sL
@vercel

vercelBot commented Aug 2, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredAug 2, 2026 3:04am

Request Review

@github-actionsgithub-actionsBot added documentation Improvements or additions to documentation protocol:system tests tooling labels Aug 2, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

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

107 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 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/kernel/services.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/v17.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.

@os-zhuang
os-zhuang marked this pull request as ready for review August 2, 2026 04:07
@os-zhuang
os-zhuang added this pull request to the merge queueAug 2, 2026
Merged via the queue into main with commit 0222d3cAug 2, 2026
21 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4537-format-cachestrategy-enum branch August 2, 2026 04:19
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:systemsize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[#4535·A2] MetadataFormat + CacheStrategy:./shared ≠ ./system 的枚举分歧收敛

2 participants

@os-zhuang@claude