Files
qinglong/docs/adr/ADR-0278-profile-separated-linux-workflow-cancellation-resource-gate.md
T

82 lines
6.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-0278Profile 分层的 Linux Workflow 取消资源发布门
- 状态:Accepted
- 日期:2026-08-07
- 关联:D-05、D-07、D-87、D-213、D-251、D-257、ADR-0088、ADR-0228、ADR-0270、ADR-0277
## 上下文
ADR-0277 已让本机用户能够通过受认证的 `workflow.cancel` 产品命令提交取消意图,既有 Local
Application Linux 条件测试也能启动真实进程并观察 `/proc/<pid>`。但是测试仍用 SQL 直接注入
`cancel_requested_at_ms`,因此没有证明产品命令、Policy、durable audit、application control、进程停止与
Workflow parent terminalization 是同一条可工作的链路。
把这条链路加入 128 MiB 路由压力门时还暴露出另一个问题:该门同时运行可选 AI Prompt、AI Model
Invocation crash matrix 与核心调度/执行 workload,虽然没有 OOMcgroup `memory.events.max` 已出现非零
命中。把可选 AI 的瞬时峰值解释成所有路由用户的核心最低配置,或通过忽略 `max` 事件来让门变绿,都会
破坏 D-07 的 Profile 隔离。
## 决策
1. Linux Application 条件测试必须通过真实 `ql3-workflow` schema v1 `workflow.cancel` command file
请求取消,不再用 SQL 注入 cancel intent。测试凭据、pepper、User、API credential 与 Owner
RoleBinding 只作为私有测试 fixture 创建;生产 package closure 不增加 Owner CLI/Console。
2. Workflow、Run、StepRun、Attempt、mutation、event 与 audit fixture 使用产品可接受的 UUID v4。命令
首次返回 `accepted`,同一命令重放返回 `existing`;持久层必须只有一个
`run.cancel_requested` 与一个 allowed `workflow.cancel` audit。
3. 测试必须先观察 `/proc/<pid>` 存在,再验证进程退出、Attempt cancelled、两个 StepRun cancelled、
parent Workflow cancelled。该证据只证明受控 Linux 容器里的进程停止链,不宣称固定路由器断电、闪存
持久性或不受控 side effect 已被证明。
4. 资源发布门按产品 Profile 分层:128 MiB `router-stress-ci``supportedMinimum=false` 的核心压力档,
只运行 Edge executor、Node SQLite、Workflow success、SQLite lock、admission crash 与 control crash
256 MiB `edge-release-ci` 运行完整核心链、受认证 Workflow cancel,以及可选 AI Prompt/Model
Invocation crash matrix。
5. Workflow success 与 cancellation 在同一个 Node test process 中执行,避免重复装载完整 Application
graph。报告解析所有 `QL3_RESOURCE_EVIDENCE`,逐条检查 RSS,并对 success/cancel 两组 durable fact
fail closed;缺一条、计数漂移、进程未退出或超过预算都拒绝发布。
6. `@qinglong/local-owner-cli``@qinglong/local-owner-console` 只能是
`@qinglong/local-application``devDependencies`。cluster dependency audit 同时精确约束 manifest
`workspace:*` 与 lockfile `link:`local image 与十档 artifact 必须继续证明二者不进入生产制品。
## 被拒绝的方案
- **继续用 SQL 触发取消**:只能证明底层 convergence,不能证明认证、Policy、命令幂等与审计产品链。
- **给 128 MiB 档加内存或忽略 `memory.events.max`**:隐藏了可选 AI 与核心路由运行时的资源边界。
- **让 128 MiB 路由档承担全部 AI crash matrix**:把 optional feature 变成基础 Profile 的隐性依赖。
- **为成功与取消各启动一个 Application test process**:重复模块装载会放大监督进程峰值,不代表真实单
Application cadence。
- **把容器 `/proc` 证据称为物理设备发布证据**:容器不能代替固定型号路由器的断电、闪存与热环境门。
- **为测试适配再拆 workspace package**:没有独立部署或生产依赖价值,并会违反既有 package 硬上限。
## 接受证据
- Linux arm64、non-root、read-only root/workspace、`no-new-privileges` 的真实 Application cancellation
测试返回 `accepted`/exact `existing`,观察到 PID 存在后退出;parent/Attempt 均 cancelled,两个
StepRun cancelledcancel event/audit 各一条,cancel workload peak RSS 94,715,904 bytes。
- 128 MiB/0.5 CPU/64 PIDs 路由核心档 6 个 workload 全通过:`memory.peak=119,615,488`
`memory.events max/oom/oom_kill=0/0/0`;该档明确不是受支持最低配置声明。
- 256 MiB Edge 完整档 10 个 workload 全通过:`memory.peak=137,867,264`memory event 全零;Workflow
success/cancel peak RSS 为 88,555,520/94,715,904AI Prompt edge/standalone 为
120,373,248/117,379,072 bytes。
- Local Application 39 pass/3 Linux 条件 skip;完整 19-package 门退出 0;后端 1,101 tests、1,099
pass/2 skip/0 fail。Edge import、cluster dependency、package boundary、cluster deployment、worker
deployment 与 local image 六项审计全部 compatible。
- 十档 artifact 全 compatibleEdge/Standalone 3,547,572/3,547,620 bytesAdopted
4,146,274/4,146,358Application 4,633,747/4,633,891AI 4,882,494/4,882,554Application AI
5,968,741/5,968,897;最大档距 6 MiB 仍有 322,559 bytes。Application production closure 不含
Owner CLI/Console。
- PostgreSQL 18.4 arm64 physical-streaming HA `passed=true``remote_apply`、timeline 1→2、旧主
fencing、`pg_rewind` 只读同步重入、两个 fresh control activation 与 remote Workflow cancellation
promotion gate 全绿;`ql3-ha-*` container/network/volume 零残留。
- 刷新后 GitNexus 为 42,509 nodes/96,471 edges/1,672 clusters/261 flows;五个修改符号全部 LOW,最多
1 direct/0 affected process。`detect-changes` all/compare `develop` 分别为 12 files/31 symbols 与
14/34,均 low/0 affected process。
## 剩余边界
- 仍需在明确型号、内存、存储与文件系统的物理路由设备上执行断电、闪存持久性、热重启和长时间 soak;
- 仍需 x64 CI/发布 runner 的同构资源门证据;
- Cluster Workflow-specific 产品入口、远程 Worker stop acknowledgement 与物理基础设施 fencing 继续由
各自的独立发布门负责,不能由本 ADR 的本机 `/proc` 证据替代;
- 联网 production dependency vulnerability audit 因依赖元数据外发权限未获批准,本轮不重跑。