Files
qinglong/docs/adr/ADR-0408-cluster-copilot-failure-diagnosis-tool-execution.md
T

92 lines
6.6 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-0408Cluster Copilot Failure Diagnosis Tool Execution
- 状态:Accepted
- 日期:2026-08-15
- 关联 RFCQL-RFC-0001 D-316、Phase 2
- 关联 ADRADR-0163、ADR-0226、ADR-0403、ADR-0405、ADR-0406、ADR-0407
## 问题
ADR-0407 只把故障诊断原子接纳为独立 Run、一个 `ready` Tool Step 和一个依赖它的
`pending` Model Step。系统仍不能执行该 Tool,也不能在崩溃、响应丢失或 PostgreSQL
主库切换后证明 Tool 是否已经产生副作用、结果是否已经加密持久化,以及 Model Step
是否可以安全解锁。
若 Copilot 绕过共享 Trusted Tool start/completion 协议直接读取日志,重放可能重复执行
adapter;若先解锁 Model 再写 completion,模型可能读取缺失、失败或未验证的结果;若复用
Prompt output key 或让 projected file 决定 Tool result active generation,又会合并本应独立的
密钥域和 durable authority。
## 决策
1. 新增 Copilot failure-diagnosis Tool execution coordinator。它只接受 ADR-0407 已持久化的
`requestId`,重新读取并规范化 exact admission plan/receipt、当前 Project Tool snapshot 和
invocation input/preview Artifact;任何 plan、Definition、binding、Artifact 或 source fence
漂移均在日志读取前失败关闭。
2. coordinator 复用 Runtime Core 的通用 Trusted Tool execution evidence、start barrier、
encrypted success/failure completion、result catalog 和 rekey 协议,并只装配内建
`qinglong.run.log.excerpt@1.0.0` adapter。start/completion 使用从 plan 稳定派生的 identity
exact replay 首先打开 durable barrier/completion,不再次读取日志或执行 adapter。
3. invocation Artifact 使用独立的 Cluster projected keyring。它包含一个 active key 和最多
16 个历史 key,提供 `active()``resolve(keyId)`,每次调用重新读取 canonical 32-byte
material,不使用 cache、watcher 或 timer,并复用既有 projected-file 的 canonical path、
symlink、权限、inode/size/mtime 和双 realpath fence。Tool result keyring 仍保持 resolve-only
PostgreSQL result catalog 继续独占 active/decryptable generation authority;两个密钥域不得互换。
4. 只有规范化且与 admission exact 绑定的 `succeeded` Tool completion 才能解锁 Model Step。
`pg-9019-ai-copilot-failure-diagnosis-tool-unlocks` 新增 append-only unlock ledger;一个
SERIALIZABLE 事务同时把 Model Step 从 `pending` 推进到 `ready`、递增 Run version/event
sequence、写 RunEvent、StepRunMutation 和不可变 unlock receipt。Tool `failed|timed_out`
completion 不解锁 Model,也不伪造最终 diagnosis 结论。
5. unlock transaction 重新锁定并验证 admission、success completion、当前 Model Step 和 running
diagnosis Runserialization/deadlock 只在事务提交前有界重试。response-loss replay 必须返回
结构完全一致的 receipt;缺失关联事实、旧 fence、不同 digest 或部分写入全部视为冲突/损坏。
6. `ql3_runtime` 对 unlock ledger 只有 `SELECT, INSERT`,没有 `UPDATE, DELETE`;数据库外调用者
不能直接把 Model Step 改为 ready。Tool execution 与 PostgreSQL storage 分别通过精确 AI
subpath 发布,纯 execution 入口不隐式 re-export PostgreSQL repository。
7. 本 Gate 到 Model Step `ready` 为止,不调用模型、不持久化模型明文、不终态化 diagnosis Run。
ADR-0405 prompt builder、Model Gateway、Copilot 专用 encrypted model completion、失败/取消/
deadline terminalization 和产品 API 属于后续 Gate。
8. 能力内聚在既有 `@qinglong/ai``@qinglong/cluster-control` 的领域子目录,不新增 workspace
package、依赖、进程、Pod、连接池、listener、daemon、timer、watcher 或 cache。默认 Edge/
Standalone 不导入 Cluster execution;显式本地 AI 制品也不会取得 PostgreSQL/S3 authority。
## 被否决方案
1. **Copilot 自建一套 Tool completion**:会分叉 start barrier、加密 Artifact、rekey 与恢复语义。
2. **admission 后直接调用日志 reader**:响应丢失时无法区分“未执行”和“已执行但未返回”。
3. **Tool 一启动就解锁 Model**:允许模型消费未完成、失败或未认证的结果。
4. **把失败 Tool completion 当成可诊断输入**:当前没有经过审定的失败 Prompt/terminalization
协议,会把基础设施错误伪装成业务诊断。
5. **共用 Prompt output/result/invocation keyring**:混淆密钥用途、active authority 与退役范围。
6. **为 keyring 或 coordinator 新建 package**:没有独立部署/ownership 边界,并会继续加剧包碎片化。
## 当前验证
1. admission/execution/unlock 与 migration/readiness 聚焦契约 21/21projected invocation keyring
2/2AI package 最终为 229 pass、3 条件 skip、0 fail,类型检查通过。
2. 18 个 QL3 package 的 clean build/test 全部退出 0backend 为 1,207 pass、2 条件 skip、
0 fail。
3. package boundary、Cluster dependency、Edge import 和 Cluster deployment 四项审计均
compatible 且零 finding。workspace 仍为 18 个 package`singleSourcePackages=[]`
`shallowSourcePackages=[]`AI 175 个源码中 174 个、Cluster Control 56 个中 54 个位于
嵌套领域目录。
4. 14 档 Local Profile artifact 全部通过。默认 Edge/Standalone 为 2,589,890 / 2,589,968
bytes;显式 Edge/Standalone AI 为 3,135,809 / 3,135,899 bytes;最大 Standalone MCP 为
7,316,038 bytes,均在各自门内。
5. PostgreSQL 18.4 arm64 physical HA 为 130/130 Gate、timeline `1→2`。门证明首次 Tool 执行只
读取两次日志、密文 JSON 不含敏感 fixture 文本、Model Step 原子进入 ready;主库提升后 exact
replay 的日志读取为零。报告 SHA-256 为
`d525a303696e178d777b021b376729bd2c5382fb5eb7bc98466a2b79d3940517`,独立审计零 finding
临时 Docker 资源已清理。
## 后续门禁
1. 从 durable Tool completion 解密受信投影,经 ADR-0405 builder 生成 prompt,并通过 Model
Gateway 执行 provider credential、egress policy、quota、price 和 deadline fence。
2. 建立 Copilot 专用 encrypted model completion 和 response-loss recovery;模型输出不得进入
普通 completion、数据库 JSON、审计或日志明文。
3. 原子终态化 Model Step 与 diagnosis Run,并覆盖 Tool/Model 失败、取消、超时、未知结果和
主库切换后的恢复状态机。
4. 最后再开放默认关闭的 Cluster API/CLI/UI/MCP 产品入口,并补真实 S3、外部 Provider fault
injection、多副本并发和 plaintext negative evidence。