Skip to content

feat(runtime,datasource): default-datasource factory seam + adopt pre-built drivers via one connect path (#3826) - #3968

Merged
os-zhuang merged 3 commits into
mainfrom
claude/adr-0062-d1-finish-git11d
Jul 30, 2026
Merged

feat(runtime,datasource): default-datasource factory seam + adopt pre-built drivers via one connect path (#3826)#3968
os-zhuang merged 3 commits into
mainfrom
claude/adr-0062-d1-finish-git11d

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

#3826 收尾的 framework 侧:为 cloud 仓库的最后收敛铺接缝,并补上 #3869/#3886 留下的三处欠账。开源侧行为零变化(不注入 factory 时逐字节走原路径)。

为什么需要接缝

cloud 组装(environment-kernel-factory 的每环境主 driver、control-plane preset)有两个共享 factory 覆盖不了的性质:driver kind 在开源之外(turso),以及实例池化超出单个 kernel(control-plane driver 同时是每个环境 kernel 的 proxy 基座;每环境 driver 跨 kernel 重建缓存 —— 按定义重建会成倍开 pool)。没有接缝,cloud 只有两条路:留在旧 DriverPlugin 路径(判决在 ObjectQLEngine.init(),恰是 #3826 要退役的第二实现),或者 fork 整套 connect 编排。两条都会重演 #3741#3758

改动

  • DefaultDatasourcePlugin 接受注入的 IDatasourceDriverFactory(缺省 = 共享开源 factory,不传时行为不变)。factory 只改变 create() 返回什么;policy-free init connect、bootCritical fail-fast、OS_ALLOW_DRIVER_CONNECT_FAILURE、start() replay 进留存状态 —— 注入与否完全一致,新测试钉死了这一点(连不上的被收养实例吃到同一份判决)。
  • createPrebuiltDriverFactory(driver, { driverId?, fallback? })(service-datasource):第一轮讨论里缺失的「adopt 现成 driver」入口,落成 factory 形态而不是第二个 connect 入口 —— create() 每次返回同一实例,构造/池化/复用留给 host,只有判决收敛。TSDoc 明确写了它不是常规用法:能表达成 { driver, config } 的就该用定义。
  • verify dogfood harness 改走 declared default(sqlite-wasm 定义经 DefaultDatasourcePlugin),不再用预构建 DriverPlugin —— dogfood gate 从此覆盖 objectstack dev/serve 真实使用的收敛路径。ADR §Risk 承诺的 "behind the dogfood gate" 此前其实没兑现,这次兑现。顺带删掉 verify 对 driver-sqlite-wasm 的直接依赖(经 factory 懒加载)。
  • ADR-0062 header 修正:自 feat(runtime): the standalone default datasource is a declaration, connected through the one datasource path (#3826) #3869/feat(cli): the serve storage fallback declares the default datasource instead of constructing a driver (#3826) #3886 起 header 里 "the default driver still has its own connect + failure path" 对开源侧已不成立(feat(datasource): a datasource that is down is visible, and says why when queried (#3827, #3828) #3836 批评它高估自己,合并后又变成低估)。现在:D1 对每条开源 boot 路径 implemented;cloud 组装是最后的第二实现。D1 正文补 fourth-pass 段落记录接缝设计,余项表述从 cloud-stack.ts 修正为真正的主 driver 组装点(environment-kernel-factory + control-plane preset)。
  • degraded-boot-parity.test.ts 头注释重写:原文还在把 default 描述成 driver.* kernel service + engine-init 连接(pass 2 之前的形态)。现在如实说明 engine 侧判决为什么仍是活代码(boot 再验证、DriverPlugin 逃生舱、cloud 未收敛),以及守卫为何在 cloud 收敛后仍然保留(只要 init() 还能抛 connect 判决,它就必须与 service 的判决一致)。测试本体不动。

验证

  • service-datasource 133(+7 新:supports/create 语义、fallback 派发、经 DatasourceConnectionService 的收养 —— 身份而非等价、自然名保留、fail-fast 判决一致)
  • runtime 839(62 files,+2 新:注入 factory 收养 host 实例后端到端读写、收养实例连接失败吃同一 bootCritical 判决 + 同一逃生阀)
  • verify 7、showcase dogfood 58(10 files)、app-crm 20 —— 全部经新 harness 路径
  • pnpm turbo build 受影响包全绿;根配置 ESLint 对本 diff 触及文件零告警(verify 包有 3 处 @typescript-eslint/no-explicit-any 规则解析报错,stash 对照确认是既有环境问题,不在本 diff 行内)

后续

cloud 仓库用本接缝收敛 environment-kernel-factory + control-plane preset(随后另开 PR);收敛后 #3826 才可关闭。


Generated by Claude Code

…-built drivers via one connect path (#3826)

DefaultDatasourcePlugin accepts an injected IDatasourceDriverFactory
(default: the shared open-core factory, unchanged when omitted), and
createPrebuiltDriverFactory wraps a host-built driver instance as a
factory — the "adopt an existing driver" seam, landed as a factory so
the connect + failure-verdict orchestration stays the single
DatasourceConnectionService implementation. This is what the cloud
compositions (turso, pooled control-plane/environment drivers) need to
converge without forking the verdict.

The @objectstack/verify dogfood harness now boots the declared default
(sqlite-wasm definition) instead of a pre-built DriverPlugin, so the
dogfood gate covers the converged path — the ADR-0062 §Risk mitigation.
ADR-0062's header no longer understates D1 (open-core converged; the
cloud repo is the last second site), and the degraded-boot parity
guard's comment now describes what it actually guards.

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

vercel Bot commented Jul 30, 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 30, 2026 12:15am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation dependencies Pull requests that update a dependency file tests tooling size/m labels Jul 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/runtime, packages/services, @objectstack/verify.

24 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/api/client-sdk.mdx (via packages/runtime)
  • content/docs/api/index.mdx (via @objectstack/runtime)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime)
  • content/docs/automation/webhooks.mdx (via packages/services)
  • content/docs/concepts/north-star.mdx (via packages/runtime)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/vercel.mdx (via @objectstack/runtime)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/runtime)
  • content/docs/kernel/runtime-services/audit-service.mdx (via packages/services)
  • content/docs/kernel/runtime-services/index.mdx (via packages/services)
  • content/docs/kernel/runtime-services/settings-service.mdx (via packages/services)
  • content/docs/permissions/authentication.mdx (via @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/runtime)
  • content/docs/plugins/packages.mdx (via @objectstack/runtime, packages/services)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/i18n-standard.mdx (via packages/services)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime)
  • content/docs/releases/implementation-status.mdx (via @objectstack/runtime, @objectstack/verify)
  • content/docs/releases/v15.mdx (via @objectstack/verify)

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.

claude added 2 commits July 30, 2026 00:14
CI frozen-lockfile caught the miss: dropping @objectstack/driver-sqlite-wasm
from @objectstack/verify's dependencies needs the lockfile regenerated.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GK5nd3gtehcAhrF6Zzp2on
…he CLI uses"

Stale since #3886: the CLI's primary boots as a declared default
definition, not a pre-built DriverPlugin. Flagged by the docs drift
check on this PR.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01GK5nd3gtehcAhrF6Zzp2on
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants