"""文学片的引文/依据/未知判断合同;纯组装不能声称模型执行。""" from copy import deepcopy import pytest from muse.审校修订.接口 import ( 审校错误, 核验文学片, 生成审校分片, 组装文学报告, ) def 结果(片, *, 有声音=True): return { "shard_id": 片.片ID, "dimensions": { dim: {"status": status, "summary": "本片判断", "findings": []} for dim, status in [ ("continuity", "reviewed"), ("craft", "reviewed"), ("voice", "reviewed" if 有声音 else "uncalibrated"), ] }, } def 问题(*, start=0, end=1, quote="甲", judgment="ask", sources=()): return { "start": start, "end": end, "quote": quote, "judgment": judgment, "reason": "需要结合语境判断。", "basis_ids": list(sources), } @pytest.mark.case_id( "NC-w22-22f001", environment="离线、合成分片与固定结果字典", given="零命中且没有已确认声音", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["完整报告保覆盖,声音未标定,纯组装固定未持久化/未认证模型"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) def test_零命中报告仍保全范围和未标定声音__22f001(): 文本 = "甲走出门。\r\n乙仍在屋内。" 片 = 生成审校分片(文本, "a" * 64, 核心上限=8, 上下文字数=2) 报告 = 组装文学报告( 文本, "a" * 64, 片, [结果(p, 有声音=False) for p in 片], 允许依据=("fact:1",), 已确认声音=False, ) assert 报告["coverage"]["范围完整"] assert 报告["counts"] == {"repair": 0, "retain": 0, "ask": 0} assert 报告["dimension_status"]["voice"] == "uncalibrated" assert 报告["persisted"] is False and 报告["model_verified"] is False assert "pass" not in 报告 and 报告["unreviewed_shards"] == [] @pytest.mark.case_id( "NC-w22-22f002", environment="离线、合成分片与固定结果字典", given="仅首片结果且连续性证据不足", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["尾部未审逐区保留,不把前缀或缺证据当整章通过"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) def test_未审尾部及缺依据不能变整章通过__22f002(): 文本 = "甲乙丙丁戊己庚辛" 片 = 生成审校分片(文本, "a" * 64, 核心上限=4, 上下文字数=1) 一 = 结果(片[0]) 一["dimensions"]["continuity"]["status"] = "insufficient_evidence" 报告 = 组装文学报告(文本, "a" * 64, 片, [一], 允许依据=(), 已确认声音=True) assert 报告["coverage"]["未审区"] == [[4, 8]] and not 报告["coverage"]["范围完整"] assert 报告["unreviewed_shards"] == [片[1].片ID] assert 报告["dimension_status"]["continuity"] == "partial" assert 报告["shards"][0]["dimensions"]["continuity"]["status"] == "insufficient_evidence" @pytest.mark.case_id( "NC-w22-22f003", environment="离线、合成分片与固定结果字典", given="重复短句及修/留两种判断", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["按全文真实码点核引文与稳定问题ID,处置分别计数"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) def test_重复文本按实际位置核引文且修留问分开__22f003(): 文本 = "甲说。\n甲说。" 片 = 生成审校分片(文本, "a" * 64, 核心上限=4, 上下文字数=2) 二 = 结果(片[1]) 二["dimensions"]["craft"]["findings"] = [问题(start=4, end=6, quote="甲说", judgment="retain")] 二["dimensions"]["continuity"]["findings"] = [ 问题(start=4, end=5, quote="甲", judgment="repair", sources=("fact:1",)) ] 校验 = 核验文学片(片[1], 二, 允许依据=("fact:1",), 已确认声音=True) assert 校验["dimensions"]["craft"]["findings"][0]["start"] == 4 报告 = 组装文学报告( 文本, "a" * 64, 片, [结果(片[0]), 二], 允许依据=("fact:1",), 已确认声音=True ) assert 报告["counts"] == {"repair": 1, "retain": 1, "ask": 0} assert len({x["finding_id"] for x in 报告["findings"]}) == 2 @pytest.mark.case_id( "NC-w22-22f004", environment="离线、合成分片与固定结果字典", given="错引文/范围/片/依据/处置/维度/分数/重复和无依据强判13分支", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["拒绝合同越界,未标定或缺声音不强判必须修改"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) @pytest.mark.parametrize( "变动", [ "错引文", "上下文冒核心", "越界", "错片", "重复", "陌生依据", "未知处置", "未知维度", "缺维度", "额外分数", "无依据修", "未标定修", "缺声音", ], ) def test_文学片拒绝错误归属与强判__22f004(变动): 文本 = "甲乙丙丁戊己庚辛" 片 = 生成审校分片(文本, "a" * 64, 核心上限=4, 上下文字数=2)[1] r = 结果(片) f = 问题(start=4, end=5, quote="戊") r["dimensions"]["continuity"]["findings"] = [f] 有声音 = True if 变动 == "错引文": f["quote"] = "甲" elif 变动 == "上下文冒核心": f.update(start=2, end=3, quote="丙") elif 变动 == "越界": f.update(end=10, quote="戊己庚辛") elif 变动 == "错片": r["shard_id"] = "b" * 64 elif 变动 == "重复": r["dimensions"]["continuity"]["findings"].append(deepcopy(f)) elif 变动 == "陌生依据": f["basis_ids"] = ["foreign"] elif 变动 == "未知处置": f["judgment"] = "must_rewrite" elif 变动 == "未知维度": r["dimensions"]["human_probability"] = {} elif 变动 == "缺维度": del r["dimensions"]["craft"] elif 变动 == "额外分数": r["score"] = 100 elif 变动 == "无依据修": f["judgment"] = "repair" elif 变动 == "未标定修": f.update(judgment="repair", basis_ids=["fact:1"]) r["dimensions"]["continuity"]["status"] = "uncalibrated" else: 有声音 = False with pytest.raises(审校错误): 核验文学片(片, r, 允许依据=("fact:1",), 已确认声音=有声音) @pytest.mark.case_id( "NC-w22-22f005", environment="离线、合成分片与固定结果字典", given="重复/陌生片和旧正文/依据4分支", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["不能复用旧结论或伪造完成覆盖"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) @pytest.mark.parametrize("变动", ["重复片", "陌生片", "旧正文", "旧依据"]) def test_报告不能复用旧片结论或伪造完成声明__22f005(变动): 文本 = "甲乙丙丁" 片 = 生成审校分片(文本, "a" * 64) rs = [结果(片[0])] 依据 = "a" * 64 if 变动 == "重复片": rs *= 2 elif 变动 == "陌生片": rs[0]["shard_id"] = "b" * 64 elif 变动 == "旧正文": 文本 = "甲乙丁丙" else: 依据 = "b" * 64 with pytest.raises(审校错误): 组装文学报告(文本, 依据, 片, rs, 允许依据=(), 已确认声音=True) @pytest.mark.case_id( "NC-w22-22f006", environment="离线、合成分片与固定结果字典", given="空结果下的非布尔声音、重复/空依据与缺片ID", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["未知/未审报告也不能绕过明确范围声明"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) @pytest.mark.parametrize("变动", ["空结果", "重复依据", "空依据", "缺片ID"]) def test_未审报告也不能接受不明确的授权声明__22f006(变动): 片 = 生成审校分片("甲乙", "a" * 64) 参数 = {"允许依据": (), "已确认声音": True} 结果表 = [] if 变动 == "空结果": 参数["已确认声音"] = 1 elif 变动 == "重复依据": 参数["允许依据"] = ("fact:1", "fact:1") elif 变动 == "空依据": 参数["允许依据"] = ("",) else: 结果表 = [{}] with pytest.raises(审校错误): 组装文学报告("甲乙", "a" * 64, 片, 结果表, **参数) @pytest.mark.case_id( "NC-w22-22f007", environment="离线、合成分片与固定结果字典", given="NaN/Infinity/-Infinity/溢出数字4分支", when="调用登记的结构化交付核对或文学片/报告组装公共入口", then=["非标准JSON不产生结构化最终交付或哈希凭据"], contract="docs/系统架构/新版设计/模块设计/B06-审校修订.md", ) @pytest.mark.parametrize("非标准值", ["NaN", "Infinity", "-Infinity", "1e999"]) def test_非标准JSON数值不产生可哈希的模型最终交付__22f007(非标准值): from muse.任务运行.接口 import 校验模型输出, 模型协议错误, 模型结果, 模型请求 请求 = 模型请求( "call", "synthetic", "synthetic-model", "固定结构", "合成输入", {"type": "object", "properties": {"n": {"type": "number"}}, "required": ["n"]}, 50, 10, ) 响应 = 模型结果("completed", '{"n":' + 非标准值 + "}", "synthetic-model", None) with pytest.raises(模型协议错误): 校验模型输出(请求, 响应)