实现侧: - 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。 - 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。 - 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。 - 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。 - 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。 - 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。 - 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。 - 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。 用例侧: - 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存; - 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
251 lines
9.8 KiB
Python
251 lines
9.8 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),
|
||
}
|
||
|
||
|
||
@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(模型协议错误):
|
||
校验模型输出(请求, 响应)
|