Skip to content

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

Closed
3 of 3 issues completed

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. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Aug 6, 2026
  2. self-assigned this
    on Aug 6, 2026
  3. 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

  4. added
    priority:p0Queue-jump: outranks batch and breaks the round — never exempts claiming or same-file serial
    on Aug 6, 2026
  5. 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

  6. 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

  7. 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

  8. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

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

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

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


    Generated by Claude Code

  9. 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

  10. 2 remaining items

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 looppriority:p0Queue-jump: outranks batch and breaks the round — never exempts claiming or same-file serialtests

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions