"""参考改写真实链路:授权携带参考版本,偏好与参考材料进冻结快照;漂移即失效。""" import json from dataclasses import replace from pathlib import Path from uuid import uuid4 import pytest import test_上下文快照与索引写入 as 方法测试 import test_两阶段写手 as 写手测试 import test_模型修订任务 as 修订测试 from muse.任务运行.接口 import 任务状态 from muse.作者经验.接口 import 偏好范围, 偏好请求 from muse.共享.错误 import Muse错误 from muse.启动 import 装配审校修订 from muse.正文写作.接口 import 原文选段, 文本节点, 正文草稿, 段落, 段落哈希, 选段写作授权 from muse.资料研究.接口 import 导入请求, 资料服务 pytestmark = pytest.mark.数据库 生成环境 = 修订测试.生成环境 @pytest.fixture def 参考环境(生成环境): env = 生成环境 装配 = env["装配"] 装配审校修订( 装配, 写手测试.合成计价(), Path(__file__).parents[2] / "配置/流程模板/审校修订.yaml" ) doc = 正文草稿( (段落("p1", (文本节点("机甲的刀锋嗡鸣。"),)), 段落("p2", (文本节点("火花四散。"),))) ) env["正文"].保存人工(env["作者"], "ref-seed", "ch-4", 0, doc) saved = env["正文"].读取正文(env["作者"], "ch-4") 方法 = 装配.要求知识方法() with 方法.数据库.连接() as 连: 来源 = 资料服务().导入( 连, env["作者"].作者, 导入请求( kind="reference", title="机甲打斗参考", origin="seed://ref-method", content="机甲近身刀法借势卸力,受击反馈优先于光效描写。", authorized_uses=("analysis",), ), ) 请求 = 方法测试._提案(str(uuid4()), "机甲近身刀法", str(来源.source_id), owner=env["作者"].作者) 回执 = 方法.提出方法(env["作者"], str(uuid4()), 请求) 方法测试._确认(方法, env["作者"], 回执["target_ref"]) 版本 = 方法.读取方法详情(env["作者"], 请求.method_id)["versions"][0] 经验 = 装配.要求作者经验() 经验.保存偏好( env["作者"], str(uuid4()), 偏好请求( preference_id=str(uuid4()), topic="打斗描写", text="重视受击反馈,不堆砌形容词。", quote="今后重视受击反馈。", scope=偏好范围(), ), ) 选段 = 原文选段("p2", 段落哈希(doc.paragraphs[1]), 0, 5, "火花四散。") 授权 = 选段写作授权( "gen-work", "ch-4", "main", saved["revision"], saved["document_hash"], "rewrite", "改为机甲近身刀法,参考所选方法", (选段,), (), references=(str(版本["version_id"]),), ) env.update( 授权=授权, 选段=选段, 参考版本=str(版本["version_id"]), 参考方法ID=请求.method_id, 来源ID=str(来源.source_id), ) return env def _快照ID(task): return next( s["checkpoint"]["snapshot_id"] for s in task.步骤 if s.get("checkpoint") and "snapshot_id" in s["checkpoint"] ) @pytest.mark.case_id( "NC-w32-a10010", environment="隔离PG与合成HTTP提供方", given="带参考版本与活跃偏好的选段改写授权", when="发起并执行受控修订流程", then=["偏好与参考材料入选装配并绑定进快照;写手输入携带材料"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md#参考改写选段改写链路扩展", ) def test_偏好与参考材料进快照与写手输入__a10010(参考环境): env = 参考环境 tid = 修订测试.发起(env, command="ref-revision-1") env["剧本"].append( { "类型": "文本", "文本": { "edits": [ { "selection_id": env["选段"].selection_id, "action": "replace", "replacement": "刀锋擦过装甲,反震顺着掌心爬上来。", "reason": "合成参考改写", } ] }, } ) task = 修订测试.跑(env, tid) assert task.状态 == 任务状态.已完成 输入 = json.loads(env["收到"][-1]["input"]) assert "重视受击反馈,不堆砌形容词。" in 输入["装配材料"] 快照 = env["装配"].要求上下文().读取快照(_快照ID(task)) assert 快照.失效说明 is None assert "参考方法:" + env["参考版本"] in 快照.装配["入选"] assert any(str(绑.来源ID) == env["参考版本"] for 绑 in 快照.来源绑定) result = env["装配"].要求审校().读取模型修订(env["作者"], tid) assert result["source_kind"] == "selection" and result["outcome"] == "candidate" @pytest.mark.case_id( "NC-w32-a10011", environment="隔离PG与合成HTTP提供方", given="携带不存在参考版本的选段授权", when="发起受控修订", then=["授权范围阶段快速拒绝,不创建任务"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md#参考改写选段改写链路扩展", ) def test_未知参考版本在发起时拒绝__a10011(参考环境): env = 参考环境 env["授权"] = replace(env["授权"], references=("不存在的版本",)) with pytest.raises(Muse错误): 修订测试.发起(env, command="ref-revision-bad") @pytest.mark.case_id( "NC-w32-a10012", environment="隔离PG与合成HTTP提供方", given="已冻结的参考改写任务", when="参考方法推进新版本后读取快照", then=["旧参考版本不再当前,快照标注失效且要求重新授权"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md#参考改写选段改写链路扩展", ) def test_参考版本漂移使快照失效__a10012(参考环境): env = 参考环境 tid = 修订测试.发起(env, command="ref-revision-drift") svc = env["装配"].任务运行 claim = svc.领取步骤("revision-worker", ["revision.freeze"]) assert claim is not None svc.执行一步(claim) 快照ID = _快照ID(svc.读取任务(tid)) 方法 = env["装配"].要求知识方法() 新请求 = 方法测试._提案( str(uuid4()), "机甲近身刀法二版", env["来源ID"], owner=env["作者"].作者, 方法ID=env["参考方法ID"], ) 回执 = 方法.提出方法(env["作者"], str(uuid4()), 新请求) 方法测试._确认(方法, env["作者"], 回执["target_ref"]) 快照 = env["装配"].要求上下文().读取快照(快照ID) assert 快照.失效说明 and "参考方法" in 快照.失效说明 assert "需重新授权" in 快照.失效说明