feat(v2): T08 专项离线质检——统一适配 fixture、逐任务准入与预算守卫
覆盖 AC-16/17/18/19/20/38/39/40/41(BR-17/18/19/20/37/38/39、E-10/13/14/15/25)。 新增: - backend/contracts/judgment.py:JudgeProfile/TaskValidation 契约(逐任务逐用途 验收登记 + 冻结 checkpoint)。放在独立契约模块,因为规格要求的 tokenizer/预算 字段会撞上 prescreen.py 既有的"契约层不得出现凭据字样"静态守卫;不放宽该守卫。 - backend/services/judgment_adapters.py:统一适配入口。准入(未登记任务/用途拒绝、 runtime 须独立评测)、冻结权重(unresolved 与不一致均拒绝)、上下文预算 (正文与选项分开计,超限返回 E-25 且零发送)、中文否定/条件例外/来源矛盾/未登记 映射一律落 unknown(inconclusive),不硬选正面结果。 - backend/fixtures/judgment/:中文提炼依据题集、本地模型原始输出、Jev 厂商响应 fixture(虚构内容,离线契约用)。 - backend/test_judgment_adapters.py:30 项测试。 修改(最小面): - contracts/prescreen.py:新增 E-25 运行级错误码 JUDGMENT_CONTEXT_EXCEEDED; Judgment 增 actual_checkpoint_ref、JudgmentConfig 增 checkpoint_ref。 - services/judgment_provider.py:映射适配层的策略拒绝异常;归一化保留实际权重。 未做(受授权限制):没有 Jev 凭据与 Laya 权重,因此只交付离线 fixture 路径, live 传输层仅留注入点,未接入硬件与端口探测。fixture 通过不证明中文效果合格。 验证:backend 全量 unittest 440 项 OK(原 410 项无回归)。 Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
@@ -110,6 +110,8 @@ class ErrorCode(StrEnum):
|
||||
JUDGMENT_UNAVAILABLE = "JUDGMENT_UNAVAILABLE"
|
||||
JUDGMENT_CAPABILITY_UNSUPPORTED = "JUDGMENT_CAPABILITY_UNSUPPORTED"
|
||||
JUDGMENT_OUTPUT_INVALID = "JUDGMENT_OUTPUT_INVALID"
|
||||
# E-25:输入超出模型已验证预算(BR-39 / AC-40)。T08 适配层使用。
|
||||
JUDGMENT_CONTEXT_EXCEEDED = "JUDGMENT_CONTEXT_EXCEEDED"
|
||||
RUN_BUDGET_EXCEEDED = "RUN_BUDGET_EXCEEDED"
|
||||
|
||||
|
||||
@@ -139,6 +141,7 @@ RUN_LEVEL_CODES = frozenset({
|
||||
ErrorCode.JUDGMENT_UNAVAILABLE,
|
||||
ErrorCode.JUDGMENT_CAPABILITY_UNSUPPORTED,
|
||||
ErrorCode.JUDGMENT_OUTPUT_INVALID,
|
||||
ErrorCode.JUDGMENT_CONTEXT_EXCEEDED,
|
||||
ErrorCode.RUN_BUDGET_EXCEEDED,
|
||||
})
|
||||
|
||||
@@ -703,6 +706,8 @@ class Judgment(Contract):
|
||||
native_metrics: list[NativeMetric] = Field(default_factory=list, max_length=32)
|
||||
error_code: ErrorCode | None = None
|
||||
skip_reason: Literal["disabled", "not_configured", "not_authorized", "unsupported"] | None = None
|
||||
# 本次实际使用的权重修订(T08,AC-39):与冻结值不符即拒绝,不做隐式路由。
|
||||
actual_checkpoint_ref: str | None = Field(default=None, max_length=ID_MAX)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def _check_status_consistency(self) -> Judgment:
|
||||
@@ -739,6 +744,8 @@ class JudgmentConfig(Contract):
|
||||
prompt_version: str | None = Field(default=None, max_length=ID_MAX)
|
||||
mapping_version: str | None = Field(default=None, max_length=ID_MAX)
|
||||
disabled_reason: str | None = Field(default=None, max_length=DESC_MAX)
|
||||
# T08:local 必须固定权重修订与摘要;不可得时为 "unresolved"(11 §8.1)。
|
||||
checkpoint_ref: str | None = Field(default=None, max_length=ID_MAX)
|
||||
|
||||
@model_validator(mode="after")
|
||||
def _check_freeze(self) -> JudgmentConfig:
|
||||
@@ -757,6 +764,7 @@ class JudgmentConfig(Contract):
|
||||
return self
|
||||
|
||||
|
||||
|
||||
# ---------------------------------------------------------------- 预审运行(T07-c)
|
||||
class Degradation(Contract):
|
||||
"""降级记录:未完成的检查必须留痕,不能静默(BR-09)。"""
|
||||
|
||||
Reference in New Issue
Block a user