接续 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。
195 lines
6.9 KiB
Python
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(模型协议错误):
|
|
校验模型输出(请求, 响应)
|