feat: C6 FR-10 代理人行为链 RISK-008

代理人异常行为链识别(RISK-008)落地:
- 新增 agent_behavior_service:三条件证据聚合(A 诱导调仓/B AUTH_403_SCOPE 越权试探/C AUTH_403_NOT_OWNER|NOT_ASSIGNED 越权查询),按代理人维度独立出 pattern 单,payload.actor_id 指向代理人,审计仅 INSERT event_type=agent_behavior_detected。
- risk_repository 新增 list_audit_events / find_agent_behavior_alert / merge_agent_behavior_payload(同日同代理人一张单,证据并集)。
- trade_gateway.submit_trade 补 actor_id 透传(代理人发起交易归属发起人,缺省 SYSTEM);simulate 路由传入 auth.actor_id。
- chat_tools 新增 query_agent_behavior 只读 Tool(agent_id 过滤 + 客户脱敏),tool_service 补意图词与摘要。
- scripts/cron/agent_behavior_scan.py 定时扫描脚本。
- 修复 append_alert_event 序列化缺 default=str(C6 evidence 含 datetime 字段)。
- 单测 12 例(_count_induce 边界 / 三条件 / 出单去重 / payload 归属 / Tool 过滤脱敏)。
全量 pytest 482 passed 0 failed(470 基线 + 12 C6)。
This commit is contained in:
2026-09-07 19:53:39 +08:00
parent 90d0660b44
commit 66ec7eba08
9 changed files with 917 additions and 3 deletions
+32
View File
@@ -0,0 +1,32 @@
"""RISK-008 代理人行为链扫描(建议 30min 周期;RISK_AGENT_BEHAVIOR_SCAN_MINUTES 可配)。
初期独立脚本 + 系统 cron;结构对齐 scripts/cron/escalation_scan.py:
sys.path 引导 → new_trace → 扫描 → 打印 JSON 摘要(供 cron 日志 / 演示走查)。
审计写库失败由 service 内降级留底,不阻塞下次扫描(红线 5 口径)。
"""
from __future__ import annotations
import json
import sys
from pathlib import Path
# ① sys.path 引导项目根(escalation_scan 先例)
ROOT = Path(__file__).resolve().parents[2]
sys.path.insert(0, str(ROOT))
from app.service.risk.agent_behavior_service import scan_and_alert # noqa: E402
from app.utils.trace import new_trace # noqa: E402
def main() -> int:
# ② 显式生成 trace(无 HTTP 上下文,service 内 current_trace 复用)
new_trace()
# ③ 扫描 → 打印 JSON 摘要
summary = scan_and_alert()
print(json.dumps(summary, ensure_ascii=False, default=str, indent=2))
return 0
if __name__ == "__main__":
sys.exit(main())