Files
group_fqcd_jr/tests/unit/service/test_agent_persistence_audit.py
T
qyqy 928d0bcea3 chore: 按评审恢复 5 份文档、审计补 agent_type、修订环境口径
评审意见落地(§3.3 驳回删除 / §3.1 审计补充 / §1.4 解释器 / §2 编号):
- docs/04、06、10、13、99 全部恢复(评审:删除收益为零、保留成本同样为零);
  AGENTS.md 改为"保留但仅作历史参考"并列入 D 类,ARCHIVE 归档说明加作废声明
- 治理审计补留痕:interaction_audit.detail 增加 agent_type 与 governance_rewrite
  (治理层会改写对外输出,事后必须能追溯到是哪个 Agent 触发的;不改表结构,detail 是 JSON 列)
  新增 tests/unit/service/test_agent_persistence_audit.py 锁住该契约
- AGENTS.md 修订环境口径:解释器各用本机可用的那个(.venv 被 gitignore、不进仓库);
  config_release 与 Milvus schema 均属环境数据、不随代码合并,相关结论必须带环境限定;
  测试基线 1034;mypy 数字双方不可比(本机未装 sqlalchemy2-stubs,报错集中在模型层)
- docs/26 JWT 文档:因 21 已被风控迁移清单占用而改名,PR 描述里会单独说明
2026-09-11 18:42:46 +08:00

49 lines
2.2 KiB
Python
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.
"""治理审计落库的字段契约(`agent_type` + 治理是否改写过输出)。
**为什么需要这个文件**:治理层(`PlatformGovernance.review`)会**改写对外输出** ——
追加固定免责声明(门禁 F5),命中禁用词时还会把整条回复替换成安全话术。
架构师评审明确要求:"治理层改写了对外输出,事后必须能追溯到是哪个 Agent 触发的。"
所以 `agent.run_completed` 那条审计的 `detail` 里必须带 `agent_type`;
本文件锁住这个契约,避免以后有人"顺手精简"掉它。
"""
from app.core.contracts import AgentResult, CoreResult
from app.service.agent_persistence_service import _governance_rewrote
def _result(text: str, *, transfer_required: bool = False) -> AgentResult:
return AgentResult(
run_id="r",
result=CoreResult(text=text, transfer_required=transfer_required),
)
def test_plain_answer_without_disclaimer_counts_as_rewritten() -> None:
"""客服出口的正文**不带**免责声明(话术由治理层统一注入)。
所以"Agent 产出的纯粹正文"在治理前后的差异就是那句被追加的话术——
见到治理后的正文(含话术)即说明治理改写过。
"""
assert _governance_rewrote(
_result("交易日 15:00 前提交,T+1 日确认份额。\n\n本内容仅为投资分析参考,不构成任何直接投资建议。")
) is True
def test_transfer_required_counts_as_rewritten() -> None:
"""拦截分支:治理层把回复替换成"该内容需要人工核实"并置 `transfer_required`。"""
assert _governance_rewrote(
_result("该内容需要人工核实。基金投资存在风险,本系统不代客交易。",
transfer_required=True)
) is True
def test_untouched_text_is_not_marked_as_rewritten() -> None:
"""没有任何治理痕迹时不标记(避免"全部记 True"让这个字段失去信息量)。"""
assert _governance_rewrote(_result("交易日 15:00 前提交,T+1 日确认份额。")) is False
def test_empty_text_does_not_crash() -> None:
"""空正文(异常路径)不得让审计写入抛异常。"""
assert _governance_rewrote(_result("")) is False