Files
heicode-win/docs/integration/agnet-platform-api-design.md
T
Ubuntu b0acfd44c1 feat(agnet): SK repo_ref validation, create deployment UI, docs touch-ups
Extend agnet SK sources with repo_ref and snapshot display; add authenticated
deployment sheet + API types; cockpit toolbar entry; locale strings; minor docs.

Made-with: Cursor
2026-05-01 09:12:00 +00:00

490 lines
25 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.
# Agnet 平台 ↔ Heicode 集成接口设计(草案)
本文描述 **Agnet 平台**应向 **Heicode(Manager / 客户端 / 自动化服务)** 暴露的 **控制面、数据面隔离、权限模型与可视化/事件接口**。
路径、字段名为 **设计意图**;落地时可等价映射为 gRPC 或 GraphQL,但**语义与隔离边界**应保持一致。
**关联里程碑**:`[../milestones/](../milestones/README.md)` 中 M3~M5。
---
## 1. 设计目标
| 目标 | 说明 |
| ---------- | ----------------------------------------- |
| **权界清晰** | 调用方身份可解析为「谁、属于哪一租户、具备何种角色」 |
| **租户默认隔离** | 无显式授权则不可读他租户资源 |
| **有状态可观测** | 执行单元生命周期与运行态可通过 API + 事件流呈现 |
| **可演进** | 资源带 `api_version` / schema 版本;破坏性变更走新版本路径 |
### 1.1 Agnet 可视化:Heicode Manager 与 Heicode 客户端的职责划分
**使用方**:团队与个人都会使用 Heicode;下列划分依据的是 **信息类型与界面载体**,不是「只有某类用户才用某一端」。
| 载体 | 主要职责 | 典型内容 |
| ------------------- | ----------------------------------------------------------------------------------- | --------------------------------- |
| **Heicode Manager** | 呈现 **Agnet 平台回传的运行态与性能类字段**:编队/实例是否在跑、阶段(phase)、健康度、资源占用、队列与心跳、项目级聚合指标与近期错误摘要等。 | 控制台、Dashboard、与平台 SLA/运维相关的观测面。 |
| **Heicode(客户端)** | 在 **编码与工作会话过程中**,**实时或准实时展示 Agnet 平台内子 agent 产出的内容**(流式文本/结构化片段/工具结果等),与编辑、会话上下文同屏。 | 会话内输出面板、流式增量、与当前任务绑定的子 agent 交付物。 |
**边界**:Manager 侧重 **平台契约下的状态与指标**;Heicode 侧重 **工作流中的执行输出**。二者可调用同源底层 API,但 **不得**把「平台大盘」与「子代理会话输出」混为同一套 UI 假设——后者通常带更强会话/项目上下文与更细粒度流式协议。
---
## 2. 身份与调用方式
### 2.1 服务间(推荐生产)
- **Heicode Manager** 使用 **服务账号** 调用 Agnet:`Authorization: Bearer <m2m_jwt>`。
- JWT 声明至少包含:`sub`(服务主体)、`tenant_id`(若适用)、`scope`(见 §3)、`exp`。
- Agnet **校验Issuer**(Manager 签发的委托令牌 **或** Agnet 签发的服务令牌,二选一应文档化)。
### 2.2 用户委派(可选)
- 终端用户经 Heicode OAuth 后,Manager 代发 **用户委派令牌** 访问 Agnet 只读/受限写接口;Claims 含 `user_id`、`org_id`、`roles`。
### 2.3 必需传递的上下文头(建议)
| Header | 必填 | 说明 |
| -------------------------- | ----------- | --------------------------------- |
| `Authorization` | 是 | Bearer Token |
| `X-Request-Id` | 强建议 | 全链路追踪 |
| `X-Tenant-Id` | 多租户时必填 | 顶层隔离键;与 Token 声明互相校验,不一致则 **401** |
| `X-Org-Id` | 视模型 | 组织内子划分 |
| `X-Project-Id` | 编排相关 API 建议 | 资源挂载点 |
| `X-Environment` | 可选 | `dev` / `staging` / `prod` |
| `X-Heicode-Correlation-Id` | 强建议 | 与 Manager 审计日志关联 |
---
## 3. 权限模型(RBAC 概要)
### 3.1 角色(示例命名,可映射贵司 IAM)
| 角色 | 典型 scope | 说明 |
| ------------------------- | -------------- | ---- |
| `agnet:platform_admin` | 全租户元数据、调试接口 | 极少人数 |
| `agnet:org_admin` | 本租户内项目、编队、凭据绑定 | |
| `agnet:project_editor` | 指定项目下部署/停止/读状态 | |
| `agnet:operator_readonly` | 读状态、读事件、读审计 | |
| `agnet:auditor` | 仅审计与导出 | |
### 3.2 权限分离原则
- **控制面**(部署/改策略)与 **观测面**(读指标)可分角色授予。
- **凭据类写操作**(绑定 Git Token、云 SA)单独 scope:`agnet:credential:write`。
- **SK 正文写入**:仅允许经 **Heicode 客户端**身份或专用 `**heicode:sk:write`**(示例名)路径;**Agnet / Manager 控制台接口不得授予 SK 正文写权限**(与 §5.0「SK 仅在 Heicode 编辑」一致)。
- **拒绝隐式升级**:只读 Token **不得**通过查询参数绕过 body 校验升格为写操作。
---
## 4. 多租户与数据隔离
### 4.1 隔离键层级
```
Tenant(租户)
└── Organization(可选)
└── Project(项目)
└── Deployment(一次编队部署)
└── AgentInstance(执行单元实例)
```
- 所有持久化资源 **必须**带 `tenant_id`;API 默认按 Token + Header 解析租户并 **强制过滤**。
- **跨租户引用**:禁止在 URL 中使用「全局唯一但不带租户前缀」的裸 ID;推荐 `tenant_scoped_id` 或 `(tenant_id, local_id)` 复合。
### 4.2 数据面实现选项(择一或组合)
| 方案 | 适用 | Agnet 侧责任 |
| --------------- | ------- | ------------------------------ |
| **逻辑隔离** | 快速迭代 | 每张业务表 `tenant_id` + RLS 或统一拦截器 |
| **Schema 分库** | 强合规 | 每租户独立 schema / database |
| **命名空间隔离(K8s)** | 执行单元运行时 | 编排器按租户分配 NS 与网络策略 |
### 4.3 负例测试(验收必备)
- 使用 Tenant A 的凭证访问 Tenant B 的 `deployment_id` → **403** 或 **404(对外不区分)**。
- 列表接口默认 **不得**返回其他租户资源,即使 ID 被猜到。
---
## 5. 编排与控制面 API(M3)
> 下列 REST 仅为示意;实际路径前缀可为 `/api/v1` 或 `/agnet/v1`。
### 5.0 Heicode Manager:一键部署 Agnet 团队与 SK 边界(产品契约)
下列条款为 **Heicode 与 Agnet 联合落地时必须写清** 的契约;API 形状可与 `**POST /deployments`** 合一或拆为 `**POST /teams/deployments`** 等聚合端点,但 **语义不得缩水**。
**启动参数与权限归属(与 Manager 的边界)**
- **Agnet 在拉起编队 / 子 agent 运行时**(进程或等价隔离单元)须获得完整部署参数:`sk_sources`、`runtime_execution`、`sk_access_policy`、成员与模型声明等;**不得在缺少参数时静默放宽为越权默认**。
- **权限与策略的可执行副本落在 Agnet**:Git 连接、`cloud_principal_refs`、SK 允许/拒绝边界由 Agnet 控制面 **落账并在运行时强制执行**;Heicode Manager **只负责发起部署请求并展示 Agnet 回传的快照锚点与观测字段**,**不是**运行时的权限裁决引擎。
| 契约项 | 要求 |
| -------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **一键部署** | 在 **Heicode Manager** 控制台提供 **单次操作**(按钮或向导终点)完成:在 Agnet 上 **部署一支 Agnet 团队/编队**,并得到可追踪的 `deployment_id`、团队视图入口与后续观测衔接(见 §1.1、§6)。不得依赖用户在 Agnet 原生控制台重复手工编排才能跑通 Heicode 叙事。 |
| **团队成员** | 部署配置须 **显式包含团队成员**(至少:`user_id`、组织内角色、是否纳入该 Agnet 团队)。成员关系由 Manager/Agnet 持久化,供 **RBAC、配额与审计**;团队管理员经 **Manager 控制面**维护名单(增删改须审计)。 |
| **成员所用模型** | 须能声明 **各成员默认使用的模型/路由**(如 `default_model_id`、`provider_profile_id` 或与 Manager **模型策略**对齐的引用)。支持「团队缺省 + 成员覆盖」;未授权模型 **不得**在执行路径上静默生效。 |
| **子 agent(Agnet 平台内)与 SK** | 本文所称 **子 Agnet / 子 agent** 均指 **Agnet 平台内部的子智能体/子执行单元**(由 Agnet 编排与实例化),非 Heicode 自研运行时。部署配置须支持为 **指定子 agent** 绑定 **SK 输入源**;运行态下该子 agent **只读**白名单内的 SK 内容。 |
| **云上 / 运行时权限(须随部署传参)** | 用户在 **Heicode Manager** 中为子 agent 配置的 **执行环境绑定**(例如专用虚拟机池、云 identity / 服务账号引用、网络或资源配额策略 ID)**必须**出现在 **部署请求体**(或等价的平台编排参数)中,由 **Agnet 调度与强制执行**;不得假设「仅在控制台勾选、不传平台即可生效」。缺省值与继承规则(编队级 → 子 agent 覆盖)须在联合 RFC 中写死。 |
| **SK 访问策略(允许 / 禁止,须随部署传参)** | 除 **`sk_sources` 解析出的快照正文**外,须支持显式声明 **SK 工具/技能命名空间或路径的允许集与拒绝集**(或引用租户级策略模板 ID)。部署完成后,平台将 **物化**各子 agent 的 **有效 SK 策略**:快照内容 ∩ 允许规则 − 拒绝规则;子 agent 运行时 **不得**调用策略外的 SK 工具入口(与 §12 校验一致)。 |
| **SK 与 Git / 上传 MD** | **SK 正文资产以 Git 仓库为统一事实源**(用户指定的远端/连接与分支、路径规则由集成约定)。同时允许用户 **上传 Markdown 等文件** 作为 **补充 SK 源**(租户内对象存储/制品 ID)。Agnet 执行前将两类来源 **解析为不可变快照**(commit SHA / upload version),再注入子 agent 上下文。 |
| **SK 文件仅在 Heicode 中编辑** | Git 侧 SK 的 **创建、修改、删除** 经 **Heicode 客户端**提交到仓库(或 Heicode 发起变更后再同步);**上传类 SK** 的 **新增/替换** 仅通过 **Heicode 提供的入口**(Manager 可做登记与透传,**不提供 SK 正文在线编辑器**)。**Agnet 平台与子 agent 对 SK 均只读**;若 Agnet 控制台出现可直接改 SK 正文的 API/UI,视为 **违背产品边界**。 |
**部署请求体扩展(示意,可与 §5.1 合并)**
```json
{
"project_id": "prj_xxx",
"template": "agnet_team_default",
"correlation_id": "mgr_cor_abc",
"members": [
{
"user_id": "usr_alice",
"role_in_team": "lead",
"default_model_id": "mdl_claude_sonnet",
"provider_profile_id": "pp_org_default"
},
{
"user_id": "usr_bob",
"role_in_team": "member",
"default_model_id": "mdl_claude_haiku"
}
],
"sub_agents": [
{
"role_template": "sub_reviewer",
"sk_file_refs": ["sk_review_policy.md", "sk_api_bar.yaml"],
"runtime_execution": {
"profile_id": "exec_profile_vm_dedicated",
"cloud_principal_refs": ["cp_az_mi_ci_readonly"],
"network_policy_ref": "net_tenant_isolated"
},
"sk_access_policy": {
"policy_ref": "tenant_sk_policy_default",
"deny_skill_ids": ["sk_admin_dest_env"],
"inherit_deployment_defaults": true
}
}
],
"parameters": { "unit_overrides": {} }
}
```
- `**runtime_execution`(推荐)**:承载 **子 agent 云上执行绑定**(VM/池、云 SA/MI、网络策略等);字段名可映射为 Agnet 内部模型,但 **语义不得省略**——Manager 收集的配置必须可达 Agnet。
- `**sk_access_policy`(推荐)**:与 **`sk_sources` 快照**配合,声明 **允许/拒绝** 的技能 ID、路径前缀或租户策略引用;平台在部署落账时计算 **effective policy** 并下发给运行时。
- `**sk_sources`(推荐显式建模)**:替代或细化纯路径数组 `sk_file_refs`; 每个元素标明来源类型,便于 Agnet 实现拉取与快照。
**部署请求体中 SK 绑定扩展示意**
```json
"sub_agents": [
{
"role_template": "sub_reviewer",
"sk_sources": [
{
"type": "git",
"repo_ref": { "connection_id": "gitconn_1", "repo_url": "https://example.com/org/sk-repo.git", "ref": "main", "paths": ["policy/review.md"] }
},
{
"type": "upload",
"artifact_id": "sk_upl_9f3a",
"mime": "text/markdown"
}
]
}
]
```
#### 5.0.1 对 Agnet 平台的接口与语义要求(含 SK)
下列为 **Agnet 应向 Heicode/Manager 提供或可观测** 的最小要求;路径可为等价 gRPC。
| 类别 | 要求 |
| ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| **部署与编队** | 实现 `**POST /deployments`**(或 `**POST /teams/deployments`**)可接收 **成员、成员模型、子 agent 模板、`sk_sources`、`runtime_execution`、`sk_access_policy`**(字段名可等价映射);返回 `**deployment_id**`、实例/子 agent 标识,供 Callback 与观测关联。 |
| **SK 快照只读** | 对每个 `deployment_id` / `sub_agent_id`,Agnet 须能记录 **已解析的 SK 快照**(Git:`commit_sha` + 路径哈希;Upload:`artifact_id` + 版本)。运行注入 **仅此快照**,不得在执行中「瞒报版本」拉未授权路径。 |
| **运行时绑定落账** | 部署请求中的 **`runtime_execution`(或等价字段)** 必须持久化,并在 **实例化子 agent** 时绑定到实际执行环境(VM、identity、网络隔离等);观测 API 能回答「该实例使用了哪套运行时绑定」。 |
| **SK 策略物化** | 部署接受后,Agnet 必须能输出 **每个子 agent 的生效 SK 策略**(快照哈希 + `sk_access_policy` 解析结果),供 Manager **Git 来源 / 审计**页展示「允许 / 禁止 SK」结论与追溯。 |
| **Git 拉取** | Agnet 须支持 **按租户注册 Git 凭据/连接**(`connection_id` 或等价),由用户在 **Heicode/Manager 流程**中授权;**Agnet 不提供 Git 写接口用于改 SK**——写操作发生在 Git 远端或经 Heicode 提交后,Agnet 仅 **fetch + checkout 指定 ref**。 |
| **上传制品** | 若支持 `type: "upload"`:Agnet(或与 Manager 分工)须提供 `**artifact_id`** 的只读获取(如 `GET /sk-artifacts/{artifact_id}/content` 或预签名 URL),**无 `PUT` 修改正文**于 Agnet 控制台;上传入口 **仅** Heicode 侧发起、Agnet 存只读副本。 |
| **刷新策略** | 约定 **何时重新解析 SK**(如新 commit、用户触发刷新、部署新版本);须可通过 API 或事件暴露 `**sk_snapshot_refreshed`**,便于 Heicode 提示「已用新版本 SK」。 |
| **禁止项** | **不得**提供面向 SK 正文的 **通用写 API**(与 §3.2 一致);子 agent **只读**绑定列表内的快照。 |
- `**sk_file_refs`**(若保留简化字段):视为 **相对某默认 Git 根**或 **由 Manager 展开为 `sk_sources`** 前的简写;联合 RFC 须声明展开规则。
- **验收**:部署完成后,Manager 可展示「团队成员—模型—**Agnet 子 agent**—SK 源(Git ref / 上传件)—快照版本—**运行时绑定**—**生效 SK 策略**」;Git 更新或 Heicode 重新上传后,按刷新策略在后续运行使用新快照。
### 5.1 部署编队
`POST /deployments`
**请求体(示意)**
```json
{
"project_id": "prj_xxx",
"template": "agile_min",
"correlation_id": "mgr_cor_abc",
"members": [],
"sub_agents": [],
"parameters": {
"unit_overrides": {}
}
}
```
**响应**
```json
{
"deployment_id": "dep_yyy",
"status": "accepted",
"agent_instances": [
{ "instance_id": "agi_1", "role": "AG-PO", "phase": "pending" }
]
}
```
### 5.2 查询部署
- `GET /deployments/{deployment_id}` —— 含租户校验。
- `POST /deployments/{deployment_id}:stop` —— 优雅停止。
### 5.3 Webhook / 回调(Agnet → Heicode)
- Manager 注册 URL:`POST /integration/heicode/callback-config`(或由 Agnet 控制台配置)。
- 负载含:`deployment_id`、`instance_id`、`event_type`、`payload`、`occurred_at`、`signature`。
**签名**:HMAC-SHA256(共享密钥或 JWKS);拒绝无签名请求。
---
## 6. 运行态与可视化 API(M5)
**与产品分工的对应关系**:本章 **§6.1~§6.3** 主要支撑 **Heicode Manager** 上的平台运行态与聚合视图;**§6.4** 支撑 **Heicode 客户端**在编码过程中展示 **子 Agnet 输出**。总则见 **§1.1**。
### 6.1 实例快照
`GET /agent-instances/{instance_id}`
**响应字段(示意)**
```json
{
"instance_id": "agi_1",
"deployment_id": "dep_yyy",
"tenant_id": "ten_1",
"role": "AG-PO",
"phase": "running",
"health": "ok",
"last_heartbeat_at": "2026-04-30T12:00:00Z",
"queue_depth": 2,
"current_task": { "id": "task_7", "summary": "Review API draft" },
"resource": { "cpu_pct": 12, "mem_mb": 512 },
"errors_recent": [{ "at": "...", "code": "UPSTREAM_TIMEOUT", "message": "..." }]
}
```
### 6.2 项目级聚合
`GET /projects/{project_id}/dashboard-snapshot`
返回:活跃实例数、按 phase 分布、近 1h 失败率、平均任务耗时等 **JSON 聚合**(供 Heicode 控制台图表)。
### 6.3 指标导出(可选)
- `GET /metrics` —— Prometheus 文本;或
- `GET /projects/{project_id}/metrics.json` —— 简化 JSON。
### 6.4 子 Agnet 输出流(Heicode 编码侧)
面向 **Heicode 客户端**在会话内展示 **Agnet 平台子 agent** 的产出(与 §6.1 的「实例心跳/资源占用」互补:此处强调 **内容增量**,而非仅状态字段)。
**设计意图**(路径可等价映射):
- `GET /sessions/{session_id}/sub-agents/{sub_agent_id}/stream` —— **SSE**,或
- `WS /sessions/{session_id}/stream` —— 多路复用主题:`sub_agent.output`、`sub_agent.tool_result` 等。
**data 示例(输出增量)**
```json
{
"schema_version": 1,
"type": "output_delta",
"sub_agent_id": "sub_agi_1",
"parent_turn_id": "turn_42",
"content": { "mime": "text/markdown", "delta": "..." },
"finished": false
}
```
- 鉴权与租户隔离与 §2~§4 一致;**仅**授权用户可读本会话下的子代理流。
- 若实际实现将子代理输出 **嵌套在既有对话/Messages 协议**中,须在联合 RFC 中声明字段映射,语义与本节一致即可。
---
## 7. 事件流(SSE / WebSocket)
**两类订阅(勿混淆)**:
1. **平台/实例生命周期与运行态**(与 §6.1、§6.2 对照):阶段变更、健康、任务摘要等 —— 主要支撑 **Heicode Manager** 与状态面板。
2. **会话内子代理输出与工具结果**(与 §6.4 对照)—— 主要支撑 **Heicode 客户端**编码界面;实现上可与下述端点合并为多路事件,但 **事件 `type` 必须可区分**。
### 7.1 SSE(推荐易调试)
`GET /agent-instances/{instance_id}/events`
- Headers:`Accept: text/event-stream`
- 事件:`id`、`event`、`data`(JSON)
**data 示例**
```json
{
"schema_version": 1,
"type": "phase_changed",
"from": "pending",
"to": "running",
"at": "2026-04-30T12:00:01Z"
}
```
### 7.2 WebSocket(高吞吐)
`WS /projects/{project_id}/stream`
- 首帧 **鉴权**(query token 或子协议);订阅主题:`deployment.`*、`instance.`*。
### 7.3 重连与顺序
- 支持 `Last-Event-ID`;服务端保留短期 **环形缓冲**(如 15 分钟)以便断线续传。
---
## 8. 审计与合规(跨 M4/M5)
- `GET /audit-logs?tenant_id=&from=&to=` —— 仅 `auditor` / `org_admin`。
- 每条:`actor`、`action`、`resource`、`tenant_id`、`request_id`、`correlation_id`、`result`。
---
## 9. 错误模型
| HTTP | 含义 | 客户端行为 |
| ---- | ------------ | --------- |
| 400 | 参数错误 | 展示校验细节 |
| 401 | 未认证 | 刷新令牌 |
| 403 | 权限不足 | 引导申请角色 |
| 404 | 不存在或无权(对外统一) | 不泄漏存在性 |
| 409 | 状态冲突(重复部署) | 幂等重试策略 |
| 429 | 限流 | 退避 |
| 503 | 编排背压 | 重试 + 降级文案 |
**响应体**统一 envelope:
```json
{ "error": { "code": "FORBIDDEN_CROSS_TENANT", "message": "...", "request_id": "..." } }
```
---
## 10. 版本与演进
- URL 前缀:`/api/v1`;破坏性变更引入 `/api/v2`。
- 事件 `schema_version` 递增;客户端忽略未知字段。
---
## 11. OpenAPI / 交付物建议
- Agnet 侧维护 **OpenAPI 3.1** 与 **异步 API(SSE/WS)说明**;
- 提供 **Postman Collection** + **租户穿越测试集合**。
---
## 12. 编排决策权模型(新增约束)
为避免“模型直接执行导致越权/失控”,本项目明确采用:
- **模型提案**:模型基于 SK 产出 `orchestration_plan`
- **平台裁决**:Agnet 对提案执行权限、租户、预算、模型授权校验后决定执行
- **Manager 入口**:Heicode Manager 仅作为调用入口与状态展示,不绕过裁决链路
详见:`[./orchestration-plan-contract.md](./orchestration-plan-contract.md)`。
最低校验项(平台必须执行):
1. `tenant_id` / `project_id` 与令牌一致
2. 成员与角色具备部署权限
3. `default_model_id` 在组织策略允许范围
4. `sk_sources` 可解析且无越权路径
5. 预算上限(tokens / cost / duration)未超策略阈值
6. 若请求包含 **`runtime_execution`**:`profile_id` / `cloud_principal_refs` 等引用 **属于本租户且已授权**,否则 **拒绝部署**(错误码建议 `RUNTIME_BINDING_INVALID`)。
7. 若请求包含 **`sk_access_policy`**:须与租户默认策略合并并 **物化为可执行的生效边界**;非法组合(例如引用禁止的技能 ID、与快照路径冲突)返回 **403** / `SK_POLICY_REJECTED`。
---
## 13. 事件字典(建议最小集)
建议固定以下事件名,避免前后端各自命名造成协议漂移:
| event | 用途 |
| ------------------------- | -------------- |
| `deployment.accepted` | 部署请求被接受,进入编排队列 |
| `deployment.rejected` | 部署被策略拒绝 |
| `instance.phase_changed` | 执行单元阶段变化 |
| `instance.health_changed` | 执行单元健康状态变化 |
| `sub_agent.output_delta` | 子 agent 流式输出增量 |
| `sk_snapshot_refreshed` | SK 快照刷新完成 |
每个事件最小字段建议:
- `event_id`
- `schema_version`
- `tenant_id`
- `project_id`
- `deployment_id`
- `correlation_id`
- `occurred_at`
---
## 14. 业务错误码字典(补充)
除 HTTP 状态码外,建议统一错误码最小集合:
| code | 说明 |
| ---------------------------- | ------------ |
| `POLICY_REJECTED` | 平台策略拒绝执行提案 |
| `MODEL_NOT_ALLOWED` | 模型未授权 |
| `SK_SOURCE_UNRESOLVABLE` | SK 源不可解析或不可读 |
| `RUNTIME_BINDING_INVALID` | 云上 / 运行时绑定引用无效或未授权 |
| `SK_POLICY_REJECTED` | SK 允许 / 拒绝策略与快照或租户策略冲突 |
| `BUDGET_EXCEEDED` | 超预算 |
| `FORBIDDEN_CROSS_TENANT` | 跨租户访问拒绝 |
| `DEPLOYMENT_CONFLICT` | 幂等或状态冲突 |
| `CALLBACK_SIGNATURE_INVALID` | 回调签名校验失败 |
验收用例集合见:`[./acceptance-matrix.md](./acceptance-matrix.md)`。
---
*本文档随里程碑评审更新;实现细节以 Agnet 与 Heicode 联合 RFC 为准。*