muse-agent-example/tests/单元/test_文学报告合同.py
zizi d909d1bd1b 后端实现与用例身份:19 包集成落地并修复收尾缺陷
实现侧:
- 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。
- 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。
- 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。
- 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。
- 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。
- 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。
- 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。
- 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。

用例侧:
- 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存;
- 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
2026-09-18 01:15:00 +08:00

251 lines
9.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""文学片的引文/依据/未知判断合同;纯组装不能声称模型执行。"""
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(模型协议错误):
校验模型输出(请求, 响应)