Skip to content

driver-memory 测试面替代:项目内测试后端迁到 sqlite :memory:(#5499 重启条件 · memory 半边,维护者 2026-08-06 立项) #5704

Description

@os-zhuang

立项依据:#5499 裁决原文「driver-memory 是早期为测试便利设计的组件,方向已定为 sqlite 内存模式替代……替代迁移若立项,在本单登记排期」+ 维护者 2026-08-06 在 PM 会话确认(「driver-memory 在项目内的测试应该被替换为 sqlite 的内存模式」)。完成即触发 #5499 的 memory 侧重启条件:名下 5 张挂起缺陷单(#5433/#5440/#5442/#5444/#5354)整批关闭(not planned),包本体的退役决策另行交维护者。

mongodb 侧不在本单:维护者同日确认 mongodb 维持暂停。

实测消费面(origin/main @ 2026-08-06 01:2x Z)

测试文件引用 driver-memory / MemoryDriver(外部,共 41 个文件 / 9 包):

包 文件数 备注
packages/objectql 22 主力面。⚠️ 实测无共享工厂:各文件自带 makeMemoryDriver() 本地定义(22 处),其中部分是手写同形 stub(如注释 "same shape driver-memory uses, small enough to assert against"),并非全部真依赖包 — 逐文件分诊是第一步
packages/runtime 5
packages/rest 3
packages/plugins/plugin-approvals 3
packages/spec 2
packages/services/service-datasource 2
packages/cli 2
packages/triggers/trigger-record-change 1
packages/qa/dogfood 1

package.json 依赖声明:cli、plugin-dev、qa/dogfood、runtime、service-datasource、examples/embed-objectql(+包自身)。

⛔ 明确不在本单范围(它们不是「测试」,归包退役决策):runtime provisioning 偏好序里的 memory 注册名回退(http-dispatcher)、plugin-dev 的开发默认后端、examples/embed-objectql(该示例的主题就是内嵌 memory driver)、driver-memory 自己的 15 个测试文件。

替代目标

@objectstack/driver-sql + better-sqlite3 :memory:(examples/app-crm、app-showcase 与 cli db clean 已采用的同款形态,#5499 事实核查确认)。

阶段结构

  1. Survey(先行,单独一单):41 个文件逐个分诊为三类 —— ① 真依赖包、直接可换 sqlite;② 本地手写 stub、与包无关(只需摘 import 或原样保留);③ 断言了 memory 特有语义的 pin(换后端会红 — 每处红都是真语义分叉,按「以 SQL 族语义为准」定向改写断言,拿不准的单独列出)。产出逐文件处置表,作为后续各包迁移单的输入。
  2. 按包迁移 sub-issue(file-disjoint,可并行;domain:* 按落点包由分诊补):objectql 一单(最重),runtime+rest 一单,其余小包合批或独立由 survey 结果定。
  3. 收口:41 文件清零后回 [裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499 执行重启条件(5 张 on-hold 批量关闭 + 请维护者裁包本体退役)。

风险如实声明

排期登记与本单互链见 #5499 评论。

Activity

  1. self-assigned this
    on Aug 6, 2026
  2. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    认领:PM 循环第 7 轮(drivers 车道)— Phase 1: Survey(逐文件处置表)
    会话:session_01WyvqvKMG6asi9aXjKE6xtx
    分支:无(本阶段纯读分析,零文件改动,产出为本单评论的处置表)
    域:程序锚点在 domain:drivers(#5499 重启条件);后续各包迁移 sub-issue 按落点包分域,由分诊补标
    文件面:无写入;读取面为正文清单的 41 个测试文件 + 各包 package.json

    Phase 2(按包迁移)待 survey 处置表产出后拆单派发。


    Generated by Claude Code

  3. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    Phase 1(Survey)交付(os-dev 只读调查,基线 a58c0b5;PM 复核收下)。

    核心发现:正文的隐含假设被证伪

    41 文件计数精确,但其中只有 3 个真 import @objectstack/driver-memory 当存储后端跑;29 个是本地手写替身(objectql/rest/plugin-approvals/trigger/spec 五个包的 package.json 连 driver-memory 依赖都没有 — makeMemoryDriver() 是误导性命名,部分注释甚至自述「driver-sql 同形」);7 个是域外面伪装(provisioning registry ×3、CLI registry ×1、spec 声明面 ×1、banner 标签 ×1、降级链 mock ×1)— 它们的命运分属 #5499 的 carve-out 与 ADR-0087 退役流程,不是测试后端迁移。净真替换面:3 个文件。

    分类 数 处置方向
    A 真依赖 3(qa/dogfood ×1 ✅纯机械、runtime ×2 含语义块) 换 SqlDriver :memory:
    B 本地替身 29 待裁决(见下)
    域外伪装 7 从迁移面剔除,理由已逐个记录
    纯注释 2(+41 外附录 2) 不动

    无环核验通过:driver-sql 不依赖 objectql,加 devDep 无循环。最高风险 5 文件:query-expression-conformance(10 处插入序断言 + 6 处 stores.set 同步播种 + 删 aggregate 能力,1249 行)、undeclared-field-write-driver-split(测试目的就是双族分歧)、secret-fields(12 处落盘形态直读)、engine-filter-alias(6 处)、datasource-autoconnect(#4083 持久化块)。

    批次结构与裁决依赖

    • 批次 0(已派发,与裁决无关):qa/dogfood 删 memory 数组条目 + datasource-autoconnect 主体换 SqlDriver :memory:,其中 datasource-autoconnect 的联邦查询测试在本地必现失败:ext_note 读到 6~12 行而非 2 行(CI 绿,需第二台机器复核) #4083 块按 PM 裁定 Q3-B 处理:改写为等价的「内存库不落盘、重启为空」保证(ADR-0062 D1 验收的是运行时属性非实现细节;工厂层的 datasource-autoconnect 的联邦查询测试在本地必现失败:ext_note 读到 6~12 行而非 2 行(CI 绿,需第二台机器复核) #4083 钉点已由 service-datasource 测试独立覆盖 — 验证策略类,PM 自决,否决窗口开放)。
    • 批次 1(本评论即执行):7 个域外文件从迁移面剔除 — runtime/standalone-stack、service-datasource/__tests__/default-datasource-driver-factory、cli/utils/storage-driver(三者 = id→驱动映射的 registry 面)、spec/data/driver/memory.test.ts(spec 声明面,归 ADR-0087)、cli/serve-driver-banner(标签字符串)、service-datasource/sqlite-driver-fallback(降级链 vi.mock)、spec/data/driver.test.ts(纯注释)。
    • 批次 2/3/4:等两项维护者裁决(已在 PM 会话呈报):
      • Q1:29 个 B 类替身 — 仅改名去误导(makeStubDriver)/ 全量真迁 / 分层(objectql 22 仅改名 + 3 包 7 个 *.integration.test.ts 真迁)。Survey 三轴推荐分层 C:objectql 的替身是刻意的单元测试隔离手段(真迁会削弱指向性),而挂着 integration 名字跑假驱动的 7 个有真实缺口;改名本身结构性消除「grep driver-memory 系统性高估」的度量陷阱。
      • Q2:undeclared-field-write-driver-split 的无 schema 参照臂 — 推荐保留 driver-memory 仅此一处(它是分歧护栏的一半,冻结令冻投资不冻使用;加注释声明「刻意保留,非迁移目标」),次选 mongodb 顶替(CI 成本上升),反对删臂(静默拆护栏)。

    裁决落地后:批次 3(7 文件合一单)→ 4a(objectql 18 低风险)→ 4b(4 高风险逐例)依序派发;若 Q1 裁「仅改名」,批次 3/4 坍缩为一条纯机械改名单,Phase 2 规模 34 → 5 文件。

    逐文件处置表(43 行,点开)
    路径 分类 关键事实 → 处置
    objectql/bulk-write-per-row-hooks B 本地 stub → 改名
    objectql/engine-audit-anchor-write B 注释自述「driver-sql 同形」→ 改名
    objectql/engine-autonumber-runtime-owned B⚠️ 单 stub 建模两族(nativeAutonumber 切 name)→ 真迁需拆两套装配
    objectql/engine-cascade-delete B → 改名
    objectql/engine-dangling-reference-audit B 2 处 store 读 → 改名
    objectql/engine-data-events B → 改名
    objectql/engine-default-value-tokens B → 改名
    objectql/engine-filter-alias B⚠️ 6 处 store 直读钉「写路径未越写」(#4346)→ 真迁需改驱动读
    objectql/engine-lookup-referential-integrity B → 改名
    objectql/hook-condition-bulk-previous B 含 syncSchema → 改名
    objectql/hook-condition-fail-loud B → 改名
    objectql/hook-condition-merged-record B → 改名
    objectql/hook-condition-previous-scope B reads 计数器真驱动上语义会变 → 改名
    objectql/hook-input-shape-contract B → 改名
    objectql/protocol-clone-real-engine B → 改名
    objectql/protocol-recorded-by-null B → 改名
    objectql/protocol-registry-shadow B → 改名
    objectql/protocol-save-meta-repo-path-real-engine B → 改名
    objectql/protocol-unknown-query-param B 1 处 stores.set 同步播种 → 真迁需 bulkCreate+建表
    objectql/protocol-unregistered-object B 同上
    objectql/query-expression-conformance B⚠️最高危 1249 行;6 处 stores.set + 10 处 INSERTION_ORDER + delete driver.aggregate
    objectql/secret-fields B⚠️ 12 处密文落盘直读
    runtime/datasource-autoconnect A+C 真 import;主体可换;#4083 块按 Q3-B 改写
    runtime/sandbox/nested-write.canary B → 改名
    runtime/sandbox/nested-write.integration B → 改名
    runtime/sandbox/undeclared-field-write-driver-split A+C⚠️ 分歧测试本体 → Q2 待裁
    runtime/standalone-stack 域外 provisioning registry 面 → 剔除
    rest/export-integration B → 批次 3
    rest/import-integration B → 批次 3
    rest/import-job-integration B → 批次 3
    plugin-approvals/record-lock-multi-update.integration B → 批次 3
    plugin-approvals/record-lock-schedule-run.integration B → 批次 3
    plugin-approvals/status-mirror-cascade.integration B → 批次 3
    spec/data/driver.test 纯注释 不动
    spec/data/driver/memory.test 域外(C) spec 声明面,归 ADR-0087 → 剔除
    service-datasource/default-datasource-driver-factory 域外 工厂 registry + #4083 钉点 → 剔除
    service-datasource/sqlite-driver-fallback B+域外 降级链 vi.mock → 随降级链去留
    cli/serve-driver-banner B 标签字符串纯函数 → 随 banner 分支去留
    cli/utils/storage-driver 域外 CLI registry 面 → 剔除
    trigger-record-change/record-change-integration B → 批次 3
    qa/dogfood/read-coercion-conformance A✅ SQL 臂已存在且绿 → 批次 0,删 memory 条目
    (附录)objectql/protocol-batch-atomic 纯注释 不动
    (附录)objectql/protocol-data 纯注释 不动

    Generated by Claude Code

  4. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    批次 0 复核:ACCEPT → PR #5715 已转 ready 并挂 auto-merge 入队(CI 全绿,唯一红为标签竞态旧 run、已被取代)。留档要点:

    批次 1(域外剔除)已随 Phase 1 评论完成。批次 2/3/4 等 Q1/Q2 裁决(已呈维护者)。


    Generated by Claude Code

  5. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    裁决落档(维护者 2026-08-06,PM 会话拍板) — 批次 2/3 解锁:

    • Q1 = C(分层):29 个 B 类本地替身分两路 — ① objectql 22 个 + runtime sandbox nested-write 2 个仅改名(makeMemoryDriver → makeStubDriver,消除误导性命名;它们是刻意的单元测试隔离手段,真迁反而稀释指向性);② 3 包 7 个 *.integration.test.ts 真迁 driver-sql + better-sqlite3 :memory:(rest ×3、plugin-approvals ×3、trigger-record-change ×1 — 名为集成测试却跑手写替身,名不副实,真迁有实际收益)。
    • Q2 = B(仅此一处保留):undeclared-field-write-driver-split.integration.test.ts 保留 driver-memory 作无 schema 语义参照臂 — 它是「SQL 族整条拒绝 / 无 schema 族照单全收」分歧护栏的一半;文件头加注释声明刻意保留、非迁移遗漏。[裁决] driver-memory / driver-mongodb 投入冻结 —— 维护者 2026-08-05 口径(跨单锚点) #5499 冻结令冻的是缺陷修复投入,不禁止作参照物使用。推论:runtime 的 driver-memory devDep 长期保留(仅此一个消费点);qa/dogfood 的 devDep 收口时摘除(批次 0 复核已记)。

    执行结构:两条 sub-issue,file-disjoint 并行 — 批次 2(改名 + Q2-B 注释:packages/objectql + packages/runtime)、批次 3(真迁:packages/rest + packages/plugins/plugin-approvals + packages/triggers/trigger-record-change)。

    收口预告:两单落地 → 迁移面清零 → 回 #5499 执行重启条件(#5433/#5440/#5442/#5444/#5354 批量关闭 not planned),包本体退役另请维护者单独裁决。


    Generated by Claude Code

  6. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    收口执行记录(批次 2/3 已合并,2026-08-06 07:5xZ)

    迁移面清零达成,main(2a607d2)实测:

    本单在尾项清理单落地后关闭。


    Generated by Claude Code

  7. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    程序终结(2026-08-06 08:0xZ) — 尾单 #5829(PR #5836)已 MERGED,3 张 sub-issue 全部闭合,本单关闭(completed)。

    最终账:


    Generated by Claude Code

  8. 2 remaining items

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions