 qiaoqichaoandClaude Code
|
27d57c9227
|
feat(v2): T07-b 专项 disabled 路径与工具策略守卫
T07 第二块。本批**只做 disabled 路径**(T07 卡片要求"先 disabled 专项路径"),
真正的 Jev/本地适配器属 T08,不预造。
新增契约:JudgmentAnswer(可辨识联合,score 必须有限数值)、NativeMetric、
Judgment、JudgmentConfig。契约层硬约束:disabled 不得产出 completed;
关闭专项必须记录原因且不得冻结任何配置修订。
ErrorCode 补齐 E-06/E-13/E-14/E-15/E-08/E-10,并**区分两类编码**:
- 请求级(有 HTTP 语义,进 S1_ERROR_HTTP):含新增 JUDGMENT_CONFIG_INVALID 422、
EGRESS_NOT_APPROVED 403
- 运行级(RUN_LEVEL_CODES,只出现在运行体 degradations/judgment 里):
JUDGMENT_UNAVAILABLE / CAPABILITY_UNSUPPORTED / OUTPUT_INVALID / RUN_BUDGET_EXCEEDED
不再把假的 HTTP 200 塞进错误映射;两者互斥且并集等于枚举,有测试锁定。
新增 services/judgment_provider.py:
- resolve_config():关闭时记原因、不冻结配置;开关 false 却传 ID 属 E-07;
无可用配置时明确报 E-13 而非悄悄关闭;未验证/提供方不符均拒绝
- judge():disabled → skipped+disabled;缺证**不发起调用**直接 completed+unknown;
超时/异常 → failed+E-06;题型不符 → skipped+unsupported(E-14);
题型对但内容非法 → failed+E-15。失败一律 answer 为空,**不补默认分值**
- allowed_tools():工具 = Skill 声明 ∩ 注册表白名单,**取交不取并**;材料正文里
写什么都无法扩展权限(AC-10,有反例测试)
测试:新增 test_judgment_provider.py 22 项。全量 390 项 OK(368 → 390);
verify.py 10/10 PASS。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-29 20:33:36 +08:00 |
|
 qiaoqichaoandClaude Code
|
c59fff68d3
|
feat(v2): S1 存储层——材料导入批次与事实冲突检测
T02 第二个子卡。复用 assistant_objects(新 kind),**未新建表**;旧库结构不变。
新增服务:
- services/material_import.py 批次生命周期:create/load/listing/mark_item/
retry/cancel;状态由逐项状态派生(ready/partial/failed/parsing)
- services/fact_conflict.py 冲突检测/阻断/裁定;FactConflictUnresolved(E-17)
解决的**真实缺口**(BR-23 / AC-24):既有 apply_candidate 对 values/facts 是
后写覆盖,sources 虽累积多来源但无人检测分歧、无人阻断。本层在**新路径**前置
检测:冲突时证据仍入 sources(BR-22 留痕)但值不采用(BR-23),已确认值不被覆盖。
增量改动(均为可加性,未改既有语义与调用方行为):
- assistant_store.py:新增 idempotent_lookup / idempotent_remember 共享 helper。
既有 enqueue 与 create_report 的内联实现**未改写**。用 INSERT OR REPLACE 而非
裸 INSERT:重试路径上裸 INSERT 会抛 sqlite3.IntegrityError(非 Conflict,
translate() 无法映射为 409)。
- assistant_materials.apply_candidate 新增 adopt=True 形参。adopt=False 只记证据
不改值;既有调用方不传参,行为完全不变(有回归测试)。
设计决定:
- T00/04 曾提 3 个 kind;实现时发现契约中 ImportItem 无 revision 且内嵌于批次,
items 是值对象,故收敛为 2 个 kind(import_batch / fact_conflict)
- E-17 有两个面:确认动作被拒 = 422;运行级结果 = HTTP 200 且冲突存于
degradations。契约映射与注释均已写明,并有测试锁定
测试:新增 test_prescreen_storage.py(33 项)。全量 196 项 OK(124 → 196)。
scripts/verify.py 9/9 PASS(exit 0)。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-29 14:49:03 +08:00 |
|
 qiaoqichaoandClaude Code
|
d8a7d3858c
|
feat(v2): 新增 S1 契约层(材料集合导入与事实确认)
T02 首个子卡 = S1 契约层。新增 backend/contracts/prescreen.py(设计指定的
唯一 owner),定义 SourceLocator / ImportItem / ImportBatch / FactConflict
与共用约束、错误码与错误信封。
落实的规格条目:
- BR-22 逐文件保留来源/定位/解析版本与状态
- BR-23 多来源冲突保留候选并要求显式处理(resolved 需说明+选择+人)
- AC-23 反例:绝对路径(C:/、/、//share)、上级引用(..)、超限、空集合、
failed 缺 error_code、parsed 缺 document_id、parsed 带 error_code
- AC-24 反例:候选值全同不构成冲突;未知用 null 而非 0/空串;
candidates 必须与 candidate_evidence_ids 同序同集合
- 01 §5 错误码与既有 translate() 的 HTTP 语义对齐;E-17 为运行级、HTTP 200
- 03 §9.1 时间必须带时区;禁止未知字段(E-07)
D3 定案(工程限制,非业务阈值):单文件 ≤10 MiB 沿用既有 LIMIT;单批
≤20 文件 / ≤20 MiB。依据 03 §1 末「管理员只能降低初期限制,放宽须重新验证」,
取保守方向即规格许可;放宽需另立验证。
依赖方向:contracts 不导入 services,标准字段白名单校验留在 service 层。
测试:新增 test_prescreen_contracts.py 38 项,全绿;scripts/verify.py 9/9 PASS。
Co-Authored-By: Claude Code <noreply@anthropic.com>
|
2026-09-29 14:20:39 +08:00 |
|