feat(ql3): execute copilot diagnosis tools

This commit is contained in:
whyour
2026-08-15 16:39:19 +08:00
parent 0163c94be7
commit 9c90c6ce82
25 changed files with 2952 additions and 27 deletions
+7 -3
View File
@@ -11,6 +11,7 @@
最新增量证据(2026-08-15):
- D-316/ADR-0408(已接受):Cluster Copilot 现在能够从 ADR-0407 的 durable admission 恢复 exact `qinglong.run.log.excerpt@1.0.0` authority,复用通用 Trusted Tool start barrier、加密 success/failure completion、result catalog/rekey 和内建日志 adapter;确定性 start/completion identity 让 response-loss replay 直接打开既有证据,不重复读取日志或执行 adapter。Cluster invocation Artifact 使用独立 projected keyring,提供 active+historical material,但每次读取均重新执行 canonical path/symlink/mode/inode/realpath fence,且不取得 PostgreSQL Tool result generation authority。只有 exact `succeeded` completion 才能通过 `pg-9019` 的 SERIALIZABLE 事务把 Model Step 从 `pending` 原子推进到 `ready`,同时写 RunEvent、StepRunMutation 和 append-only unlock receipt`failed|timed_out` 不解锁。本 Gate 不执行模型、不终态化 diagnosis Run,下一 Gate 是 ADR-0405 builder + Model Gateway + Copilot encrypted model completion/terminalization。实现仍为 18 个 package,无单文件/浅平 packageAI 175 个源码中 174 个、Cluster Control 56 个中 54 个位于嵌套目录,不新增依赖、进程、连接、timer/watcher/cache 或默认 Edge 成本。18-package clean build/test 全绿,AI 229 pass/3 条件 skip、backend 1,207 pass/2 条件 skip,四项架构审计零 finding14 档 Local artifact 全通过,默认 Edge/Standalone 为 2,589,890/2,589,968 bytes。PostgreSQL 18.4 arm64 HA 130/130、timeline `1→2`,首次执行只读两次日志、密文不含敏感 fixture,提升后 exact replay 零日志读取;报告 SHA-256 为 `d525a303696e178d777b021b376729bd2c5382fb5eb7bc98466a2b79d3940517`,独立审计与 Docker 清理通过。
- D-315/ADR-0407(已接受):Cluster Copilot 故障诊断不修改或重新打开终态源 Run,而是用源 Run/version、最新已结束 Attempt/status 与日志 Artifact 建立 exact fence,原子创建独立 `copilot_failure_diagnosis` Run、admission event、`ready``qinglong.run.log.excerpt@1.0.0` Tool Step、以其为父节点的 `pending` Model Step 和不可变 receipt。计划只接受 `cluster-control` 的 reviewed snapshot/binding/Policy/subject authority`approval_required`、Tool contract/输入漂移或未显式允许的模型出口均在写库前失败关闭。`ql3_ai` 新增有界 admission ledger 与仅授予 runtime 的 `SECURITY DEFINER` source snapshot,在 SERIALIZABLE 事务内重验 active Project/binding 和源 Run/Attemptresponse-loss replay 对 JSONB 做结构 exact 比较而不依赖无语义的对象键序。Copilot/Plugin 这类 StepRun 聚合从通用 Task orphan recovery 排除,后续由各自状态机恢复,不能伪造顶层 Attempt 或被错误终态化。本阶段只 admission,不执行 Tool/模型、不授予行动权;Tool encrypted completion、Model 解锁和 Copilot encrypted model completion 是下一 Gate。最终 18-package clean build/test 与 backend 1,207 pass/2 条件 skip/0 fail,四项边界审计零 finding且 workspace 仍为 18 package、无单文件/浅平 package14 档 Local Profile artifact 全通过,默认 Edge/Standalone 不引入 Cluster admission。PostgreSQL 18.4 arm64 HA 128/128、timeline `1→2`,报告 SHA-256 为 `a4ed1edec783e3f5b42507c0f8e11b94c59dbe44a57e691017d1445ec9d115e2`,证据审计与 Docker 清理通过。
- D-314/ADR-0406(已接受):Cluster Trusted Tool 的 encrypted completion 不再停留在 storage port。`@qinglong/cluster-control/trusted-tool-result-keyring` 新增只读 projected material authoritycanonical v1 manifest 只含最多 16 个 canonical 32-byte key,不含 generation、active/state/retirementprovider 只有 `resolve(keyId)` 而没有 `active()`;因此 PostgreSQL `trusted-tool-results` catalog 仍是 active/decryptable 状态唯一 authoritycompletion 会以 catalog material proof 再次校验。runtime 每次调用重新执行 direct-root、in-root atomic symlink、single-link、64 KiB、只读/不可执行/other-inaccessible mode、dev/inode/size/mtime 与双 realpath fence,不持有 Kubernetes API、cache、watcher 或 timer。新增能力位于 Cluster Control 既有 `trusted-tool/key-management/`,并把 mounted Secret 与 keyring 的 projected-file/TOCTOU 逻辑收敛到 package-private `security/privateProjectedFile` 真源;公开 mounted Secret 行为不变,不新增 package、依赖、migration、连接、route 或默认 Profile importer。定向共享回归 7/7Cluster Control 完整 234 pass/2 条条件 skip/0 fail;最终 18-package clean build/test 与 backend 1,207 pass/2 条件 skip/0 failpackage/dependency/Edge import/Cluster deployment 四项审计零 finding。workspace 仍为 18 package、无单文件或浅平 packageCluster Control 54 个源码中仅 2 个 binary entry 位于根层,52 个处于嵌套领域目录。14 档 Local Profile artifact 全部通过,默认 Edge/Standalone 保持 2,589,812/2,589,890 bytesAI 保持 3,121,108/3,121,198 bytesMCP 保持 7,315,930/7,316,038 bytes。PostgreSQL 18.4 arm64 HA 125/125、timeline `1→2`,报告 SHA-256 为 `26c817647ed984d8d4627a7cae1c95de06017a5d6d32dd3dfd01414ba029e542`,证据审计与 Docker 容器/网络/卷零残留。下一 Gate 是独立 diagnosis Run 的 Tool/Model Step admission 与 Copilot encrypted model completion,不能借用终态源 Run 或 Plugin Prompt plan。
- D-313/ADR-0405(已接受):新增 `@qinglong/ai/failure-diagnosis-prompt`,把 ADR-0403 的潜在敏感日志投影收敛为固定 system instruction + canonical JSON data envelope;日志只存在于 `log.content` JSON string value,不能通过引号、换行、伪造 role/schema 或 delimiter 拼接出新 message。builder 重新校验完整 trust/redaction/profile byte 契约,拒绝伪造 `safe`、行动权、未知字段与 byte/signal driftenvelope 不带 Run/Attempt、Artifact、path、cursor 或 content digest。部署者必须通过 `qinglong/copilot-model-egress-policy@v1` 显式允许 `potentially_sensitive` 数据进入 `on_device|external` 边界并提供输入/output token 双预算,空 allowlist 与 external 未授权均在 Model Gateway/Provider I/O 前失败关闭。输出只含 content-free egress evidence,并固定要求模型 completion 继承潜在敏感、仅加密持久化、禁止明文审计且无行动权;真正 Cluster Trusted Tool/model completion 仍需后续组合门。能力以 `ql3-ai/src/copilot/failure-diagnosis/` 三个内聚文件和精确 subpath 交付,不新增 package、依赖、迁移、连接或常驻组件。定向 12/12、AI 221 pass/3 条件 skip/0 fail;最终 18-package clean build/test 与 backend 1,207 pass/2 条件 skip/0 fail,四项结构/部署审计零 finding14 档 Local Profile artifact 全部通过。默认 Edge/Standalone 保持 2,589,812/2,589,890 bytes、315 files、56 modulesEdge/Standalone AI 保持 3,121,108/3,121,198 bytes、368 files、61 modulesMCP 保持 7,315,930/7,316,038 bytes、801 files、226 modules,证明未装配 subpath 被完全裁掉。PostgreSQL 18.4 arm64 HA 125/125、timeline `1→2`,报告 SHA-256 为 `2bbc8bdd0d90e6ec9ce82d2afcaec817679dddb82860c5d405a09d5e5458bece`,证据审计与 Docker 零残留。
@@ -6942,9 +6943,12 @@ ADR-0407 已完成该 admission Gate:源失败/超时 Run 和最新已结束 A
独立 diagnosis Run 在一个 SERIALIZABLE 事务内同时获得 admission event、ready Tool Step、依赖它的
pending Model Step 与 receiptCluster runtime 的 source snapshot authority 会重验 active Project/binding
和日志 Artifactresponse-loss replay 以结构语义比较 JSONB。该 Run 是 StepRun 编排聚合,不进入通用
Task orphan recovery。当前阶段仍没有执行 Tool 或模型;下一 Gate 必须先形成可信 encrypted Tool
completion,再原子解锁 Model Step,并以 ADR-0405 egress policy 和 Copilot 专用 encrypted model
completion 收敛最终 Run。
Task orphan recovery。ADR-0408 已进一步关闭 Tool execution Gatecoordinator 从 durable admission 恢复
exact Tool authority,复用通用 start barrier 与 encrypted completion;首次执行有界读取日志,response-loss
或主库提升后的 exact replay 不再执行 adapter。只有成功 completion 才由 `pg-9019` 的原子 unlock ledger
把 Model Step 推进到 ready,失败或超时保持 pending。当前阶段仍没有执行模型或终态化 diagnosis Run
下一 Gate 必须以 ADR-0405 builder 和 Model Gateway 形成 Copilot 专用 encrypted model completion,随后
原子收敛 Model Step、Run、取消、deadline 与恢复语义。
## 17. Tool Registry
@@ -0,0 +1,91 @@
# 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。
+1
View File
@@ -411,6 +411,7 @@
| [ADR-0405](./ADR-0405-bounded-failure-diagnosis-prompt-and-model-egress-policy.md) | 有界故障诊断 Prompt 与显式模型出口策略 | Accepted |
| [ADR-0406](./ADR-0406-cluster-projected-tool-result-key-authority.md) | Cluster Projected Tool Result Key Authority | Accepted |
| [ADR-0407](./ADR-0407-cluster-copilot-failure-diagnosis-run-admission.md) | Cluster Copilot Failure Diagnosis Run Admission | Accepted |
| [ADR-0408](./ADR-0408-cluster-copilot-failure-diagnosis-tool-execution.md) | Cluster Copilot Failure Diagnosis Tool Execution 与原子 Model 解锁 | Accepted |
## 规则