test(base): 端到端验证工具拒绝的分支 2 与 3,探针加第二个工具

接上一轮(分支 1 已验证)。本轮用只读探针触发另外两种拒绝:

- 分支 2「工具不在当前意图白名单」:发布白名单 ["probe_alt"] 但 Agent 调 probe_echo。
  这一步能做,正是因为给探针加了第二个工具 —— governance.resolve 取的是
  「发布白名单 ∩ 代码声明的 allowed_tools」,配置**只能缩小不能放大**,所以单个工具的
  Agent 永远构造不出"有白名单但不含该工具"的场景。这是做端到端时才撞到的结构性约束,
  platform_probe.py 里已注明。

- 分支 3「缺少工具权限」:发布白名单 ["probe_echo"],工具可用了,但 admin 角色并没有
  probe:read 这条权限,天然命中权限分支,不需要动 RBAC。

实测:两种拒绝的 stderr 分别为「工具不在当前意图白名单」与「缺少工具权限」,
运行状态均为 failed / AGENT_PERMISSION_DENIED;生效配置已恢复(终点 9 条,与起点一致)。

顺带发现分支 4 的结构性障碍(下一步处理):Agent 层的 validate_access 会先按
AgentDefinition.allowed_roles 拦截,所以要在**工具层**触发"角色不能使用工具",
必须让工具的角色集合比 Agent 的更窄 —— 探针目前两者的角色集合相同,触发不到。
This commit is contained in:
2026-09-11 13:11:30 +08:00
parent edc0c43245
commit 1eb8946552
2 changed files with 21 additions and 1 deletions
+10
View File
@@ -18,10 +18,12 @@ from app.service.agent.governance import PlatformGovernance
from app.service.agent.implementations.customer_service import CustomerServiceAgent
from app.service.agent.implementations.fund_query_demo import FundQueryDemoAgent
from app.service.agent.implementations.platform_probe import (
PROBE_ALT_TOOL,
PROBE_PERMISSION,
PROBE_TOOL,
PlatformProbeAgent,
ProbeEchoArgs,
probe_alt_tool,
probe_echo_tool,
)
from app.service.agent.implementations.risk_agent import RiskAgent
@@ -187,6 +189,14 @@ def get_agent_factory() -> AgentFactory:
required_permission=PROBE_PERMISSION,
allowed_roles=("admin",),
))
# 第二个探针工具:让"有白名单但不含该工具"的分支可被构造(见 platform_probe 的说明)
registry.register(ToolDefinition(
name=PROBE_ALT_TOOL,
input_model=ProbeEchoArgs,
handler=cast(Any, probe_alt_tool),
required_permission=PROBE_PERMISSION,
allowed_roles=("admin",),
))
registry.register(ToolDefinition(
name="check_suitability",
input_model=SuitabilityToolInput,