5.6 KiB
ADR-0299:Cluster Control 根 Composition 实现归属
- 状态:Accepted
- 日期:2026-08-09
- 关联:D-05、D-06、D-17、D-85、D-87、D-121、D-213、D-257、ADR-0106、ADR-0123、ADR-0276、ADR-0296、ADR-0298
上下文
schema v4 根行数棘轮显示 @qinglong/cluster-control 有 3 个 root source、1,032 个审计行。cli.ts 与 aiCli.ts 分别是
ql3-cluster-control 和 ql3-cluster-control-ai 的真实 binary entry;836 行的 index.ts 则不是薄聚合入口,而是完整的
PostgreSQL readiness、Recovery、Scheduler、Cancellation convergence、Worker port、Policy/Audit 与 Plugin Package Workflow
composition root。继续把它命名为 index 并放在 package root,会掩盖其 Application Runtime 领域归属,也会冻结无治理价值的
1,032 行 root cap。
该能力已通过 package 根 specifier 暴露,物理 dist/index.js 不是调用方契约。它与既有 application-runtime/application.ts、
productionApplication.ts 共享同一部署和版本生命周期,没有成立新 workspace package 的依据。
移动前 GitNexus 显示根文件、ClusterControlAssemblyInput 与 ClusterControlBootstrapOptions 均为 LOW(2 direct/6 total/0
process),bootstrapClusterControlRuntime 为 LOW(2/3/0);没有 HIGH 或 CRITICAL 风险。
决策
- 将
src/index.ts原样归入src/application-runtime/clusterControlRuntime.ts;同领域的application.ts与productionApplication.ts直接引用该 module,不再反向依赖 package root。 - 不保留根 wrapper。
package.json的main、types与根 export 直接映射嵌套编译产物;公开 package specifier、导出 symbol、 error class identity、bootstrap 顺序和 stop/close 语义保持不变。 - 两个 binary entry 保留在根目录,因为它们精确对应 manifest 的两个
bin,并承担 process signal、低敏输出和 exit code 语义; 不为目录数字搬运真实入口。 - 仓库根 benchmark 不是 workspace importer,显式绑定新的嵌套
dist路径。dependency audit 将五个 PostgreSQL runtime-only subpath 的唯一允许 owner 从旧src/index.ts改为新的 composition module,并用同路径 fixture 证明。 - package ledger 将 Cluster Control 的
rootSourceFileHardCap从 3 降为 2、rootSourceLineHardCap从 1,032 降为 195; boundary 回归冻结 source/root/nested、两个 binary role、manifest root target 与旧根文件不存在。 - 不新增 workspace package、生产依赖、数据库对象、Pool、connection、timer、listener、watcher、进程、binary 或部署单元。
被拒绝的方案
- 保留根
index.tsfacade:没有兼容、组合或权限语义,只会让旧路径继续成为包内反向依赖并保留虚假入口。 - 把 composition 拆成新 package:没有独立部署或依赖生命周期,只会扩大 Cluster 镜像 importer、lockfile 和 SBOM。
- 同时拆开 356 行 bootstrap 函数:目录归位可以证明路径之外零行为变化;本批再改 readiness/recovery/stop 顺序会扩大故障恢复审查面。
- 把两个 CLI 也移入装饰性目录:它们是真实 executable roots,不是被入口名称掩盖的领域实现;移动不会改善职责边界。
接受条件
- Cluster Control 保持 43 个 source,root 仅有两个 binary entry/195 审计行,nested 40→41;workspace 保持 19 package、 768 source,root 43→42、nested 725→726。
- 根 package export 与两个 bin 名称/路径保持;Cluster Control 及完整生产 consumer 通过 clean build/test。
- PostgreSQL authority allowlist 只承认新的 composition module;旧根源码和 clean build 旧根产物均不存在。
- 完整 packages/backend、架构/部署审计和十档本机制品门 compatible。
- 强制 GitNexus 不增加产品流程,
detect_changes保持 low/0 affected process。
接受证据
- package boundary schema v4 报告 Cluster Control 为 43 source、2 root/195 root lines/41 nested;workspace 仍为 19 package、
768 source、42 root、726 nested,
singleSourcePackages=[]。 - Cluster Control 188 项为 186 pass/2 条环境条件 skip;dependency 与 boundary 定向回归 54/54。
- 完整 19-package clean build/test 退出 0;backend 1,112 项为 1,110 pass/2 skip/0 fail。clean build 的
@qinglong/cluster-control/dist根只保留cli/aiCli产物,不再产生index.*。 - dependency、package boundary、Edge import、Local image、Cluster deployment 与 Cluster image release 审计全部 compatible;需要真实 OCI layout 参数的布局校验由 backend fixture 覆盖,不把无 layout 的 CLI 调用伪报为失败。Cluster Control benchmark 通过,module load 78.524 ms/30,638,080 bytes RSS delta,disabled activation 0.154 ms 且未打开数据库或 assembly。
- 十档本机制品门全部 compatible:基础 Edge 为 3,635,197 bytes/332 files/48 modules;最大 Standalone Application AI 为 6,123,790 bytes/491 files/104 modules,各档 artifact/file/module/RSS 均未越界。
- 强制 GitNexus 刷新为 43,308 nodes/98,518 edges/1,696 clusters/269 flows。新 composition file、两个 interface 与
bootstrapClusterControlRuntime均为 LOW,2 direct/0 process;bootstrap 仍只有inactiveBootstrap与startClusterControlApplication两个直接 caller。detect_changesall 为 12 files/31 symbols,comparedevelop为 14/34,均 low/0 affected process。 - 本批未修改 SQL、生产依赖或 Cluster 状态,不重复消费 PostgreSQL HA 物理门;紧邻 ADR-0298 已按授权完成 PostgreSQL 18.4
arm64 physical HA、fencing、timeline 1→2、
pg_rewindsync rejoin,并确认测试资源清空。