Files
qinglong/docs/adr/ADR-0295-shallow-profile-package-dependency-firewall-proof.md
T

6.5 KiB
Raw Blame History

ADR-0295:浅层 Profile Package 的依赖防火墙证明

  • 状态:Accepted
  • 日期:2026-08-09
  • 关联:D-05、D-06、D-17、D-85、D-87、D-213、D-257、ADR-0063、ADR-0106、ADR-0267、ADR-0276、ADR-0294

上下文

QL3 当前 19 个 workspace package 中没有单 source package,但 @qinglong/local-profile@qinglong/local-adopted-profile 都只有三个 src/ 根文件、没有嵌套实现。仅凭“这些文件是公开入口”的文字解释还不够: 如果任何 artifact label 加几个 wrapper 都能取得浅层例外,package hard cap 只能限制总数,不能阻止边界逐步碎片化。

另一方面,这两个 package 不能按文件数机械合并。基础 local-profile 的 production closure 只允许 SQLite storage local-adopted-profile 才安装 local-admin、Local Secret 与 legacy source 写栅栏。继续向上合入 local-application 又会带入 local-executionlocal-process 和 Croner。Edge/Standalone 的固定入口已经由 ADR-0106 从四个独立 wrapper package 收敛为 subpath,当前三个根文件分别对应 root、Edge 和 Standalone 公开入口,并非平铺 实现。

当前强制 GitNexus 中,package boundary audit 和 shallow-layout parser 均为 LOW,分别只有 1 个直接调用、0 条产品执行流; 两个 Profile 运行时 symbol 不需要修改。

决策

  1. 保留 @qinglong/local-profile@qinglong/local-adopted-profile 两个 package。它们隔离的是 production dependency、 authority 和制品闭包,不是按文件数量划分的代码职责。
  2. docs/ql3-package-boundaries.json 升级为 schema v3。所有无嵌套 source、无独立 binary、仅靠 artifact 证明 deployable 的 package,必须在 shallowSourceLayout 中同时声明:
    • artifact 名到 package export specifier 的精确映射;
    • 一个真实直接 consumer 作为相邻更大闭包;
    • 至少一个存在于 consumer closure、但不存在于自身 closure 的 production dependency。
  3. 审计必须从实际 package manifests 递归计算 production dependency closure,不接受账本自报;比较对象必须是该 package 的真实直接 consumerdelta dependency 必须在 workspace 或外部 production closure 中可证明。
  4. 对 shallow artifact packagemanifest 的全部 export specifier、runtime .js target、根 source output 和 artifact entrypoint 必须形成一一对应;隐藏 export、孤立根文件、重复 target、虚构 artifact 或未证明 dependency delta 均失败。
  5. 有真实 bin 的 shallow deployable 继续以 executable manifest 作为独立部署证明,不强制使用 artifact dependency delta one-source、consumer、authority、adapter 和 package hard-cap 的既有规则继续生效。
  6. local-profile 必须证明相对直接 consumer local-adopted-profile 排除 local-adminlocal-secret local-adopted-profile 必须证明相对直接 consumer local-application 排除 local-executionlocal-processcroner
  7. 不改两个 package 的 public API、运行实现、依赖树、artifact 集合或 Profile 行为;本批只加强结构准入,不以门禁改造伪装 运行重构。

被拒绝的方案

  • 合并两个 Profile package:基础路由器闭包会取得 adoption 管理 authority,违反低配与最小权限边界。
  • 把 adopted 组合并入 local-applicationstorage-only adopted artifact 会被执行器、进程适配器和 Croner 污染。
  • 只按 LOC/source 数设置自动合并阈值:无法表达依赖、authority、部署和消费者责任,会误删安全边界并鼓励拆空 wrapper。
  • 维持 schema v2 的文字 rationale:能解释当前状态,但不能阻止下一批浅层微包复制相同说法。
  • 为 Edge/Standalone 恢复独立 package:ADR-0106 已证明固定配置值只需要 subpath,不构成依赖边界。

接受条件

  1. 当前两个 shallow package 的入口、artifact 和 dependency firewall 由实际 manifest/closure 计算证明,审计 compatible:true
  2. fixture 必须拒绝缺少 closure delta、比较非 consumer、依赖在两边都不存在、export/artifact 漂移和隐藏根入口。
  3. 两个 Profile package 定向测试、完整 19-package 与 backend package-boundary 回归通过。
  4. cluster dependency、package boundary、Edge import、local image 与十档 artifact/RSS 门通过;基础 Edge/Standalone 仍不安装 local-admin/adoption authority。
  5. 强制 GitNexus 和 detect_changes 证明没有产品执行流、运行 symbol 或 production dependency 变化。

接受证据

2026-08-09 已完成:

  1. package boundary ledger 已升为 schema v3,审计从实际 manifest 递归计算 production dependency closure;当前 workspacePackageCount=19singleSourcePackages=[],只有 local-profilelocal-adopted-profile 被识别为 shallowcompatible:true
  2. 六项 package-boundary fixture 全部通过,明确拒绝缺少 artifact/delta 证据、虚构 delta dependency、以非 consumer 比较、export/artifact 漂移和隐藏根入口;完整 backend 为 1,1111,109 pass/2 skip)。
  3. local-profile 5/5、local-adopted-profile 8/8,完整 19-package clean build/test 全绿。cluster dependency、package boundary、Edge import 与 local image 四项相关审计均 compatible。
  4. 十档实际 pack/offline-install/import/RSS 门全部通过,字节/文件/module closure 与改造前完全相同:
    • Edge 3,635,004 bytes/332 files/48 modulesStandalone 3,635,052/332/48
    • Edge Adopted 4,246,392/372/49Standalone Adopted 4,246,476/372/49
    • Edge Application 4,735,631/427/105Standalone Application 4,735,775/427/105
    • Edge AI 5,021,770/396/49Standalone AI 5,021,830/396/49
    • Edge Application AI 6,122,469/491/104Standalone Application AI 6,122,625/491/104。
  5. 基础 Edge/Standalone 的生产集合仍只有 local-profilelocal-sqliteruntime-coresemverAdopted 才安装 local-admin/local-secretApplication 才安装 local-execution/local-process/croner。强制 GitNexus 为 43,278 nodes/98,485 edges/1,699 clusters/269 flowsshallowSourceLayoutauditPackageBoundaries 均为 LOW、0 affected processdetect_changes all/compare develop 仍为 12 files/31 symbols 与 14/34,均 low/0 process。本批没有 修改运行 symbol、public API、production dependency、migration 或部署单元,因此不重复制造 PostgreSQL HA 物理晋升证据。