Files
qinglong/docs/adr/ADR-0298-local-sqlite-root-runtime-and-adoption-ownership.md

5.4 KiB
Raw Permalink Blame History

ADR-0298Local SQLite 根 Runtime 与 Adoption 实现归属

  • 状态:Accepted
  • 日期:2026-08-09
  • 关联:D-05、D-06、D-17、D-85、D-87、D-97、D-213、D-257、ADR-0063、ADR-0098、ADR-0276、ADR-0296、ADR-0297

上下文

schema v4 根行数棘轮显示 @qinglong/local-sqlite 仍有 3 个 root source、1,203 个审计行。index.ts 只有 31 个审计行, 是聚合公开导出的真实门面;runtime.tsadoption.ts 分别有 432 与 738 个可见代码行,承载长期 Runtime Database Composition 和短生命周期 Legacy Adoption Authority。两者有明确的权限、生命周期与领域归属,却继续以“公开入口”为由平铺在 package root,会让目录结构掩盖常驻与短生命周期 authority 的隔离关系。

这两个能力已经通过 @qinglong/local-sqlite/runtime@qinglong/local-sqlite/adoption 两个稳定 subpath 暴露,物理 dist 路径并不是调用方契约。它们也不具备独立部署、依赖或版本生命周期,另拆 workspace package 会扩大路由设备的 importer、packlist、 SBOM 和构建拓扑。

移动前 GitNexus 显示 LocalSqliteRuntimeDatabase 为 MEDIUM10 direct/24 total/0 process), openLocalSqliteRuntimeDatabase 为 LOW1/3/0);LocalSqliteLegacyAdoptionPublisheropenLocalSqliteAdoptionDatabase 均为 LOW2/6/0 与 1/1/0)。没有 HIGH 或 CRITICAL 风险。

决策

  1. 保留根 src/index.ts 作为唯一聚合门面;Runtime composition 原样归入 src/runtime/runtimeDatabase.tsLegacy Adoption authority 原样归入 src/adoption/legacyAdoptionDatabase.ts
  2. 不保留根 wrapper。package.json#exports 直接把公开 /runtime/adoption subpath 映射到嵌套编译产物;公开 specifier、导出 symbol、错误 class identity、lazy loading 和运行行为保持不变。
  3. src/storage/database.ts 作为开发工具兼容入口直接导出新的 Runtime domain module。package tests 通过公开 self-reference 验证 Runtime 入口;仓库根物理 Edge 脚本不是 workspace importer,显式绑定新嵌套产物。
  4. package ledger 将 Local SQLite 的 rootSourceFileHardCap 从 3 降为 1、rootSourceLineHardCap 从 1,203 降为 31 回归测试同时冻结 source/root/nested 计数、manifest targets 与旧根文件不存在。
  5. 不新增 workspace package、生产依赖、migration、数据库对象、connection、transaction、queue、timer、watcher、listener、进程或 部署单元。

被拒绝的方案

  • 保留两个根 facade:会留下无独立语义的转发文件,使根文件数棘轮失去约束力。
  • 按 Runtime 与 Adoption 各拆一个 package:二者仍共享同一 SQLite adapter、operation authority 与发布节奏;拆包只增加低配设备成本。
  • 本批同时拆分 738 行 Adoption publisher:目录归位能证明路径之外零行为变化;同时重排事务、validation 和 row codec 会扩大授权与原子性审查面。
  • 继续容忍 1,203 行 hard cap:公开 subpath 不要求实现位于根目录,提高或冻结旧上限没有架构价值。

接受条件

  1. Local SQLite 保持 156 个 sourceroot 仅有 index.ts/31 审计行,nested 153→155workspace 保持 19 package、768 source root 45→43、nested 723→725。
  2. /runtime/adoption 和根 export symbol 保持,Local SQLite 及完整生产消费者通过 clean build/test。
  3. Runtime lazy import、migration exclusion、Adoption 单事务/围栏/重放行为继续由既有测试覆盖,旧根私有产物引用清零。
  4. 完整 packages/backend、四项架构审计和十档 artifact/RSS compatible;基础 Edge 不获得 Adoption authority。
  5. GitNexus 不出现新增产品流程,detect_changes 保持 low/0 affected process。

接受证据

  • package boundary schema v4 报告 Local SQLite 为 156 source、1 root/31 root lines/155 nestedworkspace 仍为 19 package、 768 source、43 root、725 nestedsingleSourcePackages=[]。边界 fixture 明确验证两个公开 target 与旧根文件不存在。
  • Local SQLite 196/196,完整 19-package clean build/test 通过;backend 1,112 项为 1,110 pass/2 skip/0 fail。cluster dependency、package boundary、Edge import、local image 四项审计 compatible。
  • 十档 artifact/RSS 全部 compatible。基础 Edge 为 3,635,197 bytes/332 files/48 loaded modules;最大 Standalone Application AI 为 6,123,790/491/104,均低于门限。clean build 后旧根 dist/runtime*dist/adoption* 不进入 packlist。
  • 强制 GitNexus 为 43,302 nodes/98,525 edges/1,696 clusters/269 flows。嵌套 manifest subpath 不被当前索引器反向解析为 跨包 direct edge,因此移动后的四个关键符号均显示 LOW/0 process,不把降低后的 direct count 作为兼容证据;移动前 blast radius、 完整 consumer 测试与制品门共同承担验证。detect_changes all/compare develop 分别为 12 files/31 symbols 与 14/34 均 low/0 affected process。
  • 本批没有修改 SQL、migration checksum、生产 dependency 或 Cluster 状态;按维护者额外授权,仍重跑 PostgreSQL 18.4 arm64 physical HA Docker 门,gates.passed=true。证据覆盖 remote_apply、timeline 1→2、旧主 promotion 前 fencing、 pg_rewind 后只读 synchronous rejoin 与两个新 control ready;结束后 ql3-ha-* container、volume、network 均为空。