Files
qinglong/docs/adr/ADR-0358-runtime-package-manifest-projection.md
T

50 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ADR-0358:最终运行制品的 Package Manifest 投影
- 状态:Accepted
- 日期:2026-08-10
- 关联:QL-RFC-0001 D-270、ADR-0257、ADR-0346
- SupersedesADR-0346 中“最终 Local Runtime Artifact 不删除任何 manifest 字段”的限制;不改变源码/发布 package manifest、外部 npm package 或 Cluster/Worker 镜像策略
## 上下文
Cluster Approval 切片完成后,最紧的 Standalone Application AI 制品达到 6,284,121/6,291,456 bytes,只剩 7,335 bytes。预算没有安全增长空间,而 workspace package 数、authority 和 public export 又都有明确理由,不能靠合包、删功能或提高 6 MiB 上限解决。
既有裁剪器已经删除内部 package 的 `.d.ts`/`.map`、失效 sourcemap 指令并压缩 JSON,但最终运行制品的 `package.json` 仍保留指向已删除声明文件的 `types``typesVersions` 与 export `types` condition,以及只服务开发/发布阶段的 `files``scripts``devDependencies`。Node 运行时不消费这些字段;继续保留会让低配设备为已被移除的开发资产支付闪存字节。
按当前 Application AI 的 9 个内部 package 估算,这部分为 25,328 bytes。生产依赖、peer/optional 依赖、license、版本、engine、runtime export、main 和 binary 信息不在该范围内。
## 决策
1. 源码和 `pnpm pack` 产物继续保留完整开发 manifest;类型消费者和发布流程不受影响。
2. 本机 Profile 完成精确离线安装并核对 package closure 后,只对 `node_modules/@qinglong/*/package.json` 生成运行时投影。
3. 投影只删除根字段 `types``typesVersions``files``scripts``devDependencies`,以及 `exports` 条件树中的精确 `types` key。
4. 必须保留所有其他字段,包括 name/version/license/engines、main、bin、runtime `require/default/import` 条件、dependencies、optionalDependencies、peerDependencies 和 peerDependenciesMeta;不得改写版本或依赖。
5. 裁剪器继续先完整 inventory、拒绝 symlink/特殊文件并解析验证所有直接 manifest,再执行任何删除或原子替换;外部 npm package 不做投影。
6. 报告分别暴露 JSON compaction 与 runtime projection 的文件数/字节数;总回收量仍包含声明、map、指令、compaction 和 projection。
7. Local Application Dockerfile 继续复用同一裁剪器;不新增 workspace package、生产依赖、runtime module、listener、Pool、timer 或 authority。
## 放弃的方案
- 提高 Application AI 到 7 MiB:掩盖默认闭包增长,且没有设备证据支持。
- 从源码 package 删除类型和开发字段:破坏 SDK、编辑器和发布使用。
- 删除 license、版本或生产依赖:损害 SBOM、许可与模块解析事实。
- 对第三方依赖做通用 manifest 清洗:升级形态不可控,超出本地内部包证明范围。
- JavaScript minify/tree-shake:调试、动态 require 与审计风险更高,需要独立设计。
- 合并现有 package:会破坏部署、authority、可选依赖或多消费者边界,且不是字节问题的最小修复。
## 结果
十二档 artifact 全部保持原 package/file/module closure 和预算,投影分别回收 16,05825,328 bytes。最紧两档为:
- Edge Application AI6,258,661/6,291,456 bytes,余量 32,795 bytes640 files、120 loaded modules。
- Standalone Application AI6,258,793/6,291,456 bytes,余量 32,663 bytes640 files、120 loaded modules。
Standalone Application 为 4,783,705 bytesStandalone AI 为 5,150,523 bytesStandalone MCP 为 9,862,496 bytes。所有预算不变。投影没有改变 package 数、源码布局、运行依赖、公开 specifier 或常驻资源。
## 验证
- Runtime Artifact Pruner 3/3:开发字段和 export `types` 被删除,runtime export 与 production dependency 保留,mode/原子写、symlink 和坏 manifest fail-before-mutation 继续成立。
- Local Image audit 7/7,静态镜像契约 compatible。
- 十二档 Local Profile artifact 全部 compatible;最紧档净回收 25,328 bytes。
- 每档真实 Node import probe 在投影后执行;Application AI 的 loaded module count 仍为 120。