双守门员
Policy 处理已知规则(毫秒级),HITL 处理边缘高风险(分钟级),二者互补不可替代
风险三档
Low 自动 / Medium 本人确认 / High 审批人或双人复核,按"是否不可逆 + 影响范围"自动分流
Break-Glass
紧急通过只缩短等待,不绕审计:身份、权限、Policy、Trace 全程不变
详细设计说明
把危险动作挡在执行前,把人工审批纳入状态机
这份文档把"治理"从一句口号还原成可执行的工程契约:风险如何分档,Policy 如何写规则,HITL 如何分级,AWAITING_HITL 如何持久化沙箱,Break-Glass 如何在不绕开审计的前提下加速,以及成本如何在 Run / User / Workspace / Skill 四维度收敛。
设计主张
治理不是 Harness 之外的"加层",而是 Harness 八步管道里的双守门员——⑤ Policy 校验和 ⑦ HITL 审批同处执行阶段,承担"准入 + 责任分担",让所有外部副作用都在被授权的前提下发生。
评审关注点
- 已知规则是否进 Policy、是否会偷懒丢给 HITL
- AWAITING_HITL 期间沙箱是否被回收
- Break-Glass 是否真的不绕过 Trace 与 Policy
- 成本超限的降级是否会引发"沉默失败"
1. 定位与概念
用一张总体架构图和两段时序图,把"治理与 HITL"放回 Harness 八步管道的实际位置:它是 ⑤ 和 ⑦ 两道守门员,不是平行于内核的另一套系统。
1.1 总体架构图
下图把治理与 HITL 的三层职责和双守门员位置叠加在一张图上:横向 3 个 tier 带(T1 蓝 / T2 紫 / T3 金),T1 区画"审批策略配置 + 审批 UI",T2 区画"Team 权限边界",T3 区把 Harness 八步管道画成一条横向流水线,⑤ Policy 校验和 ⑦ HITL 审批用金色虚线边突出,下方画出风险三档分流。
1.2 双场景时序图
下面两张时序图分别可视化双守门员的两条典型决议链。点击顶部 lifeline 头部色块可跳到下面对应章节的详细规则。
⑤ Policy 评估为 high → T3 暂停(AWAITING_HITL)→ 审批人审批 → 通过后 T3 恢复 → ⑥ Tool 执行 → ⑧ Trace。沙箱在等待期不释放。
⑤ Policy 命中"已知拒绝规则" → 直接 reject → 跳过 ⑥ ⑦ → ⑧ Trace(PolicyTrace + ErrorTrace)→ CLOSED_REJECTED。无需人工。
1.3 为什么要做双守门员(不做的痛点)
当前缺口:
| 缺口 | 具体表现 | 影响 |
|---|---|---|
| 没有 Policy,全靠 HITL | 把所有"该不该执行"的判断推给人审批 | 审批人被低风险动作淹没;真正的高风险被淹没在噪音里;P95 等待时间分钟级 |
| 没有 HITL,全靠 Policy | 试图把所有规则写死在代码里 | 新型攻击 / 边缘场景规则永远滞后;高风险动作没有责任人 |
| 风险分档拍脑袋 | 同一动作不同 Run 走不同路径 | 用户体验割裂;审计无法解释"为什么这次要审批那次不要" |
| AWAITING_HITL 沙箱被回收 | 等审批期间释放容器 | 批准回来要重跑前 6 步,浪费成本 + 可能产生不一致 |
| Break-Glass 等于绕审计 | 紧急情况直接跳过 Policy 与 Trace | 合规审查无证据;事后无法定责 |
| 成本只看总账 | 只统计租户月消耗 | 无法定位是哪个 Skill / User / Workspace 异常;超限只能粗暴关停 |
双守门员解决的具体技术问题:
- Policy 处理"已知规则"——结构 / 权限 / 成本 / 安全四类规则,毫秒级裁决,承载 95% 流量
- HITL 处理"边缘高风险"——剩余 5% 进人工审批队列,分钟到小时级,由审批人承担责任
- 风险三档自动分流——Skill 元数据 + 动作属性两路输入,确定性输出 Low / Med / High,决策树不靠人
- 沙箱与 AWAITING_HITL 绑定——审批期间 RunState 保留、上下文不丢、容器不回收,批准即续跑
- Break-Glass 只缩短等待——身份、权限、Policy、Trace 一项不少;唯一的不同是审批通道从异步改实时
- 成本四维聚合——Run / User / Workspace / Skill 都是 Policy 的拒绝依据,超限 → 自动降级或转 HITL L4
1.4 三层职责定位
| 层 | 承担 | 不承担 |
|---|---|---|
| T1 · Agent Platform | 风险矩阵注册;Policy 规则配置;审批人 / 审批流配置;审批 UI;Break-Glass UI;成本预算面板;审计 / Replay UI | 不直接拦截 Run;不在请求路径上做决议 |
| T2 · Coordinator | Team 级阈值注入(hitl_threshold / cost_budget);CallerIdentity 透传;审批回执路由;协作群成本聚合 | 不存储 Policy 规则;不实施拦截;不发起 HITL 请求 |
| T3 · Harness | 双守门员实施层——⑤ Policy 校验和 ⑦ HITL 审批两道门,AWAITING_HITL 状态机维护,Trace 强制写入 | 不存配置;不画 UI;规则不落 T3 的代码 |
2. 风险矩阵
把"什么动作算高风险"从主观判断变成可注册、可演进的工程清单:决策树两步走,三档穷举有兜底,新增动作有评估流程。
2.1 决策树:不可逆 × 影响范围
2.2 三档穷举表
Low · 自动通过
| # | 类别 | 具体动作 | 影响范围 |
|---|---|---|---|
| L1 | 只读查询 | 检索文档、查询数据库、查日历、查天气 | 无 |
| L2 | 内部生成 | 生成草稿、整理资料、写在个人沙箱 | 个人沙箱 |
| L3 | 临时计算 | 数据汇总、格式转换、本地脚本运行 | 个人沙箱 |
| L4 | 个人记忆写 | 更新个人偏好、记录个人笔记 | 个人范围 |
Medium · 本人确认
| # | 类别 | 具体动作 | 影响范围 |
|---|---|---|---|
| M1 | 代码变更 | 提交 PR、合并代码、修改 CI 配置 | 项目空间 |
| M2 | 文档修改 | 编辑共享文档、修改项目 Wiki | 项目空间 |
| M3 | 付费 API | 调用付费 API、调用第三方服务超阈值 | 项目空间 + 成本 |
| M4 | 任务分配 | 派单给他人、修改 OKR | 项目空间 |
| M5 | 对外消息 | 发邮件给客户(无金额)、发 IM 通知 | 外部可见 |
| M6 | 浏览器写操作 | 表单提交、登录态操作 | 项目空间 |
| M7 | 项目空间写 | 写入项目级资源、修改项目设置 | 项目空间 |
| M8 | workspace 不可逆操作 | 用户 workspace 内文件 / 目录删除、覆写已有文件、git reset --hard | 用户私有空间 |
M8 注解:技术隔离上沙箱挂载只能动 /data/users/<user_id>/workspace(详见 沙箱边界 §F ↗),不会越界。但用户私有空间内仍可能误删用户自己的代码 / 数据,所以走本人确认(L2)。HITL 文案必须带可判断信息:完整 path、子项数量、总大小、最近修改时间——避免审批疲劳让用户秒批。批量删除一次审批一次列表(含全部 path),不要拆成 N 次。
High · 审批人 / 双人
| # | 类别 | 具体动作 | 影响范围 | 审批级别 |
|---|---|---|---|---|
| H1 | 生产部署 | 部署 / 回滚 / 重启生产服务 | 生产环境 | L4 双人 |
| H2 | 数据破坏 | 删除记录、清空表、降级数据 | 生产环境 | L3 / L4 |
| H3 | 权限变更 | 添加管理员、修改 IAM、开通访问 | 租户全局 | L3 |
| H4 | 金额操作 | 付款、退款、合同签订 | 涉及金额 | L3 |
| H5 | 批量操作 | BatchPhase 执行(强制升级) | 项目 / 生产 | L3 |
| H6 | Shell 执行 | 沙箱外或高权限 Shell 命令 | 项目空间 + | L3 |
| H7 | 对外承诺 | 含金额客户邮件、对外公告、API 公开 | 外部可见 | L3 |
2.3 风险等级重写规则
管理员可对自动判定的风险等级进行升降级覆盖。重写记录写入治理审计表,不可物理删除。
| 规则 | 说明 |
|---|---|
| 降级需双人批准 | 任何 downgrade 操作需两名管理员独立批准 |
| 降级不可低于 Medium | High → Medium 允许;High → Low 一律禁止(安全底线) |
| 升级即时生效 | upgrade 操作无需等待,写入即生效 |
| 审计不可删除 | 重写记录仅追加,含 reason / approved_by / effective_until |
| 优先级 | user 级 > tenant 级 > global 级;同级别按生效时间倒序取最新 |
2.4 新增 Action 类型评估流程
评估检查清单:
- 确认动作的不可逆性(是否能 5 分钟内恢复原状)
- 确认影响范围(个人沙箱 / 项目空间 / 生产环境 / 外部可见)
- 确认是否涉及金额、权限变更、数据删除
- 确认是否对外发出消息(邮件 / IM / 公告 / API)
- 对应 Skill 等级是否匹配(L1 沙箱内 / L4 系统级)
- 在风险矩阵表中注册并分配编号
- 提交治理委员会评审通过
3. Policy 自动规则
定义守门员一号(⑤ Policy)的规则结构、四类规则的语义、决议输出契约。Policy 处理"已知规则",毫秒级返回。
3.1 评估输入与决议输出
Policy 引擎在 ⑤ Policy 校验步骤接收"Plan + CallerIdentity + 上下文",按规则路由分发到四类引擎,最后统一输出三选一决议。
| 项 | 载荷 | 来源 |
|---|---|---|
| Plan | 步骤序列 / DAG / tool_calls / budget_estimate | ④ Plan 规划输出 |
| CallerIdentity | user_id / role / tenant_id / team_id / workspace_id | T2 通过 caller_extra 注入 |
| Skill 元数据 | skill_id / level / hitl_risk_level / 沙箱要求 | ③ Skill 加载锁定 |
| 动作属性 | 是否不可逆 / 影响范围 / 是否对外 | Skill 声明 + Plan 推断 |
| 预算上下文 | Run 已用 / User 日 / Workspace 月 / Skill 单价 | 成本治理实时聚合 |
决议输出三选一:
| 决议 | 含义 | 下一步 |
|---|---|---|
| pass | 所有规则通过,可以直跑 | → ⑥ Tool 调用 |
| reject | 命中已知拒绝规则(成本超限 / 权限缺失 / 安全护栏) | → ⑧ Trace → CLOSED_REJECTED |
| await_hitl | 风险判定为 high,需要人工授权 | → AWAITING_HITL → ⑦ HITL |
3.2 四类规则
结构性规则 · 校验 Plan 自身的合法性,最先执行。
| 规则 | 检查点 | 命中行为 |
|---|---|---|
| DAG 合法性 | 步骤间依赖无环 / 无悬空引用 | reject · 原因:plan_dag_invalid |
| 步骤上限 | steps 数量 ≤ 当前 tier 上限 | reject · 原因:plan_too_long |
| BatchPhase 标记 | 批量步骤必须 requires_authorization=true | 升级为 await_hitl |
| Skill 引用一致性 | tool_calls 引用的 skill_id 在加载列表内 | reject · 原因:unknown_skill_ref |
权限规则 · 基于 RBAC 矩阵和 Skill level 校验。
| 规则 | 检查点 | 命中行为 |
|---|---|---|
| Skill 可见性 | CallerIdentity 是否有权使用该 Skill | reject · 原因:skill_not_visible |
| Workspace 边界 | 动作目标资源是否属于 caller 可访问 workspace | reject · 原因:cross_workspace_denied |
| 租户隔离 | 跨 tenant 的资源访问 | reject · 一票否决 |
| Team 级 hitl_threshold | Team 配置 high 阈值低于全局默认时收紧 | 升级为 await_hitl |
成本规则 · 在 Tool 执行前预扣,超限即拒。
| 规则 | 检查点 | 命中行为 |
|---|---|---|
| Run 级 token 上限 | Plan budget_estimate ≤ tier 配额 | reject · 原因:run_budget_exceeded(详见第 7 章) |
| User 日预算 | 用户当日累计 + 预估 ≤ 日上限 | reject · 原因:user_daily_exceeded |
| Workspace 月预算 | 工作区当月累计 + 预估 ≤ 月上限 | 升级 await_hitl L4 或自动降级 |
| Skill 单次成本 | 单步 Skill 预估超阈值 | 升级 await_hitl |
| Escalation 门控 | Plan 已 escalate 次数 ≤ 上限(默认 2) | reject · 原因:escalation_capped |
安全护栏 · 拦截已知危险模式,独立于风险矩阵硬规则。
| 规则 | 检查点 | 命中行为 |
|---|---|---|
| 敏感字段写 | Plan 含写 OAuth / 密钥 / PII 字段的步骤 | reject · 一票否决 |
| 跨租户串数据 | 动作目标 tenant ≠ caller tenant | reject · 一票否决 |
| 外部出站白名单 | HTTPS 请求域名不在租户白名单内 | reject 或 await_hitl(按租户配置) |
| 提示词注入特征 | 用户输入命中已知 prompt injection 模式 | reject · 原因:prompt_injection_suspected |
| Shell 命令模式 | 命中黑名单(rm -rf 根、kill -9 1 等) | reject · 一票否决 |
3.3 规则优先级与短路
四类规则按"结构性 → 安全护栏 → 权限 → 成本"顺序短路评估:任一类命中拒绝即直接返回 reject 决议,不再评估后续。这保证:结构非法不会被算成本浪费时间;安全一票否决永远第一线;成本规则放最后是因为它最有可能"升级到 HITL"而非"直接拒"。
每条命中的规则都会单独写入 PolicyTrace(rule_id / 决议 / 原因 / 用时),即使被短路也不丢。
4. HITL 四级审批
定义守门员二号(⑦ HITL)的四级审批模型、触发条件、超时升级链路、审批人权限。HITL 处理 Policy 给不出确定答案的边缘场景。
4.1 四级审批模型
| 级别 | 名称 | 触发条件 | 审批人 | 典型时延 |
|---|---|---|---|---|
| L1 | 自动通过 | 风险 Low / 只读 / 个人沙箱写 | 无 | 实时(绕过 ⑦) |
| L2 | 本人确认 | 风险 Medium / 项目空间写 / 中等成本 | 任务发起者 | 秒级(inline 确认) |
| L3 | 审批人审批 | 风险 High / 金额 / 权限变更 / Skill L4 | 指定审批人(直属上级 / 项目 Owner) | 分钟到小时 |
| L4 | 双人复核 | 生产操作 / 数据破坏 / 跨租户 / Break-Glass | 两名独立审批人 | 数小时 |
升级链路只有一条:L2 超时 → L3;L3 超时 → L4;L4 超时 → 终态 CLOSED_REJECTED(不再无限升级)。
4.2 每层权限模型
| 审批层 | 谁能批准 | 拒绝权限 | 修改权限 |
|---|---|---|---|
| L2 | 任务发起者本人 | 本人可拒绝自己的操作 | 不可修改 Plan 参数 |
| L3 | 指定审批人(上级 / Owner) | 审批人可拒绝 | 审批人可修改参数后批准 |
| L4 | 两名独立审批人 | 任一人拒绝即驳回 | 需两人一致修改才能改写 |
| L4 · 平台 | 平台管理员(Break-Glass / 跨租户争议) | 管理员可拒绝 | 管理员可修改并加批注 |
4.3 超时升级链路
| 当前级别 | 首超时阈值 | 升级动作 | 二超时阈值 | 终态动作 |
|---|---|---|---|---|
| L2 · 本人确认 | 5 分钟 | 升级到 L3 · 通知直属上级 | — | — |
| L3 · 审批人审批 | 2 小时 | 升级到 L4 · 通知上级审批人 | 24 小时 | TIMEOUT → CLOSED_REJECTED |
| L4 · 双人复核 | 4 小时(每人 2 小时) | 升级到平台管理员通道 | — | — |
| L4 · 平台管理员 | 48 小时 | — | — | TIMEOUT → CLOSED_REJECTED |
超时由独立的"看门狗"进程定时扫描 AWAITING_HITL 状态的 Run,命中阈值即推进升级或终态。看门狗每次检查都写一条 HITLTrace 记录"等待时长 / 当前级别",便于事后分析瓶颈。
4.4 审批记录契约
| 字段 | 含义 |
|---|---|
| record_id | 审批记录 UUID |
| run_id | 关联的 Run |
| hitl_level | L1 / L2 / L3 / L4 |
| risk_level | low / medium / high |
| requester_id | 发起人 |
| reviewer_id | 审批人(L4 时为列表) |
| decision | approve / reject / skip / timeout |
| comment | 审批意见(拒绝时必填) |
| modified_action | 审批人修改后的动作(如有) |
| decided_at | 决议时间戳 |
| escalation_from | 从哪一级升级而来(如有) |
| break_glass | 是否走紧急通道(详见第 6 章) |
所有审批记录通过 ⑧ Trace 通道写入审计表,仅追加、不可修改。审批 UI 的查询入口按 run_id / requester_id / reviewer_id / hitl_level / decision / 时间范围聚合检索。
5. AWAITING_HITL 持久化
HITL 是异步审批,等待期间 Run 不能被当作"挂起任务"丢掉——状态、上下文、沙箱必须全部留住。这一章定义这条 D3 不变量的工程实现。
5.1 状态机定位
AWAITING_HITL 是 11 个 RunState 中唯一可由外部唤醒的中间态。它的合法转移有三条出路:通过审批 → 回到 EXECUTING 续跑;拒绝 → 进 TRACING → CLOSED_REJECTED;超时 → 进 TRACING → CLOSED_REJECTED。状态机不允许 AWAITING_HITL 直接进 CLOSED_*,必须先经 ⑧ Trace。
5.2 三个不释放
| 资源 | 不释放原因 | 实现要点 |
|---|---|---|
| RunState | 批准回来要回到 EXECUTING 续跑,丢了状态就要重跑前 6 步 | RunState 持久化在 Redis + MySQL 双写;TTL 按最长审批时延 ×2 设置 |
| 上下文 | AssembledContext + Plan 必须可还原;Skill manifest_hash 必须锁住 | 上下文以 hash 存储,走 ⑧ Trace 同样的 hash 链;批准时按 hash 还原 |
| 沙箱容器 | 容器内可能已经有"准备好的工作目录 / 已下载依赖",回收要重做 | 沙箱 Provider 上 Run 的 lifecycle 与 RunState 绑定;AWAITING_HITL 期间标记 idle 但不回收 |
5.3 续跑契约
批准回来时,HITL 控制器把审批记录附加到 caller_extra,向 T3 发"通行 + 审批人修改后的参数(如有)"信号。T3 按以下步骤恢复:
- 核对 RunState 仍在 AWAITING_HITL(防止重复批准 / 已超时)
- 如审批人改了参数,用 modified_action 替换 Plan 中对应 tool_call 的入参
- 状态转移 AWAITING_HITL → EXECUTING
- 沙箱拉起 idle 容器到工作态,直接进 ⑥ Tool 执行
- Tool 执行完后正常进 ⑧ Trace,HITLTrace 链接到 PolicyTrace 形成完整决议链
5.4 超时与僵尸 Run
独立看门狗进程每分钟扫描所有 AWAITING_HITL 的 Run:到达终极超时阈值(L4 平台管理员 48 小时)→ 强制 TIMEOUT → 进 ⑧ Trace → CLOSED_REJECTED → 释放沙箱。事后告警通知 requester 与最后一级审批人。
对于"看门狗自身挂了"的情况,部署架构上看门狗是无状态的多实例 + 抢锁;MySQL 上有冗余的扫描查询作为兜底,最坏情况下一天内必然回收所有僵尸 Run。
6. Break-Glass · 紧急通道
定义"紧急通过"的工程边界——只缩短等待,不绕审计。Break-Glass 不是后门,它是一条"用速度换事后审查强度"的合规通道。
6.1 三个不变量
| 不变量 | 含义 |
|---|---|
| 身份不绕 | Break-Glass 仍要 CallerIdentity 完整鉴权;权限矩阵仍生效,没权限的人不能 Break-Glass 自己没权限的动作 |
| Policy 不绕 | 四类规则仍跑——结构 / 权限 / 成本 / 安全护栏一项不少;只是把 await_hitl 的等待时长压短到分钟级 |
| Trace 不绕 | HITLTrace.break_glass=true 写入审计表;事后审查任务自动创建 |
6.2 触发条件与申请字段
| 字段 | 说明 |
|---|---|
| 触发场景 | 只允许"生产事故止血 / 安全事件响应 / 高优先客户合同窗口"三类 |
| 原因描述 | 必填,至少 50 字;描述紧急原因 + 不走正常审批的理由 |
| 申请人 | 需是对应资源的合法操作人,且通过当前级别的权限矩阵 |
| 实时通知 | 申请同时通知平台管理员和正常审批链路上的所有审批人 |
| 事后审查窗口 | 48 小时内必须完成事后审查,否则封禁该用户后续 Break-Glass 一个月 |
| 频率限制 | 同一用户每月最多 3 次;同一 Workspace 每月最多 10 次 |
6.3 与正常审批的差异点
正常 L4 走完整异步审批,等待时长 = 审批人 SLA(小时级);Break-Glass 改为"申请即走,平台管理员有 5 分钟窗口可中止"。差异只发生在审批通道这一段,前后链路(鉴权 / Policy / Trace / 沙箱)一致。
| 阶段 | 正常 L4 | Break-Glass |
|---|---|---|
| 鉴权 | 完整 RBAC | 完整 RBAC(不变) |
| Policy 评估 | 四类规则 | 四类规则(不变) |
| 等待审批 | 异步等待人审 | 5 分钟管理员中止窗口 |
| Trace 写入 | HITLTrace | HITLTrace + break_glass=true + 申请原因 |
| 事后审查 | 无 | 48 小时内必审;不通过 → 封禁 |
6.4 异常路径
| 情况 | 处理 |
|---|---|
| 5 分钟内管理员主动中止 | Run 直接进 ⑧ Trace → CLOSED_REJECTED;Break-Glass 申请记一次"被中止" |
| 事后审查未通过 | 生成安全事件报告;该用户 Break-Glass 权限封禁一个月 |
| 申请理由低于 50 字 / 频率超限 | 申请直接 reject,不进入紧急通道 |
| 申请人无对应资源权限 | 权限矩阵拦截,返回 403;不算 Break-Glass 次数 |
7. 成本治理
把"成本"作为治理的第四类规则,覆盖 Run / User / Workspace / Skill 四个维度,超限触发拒绝、降级或升级 HITL,让平台不会因为某一个失控的 Run 把全月预算烧光。
7.1 四维度限额
| 维度 | 典型阈值 | 命中行为 | 聚合粒度 |
|---|---|---|---|
| Run 级 | token 上限按 tier 阶梯:trivial 3K / simple 8K / standard 25K / complex 60K / epic 120K | Plan 预估超限直接 reject;Tool 执行中实时超限触发 Run FAILED | 每 Run 独立 |
| User 级 | 日预算(按用户角色 / 套餐配置) | 当日累计接近时降级模型;超限 reject 或转 await_hitl L4 | 按 user_id 当日聚合 |
| Workspace 级 | 月预算(按工作区合同配置) | 80% → 通知 Owner;100% → 强制降级;120% → 写操作必须 L4 审批 | 按 workspace_id 当月聚合 |
| Skill 级 | 单次成本阈值(按 Skill 单价) | 单步 Skill 预估 > 阈值 → 升级 await_hitl | 按 skill_id 单次 |
7.2 八步管道的成本归集
| 步骤 | 成本类型 | 归集口径 |
|---|---|---|
| ① Run 创建 | 0 | 仅状态机写入,无 token |
| ② Context 装配 | input tokens | system + history + memory 召回的 token 量 |
| ③ Skill 加载 | 0 | 内存读取,仅 metadata |
| ④ Plan 规划 | input + output tokens | LLM 推理;可能跨多 stage |
| ⑤ Policy 校验 | 0 | 本地规则评估 |
| ⑥ Tool 调用 | Tool 内部消耗 | Skill 自身的 token / 沙箱时长 / 第三方 API 单价;按 skill_id 聚合 |
| ⑦ HITL 审批 | 机会成本 | 等待期间不烧 token,但占沙箱资源 → 折算"沙箱 idle 单价" |
| ⑧ Trace 留痕 | 0 | 批写到 OSS / MySQL,不计 token |
每步的 token 与时延通过 ⑧ Trace 写入 CostTrace;按 Run / User / Workspace / Skill 四个维度的 GROUP BY 聚合即可生成各级仪表板。
7.3 超限降级策略
7.4 超限告警与白名单升级
| 告警 | 触发条件 | 严重度 | 动作 |
|---|---|---|---|
| RunBudgetExhaustedHigh | budget_exhausted 持续 > 1/sec | info | 通知运维检查 tier → budget 映射 |
| TokenOverrunHigh | p95 output tokens > 200K | info | 排查 Agent 是否陷入循环 |
| CostSpikeDetected | 单 Run 成本 > tier 平均值 3 倍 | warning | 自动触发降级 + 通知 Workspace Owner |
| UserDailyExceeded | 用户日消耗 > 日预算 | warning | 限制非关键 Skill 调用 |
| WorkspaceMonthlyCritical | 月消耗 > 月预算 80% | critical | 强制降级 + 通知 Workspace Owner + 平台管理员 |
Escalation 白名单:单个 Plan 最多 2 次预算追加,每次最多 8 个 jobs,理由必须命中白名单(stage1_underestimated / attachment_workload_grew / user_requested_more / admin_override),否则 reject。
7.5 仪表板与 Trace 字段对齐
| 面板 | 核心指标 | 数据源 |
|---|---|---|
| Token 消耗趋势 | 实际 output / thinking tokens(按 tier 分组 p50 / p95) | CostTrace 时间序列聚合 |
| Skill 成本排行 | Top 10 高成本 Skill | CostTrace GROUP BY skill_id |
| 预算利用率 | 当前 / 预算 比率(按 Run / User / Workspace 三档展示) | 实时聚合 + Trace 持久化 |
| 降级事件 | L1 / L2 / L3 触发次数 | 降级控制器写入的事件流 |
| HITL 等待成本 | 沙箱 idle 时长 × 单价 | HITLTrace 等待时长字段 |
| Workspace 成本汇总 | 按 Workspace 聚合的日 / 月成本 | CostTrace + caller_extra.workspace_id |
所有仪表板的数据来源都是 ⑧ Trace 写入的 CostTrace + HITLTrace;不存在另起一套度量的"影子表",保证账单与审计一致。