Skip to content

feat(spec,service-datasource)!: 驱动工厂 4 处未声明 ?? 容错按 ADR-0087 转换层退役 (#4456) - #4637

Merged
os-zhuang merged 2 commits into
mainfrom
claude/issue-4456-datasource-key-alias-conversion
Aug 2, 2026
Merged

feat(spec,service-datasource)!: 驱动工厂 4 处未声明 ?? 容错按 ADR-0087 转换层退役 (#4456)#4637
os-zhuang merged 2 commits into
mainfrom
claude/issue-4456-datasource-key-alias-conversion

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #4456

做了什么

按 issue 的三步计划,把 createDefaultDatasourceDriverFactory 里遗留的 4 组未声明读取侧 ?? 回退毕业为一条声明式 ADR-0087 D2 转换,然后真正删除:

1. 新转换条目 datasource-config-driver-key-aliases(含 fixture)

关于 mongo 的说明:issue 表格第三行的 userusernamebuildMongoUrl 里同样存在一处 cfg.user ?? cfg.username(同一形状的第 5 个读取点),一并纳入转换并删除,否则 mongo 侧会留下半个后门。

2. 删除工厂回退 + 中间态注释

  • 四组(五处)?? 全部删除,工厂对每个键只读一种拼写。
  • sqlite.zod.ts 里"工厂仍容忍存量记录"的过渡注释改写为指向转换条目(mongo.zod.ts 经核对现版本没有对应注释;工厂内 uri 的过渡注释随回退一起删除)。
  • 补上缺口的 rehydration seam:DatasourceAdminServicePlugin 的 sys_metadata 恢复路径(loadDatasourceRows)此前直接 JSON.parse,绕过了 [P2] The spec contract stops at authored source — stored metadata is rehydrated unparsed, unconverted, and ungated #3903 的存量转换。现在按 ADR-0087 addendum 调用 applyConversionsToStoredItem('datasource', …) 重放整条链——这正是"删了回退存量 file: 行会无声落到 :memory:"的那条路径。metadata / metadata-protocol 的通用 seam 本来就重放整条链,注册后自动覆盖。

3. 常规再生成

  • step-17 迁移链登记 conversionIds + rationale 段落;spec-changes.jsondocs/protocol-upgrade-guide.mdcontent/docs/references/data/driver-sqlite.mdxcheck:generated --fix 再生(仅重生成被判 stale 的三个)。

Pin 测试

  • stored.test.ts:四组 legacy 键的存量 datasource 行经 applyConversionsToStoredItem 均以规范键载入;pg 的 database 不被误改;规范键胜出、别名 shadowed。
  • conversions.test.ts:同一 database 键"sqlite 转、其余驱动不转";插件贡献的未知 driver id 不动;load path 上(不带 includeRetired)作者侧 legacy 拼写不被静默吸收
  • datasource-admin-plugin.test.ts:直接向 sys_metadata 播种 pre-datasource.config 至今无人校验:驱动 configSchema 是声明但完全惰性的(ADR-0049 enforce-or-remove,#4001 收尾发现) #4410 形状的行,boot + start 后经 getDatasource 读回的 config 已是规范键。
  • default-datasource-driver-factory.test.ts:工厂对直接递入的 legacy 拼写不再理会——pg connectionString 不再选中 DSN 路径、user 不再到达客户端(canonical username 为对照)、mysql 同;sqlite-wasm 的 file/database 落到 :memory:(legacy 路径无文件产生);mongo uri/user 不参与 URL 组装(canonical 组装为对照)。

验证

  • pnpm --filter @objectstack/spec test:290 files / 7297 passed(合并 origin/main 后复跑)
  • pnpm --filter @objectstack/spec typecheckcheck:generated:全绿(8/8 artifacts up to date)
  • @objectstack/service-datasource:204 passed + typecheck 通过
  • turbo test typecheck --filter metadata --filter metadata-protocol --filter runtime:28 tasks successful

Changeset

.changeset/datasource-config-key-alias-conversion.md(spec minor + service-datasource minor),含 FROM → TO 映射表与一行修复指引。

🤖 Generated with Claude Code

https://claude.ai/code/session_012C2cd7tL8QDoZ2QKN3djJ5


Generated by Claude Code

…y config ?? fallbacks into an ADR-0087 conversion (#4456)

The four undeclared read-side fallbacks createDefaultDatasourceDriverFactory
kept after #4410 — sqlite `file`/`database` -> `filename`, pg/mysql
`connectionString` -> `url`, pg/mysql/mongo `user` -> `username`, mongo
`uri` -> `url` — become the declared, driver-aware conversion entry
`datasource-config-driver-key-aliases` (retired from the load path: the
authoring gate already rejects each spelling with a rename hint), and the
`??` chains are deleted.

Stored sys_metadata rows written before the #4410 gate keep loading: every
rehydration seam replays the full chain (applyConversionsToStoredItem,
#3903), including the DatasourceAdminServicePlugin restore path, which read
raw JSON and now converts. Without that, deleting the fallbacks would have
silently re-pointed a stored sqlite `file:` datasource at `:memory:`.

Also adds the mapDatasources walker (conversions/walk.ts), registers the
entry in the step-17 migration chain, regenerates spec-changes.json /
protocol-upgrade-guide / driver-sqlite reference, and pins: stored rows with
each legacy key load canonical; the factory no longer honours any legacy
spelling handed to it directly.

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

vercel Bot commented Aug 2, 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 2, 2026 1:30pm

Request Review

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

github-actions Bot commented Aug 2, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 2 package(s): @objectstack/service-datasource, @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.

…asource-key-alias-conversion

# Conflicts:
#	docs/protocol-upgrade-guide.md
#	packages/spec/spec-changes.json
#	packages/spec/src/conversions/registry.ts
@os-zhuang
os-zhuang added this pull request to the merge queue Aug 2, 2026
Merged via the queue into main with commit aee1806 Aug 2, 2026
22 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-4456-datasource-key-alias-conversion branch August 2, 2026 13:52
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 tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

驱动工厂仍保留 4 处未声明的 ?? 容错,应按 ADR-0087 转换层退役(#4410 收尾发现)

2 participants