Skip to content

driver-turso 住在闭源 cloud 仓,却是开源 runtime 点名偏好的默认 driver — 建议把核心迁回本仓 #4645

Closed

Description

@os-zhuang

包:@objectstack/driver-turso(现居 objectstack-ai/cloud,publishConfig: restricted)
目标路径:packages/drivers/driver-turso(新 packages/drivers/ 目录;现有四个 driver 与它同批迁入——见「推进顺序」)
发现于:核对 #4484(findStream enforce-or-remove)时,发现该 remove 的工作范围只覆盖本仓三个 driver,cloud 侧 4 处实现完全在盲区——见 #4484 的补充评论。
核实基线:objectstack @ 0a936ea,cloud @ 0070d51(pin 在 ad5fe25)
前置项:#4646 / PR #4648(gate 的零发现)— ✅ 已合入

⏸️ 排期:等 maintainer 通知后再动

四条决策点已全部裁定(见文末),方案完整可实施,但实施时机由 maintainer 掌握:当前有多个 agent 在并行改 packages/plugins/driver-*(#4484 正在改三个 driver 的 findStream),此时任何对这些包的路径改动都会与进行中的开发撞车。

待那批开发收尾、maintainer 通知后,一次性统一迁移——不做分批。别的 agent 请勿抢跑这个 issue。

摘要

TursoDriver 以 extends SqlDriver 的方式跨仓库继承本仓的类,住在闭源 cloud 仓;而本仓的 runtime 已经把 turso 当一等公民——环境 provisioning 的默认偏好顺序第一位就是它。结果是:开源侧的代码路径引用着一个自己仓里既测不到、也 grep 不到的 driver,而闭源侧只能在每次 pin bump 时追赶父类的重构。

证据 0:它本来就在本仓,而且本仓至今为它保留着扩展点

CHANGELOG.md:2052-2060 记录了它的到来:

@objectstack/driver-turso plugin — Migrated and standardized the Turso/libSQL driver from @objectql/driver-turso into packages/plugins/driver-turso/. The driver extends SqlDriver …

同一个 release 还做了这件事(CHANGELOG.md:2066-2073):

@objectstack/driver-sql — Protected extensibility — Changed private to protected for all internal properties and methods(knex、config、applyFilters、formatInput/formatOutput、introspect* 等约 25 个成员)。Enables clean subclassing for driver variants (Turso, D1, etc.)

也就是说:本仓的 SqlDriver 至今维持着一整片 protected 扩展面,专为一个已经不在本仓的子类而存在——而这份扩展契约在本仓没有任何子类去行使它,等于一个无人验证的 API surface。这不是「要不要迁进来」的问题,是「它被迁出去了,接口债留在了这里」。

证据 1:开源侧已把 turso 当默认

位置 内容
packages/runtime/src/http-dispatcher.ts:1324 provisioning 偏好顺序:turso → memory → 任意其他已注册 driver
packages/runtime/src/http-dispatcher.ts:1299 POST /cloud/environments 的 driver 参数示例即 memory | turso
packages/runtime/src/default-datasource-plugin.ts:70 提到 distribution 的 turso
packages/objectql/src/engine.ts:3133 turso 专属的瞬时 fetch failed 重试
packages/objectql/src/plugin.ts:54, 88, 144 三处以 Neon/Turso 这类 latency-bound 远程 driver 为前提的设计推理(含 cold start 不被 sync 打死)

本仓有 turso 专属的容错逻辑和调度偏好,却没有 turso 的代码和测试。

证据 2:闭源侧在持续追赶父类

cloud 仓 packages/driver-turso 最近 5 个提交里 3 个是在追本仓 SqlDriver 的内部变化:

0352d3c fix(driver-turso): remote 模式的 filter 列也读进驱动的存储形态 (#937) (#1003)
eca7f7e fix(driver-turso): remote 模式的写入与 comparand 接回 SqlDriver 的 temporal seam (#937) (#942)
6d1ab28 test(driver-turso): 接入 temporal conformance 矩阵——canonical + 遗留存储四条扫描 (framework#4191) (#938)

耦合面不是「用了个接口」而是继承(turso-driver.ts:166),且 find / findOne / findStream / create / update 全部带 override。父类每次重构,子类都可能静默坏掉,只能在 bump SHA 时才发现。

节奏差放大了这一点:本仓最近 50 个提交跨约 11 小时;cloud 的 50 个提交跨约 2.7 天。

证据 3:仓库级 gate 与清扫物理上看不见它

scripts/check-driver-conformance.mjs 的 scope 注释写得很清楚:

packages/plugins/driver-* — discovered from disk, never listed here, so a new driver package is in scope the moment it exists

这正是迁回的直接收益:turso 落盘即入矩阵,filter 组合语义(#3774)、temporal 存储形态(ADR-0053)、确定性分页读(#4363)三套 case-set 自动 held 住它,不再靠 cloud 侧手工「接入 conformance 矩阵」(6d1ab28 就是这么补的)。

同理,#4484 那种「全仓 grep + 删实现 + 删桩」的 ADR-0049 清扫,今天必然漏掉 cloud 的 4 处实现。这类清扫是本仓常规动作,每一次都有同样的漏网风险。

拆分方案

cloud/packages/driver-turso 共 4,824 行。

迁到 packages/drivers/driver-turso(~4,162 行)

  • turso-driver.ts(896)— TursoDriver extends SqlDriver,迁后变成同仓继承,父类重构立刻可见,protected 扩展面终于有子类验证
  • remote-transport.ts(961)— 纯 @libsql/client 走 HTTP/WebSocket,无任何平台机密;文件头本来就是 Apache-2.0
  • index.ts(95)、libsql-sqlite-stub.testkit.ts(87)
  • 测试:turso-driver.test.ts(1,135)、spec/turso*.{test,zod}.ts、turso-{,remote-}temporal-conformance.test.ts(591)、date-bucket-parity.test.ts(135)、remote-*.test.ts(262)

留在 cloud(662 行 + service-cloud 一处)

  • multi-tenant.ts(289)+ multi-tenant.test.ts(242)— 按租户路由、{tenant} URL 模板、group token、TTL 缓存
  • vector-poc.test.ts(131)— 已核实完全独立:直连 @libsql/client 的 createClient,不 import TursoDriver;驱动四个源文件里 vector / embedding / F32_BLOB 零命中。留下来不需要从驱动里切任何东西。
  • service-cloud/src/control-plane-proxy-driver.ts — 控制面 org 注入

cloud 随后按既有的 link: + .objectstack-sha pin 消费开源版 driver;multi-tenant.ts 只 import 公开的 TursoDriver。

迁完后 cloud 侧 driver-turso 包的收尾(建议,非阻塞):它将只剩一个多租户路由器和一个 vector PoC,已经不是一个 driver。两件小事值得顺手做:把包名/目录改成名副其实的(如 tenant-router),以及把 vector-poc.test.ts 挪进 packages/knowledge-turso——该文件 docstring 写明它的目的就是 "confirm before building knowledge-turso",那才是它的归属。

目录重组:packages/plugins/driver-* → packages/drivers/*

五个 driver(现有 driver-memory、driver-mongodb、driver-sql、driver-sqlite-wasm + 从 cloud 迁入的 driver-turso)同批落入 packages/drivers/,让 driver 与 plugin 在目录上分开。

收纳范围(已裁定):packages/drivers/ 只收 IDataDriver 实现。knowledge-*(本仓 2 个 + cloud 的 knowledge-turso)、embedder-* 留在 packages/plugins/。这与 check-driver-conformance.mjs 的 scope 定义一致——该脚本已明确把「非 driver 的 case-set 消费者」排除在外,目录边界与 gate 边界因此重合,不产生第二套判断标准。

改名的影响面(已实测)

本仓

  • pnpm-workspace.yaml — 增加 packages/drivers/* glob
  • scripts/check-driver-conformance.mjs:70 — DRIVERS_DIR(test(drivers): a conformance run that discovers zero drivers is a failure, not an OK (#4646) #4648 已把 self-test 里的 driver-sql / >= 3 硬编码消除,现在只剩这一处常量要改)
  • .github/workflows/ci.yml:866 — 遍历 packages/triggers/* packages/services/* packages/plugins/* 的循环
  • .github/workflows/lint.yml:424 — 构建嵌套包的说明与逻辑
  • 各 driver package.json 的 repository.directory
  • packages/spec/liveness/*.json 的 evidence 路径(field.json、object.json、query.json 共 11 处指向 packages/plugins/driver-sql/...)——ADR-0087 registries,路径失效即证据链断裂
  • 文档:README.md:287-289、ARCHITECTURE.md:250、content/docs/plugins/packages.mdx(4 处)、content/docs/protocol/objectql/{index,query-syntax}.mdx、examples/app-crm/README.md
  • pnpm-lock.yaml 重生

cloud 仓(跨仓,会断)

3 个 package.json 共 6 条 link:../../../objectstack/packages/plugins/driver-* 指向物理路径,目录一动全部失效:

  • packages/objectos-runtime/package.json:32,33,53(memory / sql / mongodb)
  • packages/driver-turso/package.json:34(sql)
  • packages/service-cloud/package.json:27,28,29(memory / mongodb / sql)

外加 lockfile 里十余条同路径 specifier。必须与一次 bump-objectstack 同批推进,否则 pin 前移时 cloud 直接装不上。

这里有个值得记下的递归:目录重组本身正好踩中它要解决的那个跨仓盲区。本仓改目录的 PR 在自己仓 CI 全绿(cloud 的 link: 路径不在本仓任何检查的视野里),破坏只在 cloud 下次 bump 时出现——和 #4484 一模一样的形状。

推进顺序

  1. ✅ 修 gate 的零发现 — check-driver-conformance 的 audit 路径对「发现零个 driver」报 OK — 零发现该是失败,且唯一的守卫硬编码了 driver-sql #4646 / PR test(drivers): a conformance run that discovers zero drivers is a failure, not an OK (#4646) #4648,已合入 main。
  2. ⏸️ 等窗口 — 待进行中的 agent 批次收尾(含 IDataDriver.findStream 没有任何调用方,两个 driver 的实现还正好做了它承诺要避免的事(ADR-0049 enforce-or-remove) #4484 对三个 driver 的 findStream 改动),由 maintainer 通知开工。
  3. 一次性统一迁移(一个 objectstack PR + 一个 cloud PR,同批 bump):
    • 建 packages/drivers/,五个 driver 一起进(四个从 packages/plugins/ 平移,driver-turso 从 cloud 迁入)
    • 同一 PR 内改 pnpm-workspace.yaml glob、DRIVERS_DIR、两个 CI workflow、各包 repository.directory
    • cloud 侧 6 条 link: 路径 + lockfile,配 scripts/bump-objectstack.sh
  4. 收敛文档与 packages/spec/liveness/*.json 的 evidence 路径(11 处)
  5. cloud 侧收尾:driver-turso 残包更名 + vector-poc.test.ts 归入 knowledge-turso

为什么不分批:早前版本计划「先只迁 turso,再分批搬其余四个」,理由是降低单次跨仓同步的冲突面。maintainer 裁定改为一次性,理由更强——在多 agent 并行窗口里,任何对 packages/plugins/driver-* 的路径改动都会与进行中的开发撞车,分批等于把这个撞车面重复 N 次;而且分批必然产生「packages/plugins/ 与 packages/drivers/ 各有 driver」的双根中间态,DRIVERS_DIR 得先改成多根扫描、迁完再改回单根,凭空多一次 gate 改动和一段需要维护的过渡状态。等窗口静默后一次做完,冲突面和改动次数都最小。

决策(已裁定)

  1. ✅ 许可/商业 — 核心 driver 迁回本仓,作为公开 Apache-2.0 包发布。
  2. ✅ 多租户边界 — multi-tenant.ts 的按租户 provisioning 属云产品差异化能力,留 cloud。
  3. ✅ vector-poc — 先留 cloud(已核实与驱动零耦合,留下不需要切分驱动代码;建议后续归入 knowledge-turso)。
  4. ✅ packages/drivers/ 收纳范围 — 只收 IDataDriver 实现;knowledge-* / embedder-* 留在 packages/plugins/。
  5. ✅ 实施时机与批次 — 等进行中的 agent 批次收尾、maintainer 通知后,一次性统一迁移;不分批,不抢跑。

不做的代价

维持现状可行,但要接受:每次本仓 driver 契约或 SqlDriver protected 成员变更,都得有人记得去 cloud 补一刀,而这份记忆目前不在任何检查里——#4484 已经演示了它是怎么丢的。最低限度的止血是在 packages/plugins/driver-sql(或迁移后的 packages/drivers/driver-sql)加一条提示:改动 IDataDriver 契约或 SqlDriver 受保护成员时,同步检查 cloud/packages/driver-turso。

Activity

  1. os-zhuang commented on Aug 2, 2026

    @os-zhuang
    ContributorAuthor

    更正(正文已改,此处留痕):早前版本称目录重组会让 conformance gate「一片绿地覆盖零个 driver」——说过头了,CI 拦得住。

    lint.yml:304 跑的是 pnpm check:driver-conformance,而 package.json:50 定义为 --self-test && audit;self-test 里的 driver 发现断言会先失败。实测两条路径:

    $ node check-driver-conformance.mjs               → exit 0,"OK — 0 covered cell(s)"
    $ node check-driver-conformance.mjs --self-test   → exit 1,"x self-test: discovers driver packages from disk"
    

    假绿只在直接跑 audit 时出现(脚本 header :21 文档化的独立用法),CI 走的不是那条路。

    真正需要先修的是那条守卫本身对本次重组不友好:它硬编码 drivers.length >= 3 && drivers.includes('driver-sql')(重组正要动这两项),且失败信息不指向 DRIVERS_DIR。已按实测范围拆成 #4646。


    Generated by Claude Code

  2. os-zhuang commented on Aug 2, 2026

    @os-zhuang
    ContributorAuthor

    决策已裁定(maintainer),正文四条已全部标记 resolved:

    # 决策 结论
    1 许可/商业 核心 driver 迁回本仓,公开 Apache-2.0
    2 多租户边界 multi-tenant.ts 留 cloud
    3 vector-poc 先留 cloud
    4 packages/drivers/ 收纳范围 只收 IDataDriver 实现

    两条新裁定的核实与影响:

    3 — vector-poc 留 cloud,零摩擦。 已核实 vector-poc.test.ts 与驱动完全解耦:它直接 import { createClient } from '@libsql/client',不 import TursoDriver;turso-driver.ts / remote-transport.ts / index.ts / multi-tenant.ts 四个源文件里 vector / embedding / F32_BLOB / libsql_vector 全部零命中。所以「留下」就是「不动这个文件」,不需要从驱动里切分任何代码。

    顺带一个归属建议(非阻塞,已写进正文第 5 步):该文件 docstring 明写目的是 "confirm before building knowledge-turso",而 cloud 已有 packages/knowledge-turso。迁移完成后,cloud 的 driver-turso 残包将只剩一个多租户路由器 + 一个 vector PoC,已不是 driver——建议届时把包更名为名副其实的(如 tenant-router),并把 vector-poc.test.ts 归入 knowledge-turso。

    4 — 只收 driver,与 gate 边界重合。 check-driver-conformance.mjs 的 scope 注释已经明确把「非 driver 的 case-set 消费者」(packages/formula 的 matchesFilter、service-analytics 的 native-SQL 策略)排除在外,理由是「enrolling them means answering which case-sets even apply per consumer — a question this gate would have to guess at」。目录边界照此划,与 gate 边界重合,不引入第二套判断标准。knowledge-*(本仓 2 个 + cloud 的 knowledge-turso)与 embedder-openai 留在 packages/plugins/。

    行数据此更新:迁 ~4,162 行,留 662 行(+ service-cloud 的 ControlPlaneProxyDriver)。

    实施仍等 #4648 合入(推进顺序第 1 步)。


    Generated by Claude Code

  3. added
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 3, 2026
  4. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    裁决落地:维护者 2026-08-05 通知开工(PM 会话原话:「同意 turso 迁回」)。推进顺序第 2 步「等窗口、待通知」就此满足,正文 ⏸️ 排期横幅以本评论为准解除(不重写长正文,避免编辑引入错漏)。needs-user-decision 已摘,本单转入派发。

    开工前在飞检查(2026-08-05 ~20:1x Z 读数):

    前提漂移(立单至今 3 天,已实测):

    1. cloud 侧 link: 断裂面大于正文所述:正文记「3 个 package.json 共 6 条」,当前 cloud origin/main 实测 7 个文件共 14 条(新增 apps/cloud×2、apps/ee-authz-showcase×1、apps/objectos-ee×1、apps/objectos×3)。Phase B 按实测面执行。
    2. cloud 的 packages/driver-turso 立单后又落 5 个语义修复(Fix broken pnpm lockfile causing CI failures #1117/fix(studio): Route Code tab to CodeExporter instead of always rendering preview #1080/fix: AI agent routes never registered — kernel pre-injects core service fallbacks before plugin starts #1078/chore(deps)(deps): bump the production-dependencies group across 1 directory with 14 updates #1074/Addressing PR comments #1071),迁移以当前 cloud origin/main 为源,行数与文件清单重新核定。
    3. objectstack 侧 driver 路径近日有合并(今日 test(driver-mongodb): 依赖 mongod 二进制的套件改为 opt-in,默认响亮跳过(#5517) #5538 mongodb 测试 opt-in;昨日 fix(driver-memory): analytics 面的 $notContains 编译成真正排除行的谓词,而不是不约束任何行的裸 {$not: 'x'} (#5374) #5445/fix(driver-memory): analytics 面不再把比较数往返成 string[](布尔取 0 行、null 取全表)(#5373) #5431/fix(driver-memory): analytics 面拒收编译不了的过滤器,而不是静默丢掉 (#5345) #5375 driver-memory analytics 修复),实施基于当前 origin/main。

    执行编排(两阶段,同属本单):

    • Phase A(本次派发):objectstack PR — 建 packages/drivers/,四个存量 driver 平移 + turso 核心自 cloud 迁入,连同 workspace glob / DRIVERS_DIR / 两个 CI workflow / repository.directory / liveness evidence 路径 / 文档 / lockfile 一次做完(正文推进顺序第 3-4 步的本仓半边)。
    • Phase B(A 合并后另派):cloud PR — bump-objectstack 前移 pin + 14 条 link: 路径改指 packages/drivers/* + 残包收尾建议项。A 落地而 B 未落地期间 cloud 的断裂是方案预期内状态(正文「必须与一次 bump 同批推进」即指此),Phase B 紧随派发。

    两条边界说明(否决窗口,维护者可叫停):

    • [裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499 冻结令:driver-turso 明文不在冻结范围;driver-memory / driver-mongodb 的目录平移是基础设施迁位,不属冻结的「缺陷修复与语义补齐投入」,且系维护者已裁定的一次性方案组成部分。派发词明令:平移即平移,⛔ 不顺手修冻结族任何缺陷。
    • packages/spec 触碰面:仅 liveness/*.json 的 evidence 路径字符串同步(ADR-0087 证据链,路径不随迁移更新即断裂、相关 gate 判红,无法从一次性方案中拆出)。spec 座位当前空缺;该触碰不涉任何 os-regen 驱动路径。已按跨域例外的申报纪律写入认领文件面。

    — drivers 座位,会话 session_01WyvqvKMG6asi9aXjKE6xtx(座位登记 #4604)


    Generated by Claude Code

  5. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    needs-user-decisionBlocked on a maintainer decision — do not dispatch; decision cards only, never on a PR
    on Aug 5, 2026
  6. self-assigned this
    on Aug 5, 2026
  7. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    认领:PM 循环第 4 轮(drivers 车道)— Phase A(objectstack 半边)
    会话:session_01WyvqvKMG6asi9aXjKE6xtx
    分支:claude/issue-4645-drivers-dir-turso-migration
    Worktree:objectstack-issue-4645
    域:domain:drivers
    文件面(Phase A):packages/plugins/driver-{memory,mongodb,sql,sqlite-wasm} → packages/drivers/*(git mv 平移)、新增 packages/drivers/driver-turso(自 cloud origin/main 迁入)、pnpm-workspace.yaml、scripts/check-driver-conformance.mjs(DRIVERS_DIR)、.github/workflows/ci.yml + lint.yml(driver 路径遍历)、各迁移包 package.json(repository.directory 等)、packages/spec/liveness/*.json(evidence 路径字符串,跨域触碰已在裁决落地评论申报)、文档(README.md / ARCHITECTURE.md / content/docs/plugins/packages.mdx / content/docs/protocol/objectql/*.mdx / examples/app-crm/README.md)、pnpm-lock.yaml、.changeset/*.md。⛔ 不碰 content/docs/releases/。越界即停,报告说明。

    Phase B(cloud 半边)待 A 合并后另行认领派发,届时单独申报 cloud 文件面。


    Generated by Claude Code

  8. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    Phase A 进展 + 一项 PM 裁定(否决窗口):

    PR #5618 已上(draft):四个存量 driver git mv 平移(内容零改动,冻结令遵守)+ turso 核心 22 文件自 cloud bc372e3b 迁入(含立单后六个语义修复),538 条 hermetic 测试全绿,conformance 矩阵 5×5 落成 22 covered + 3 measured DEBT(清偿工作项 #5590);全仓路径清扫含 11 处 liveness evidence、两个 workflow、SKILL 域表范围列;changeset 已加(新公开包)。dev 现正合 main 触发 CI(PR open 时 mergeable 短暂 dirty,除 Vercel 外零 workflow 起跑)。

    裁定(dev 上报的边界问题,按其建议 A 案定案):spec/turso-multi-tenant.{zod,test}.ts 不随迁。依据:① 它是多租户能力的声明面,决策 2 已把该能力整体留 cloud — 声明面随实现走;② 迁入即 declared ≠ enforced(四个 schema 成为公开 API 而实现不在包内,PD #10 禁止);③ 实测全 cloud 零消费(仅 barrel 再导出)。代价不对称:将来要迁 = 复制两个文件;迁了要撤 = 公开包 breaking API 移除。维护者可否决,一条 commit 可翻。

    顺手立单(已核实存在):#5590(turso 三格 conformance DEBT 清偿,Blocked-by 本 PR)、#5602(libsql:// 要不要接进 CLI URL 推断 — 公共契约裁决,待分诊入决策箱)、#5612(CLI doctor 存量红,与本单无关,已证伪因果)。

    Phase B(cloud:pin 前移 + 14 条 link: + 残包收尾)待 Phase A 合并后派发。


    Generated by Claude Code

  9. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    复核:Phase A ACCEPT → PR #5618 已转 ready 并挂 auto-merge 入队(CI 26/26 全绿,GitHub 读数核验)。

    终审要点(在初审基础上增量):

    合并后动作(已排):① 解锁 sweep — #5590、#5589 摘 pm:blocked 回队列派发;② Phase B 紧随派发(cloud PR:bump-objectstack 前移 pin + 14 条 link: 路径改指 packages/drivers/* + 残包收尾按既有建议)。本单保持 open 至 Phase B 落地。


    Generated by Claude Code

  10. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    认领:PM 循环第 5 轮(drivers 车道)— Phase B(cloud 半边),同一认领的延续

    会话:session_01WyvqvKMG6asi9aXjKE6xtx
    分支(cloud 仓):claude/issue-4645-relink-drivers-phase-b
    Worktree:cloud-issue-4645
    文件面(cloud):objectstack pin(.objectstack-sha / scripts/bump-objectstack.sh 机制,前移至含 06ba03627 的 main)、14 条 link: specifier(7 个 package.json:packages/driver-turso×3、packages/objectos-runtime×3、packages/service-cloud×3、apps/cloud×2、apps/objectos×3、apps/ee-authz-showcase×1、apps/objectos-ee×1,以实施时重扫为准)、lockfile、packages/driver-turso 残包收尾(移除已上移的核心文件、multi-tenant 改依赖上游 @objectstack/driver-turso、按方案第 5 步评估更名与 vector-poc.test.ts 归入 knowledge-turso)。⛔ objectstack 仓对本阶段只读。


    Generated by Claude Code

  11. os-zhuang commented on Aug 5, 2026

    @os-zhuang
    ContributorAuthor

    复核:Phase B ACCEPT → cloud PR objectstack-ai/cloud#1122 已转 ready 并挂 auto-merge(cloud CI 3/3 绿:build-and-test / console-boots / EE 镜像演练)。本 PR 合并即随 Fixes 关闭本单。

    终审要点(以 GitHub 读数与文件清单核验,dev 报告经 PR body 收集):

    • Pin bump 取最小增量:.objectstack-sha → 06ba036(Phase A 合并提交本身,非当时 main 头);14 条 link: 重接与 PM 预估逐条一致,@objectstack/driver-turso 改 link: 上游共 5 个 manifest,包名未变故 import 站点零改动(契约优先,不造中间层)。
    • 残包更名落地:packages/driver-turso → packages/tenant-router(@objectstack-cloud/tenant-router,private,循本仓私有 scope 惯例);更名爆炸半径实测 0 代码引用、无 npm 发布面,不触 needs_decision 判据;19 个已上移文件逐一与上游比对后删除;vector-poc.test.ts 归入 knowledge-turso。回归钉:retired-framework-deps 补四条旧路径 + live-path 反向断言(防「删依赖装绿」)。
    • Bump 吸收的三处 pin 落差全部由 turbo run test 抓出、处置得当:① service-ai-studio unwrapToInput() 对 Zod preprocess 取错侧 → view 契约渲染成空 {} 交给 AI —— 真缺陷,修复 + anyOf 级回归钉 + 方向前置反向验证;②③ 两处「等上游 organization/create 的闸门读的是被降级的 OS_MULTI_ORG_ENABLED,不是权威的 OS_TENANCY_POSTURE —— 只设权威 knob 的有墙部署,引导式「创建工作区」是死路 #5233 落地即翻面」的预期红按注释翻面,断言写死强形态(owner 断言 / 0 行)。
    • 审计诚实:.spec-changes-ack.json 两条 not-used 判定;data.query.joins 假阳性被证明旧 pin 上就在报,门禁触发面缺陷按 observation 立 cloud#1121(finding,含 A/B 选项与推荐,已核实存在)— 未在本 PR 顺手改 workflow。
    • objectstack 仓零改动;真相清扫的「改/留」清单齐备,历史记录未动。

    合并确认后本单闭环:turso 核心开源发布 + 五 driver 归一 packages/drivers/ + cloud 对接完成。


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

pm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch loop

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions