feat(ql3): establish 3.0 incubation baseline

This commit is contained in:
whyour
2026-08-12 00:25:26 +08:00
parent 4bf92dcfeb
commit c699c32461
2817 changed files with 779642 additions and 653 deletions
@@ -0,0 +1,109 @@
# ADR-0243:删除无产品消费者的 Local Cutover 孵化包
- 状态:Accepted
- 日期:2026-08-01
- 关联 RFCQL-RFC-0001 D-64、D-85、D-175、D-207、D-227
- 取代实现:ADR-0065 中未接入产品的 `@qinglong/local-cutover` 孵化代码
- 延续:ADR-0217 的 beta 删除门
> 后续 ADR-0309 没有恢复被删除的 workspace package,而是在已有短生命周期
> `ql3-local-deploy` 产品内实现首个 Docker legacy-stop slice;本 ADR 的 package 删除决策
> 继续有效。
## 背景
QingLong 3.0 的 workspace package 只能表达可验证的制品、依赖、Profile 或 authority
边界,不能把尚未接入产品的概念源码永久保留为 importer。`local-cutover` 已连续多个
里程碑保持以下状态:
- 5 个 TypeScript 文件、约 1,479 行;
- 没有 production consumer、binary、image、deployment 或 Profile artifact entry
- 没有 workspace 或第三方 production dependency
- 只有自己的单元测试、dependency audit 登记和 RFC/ADR 文档引用;
- 缺少 ADR-0065 要求的 legacy controller、target controller、人工恢复 ceremony 与
可安装 supervisor artifact。
这不是“包虽小但边界合理”,而是没有产品入口的孤立孵化实现。继续保留会增加
manifest、lock importer、拓扑构建、测试、SBOM/漏洞 inventory 和维护认知成本,同时
无法帮助任何 Edge、Standalone 或 Cluster 用户完成 2.x→3.0 cutover。
## 决策
### 1. 删除整个 `local-cutover` package
删除 package manifest、源码、测试、生成物和 pnpm lock importer,不把 1,479 行源码
机械并入 `runtime-core``local-admin``local-application`。这些包都没有产品调用该
Supervisor;把死代码移入现有 owner 只会隐藏而不会消除无效 authority。
Workspace importer 从 20 收敛为 19hard cap 同步收紧为 19。新增第 20 个 importer
必须重新通过 D-85 的独立部署/依赖/Profile/authority/多消费者证明,而不能把本次删除
当作预留空位。
### 2. 保留删除墓碑
Dependency audit 继续识别 `@qinglong/local-cutover` 及其 subpath,并返回稳定的
`DELETED_LOCAL_CUTOVER_PACKAGE_IMPORT`。旧名称不允许被 root dependency、现有 package
或动态 import 重新引入。删除 package 本身的例外已经移除。
### 3. 保留安全需求,不保留未交付实现
RFC D-64 中“先证明 legacy writer/外部副作用静默、start barrier 后结果未知不得盲重试、
不得自动重启 2.x”的安全要求继续有效。ADR-0065 作为设计记录保留,但其 package 实现
由本 ADR 取代,不再作为当前可用能力或完成证据。
未来重新实现 cutover 前,必须同时提供至少一项真实产品边界:
- 可安装的短生命周期 CLI/image/service artifact
- 至少一个受审 legacy controller 和一个 QL3 target controller
- 明确的权限、签名、SBOM、人工恢复和多架构测试矩阵;
- 一个真实部署流程中的 production consumer。
若独立制品仍有必要,可以重新评审 package;否则默认作为既有 migration/admin owner 的
内部 subpath。无论哪种方式都不能在没有产品入口时先恢复 workspace importer。
## 影响分析
删除前对 package 内全部 39 个顶层函数/类执行 GitNexus upstream impact
- 13 个 HIGH、3 个 MEDIUM、23 个 LOW
- 最大 26 个受影响符号;
- 所有调用者都位于 `packages/ql3-local-cutover` 内;
- 外部文件 0、production process 0。
HIGH 来自 validation/helper 在 package 内的扇出,不代表跨 Profile 产品风险。整包原子
删除能同时消除这些内部边,因此不需要迁移 caller 或兼容 facade。
## 低配与集群影响
- Edge/Standalone/Cluster 运行时行为、RSS 和第三方依赖不变,因为该包从未进入制品;
- Workspace 构建、lockfile、漏洞扫描和维护面减少一个 importer;
- `local-command-file` 继续保留:它虽为单文件,却是零依赖且有三个 production consumer
的共享安全叶子;
- Cluster PostgreSQL/Kubernetes/S3 三包和本机安全/Profile 边界不因追求包数量而合并。
## 验证
1. `packages/ql3-local-cutover` 目录不存在;
2. pnpm lockfile 不含 `packages/ql3-local-cutover` importer
3. dependency audit 枚举正好 19 个 QL3 package
4. 旧 package import 的负向 fixture 返回删除墓碑;
5. dependency audit 定向测试 39/39 通过;
6. Cluster dependency、Edge import、Cluster/Worker/CloudNativePG deployment、local image
inventory 和全包 build/test 必须继续无 finding
7. PostgreSQL HA Docker 门必须继续通过,且容器、网络与卷零残留;
8. GitNexus `detect_changes` 不得出现 cutover 之外的非预期产品执行流。
本次实际验证中,19 个 package 的完整 build/test、dependency/Edge/deployment/image
审计和 PostgreSQL 18.4 physical HA 均退出 0HA `gates.passed=true``ql3-ha` Docker
容器、网络与卷均为零残留。完整门同时发现并修复两个与删除无调用关系的旧夹具漂移:
PostgreSQL runtime role fixture 缺少两个 Worker credential management 表,以及 Local
Compose 镜像仍声明旧 SQLite contract。镜像、preflight 成功夹具和审计已同步到 v42;
Compose collected-evidence 不再固定只接受 v40,而是在不扩大 storage authority 的前提下
由三个已授权调用方显式传入当前上限,接受历史 `40..42`、拒绝未知未来版本。
`audit:profiles:ql3` 本轮没有取得成功证据:受限环境无法获得 advisory,提升权限又因会
向外部 registry 发送生产依赖图和私有 package 元数据而被安全策略拒绝。未绕过该限制,
因此本文不宣称 vulnerability gate 已通过;它仍需在受信 CI/registry 环境执行。
删除不表示 2.x→3.0 cutover 已解决。它表示 3.0 不再把一个不可安装、不可调用的源码目录
误报为产品能力;正式 cutover 仍需新的、带真实部署证据的 RFC/ADR 切片。