Files
qinglong/docs/adr/ADR-0275-authenticated-cluster-plugin-package-prompt-product-entry.md

100 lines
8.0 KiB
Markdown
Raw Permalink 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-0275:受认证的 Cluster Plugin Package Prompt 产品入口
- 状态:Accepted
- 日期:2026-08-04
- 关联:D-157、D-207、D-243、D-252、D-255、ADR-0260、ADR-0261、ADR-0271、ADR-0274
## 上下文
Cluster AI composition 已能显式挂载 Prompt execution route、PostgreSQL admission/finalization、
Model Gateway、projected Secret 和可选加密输出;但现有 v1 transport 仍要求 caller 提供
`publicationDigest`,并把 API admission 得到的 Subject/Policy fence 带入 AI repository。Prompt
admission snapshot 会复验 publication 与 RoleBinding fence,却没有在同一 SERIALIZABLE transaction
重新锁定 API credential、完整 `run.start + model.invoke + secret.use` 语义和 allowed SecurityAudit。
这意味着 route 已“认证”,但尚未成为完整产品 authoritycaller 仍选择 generationcredential 可在
HTTP authorization 与 Run commit 之间撤销,transport allowed audit 与产生外部模型费用的 admission
不是同一个提交事实。另建 Prompt service、listener 或 Pool 会增加集群运维面,也会诱导本机 Profile
复用错误依赖。
## 决策
1. 保留既有 AI-enabled `cluster-control` process、TLS listener、authentication shield、route registry 和
AI PostgreSQL Pool;不新增 package、service、port、Pool、table、timer、watcher 或 scheduler。
AI migration stream 只追加 `pg-9017`,建立 runtime-only 的窄 SECURITY DEFINER admission
authorization function,不授予 runtime 对 credential、Identity、Project、RoleBinding 或 audit 表的
直接读写权。默认 control image/entrypoint 继续不加载 AIEdge/Standalone closure 零变化。
2. Prompt execution transport 升级为 server-derived requestbody 只允许 request/trace、parameters、
provider/model、token/temperature/timeout 与显式 output intent;禁止 publication/generation/digest、
Subject、Policy fence、credential identity、planned/deadline、Run/StepRun/invocation identity。
3. 首次请求由 PostgreSQL current automation head 派生 exact publicationexact replay 必须先按 durable
request plan 找到 immutable historical publication,再验证 caller request digest。Package 后续
upgrade/withdraw/quarantine 不会让已完成请求再次调用 Provider,也不能把旧 plan 用于新 request。
4. Route 仍先经过共享 bearer authentication、overload shield 和 Project PolicyAI admission 事务再以
`authenticationId` 解析 exact API credential version,取得 credential/Identity advisory lock,验证
credential/Identity active 与数据库时钟有效期,再锁定 active Project/latest RoleBinding exact fence。
5. admission 事务必须用共享 Project Policy 角色语义确认 `run.start``model.invoke``secret.use` 均为
allowAgent 的 `require_approval` 不得在此被降级为 allow。新 admission 在同一 SERIALIZABLE
transaction 原子写 allowed `prompt.execute` SecurityAudit、Run、StepRun、Events 和 admission receipt
credential/RoleBinding/permission/audit 任一失败时零 Provider I/O 和零部分 Run。
6. exact replay 仍重新验证 current credential、Identity、Project/RoleBinding 与三权限,但不重复写
allowed audit、不重新执行 current Package start guard、不再次调用 Provider。replay 只返回既有
content-free receiptlive result 只返回第一次仍连接的 caller。
7. Provider authority 保持 projected read-only manifest + durable Provider binding + projected Secret
materialroute/body/env 不成为 credential authority。`durable_artifact` 只有在 ADR-0261 output
keyring/read/retention authority 已显式装配时可达,`live_only` 不把正文写入 PostgreSQL、audit 或日志。
8. 该切片复用 `@qinglong/ai``@qinglong/cluster-control` 既有 subpath。包边界继续按部署制品、
权限域、可选依赖和消费者裁决;workspace 保持 19 包,不能因本次多出 guard/adapter 文件拆新包。
## 被拒绝的方案
- **继续让 caller 提供 publication digest**:把 current generation 选择权留在 transport,并使 replay
与首次执行无法采用同一 durable-plan-first 规则。
- **只依赖 admission pipeline 的一次 `model.invoke`**:不能关闭 credential revoke TOCTOU,也没有
与 Run commit 原子的 allowed audit;三权限当前碰巧落在同一角色集合也不能替代显式契约。
- **先提交 Run,再异步补 audit 或 credential check**:会产生无当前授权或无审计的外部费用。
- **为 Prompt 建独立 API/AI service 或第二 Pool**:增加端口、证书、连接预算和故障域,没有新的
deployment authority 价值。
- **把 Cluster Prompt 入口复用 Local `ql3-prompt`**POSIX UID/command-file proof 不能替代多副本
bearer identity、PostgreSQL fencing 与 HA durability。
## 接受门
- v2 exact body 拒绝 caller-supplied publication/identity/fence/credential/clock/Run 字段;
- current publication server derivation、historical exact replay、request drift conflict 和 Provider
exactly-once
- credential/Identity/Project/RoleBinding revoke race 与三权限/Agent approval 在 admission transaction
内失败,零 Provider I/O、零 Run、零 allowed mutation audit
- allowed audit 与 admission 原子提交,COMMIT response loss 以同 request 收敛且不重复计费;
- projected Provider binding/Secret、live-only redaction、durable output explicit gate
- Cluster Control、AI、PostgreSQL 真库与完整 package/back/dependency 门;
- PostgreSQL 18.4 physical HA 证明 admission/audit 在 promotion 前同步复制、promotion 后 exact replay、
credential/RoleBinding fence 和 content-free facts 均保持;
- Edge/Standalone 十档 artifact closure 与 workspace 19 包不增长。
## 实施证据
- Cluster Prompt route 已升级为 v2 exact bodypublication digest、Principal、Policy fence、credential、
server clock 与 Run identity 均不能由 caller 提供。route 使用进程内 UUID v4 factory 生成 mutation
audit identity,并复用现有 authentication shield、route registry、AI composition 与 PostgreSQL Pool。
- `PostgresPluginPackagePromptExecutionService` 首次请求从 current automation publication head 派生
publicationexact replay 先读取 immutable admission plan,再解析历史 publication。admission
repository 的 guard 在同一 SERIALIZABLE transaction 中执行,首次写入 Run facts 前和 exact replay
返回前都重新验证 current authority。
- `pg-9017-ai-plugin-package-prompt-product-authorization` 建立仅授予 `ql3_runtime` EXECUTE 的
SECURITY DEFINER function;函数以数据库时钟和 advisory/row locks 验证 exact API credential
version、active Identity、Project 与 latest RoleBinding fence,拒绝 Agent approval 语义,并在首次
admission 同事务插入一条 content-free `prompt.execute` allowed audit。readiness 同时冻结 migration
history、runtime role、snapshot function 与 authorization function 的精确权限。
- 定向与完整门:AI 199 pass/3 条件 skip、Cluster Control 175 pass/2 条件 skip;完整 19-package 门
退出 0,后端 1,096 pass/2 条件 skip/0 fail。cluster dependency、Edge import、package boundary 与
local-image audit 全部 compatibleworkspace 保持 19。
- 十档 Edge/Standalone artifact closure 全部 compatible:最小 Edge 3,519,580 bytes/324 filesEdge
Application 4,600,461 bytes/418 files,最大 Standalone Application AI 5,930,722 bytes/475 files
非 AI closure 不加载 AI/Cluster Prompt 产品面。
- PostgreSQL 18.4 arm64 physical HA 报告最终 `gates.passed=true`。首次 Cluster Prompt 请求只有 1 条
allowed auditexact replay 未重复写;RoleBinding 撤销后的新 request 为 0 条 allowed audit且零
Provider 重打。audit/admission/finalization/content-free facts 在 promotion 前同步复制,timeline 1→2
后完全一致;旧主 fenced、rewind 后只读重入,两控制副本恢复。隔离 HA 资源零残留,既有 CNPG
evidence control-plane ID 未变、running、restart count 0。