muse-agent-example/tests/单元/test_文学报告合同.py
zizi cf0f4fb985 W20–W24:保存知识方法、迁移框架、审校修订与案例行为的集成成果
接续 88dd570,保存 W20–W24 已实现的共享接口、业务入口、迁移、工作台、测试与文档。
W20/W22/W23 保持 in_progress,W21/W24 保持 verified;此提交不宣称方法或规则正式启用、多轮返修、真实角色评测完成。

W25 新增实验、标定、逐调用交付与角色执行及其迁移/测试/索引留在实施工作树,原有私人和旧实现保留项不纳入。

验证:离线 571、前端 33 通过;PG 469 项通过、2 项浏览器未启用,2 项误带入的 W25 用例已移出本提交;最终任务与交付边界 37 项通过。make 检查、最终类型、84 项资源及 diff 检查通过。未重跑浏览器或 Pi 宿主,不以合成调用认证外部模型效果。
独立整体审查四维通过;证据保存在 R2-20260909/提交W20-W24。
2026-09-13 16:24:42 +08:00

195 lines
6.9 KiB
Python

"""文学片的引文/依据/未知判断合同;纯组装不能声称模型执行。"""
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),
}
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"] == []
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"
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.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.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.parametrize("变动", ["空结果", "重复依据", "空依据", "缺片ID"])
def test_未审报告也不能接受不明确的授权声明__22f006(变动):
片 = 生成审校分片("甲乙", "a" * 64)
参数 = {"允许依据": (), "已确认声音": True}
结果表 = []
if 变动 == "空结果":
参数["已确认声音"] = 1
elif 变动 == "重复依据":
参数["允许依据"] = ("fact:1", "fact:1")
elif 变动 == "空依据":
参数["允许依据"] = ("",)
else:
结果表 = [{}]
with pytest.raises(审校错误):
组装文学报告("甲乙", "a" * 64, 片, 结果表, **参数)
@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(模型协议错误):
校验模型输出(请求, 响应)