feat(check): 文件要在、扫描件兜底(C10);响应方式存进清单并可改(C12)

- check/presence.py:「提供《授权委托书》」「须提交投标函」这类要求按标题里有没有这个文件名判断,不调模型。
- 扫描件兜底:要附证明材料的要求没找到、投标文件里有扫描件页时,改为提示级「可能在扫描件里,请人工核对」。
- 响应方式解析时识别、带依据句子存进 checklist.response_modes(迁移 0008);清单页显示、可改(写审计,
  重新解析不覆盖人工改过的);查标用存下来的。新接口 PUT /projects/{id}/checklist/response-modes/{category}。
- check_item_result.layer 加 presence(迁移 0007);契约同步默认接受的两种结论。

开发集 17 份:规矩投标文件的致命问题 120 → 51,致命级召回不变(22 / 32)(docs/architecture/check-eval.md §5)。

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
YANG JIANKUAN
2026-11-04 15:53:45 +08:00
parent cb0c2fcafe
commit 47c6a1258e
21 changed files with 529 additions and 24 deletions

View File

@@ -826,6 +826,26 @@ export interface paths {
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist/response-modes/{category}": {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
category: "technical" | "commercial";
};
cookie?: never;
};
get?: never;
/** 改招标文件某一类要求的响应方式(C12 的人工确认点) */
put: operations["setResponseMode"];
post?: never;
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/projects/{project_id}/checklist/versions": {
parameters: {
query?: never;
@@ -1783,6 +1803,8 @@ export interface components {
citation: components["schemas"]["Citation"];
};
Checklist: {
/** @description 招标文件对技术、商务要求的响应方式(C12)。识别出来的(origin = rule)可以改(origin = human,人工确认点);查标按它判没找到响应算不算问题 */
response_modes?: components["schemas"]["ResponseMode"][];
/** @enum {string} */
status: "draft" | "confirmed";
/** @description 最近一次确认的版本号;没确认过为 0 */
@@ -2059,21 +2081,41 @@ export interface components {
resolved_by?: components["schemas"]["UserRef"] | null;
resolved_at?: components["schemas"]["Timestamp"] | null;
};
ResponseMode: {
/** @enum {string} */
category: "technical" | "commercial";
/**
* @description 逐条响应 / 默认接受(只列偏离)
* @enum {string}
*/
mode: "explicit" | "implicit";
/**
* @description 写明了 / 两处写法冲突(按逐条处理)/ 没写明(按逐条处理)
* @enum {string}
*/
status: "found" | "conflict" | "unknown";
/** @enum {string} */
origin: "rule" | "human";
citations: components["schemas"]["Citation"][];
set_by?: components["schemas"]["UserRef"] | null;
set_at?: components["schemas"]["Timestamp"] | null;
};
CheckItemResult: {
checklist_item_id: components["schemas"]["Id"];
title?: string | null;
/**
* @description 已响应 / 未找到 / 负偏离未说明 / 疑似不满足 / 未给出具体值 / 未判定(模型漏答或暂时不可用)/ 扫描件请人工核对。
* @description 已响应 / 未找到 / 负偏离未说明 / 疑似不满足 / 未给出具体值 / 未判定(模型漏答或暂时不可用)/ 扫描件请人工核对 /
* 按招标文件默认接受(未列入偏离表的视为接受,不出问题)/ 默认接受的实质性要求、请人工核对(C12)。
* 没有校验通过的投标侧证据,不会是 responded(架构 §3.6)
*
* @enum {string}
*/
verdict: "responded" | "not_found" | "negative_deviation" | "suspected_unmet" | "no_value" | "undetermined" | "scanned";
verdict: "responded" | "not_found" | "negative_deviation" | "suspected_unmet" | "no_value" | "undetermined" | "scanned" | "implicit_accepted" | "implicit_review";
/**
* @description 结论来自哪一层(m3-plan §2.1)
* @description 结论来自哪一层(m3-plan §2.1;presence 是按文件在不在判断)
* @enum {string}
*/
layer: "deviation_table" | "rule_compare" | "model" | "retrieval";
layer: "deviation_table" | "rule_compare" | "model" | "retrieval" | "presence";
/** @enum {string} */
evidence_status: "verified" | "unverified" | "none";
/** @description 证据没通过、漏答、模型错误等的原因码 */
@@ -3820,6 +3862,37 @@ export interface operations {
};
};
};
setResponseMode: {
parameters: {
query?: never;
header?: never;
path: {
project_id: components["parameters"]["ProjectId"];
category: "technical" | "commercial";
};
cookie?: never;
};
requestBody: {
content: {
"application/json": {
/** @enum {string} */
mode: "explicit" | "implicit";
};
};
};
responses: {
/** @description 返回清单概况 */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["Checklist"];
};
};
409: components["responses"]["ProjectReadOnly"];
};
};
listChecklistVersions: {
parameters: {
query?: never;