mirror of
https://github.com/whyour/qinglong.git
synced 2026-09-20 16:07:11 +08:00
feat(ql3): execute copilot diagnosis models
This commit is contained in:
@@ -12,6 +12,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,无单文件/浅平 package;AI 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,四项架构审计零 finding;14 档 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-317/ADR-0409(已接受):已解锁的 Cluster failure-diagnosis Model Step 现在从 durable encrypted Tool completion 重开受信日志投影,经 ADR-0405 builder 和既有 Model Gateway 执行;只有显式安装的 Copilot success sink 可以接管成功返回。Copilot `GenerateResult` 使用独立 AES-256-GCM Artifact,绑定 plan、Tool completion、egress evidence 与 Model identity,公开 reference、ModelInvocation completion、RunEvent 和审计均不含明文。通用 `DurableModelInvocationCoordinator` 已改为领域无关的 `ModelInvocationAtomicSuccess<TReference>`,消除对 Plugin Prompt Artifact 的反向依赖;Plugin Prompt 通过 adapter 保持兼容。`pg-9020` 在一个 SERIALIZABLE 事务中原子提交 ciphertext、Model completion、StepRun/Event 与 usage/pricing/quota settlement,再由可重放 finalization 事务把 diagnosis Run 推进为 `succeeded|failed|timed_out`;两事务间崩溃只补 finalization,existing start/completion/finalization replay 均不重复调用 Provider。当前仍不自动终态化 Tool failure、日志 missing/retired、Model admission 前 deadline/cancel,也不把 `outcome_unknown` 冒充失败;Cluster 专用 output projected keyring 与产品 composition 完成前该入口保持不可达。实现仍在既有 18 个 package 的嵌套领域目录内,不新增进程、队列、timer/watcher/cache 或默认 Edge 成本。最终 AI 233 pass/3 条件 skip、18-package clean build/test 与 backend 1,207 pass/2 条件 skip/0 fail,四项架构审计零 finding;workspace 无单文件或浅平 package,AI 183 个源码中 182 个位于嵌套目录。14 档 Local Profile artifact 全部通过,默认 Edge/Standalone 为 2,589,890/2,589,968 bytes,Edge/Standalone AI 为 3,061,009/3,061,099 bytes。PostgreSQL 18.6 arm64 HA 130/130、timeline `1→2`,报告 SHA-256 为 `8401634f30635b45bfb583b02e94ac41f023bf8a0bdbcfd9744ebf459ab0d8f8`,独立证据审计与 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/Attempt;response-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、无单文件/浅平 package;14 档 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 authority:canonical v1 manifest 只含最多 16 个 canonical 32-byte key,不含 generation、active/state/retirement,provider 只有 `resolve(keyId)` 而没有 `active()`;因此 PostgreSQL `trusted-tool-results` catalog 仍是 active/decryptable 状态唯一 authority,completion 会以 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/7,Cluster Control 完整 234 pass/2 条条件 skip/0 fail;最终 18-package clean build/test 与 backend 1,207 pass/2 条件 skip/0 fail,package/dependency/Edge import/Cluster deployment 四项审计零 finding。workspace 仍为 18 package、无单文件或浅平 package;Cluster Control 54 个源码中仅 2 个 binary entry 位于根层,52 个处于嵌套领域目录。14 档 Local Profile artifact 全部通过,默认 Edge/Standalone 保持 2,589,812/2,589,890 bytes,AI 保持 3,121,108/3,121,198 bytes,MCP 保持 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 drift;envelope 不带 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,四项结构/部署审计零 finding,14 档 Local Profile artifact 全部通过。默认 Edge/Standalone 保持 2,589,812/2,589,890 bytes、315 files、56 modules,Edge/Standalone AI 保持 3,121,108/3,121,198 bytes、368 files、61 modules,MCP 保持 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 零残留。
|
||||
|
||||
@@ -0,0 +1,96 @@
|
||||
# ADR-0409:Cluster Copilot Failure Diagnosis Model Execution
|
||||
|
||||
- 状态:Accepted
|
||||
- 日期:2026-08-15
|
||||
- 关联 RFC:QL-RFC-0001 D-317、Phase 2
|
||||
- 关联 ADR:ADR-0262、ADR-0405、ADR-0407、ADR-0408
|
||||
|
||||
## 问题
|
||||
|
||||
ADR-0408 只把成功的日志 Tool completion 原子解锁为 `ready` Model Step。若调用方直接把
|
||||
Tool 返回值留在进程内再调用 Provider,进程重启后无法恢复 prompt;若 Model completion 先于
|
||||
密文输出写入,COMMIT response loss 会留下“Step 已成功但结果不存在”的分裂状态;若把 Copilot
|
||||
Artifact 继续塞进通用 Model coordinator,则每增加一个 AI 领域都会让核心层反向依赖一个新领域。
|
||||
|
||||
同时,diagnosis Run 不能在 Model Step 已终态后永久停留在 `running`。成功、Provider 失败和
|
||||
deadline 必须由耐久 ModelInvocation completion 驱动 Run 终态,而不能由一次内存返回值决定。
|
||||
|
||||
## 决策
|
||||
|
||||
1. Model executor 只接受 ADR-0407/0408 的 exact admission、unlock receipt 和加密 Tool success。
|
||||
它通过 Runtime Core 的只读 `openTrustedToolSuccessCompletion` 重开 ciphertext,复验 barrier、
|
||||
result catalog/rekey、key material proof、Tool definition 与 completion digest;绝不重新执行 Tool。
|
||||
2. 只有 `available`、`cluster-control` 且 Run/Attempt identity 与 source fence 完全一致的内建日志
|
||||
projection 才能进入 ADR-0405 builder。其余 Tool 输出不会被转成任意 Prompt,也不会调用 Provider。
|
||||
3. executor 使用既有 `BoundedModelGateway`,因此 Provider/model allowlist、egress budget、并发、
|
||||
deadline、quota、price quote、usage settlement 和 content-free audit 继续由一个通用边界裁决。
|
||||
Gateway 必须显式安装当前 Copilot successful-completion sink,否则执行失败关闭。
|
||||
4. Copilot 输出使用独立 `qinglong/copilot-failure-diagnosis-output-artifact@v1`,AES-256-GCM 密封
|
||||
完整 `GenerateResult`。AAD 与 digest 绑定 request/plan/Tool completion/Project/Run/Step/
|
||||
invocation/provider/model/egress evidence/key;公开 reference 不含 nonce、ciphertext、auth tag 或明文。
|
||||
5. 通用 `DurableModelInvocationCoordinator` 不再导入 Plugin Package Prompt Artifact。新增领域无关的
|
||||
`ModelInvocationAtomicSuccess<TReference>` 端口,由领域负责 exact replay、冲突类型和方言事务;
|
||||
原有 Plugin Prompt 通过 adapter 保持行为兼容,Copilot 使用独立 adapter。PostgreSQL 的通用
|
||||
atomic-output helper 在同一 SERIALIZABLE 事务提交 StepRun/Event、Model completion、usage、
|
||||
pricing/quota settlement 和领域 ciphertext,任何一步失败均整体回滚。
|
||||
6. `pg-9020-ai-copilot-failure-diagnosis-model-executions` 新增两个 append-only ledger:
|
||||
`copilot_failure_diagnosis_model_outputs` 保存密文 Artifact;
|
||||
`copilot_failure_diagnosis_finalizations` 保存 content-free Run terminal receipt。`ql3_runtime` 只有
|
||||
`SELECT, INSERT`,其他运行/管理角色不得读写,PUBLIC 无权限。
|
||||
7. Model completion 提交后,独立可重放的 finalization 事务锁定 diagnosis Run 与 Model Step,复验
|
||||
plan、completion、成功 Artifact 和当前计数链,再把 Run 推进为 `succeeded|failed|timed_out`、
|
||||
写一个 `copilot.diagnosis.<outcome>` Event 和 receipt。两个事务之间崩溃时,恢复只执行
|
||||
finalization,不再调用 Provider;Run 的成功 `outputRef` 只指向密文 Artifact。
|
||||
8. 已存在 completion 或 finalization 的 replay 永不调用 Provider;只有 start、没有 completion 的
|
||||
invocation 视为结果未知,禁止自动重试。`outcome_unknown` 仍必须先走既有显式 resolution,当前
|
||||
finalizer 不把未知结果伪装成失败。Tool failure、Tool 输出退役/缺失、Model admission 前 deadline
|
||||
和用户取消的无 Model-completion 终态化,留给下一状态机 Gate。
|
||||
9. 本能力继续内聚于 `@qinglong/ai` 的嵌套领域目录,不新增 workspace package、Node 进程、Pod、
|
||||
连接池、队列、timer、watcher 或 cache。Edge/Standalone 默认制品不导入 PostgreSQL executor;
|
||||
Cluster 的 Copilot output key material 必须由显式 `active()/resolve()` provider 注入,不能复用
|
||||
Provider credential、Tool invocation/result 或 Plugin Prompt output 的密钥用途。
|
||||
|
||||
## 被否决方案
|
||||
|
||||
1. **Model 成功后再单独写 Artifact**:留下成功 Step 与缺失输出的不可恢复窗口。
|
||||
2. **把 Tool 明文保存在 executor registry**:崩溃后无法恢复,也扩大路由设备常驻内存与泄漏面。
|
||||
3. **把第二个领域 Artifact 导入通用 coordinator**:继续形成 Model core → product domain 的反向依赖。
|
||||
4. **自动重试只有 start 的 Model invocation**:外部 Provider 可能已完成,重试会产生重复费用和结论。
|
||||
5. **将 `outcome_unknown` 直接标为 failed**:丢失真实不确定性,破坏人工 resolution 语义。
|
||||
6. **为 Copilot Model execution 新建 package**:没有新的独立部署边界,只会再次制造单文件薄包。
|
||||
|
||||
## 验证标准
|
||||
|
||||
1. 单元/契约测试覆盖密文 round-trip、metadata/ciphertext/key tamper、content-free reference、
|
||||
finalization receipt、显式 subpath、一次 Provider 调用、completion/finalization replay 零 Provider 调用。
|
||||
2. 既有 Plugin Prompt exact replay、Artifact 与 settlement crash window 全部通过,证明通用原子端口
|
||||
重构没有改变旧领域语义。
|
||||
3. PostgreSQL 18.4 physical HA 必须应用 20 条 AI migration,证明两张新表 append-only 角色隔离、
|
||||
timeline `1→2` 提升后 history/schema/ACL 一致,并由独立证据审计复核。
|
||||
4. 18-package clean build/test、backend、四项架构审计、14 档 Artifact 和 GitNexus staged/change
|
||||
detection 全部通过后才允许阶段性提交;不得把 focused test 当完整性证明。
|
||||
|
||||
## 当前验证
|
||||
|
||||
1. `@qinglong/ai` 全量测试 233 pass、3 条 PostgreSQL 条件测试 skip、0 fail;新增覆盖密文
|
||||
round-trip、tamper、content-free reference、一次 Provider 调用及 completion/finalization replay。
|
||||
2. 18 个 QL3 package 从清空 `dist` 开始全部构建并通过各自全量测试;backend 1,207 pass、
|
||||
2 条条件测试 skip、0 fail。
|
||||
3. package boundary、cluster dependency、Edge import、Cluster deployment 四项审计均为
|
||||
`compatible: true` 且零 finding。workspace 仍为 18 个 package,`singleSourcePackages=[]`、
|
||||
`shallowSourcePackages=[]`;AI 的 183 个源码中 182 个位于嵌套领域目录。
|
||||
4. 14 档 Local Profile Artifact 全部通过;默认 Edge/Standalone 分别为
|
||||
2,589,890/2,589,968 bytes,Edge/Standalone AI 为 3,061,009/3,061,099 bytes,均在预算内。
|
||||
5. PostgreSQL 18.6 arm64 physical HA 130/130、timeline `1→2`,20 条 AI migration、schema、
|
||||
append-only ACL 与提升后一致性全部通过;报告 SHA-256 为
|
||||
`8401634f30635b45bfb583b02e94ac41f023bf8a0bdbcfd9744ebf459ab0d8f8`,独立证据审计零 finding,
|
||||
Docker 容器、网络和卷零残留。
|
||||
|
||||
## 后续门禁
|
||||
|
||||
1. 为 Copilot output 建立 Cluster 专用 projected keyring manifest、active rotation、retirement、
|
||||
external custody 与 lost-key recovery;在产品 composition 完成前 Model executor 保持不可达。
|
||||
2. 终态化 Tool failure、日志 missing/retired、Model admission 前 deadline、用户 cancellation 与
|
||||
`outcome_unknown` resolution,并加入跨主库提升的 crash-window execution matrix。
|
||||
3. 最后开放默认关闭的 Cluster API/CLI/UI/MCP 入口,补真实外部 Provider、KMS/Secret projection、
|
||||
plaintext negative evidence、多副本并发和费用/取消可观测性。
|
||||
@@ -412,6 +412,7 @@
|
||||
| [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 |
|
||||
| [ADR-0409](./ADR-0409-cluster-copilot-failure-diagnosis-model-execution.md) | Cluster Copilot Failure Diagnosis Model Execution、密文输出与 Run 终态化 | Accepted |
|
||||
|
||||
## 规则
|
||||
|
||||
|
||||
Reference in New Issue
Block a user