mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
5.6 KiB
5.6 KiB
ADR-0290:Local SQLite Completion Receipt Journal 内部 Collaborator
- 状态:Accepted
- 日期:2026-08-09
- 关联:D-85、D-87、D-213、D-257、ADR-0007、ADR-0069、ADR-0276、ADR-0280
上下文
LocalSqliteRunRepository 同时实现 Run Repository、startup recovery、local dispatch/control、Completion Receipt
Journal、Project Policy、Security Audit 与 Local Secret 等接口。它继续作为同一 Node SQLite connection 和
LocalSqliteOperationAuthority 的产品 Facade 是必要的:应用层需要在一个串行 authority 中共享事务和关闭语义。但把
所有持久化 SQL、结果映射与协议校验都留在同一个 2,755 行文件,会让独立能力的修改进入 CRITICAL Facade 的审查面,
也掩盖真正的事务耦合。
Completion Receipt Journal 已有独立 runtime-core port、独立表、四个完整操作与专用测试;其单次操作不与 Run aggregate 写事务合并,只需要在同一 connection authority 队列中执行,因此适合作为第一项内部职责抽取。Project Policy、 Security Audit 与 Local Secret 包含跨事实授权围栏和共同事务,不在本切片移动。
决策
- 在既有
@qinglong/local-sqlite/src/run/domain 内新增私有LocalSqliteCompletionReceiptJournalStore。它只持有 Facade 已解析的同一个DatabaseSync,负责 journal 四个操作的 SQL、exact replay、候选映射与 corruption 检查。 LocalSqliteRunRepository继续实现LocalCompletionReceiptJournal,公开构造器、方法签名、root/subpath exports 和 消费者全部不变。新 Store 不从package.json#exports、index.ts或runtime.ts导出,调用者不得直接构造。- 所有输入 validation、
LocalSqliteOperationAuthority.enqueue、busy/closed 映射和 connection close 仍由 Facade 控制。Store 不创建 connection、transaction、Promise queue、timer、watcher、cache 或后台工作。 - Store 使用同步 Node SQLite 操作;Facade 只在原 authority 队列内调用它。不得为了“解耦”新建第二 connection, 也不得把 Completion Receipt 注册并入另一个 transaction authority。
- SQLite driver error 继续由 Facade 的既有
mapSqliteError归一化;Store 只产生既有RunRepositoryConstraintError和底层 SQLite error,不新增公开 error code。 - 本增量不新增 workspace package、生产 dependency、migration、表、索引、公开 specifier、进程、listener、Pool、 timer、资源预算或部署单元;package boundary root hard cap 与 19-package ledger 不变。
被拒绝的方案
- 拆成新的 workspace package:没有独立部署、权限、依赖或消费者 closure,反而增加路由设备 importer 与 SBOM 表面积。
- 让应用直接组合多个 Repository:会把同一 connection 的串行、关闭与事务 ownership 泄漏到产品层。
- 为 Store 新建 SQLite connection:会改变 busy、WAL/DELETE、事务竞争和关闭语义,并破坏单 authority 不变量。
- 一次拆出 Policy/Audit/Secret/Run 所有职责:CRITICAL Facade 有 30 个直接消费者,混合大规模移动无法归因回归。
- 只把代码移动到一个工具文件:没有形成可测试的持久化职责,也不会降低 Facade 的实现耦合。
接受条件
- Completion Receipt Journal 专用测试和
@qinglong/local-sqlite全量测试通过,exact replay、非 Local Attempt 拒绝、 quarantine/cursor/resolve 语义不变。 - 完整 19-package clean build/test 与 backend 零回归;dependency/package boundary、Edge import、Cluster/CloudNativePG/ local image 和十档 artifact/RSS 门 compatible。
- package 仍为 19 个,
singleSourcePackages=[];Local SQLite root source 数、公开 export keys、生产依赖和 migration chain 不变。 - 刷新 GitNexus 后重新检查 CRITICAL Facade 与四个 delegation 方法,并运行
detect_changesall/comparedevelop。如执行路径扩散或新 Store 变成公开消费者,ADR 不得进入 Accepted。
接受证据
- Completion Receipt Journal 专用测试 3/3、
@qinglong/local-sqlite192/192、完整 19-package clean build/test 与 backend 1,110(1,108 pass/2 skip)通过;六项架构/部署审计和十档 artifact/RSS 均 compatible。 - package ledger 保持 19 个 package、
singleSourcePackages=[];Local SQLite 为 151 个 source、3 个受审根入口、 148 个领域内嵌套实现。新 Store 未进入任何公开 export,生产依赖、migration chain、表和索引均未改变。 - 最小 Edge 产物为 3,617,583 bytes,RSS delta 为 12,025,856 bytes;最大 Standalone Application AI 为 6,105,204 bytes,RSS delta 为 21,364,736 bytes,均低于硬上限。
- 刷新后的 GitNexus 为 43,155 nodes/98,225 edges/1,693 clusters/265 flows。Facade 保持 CRITICAL(30 direct/
63 total/3 modules),四个 delegation 方法与构造器均为 LOW;内部 Store 为 MEDIUM(6 direct/31 total/
0 process,仅 Run module)。
detect_changesall/comparedevelop分别为 12 files/31 symbols 与 14/34, 均为 low/0 affected process;由于 QL3 孵化树大部分仍 untracked,该统计只作为补充证据。
后续边界
- 下一候选应按共同事务事实选择,而不是按 LOC:dispatch definition、startup recovery reader 或 Security Audit 可以分别 评审;Project Policy + authorized Secret mutation 必须先证明事务围栏不会被拆断。
- Facade 最终可以变成显式 capability aggregator,但在所有生产调用者迁移到窄 port 前,不能删除
LocalSqliteRunRepository或改变其构造方式。