"""三条收归链路装配后的系统提示:角色层唯一身份 + 资源模板 + 动态合同。 保护:批次1治理归一的目标语义——探索/章后抽取/拆书分析的系统提示 全部来自登记资源模板,装配后身份句只出现在角色层(模板不重复自我介绍)。 """ from __future__ import annotations import json import pytest from muse.任务运行.角色会话 import 组装系统提示 from muse.任务运行.角色策略 import 角色策略目录 from muse.编排.生成正文 import _探索输出合同, 受限探索模板 from muse.编排.章后处理 import _抽取输出合同, 章后抽取模板 from muse.资料研究.拆书分析 import 拆书分析模板, 窗口输出合同 from muse.资源加载 import 使用资源提供器 链路集 = ( ("writer", 受限探索模板, _探索输出合同), ("extractor", 章后抽取模板, _抽取输出合同), ("extractor", 拆书分析模板, 窗口输出合同), ) @pytest.mark.case_id("NC-prompt-assembly-single-identity") @pytest.mark.parametrize( "角色,读取,合同", 链路集, ids=("explore", "chapter-extract", "book-analysis") ) def test_装配后身份唯一且模板无身份句(源码资源, 角色, 读取, 合同): with 使用资源提供器(源码资源): 目录 = 角色策略目录.从发布包() 角色提示 = 目录.读取角色提示(角色) 模板, 模板哈希 = 读取() 组装 = 组装系统提示(目录, 角色, 模板, 合同) assert 组装 == ( 角色提示 + "\n\n本次任务:\n" + 模板 + "\n\n最终输出结构:\n" + json.dumps(合同, ensure_ascii=False, sort_keys=True) ) assert "你是" not in 模板, "任务模板不得重复角色层自我介绍" assert 组装.count("你是") == 角色提示.count("你是") assert len(模板哈希) == 64