muse-agent-example/tests/架构/test_提示词治理.py
zizi 18343b9464 refactor(提示词): 批次1治理归一——硬编码系统提示收归发布资源包
- 新增3份任务模板并登记:正文/受限探索.md、抽取/章后抽取.md、抽取/拆书分析.md;
  模板不带身份句,身份唯一来源为角色层,消除装配后双自我介绍
- 消费方改走 打开资源() 并返回(文本,sha256):生成正文.受限探索模板、
  章后处理.章后抽取模板、拆书分析.拆书分析模板;探索/抽取检查点留痕模板哈希
- 配置探针保留代码内提示并加豁免注释(与探针合同同构、64 token、无迭代需求)
- 新增架构守卫 tests/架构/test_提示词治理.py:系统提示字面量仅白名单豁免,
  正则覆盖括号多行拼接与f-string形式,含守卫自检防假绿
- 新增 tests/单元/test_提示词装配.py:三链路装配=角色+模板+合同且模板无身份句
- test_规划审校发布模板.py 参数表扩至6份模板(同哈希、缺失/篡改不回退)

证据:离线全量1153项通过;受影响数据库集成19项通过(两阶段写手/章后失败与
重建/配置探针与章后绑定/参考分析权威/同作品抽取互斥/抽取版本与补偿);
ruff+pyright 零告警;资源包已重建(构建编排.py),索引检查通过(用例+3)。
2026-09-19 21:10:45 +08:00

64 lines
2.4 KiB
Python
Raw Permalink 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.

"""提示词治理守卫:模型系统提示必须来自登记资源,代码内字面量仅白名单豁免。
保护:A1 类回归——任务提示词散落在代码字面量、绕过资源登记/哈希冻结/发布包治理。
白名单唯一成员是配置探针:探针提示与探针合同同构、64 token 固定、无迭代需求,
豁免理由在 配置探针.py 调用处注释留痕。
"""
from __future__ import annotations
import re
from pathlib import Path
import pytest
仓库根 = Path(__file__).resolve().parents[2]
源码根 = 仓库根 / "src" / "muse"
白名单 = {"任务运行/配置探针.py"}
# 系统提示= 后接字符串字面量(含括号包裹的隐式拼接与 f/r/b 前缀)即硬编码;
# 变量或函数返回值传递(系统提示=模板 / 系统提示=拆书分析模板()[0])不匹配。
_硬编码 = re.compile(r"""系统提示\s*=\s*\(?\s*[fF]?[rRbBuU]{0,2}["']""")
def _源码文件():
for 文件 in sorted(源码根.rglob("*.py")):
if "__pycache__" in 文件.parts:
continue
yield 文件
@pytest.mark.case_id("NC-prompt-governance-no-hardcoded-system-prompt")
def test_系统提示字面量仅白名单豁免():
违规 = [
str(文件.relative_to(源码根))
for 文件 in _源码文件()
if str(文件.relative_to(源码根)) not in 白名单
and _硬编码.search(文件.read_text(encoding="utf-8"))
]
assert 违规 == [], f"系统提示不得硬编码字面量,应登记为资源模板:{违规}"
@pytest.mark.case_id("NC-prompt-governance-guard-self-check")
def test_守卫正则检出各字面量形式且不误报变量传递():
检出样例 = (
'系统提示="你是XX。"',
"系统提示='你是XX。'",
'系统提示=(\n "你是XX。"\n "做YY。"\n )',
'系统提示 = (\n "你是XX。"\n)',
'系统提示=f"你是{名}。"',
)
for 样例 in 检出样例:
assert _硬编码.search(样例), f"守卫漏检字面量形式:{样例}"
放行样例 = (
"系统提示=模板",
"系统提示=模板,",
"系统提示=探索提示,",
"系统提示=拆书分析模板()[0]",
"系统提示: str,",
"系统提示: str = 模板",
)
for 样例 in 放行样例:
assert not _硬编码.search(样例), f"守卫误报变量传递:{样例}"