实现侧: - 上下文:任务范围拆分为 范围校验/范围授权;索引按可发现口径重建、索引新鲜度改对称差;依赖校验统一快照漂移说明。 - 知识方法:方法与材料读取口径统一;超限方法材料按可选省略,核对路径不再二次计费;删除无合同的读时重算。 - 任务运行:新增 context.usage/tool.denied 事件类型;连接池常驻并在装配生命周期内开关;调用结算与核对分列。 - 效果评测/审校修订/交付连载/作者经验/作品规划:凭据冻结、标定消费、导出补证、事实引文核对等收尾修复。 - 资源加载:能力正文不再夹带索引用的导航注记(该注记此前进入角色与技能的模型提示)。 - 元数据:受保护骨架与代码保护属性对齐;字段校验与内置结构口径同步。 - 基础设施:环境预检进入装配生命周期;数据库连接运行期字段不参与相等比较;索引指纹归一化 jsonb 浮点。 - 删除被替代实现:7 份旧提示词模板与空壳 资料来源 读取器。 用例侧: - 用例身份与导航元信息迁移;夹具补生命周期、同库暴露与模板封存; - 本轮定向修复:方法材料省略、事实引文、迁移回执、额度与暂停用例、慢用例超时预算等。
171 lines
8.5 KiB
Python
171 lines
8.5 KiB
Python
"""完整分析落B03;S02运行证据不被业务回查或历史承接改写。"""
|
||
|
||
from dataclasses import replace
|
||
|
||
import pytest
|
||
|
||
from muse.任务运行.接口 import 任务状态, 步骤结果
|
||
from muse.共享.错误 import Muse错误
|
||
from muse.接入.cli.研究命令 import 运行研究命令
|
||
from muse.编排.研究拆书 import 查询拆书状态
|
||
from muse.资料研究.接口 import 版本身份, 窗口, 窗计划哈希, 资料服务
|
||
from muse.配置 import 服务配置
|
||
|
||
pytestmark = pytest.mark.数据库
|
||
|
||
|
||
def _来源(工具):
|
||
return 工具.导入来源("B03版本样例", "第1回 机舱\n林深照看机舱。\n")
|
||
|
||
|
||
def _完成(工具, 来源, 名称):
|
||
任务 = 工具.发起(来源["source_id"])
|
||
快照 = 工具.装配.任务运行.读取任务(任务["task_id"])
|
||
for _ in 快照.冻结输入["输入"]["窗计划"]:
|
||
工具.剧本.append(
|
||
工具.分析输出([{"name": 名称, "type": "人物", "evidence": ["林深照看机舱。"]}])
|
||
)
|
||
终态 = 工具.跑任务(任务["task_id"])
|
||
assert 终态.状态 == 任务状态.已完成
|
||
return 任务, 终态
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w21-214010",
|
||
environment="隔离PG及合成提供方,不访问真实资料或外部模型",
|
||
given="相同来源/窗计划的两次真实S02合成模型流程",
|
||
when="调用真实领域/CLI/迁移入口",
|
||
then=["B03分别存完整结果与哈希;输入基准可相同,结果身份不合并"],
|
||
contract="docs/系统架构/新版设计/模块设计/B03-资料研究.md",
|
||
)
|
||
def test_相同输入的不同运行分别持久化完整分析__214010(研究环境):
|
||
工具 = 研究环境
|
||
来源 = _来源(工具)
|
||
一, 原一 = _完成(工具, 来源, "第一种归纳")
|
||
二, 原二 = _完成(工具, 来源, "第二种归纳")
|
||
assert 一["版本ID"] == 二["版本ID"] and 一["task_id"] != 二["task_id"]
|
||
with 工具.库.连接(只读=True) as 连:
|
||
列表 = 工具.服务.列出分析(连, "post-author", 来源["source_id"])
|
||
assert len(列表) == 2 and {r["analysis_id"] for r in 列表} == {一["task_id"], 二["task_id"]}
|
||
assert len({r["content_hash"] for r in 列表}) == 2
|
||
assert {r["payload"]["窗口结果"]["w001"]["entities"][0]["name"] for r in 列表} == {
|
||
"第一种归纳",
|
||
"第二种归纳",
|
||
}
|
||
with pytest.raises(Muse错误):
|
||
工具.服务.读取分析(连, "foreign-author", 一["task_id"])
|
||
with 工具.库.连接() as 连, 连.transaction():
|
||
回查 = 工具.服务.承接历史分析(连, 工具.装配.任务运行, "post-author", 一["task_id"])
|
||
assert 回查["origin"] == "model"
|
||
状态 = 查询拆书状态(工具.装配, "post-author", 来源["source_id"])
|
||
assert len(状态["分析"]) == 2
|
||
assert {r["analysis_state"] for r in 状态["台账"]} == {"recorded"}
|
||
assert 工具.装配.任务运行.读取任务(一["task_id"]) == 原一
|
||
assert 工具.装配.任务运行.读取任务(二["task_id"]) == 原二
|
||
|
||
|
||
def _旧版本登记(上下文, *, 坏摘要):
|
||
# 复现升级前的最终处理器;前置窗口仍由真实S02流程和合成模型提供方执行。
|
||
任务 = 上下文.任务
|
||
输入 = 任务.冻结输入["输入"]["拆书"]
|
||
步骤 = {s["step_id"]: s for s in 任务.步骤}
|
||
结果 = 步骤["逐窗提取"]["checkpoint"]["窗口结果"]
|
||
合并 = 步骤["实体归并"]["checkpoint"]["归并"]
|
||
窗列表 = [窗口(**r) for r in 任务.冻结输入["输入"]["窗计划"]]
|
||
版本 = {
|
||
"版本ID": 版本身份(输入["source_id"], 输入["revision"], 窗列表),
|
||
"source_id": 输入["source_id"],
|
||
"revision": 输入["revision"],
|
||
"content_hash": 输入["content_hash"],
|
||
"窗计划哈希": 窗计划哈希(窗列表),
|
||
"完成窗": sorted(结果),
|
||
"实体组数": len(合并["合并组"]) + int(坏摘要),
|
||
"歧义数": len(合并["歧义"]),
|
||
"样本依据": 任务.冻结输入["输入"].get("样本依据"),
|
||
}
|
||
return 步骤结果({"版本ID": 版本["版本ID"], "歧义数": 版本["歧义数"]}, {"版本": 版本})
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w21-214011",
|
||
environment="隔离PG及合成提供方,不访问真实资料或外部模型",
|
||
given="升级前处理器形成真实已完成S02窗口和摘要,另有坏摘要",
|
||
when="调用真实领域/CLI/迁移入口",
|
||
then=["CLI明确承接到B03并幂等回查;坏摘要拒绝,不新建任务、不重发模型、不修改旧检查点"],
|
||
contract="docs/系统架构/新版设计/模块设计/B03-资料研究.md",
|
||
)
|
||
@pytest.mark.parametrize("坏摘要", [False, True])
|
||
def test_已完成旧检查点显式承接不造任务且坏摘要拒绝__214011(
|
||
研究环境, monkeypatch, tmp_path, 坏摘要
|
||
):
|
||
工具 = 研究环境
|
||
来源 = _来源(工具)
|
||
登记 = 工具.装配.流程登记
|
||
原获取 = 登记.获取
|
||
|
||
def 旧获取(身份, 版本):
|
||
处理器 = 原获取(身份, 版本)
|
||
if 身份 == "rs.version":
|
||
return replace(处理器, 执行=lambda ctx: _旧版本登记(ctx, 坏摘要=坏摘要))
|
||
return 处理器
|
||
|
||
with monkeypatch.context() as m:
|
||
m.setattr(登记, "获取", 旧获取)
|
||
任务, 原任务 = _完成(工具, 来源, "旧分析")
|
||
with 工具.库.连接(只读=True) as 连:
|
||
assert 工具.服务.列出分析(连, "post-author", 来源["source_id"]) == []
|
||
查询 = 查询拆书状态(工具.装配, "post-author", 来源["source_id"])
|
||
assert 查询["台账"][0]["analysis_state"] == "history_not_imported" and 查询["分析"] == []
|
||
前任务数 = len(工具.装配.任务运行.列出任务("post-author"))
|
||
工具.装配.配置 = replace(
|
||
工具.装配.配置, HTTP=服务配置(str(tmp_path / "token-reference"), "post-author")
|
||
)
|
||
if 坏摘要:
|
||
with pytest.raises(Muse错误, match="旧登记摘要与完整结果不符"):
|
||
运行研究命令(工具.装配, "承接", 任务["task_id"])
|
||
with 工具.库.连接(只读=True) as 连:
|
||
assert 工具.服务.列出分析(连, "post-author", 来源["source_id"]) == []
|
||
else:
|
||
分析 = 运行研究命令(工具.装配, "承接", 任务["task_id"])
|
||
assert 分析["origin"] == "checkpoint_history"
|
||
assert 分析["payload"]["窗口结果"]["w001"]["entities"][0]["name"] == "旧分析"
|
||
assert 运行研究命令(工具.装配, "承接", 任务["task_id"]) == 分析
|
||
assert 运行研究命令(工具.装配, "分析", 任务["task_id"]) == 分析
|
||
assert 运行研究命令(工具.装配, "检查", 任务["task_id"])["分析"] == 分析
|
||
assert 工具.装配.任务运行.读取任务(任务["task_id"]) == 原任务
|
||
assert len(工具.装配.任务运行.列出任务("post-author")) == 前任务数
|
||
assert 工具.剧本 == [], "承接不重发模型调用,也不需要额外模型剧本"
|
||
|
||
|
||
@pytest.mark.case_id(
|
||
"NC-w21-214012",
|
||
environment="隔离PG及合成提供方,不访问真实资料或外部模型",
|
||
given="未完成任务、错误步骤及取消后的旧领取",
|
||
when="调用真实领域/CLI/迁移入口",
|
||
then=["历史承接/模型登记拒绝不合格状态,B03零结果"],
|
||
contract="docs/系统架构/新版设计/模块设计/B03-资料研究.md",
|
||
)
|
||
def test_历史承接拒绝未完成任务和非持有者写入__214012(研究环境):
|
||
工具 = 研究环境
|
||
来源 = _来源(工具)
|
||
任务 = 工具.发起(来源["source_id"])
|
||
with 工具.库.连接() as 连:
|
||
with pytest.raises(Muse错误, match="已完成"):
|
||
with 连.transaction():
|
||
资料服务().承接历史分析(连, 工具.装配.任务运行, "post-author", 任务["task_id"])
|
||
领取 = 工具.装配.任务运行.领取步骤("worker", 工具.环境["处理器能力"])
|
||
assert 领取 is not None
|
||
with 工具.库.连接() as 连:
|
||
with pytest.raises(Muse错误, match="只有分析登记步骤"):
|
||
with 连.transaction():
|
||
资料服务().登记模型分析(连, 工具.装配.任务运行, 领取)
|
||
工具.装配.任务运行.控制任务(
|
||
任务["task_id"], "post-author", 任务状态.运行中, "取消", 命令ID="cancel-analysis"
|
||
)
|
||
with 工具.库.连接() as 连:
|
||
with pytest.raises(Muse错误, match="任务已停止"):
|
||
with 连.transaction():
|
||
资料服务().登记模型分析(连, 工具.装配.任务运行, 领取)
|
||
with 工具.库.连接(只读=True) as 连:
|
||
assert 工具.服务.列出分析(连, "post-author", 来源["source_id"]) == []
|