5.0 KiB
ADR-0320:Local Publisher Trust Lifecycle Ownership
- 状态:Accepted
- 日期:2026-08-10
- 关联 RFC:QL-RFC-0001 D-05、D-06、D-17、D-87、D-257
- 关联 ADR:ADR-0267、ADR-0276、ADR-0295、ADR-0318、ADR-0319
背景
ADR-0319 已把 Local Publisher Trust 的 contract、codec 与 private filesystem store 从 facade 分离,但 1,112 行 facade 仍同时拥有只读 inspection、provision/rotation publication、retirement 和双阶段 compromise revocation。 这些流程共享同一 durable store,却有不同的授权语义、callback barrier 和演进原因,继续平铺会让修改一种生命周期 时无意触碰另外三种。
编辑前逐 symbol GitNexus impact 显示 8 个 coordinator/helper 全部为 LOW。createSnapshot 有 3 个直接上游并进入
2 条流程,assertTransition 有 1 个直接上游;6 个公开入口在当前图中为 0 个 production process 扩散。没有 HIGH
或 CRITICAL。
决策
保持一个 Local Admin package、一个公共 subpath 和 18 行稳定 facade,在现有 publisher-trust/ ownership 下新增
四个 package-private lifecycle 模块:
publisher-trust/
├── contracts.ts # schema、公开 contract、错误 identity
├── codec.ts # canonical codec、digest、纯 snapshot composition
├── privateFilesystemStore.ts # POSIX durable store
└── lifecycle/
├── inspection.ts # read-only bounded projection
├── publication.ts # provision、overlap rotation、publication fence
├── retirement.ts # intent → proof → receipt → snapshot
└── revocation.ts # proposal → independent confirmation → snapshot
createSnapshot 是纯 canonical composition,归入 codec;publication、retirement 和 revocation 只导入同一个函数,
不复制 digest 规则。assertTransition 只服务 provision/overlap rotation,留在 publication。Revocation proposal 与
confirmation 保持在同一个 484 行模块,因为二者共同拥有 compromise transaction identity、impact digest、
dual-control/break-glass 与 quarantine lock 语义,禁止为了“一函数一文件”拆断协议。
原 pluginPackagePublisherTrust.ts 只 re-export contract、三个公开 codec function 与六个 lifecycle function。
所有公开函数、错误 class、package export 和调用路径仍是同一个 runtime object;没有新增公共 subpath。
本轮逐字移动 coordinator body,不修改 callback 执行点、generation fence、snapshot/intent/receipt 发布顺序、 authorization mode、impact/quarantine 语义、crash replay status、返回投影或错误 identity。
小设备与集群影响
新增 lifecycle 文件只进入包含 Local Admin 的 Application 制品,不进入最小 Edge/Standalone 基础 Profile。 四个物理文件没有增加实际启动 loaded module 数,说明现有基础/Application 启动闭包没有因目录拆分扩大。没有新增 dependency、进程、timer、listener、数据库连接或 Cluster 部署单元。
被否决方案
- 单一
lifecycle.ts:只是把 1,112 行文件换名,仍混合四种 authority,拒绝。 - proposal/confirmation 各一个文件:拆断同一 revocation durable protocol,拒绝。
- 每个公开函数一个 workspace package:没有独立产物或部署闭包,拒绝。
- lifecycle 直接实现 filesystem publish:破坏 ADR-0319 store ownership,拒绝。
- 改成动态 import 降 module count:当前 loaded module 未增长,没有必要引入异步 API 与失败面,拒绝。
验收证据
- facade 1,112→18 行;inspection 67、publication 239、retirement 318、revocation 484 行;codec 为 829 行、 private store 841 行、contract 174 行。
- facade 与 owning module 的 6 个 lifecycle function identity 逐项相同;contract error 与公开 codec identity 沿用 ADR-0318/0319 的同对象证明。
- Local Admin build 与 91/91;完整 16-package clean build/test 最终退出 0,Owner CLI 134/134,Application 40 pass/3 条件 skip。
- package boundary 为 16 package、812 source、25 root、787 nested、findings 为空;Local Admin 为 36 source。 Edge import、Cluster dependency、Cluster deployment 全部 compatible。
- Edge/Standalone Application 为 4,731,034/4,731,154 bytes、435 files、110 loaded modules;Edge/Standalone Application AI 为 6,126,411/6,126,543 bytes、514 files、109 loaded modules。相对 ADR-0319 只增加 4 个物理 文件,loaded module 数不变,pack/RSS 预算保持 compatible。
- 本轮不改 SQL、migration、PostgreSQL/Cluster runtime 或部署资源,因此不重复 PostgreSQL HA Docker 门。
未完成
Local Publisher Trust 的 package 内 ownership 已形成稳定 contract → codec/store → lifecycle → facade 层次。下一轮 回到 workspace 大文件职责审计,优先选择仍同时混合协议、持久化与 coordinator 的实现;纯 schema declaration 继续不因 LOC 被机械拆分。