Files
mini-openclaw-v2/docs/v2/17-batch-delivery-records.md
T
qiaoqichaoandClaude Code 01c88af501 docs(v2): 第二批交付记录与交接(历史经验加工)
按 16 §4 的五项口径(页面入口 / 操作步骤 / 实际结果 / 证据位置 / 剩余缺口)
填第二批,状态记**部分完成**:

- 后端闭环已接通并经真实执行链测试(提炼→候选治理→卡片进方案→运行可追溯);
- 本模块独立入口 /experience-center 已建,通过生产构建与新增源码守卫;
- 未闭合三项写清楚而不是含糊带过:真实模型提炼未实测(F17,需端点)、
  例外边界未进入可求值条件语言(F18)、卡片适用条件不参与运行内逐项判定(F19);
- 界面证据明确标注为"源码守卫 + 生产构建 + 代码走查",不是端到端点击证明。

验证:`test-evidence/20261001-003148-2e7e194/`(verify.py 12/12 PASS,全量 567 项)。
15 §7 交接同步更新:新增 F17/F18/F19,F13 标记为已由第一批关闭,F6 更新为 Q3–Q5。

Co-Authored-By: Claude Code <noreply@anthropic.com>
2026-10-01 00:33:50 +08:00

211 lines
14 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 四批交付记录
口径见 [16 交付纠偏规格](16-delivery-corrections.md) §4:每批必须列出**页面入口、操作步骤、
实际结果、证据位置、剩余缺口**;未接通项标"部分完成"。
---
## 第一批:接通正常预审执行链
状态:**部分完成**(执行链已接通并经真实运行验收;模型类技能已能跑完全程,见文末
「更正记录」;界面点击本身尚未由自动化驱动,材料确认步骤未在浏览器中完整走一遍)。
### 页面入口
| 入口 | 位置 |
|---|---|
| 发起预审 | `/xingbang-workbench?project=DEMO-B`「材料与问题」页 → 顶部"开始AI预审"按钮 |
| 查看结果与依据 | 同页「预审与推进沙盘」面板:主审意见、核查结果、核查维度(10)、每条"查看依据" |
### 操作步骤(实际执行)
1. 启动 v2:后端 `uvicorn app:app --port 8012`(带 `XINGBANG_DEMO_ROLE_LOGIN=1`)、
前端 `npm run dev -- -p 3212`。
2. 经前端代理发起预审(与页面按钮同一请求):
`POST /api/risk-agent/project-assistant/projects/DEMO-B/runs`,角色头 `manager`。
3. 等 worker 执行结束(轮询运行状态)。
4. 读取 `GET .../prescreen/projects/DEMO-B/runs/{run_id}`。
5. 浏览器打开工作台并渲染面板截图。
### 实际结果
- 运行结束状态 `partial`,视图 `recommendation=supplement`,`probability=null`。
- **维度 10 个**:5 已核查 / 2 待核实 / 3 存在阻断项;阶段 1–2
(`corporate.consistency`、`corporate.cashflow`、`corporate.assets`、`corporate.coverage`、
`skill-quality`、`skill-finance`、`skill-credit`、`demo.coverage`、`rules-corporate`、`corporate.analysis`)。
- **核查结果 4 条**(`lease.coverage.below_demo_threshold`、`lease.asset.duplicate`、
`financial.cashflow.missing`、`financial.liabilities.conflict`),各带依据与组件版本。
- **证据 14 条**随视图返回,界面"查看依据"可展开来源与定位。
- **未完成项 1 条**:`RUN_STEP_FAILED 金租对公业务综合核查:未配置受信模型,语义核查未执行`
——模型不可用时如实标未完成,不伪造结论。
- 缺证 2 项:`financial.operating_cashflow`、存在尚未人工确认的材料候选。
- 反复发起产生多条记录(本轮 3 条),旧记录仍可读;轨迹引用指向本次运行。
- 呈现判定:10 维超出雷达可读范围 → 界面改用分组列表并保留全部维度(AC-44 真实分支)。
### 证据位置
| 内容 | 位置 |
|---|---|
| 会话内验证日志 | 本轮运行输出(发起→轮询→读视图) |
| 端到端测试 | `backend/test_prescreen_from_run.py`(12 项,真实 enqueue + worker 执行) |
| 界面渲染 | `claude_use/tmp/v2-batch1-panel.png`(本机截图,未入库) |
| 全量验证 | `test-evidence/20260930-123451-0228966/`(`scripts/verify.py` 11/11 PASS,531 项单测) |
| 推送状态 | 已推送 `origin/main`:`f118721..c5edb40`;`git ls-remote origin main` 实测与本地 HEAD 一致 |
### 剩余缺口
- **界面点击未由自动化驱动**:本机无 playwright/puppeteer/chromium-cli,发起预审是通过
与页面按钮同一条代理请求完成的;"点按钮"这一步没有脚本化证据。
- **材料确认已走通(部分闭合)**:通过应用自己的入口补齐演示项目缺的字段——
`POST /documents` 上传按解析器键名书写的材料(`operating_cashflow: 1200`)→
项目待确认候选 → `POST /supplements` 带 `candidate_ids` 确认 →
`financial.operating_cashflow` 等 3 个字段生效(revision 5→6)。
**未闭合部分**:仍是接口调用而非浏览器点击。
- **演示角色需要 `XINGBANG_DEMO_ROLE_LOGIN=1`**:否则 worker 的 `authorized()` 会把
演示角色发起的运行判为"权限已撤销"(运行会失败但可读)。这是配置要求,需写入部署说明。
- **模型已接通并能跑完全程(2026-09-30 第二轮更正,见下方「更正记录」)**:配置 DeepSeek
(`XINGBANG_LOCAL_MODEL_*`)后,模型类技能 `corporate.analysis` 真实发起调用。
本轮首测仍报 `模型引用未知字段`——但**根因不是缺 `financial.operating_cashflow`**;
修复字段表三处缺陷后,模型跑完全程:工具调用 11 次 / 预算 18,降级记录为空。
- 取消中的运行不产出视图(只处理 completed/partial/failed)。
### 更正记录(2026-09-30 第二轮实测)
**更正**:本节原先记为"模型已接通,但预算不足",其归因有误。第二轮用真实模型复测后确认:
1. **`模型引用未知字段` 与缺 `financial.operating_cashflow` 无关。** "已定义但本次无值"的
字段,键仍然存在(`backend/services/assistant_materials.py` 的 `apply_candidate` 无条件建键),
不会触发该守卫;补这个字段因此不可能修好它。实测补件后(revision 2→4,缺证清零)报错照旧。
2. **真正被拒的是 `repayment.*`,进而是字段表的三处缺陷**:
- `backend/skills/financial-leasing-*/SKILL.md` 的 `inputs` 声明了 8 个 S1 标准字段表里
**不存在**的字段:还款来源、涉诉、增信、保证金、保险、客户名称;
- 字段守卫比对的是"当前恰好有值的字段",而非标准字段表,于是把"标准字段但本次无数据"
误判为未知字段——与提示词自身"缺失资料标 unknown"**自相矛盾**;
- 模型从未被告知允许使用的字段名,只能靠猜(实测先猜 `repayment.annual_amount`,
放开后改猜 `metrics.debt_ratio`)。
3. **工具预算不是约束**:跑通的那次实际只用了 **11 次**,原值 12 本就够用。
`max_tool_calls` 12→18、超时 120s→180s 保留作余量,但**不构成修复**。
**已修复(4 个文件)**:
| 文件 | 改动 |
|---|---|
| `backend/services/assistant_materials.py` | 补 8 个标准字段;`NUMERIC` 排除两个非数值字段;`legal.case_count` 加非负整数校验 |
| `backend/services/assistant_model.py` | 守卫改为比对标准字段表;向模型下发 `standard_fields`;提示词加字段约束;删除遮蔽模块级导入的局部导入 |
| `backend/services/project_assistant.py` | 补 `insurance.`→租赁物、`deposit.`→增信 维度前缀 |
| `backend/services/component_registry.py` | 方案预算与版本(`1.0.0`→`1.1.0`) |
字段表三处是代码层改动,**对既有数据库立即生效**;预算存放在冻结组件里,需走
`POST /components` 草稿 → publish 才对既有库生效。
**实测结果**(一次性临时库 + DeepSeek,演示库未改动):`corporate.analysis` 由 `failed`
变为 `partial`(部分结果为 `unknown`,属如实标注而非失败),降级记录为空,
核查结果 3 条 → 14 条。证据:`test-evidence/20260930-171301-962d425/`
(`scripts/verify.py` 11/11 PASS,531 项单测)。
**本轮新发现、尚未修复**:`skill-quality` 的完整性检查只遍历"已存在值的字段"
(`backend/services/skill_executor.py`),因此**从未提供过的字段永远不会被判为缺失**——
真实项目下"资料完整性"会漏报。建议单独立项,不并入本批。
---
## 运行环境配置(本地演示,2026-09-30 实测)
复现本记录需要以下环境变量。**密钥一律不入库、不写入任何文件**:本地演示用 shell 变量
展开传入,正式环境请用部署系统的密钥管理。
```bash
XINGBANG_DEMO_ROLE_LOGIN=1 # 演示角色发起运行必需,否则 worker 判"权限已撤销"
XINGBANG_LOCAL_MODEL_URL=https://api.deepseek.com/v1
XINGBANG_LOCAL_MODEL_NAME=deepseek-flash # 可换 deepseek-v4-pro(语义核查质量优先)
XINGBANG_LOCAL_MODEL_KEY=<你的 DeepSeek API Key>
# 后端启动前清空代理:实测直连 api.deepseek.com 可用(HTTP 200),
# 系统代理 127.0.0.1:7890 不可用(HTTP 000,与 AGENTS.md 记录的坑一致)
```
启动:`cd backend && venv/Scripts/python.exe -m uvicorn app:app --host 127.0.0.1 --port 8012`;
前端:`npm run dev -- -p 3212`,并设 `RISK_AGENT_BACKEND_URL=http://127.0.0.1:8012`(v2 隔离端口)。
---
## 第二批:完成历史经验加工流程
状态:**部分完成**。后端闭环(真实提炼入口 → 候选治理 → 卡片进方案并影响运行)已接通,
并经真实执行链测试;本模块页面入口已建并通过生产构建与源码守卫。
**未闭合**:① 真实模型提炼调用尚未实测(需要模型端点,见"剩余缺口");
② 界面点击未由自动化驱动(本机无浏览器自动化,沿用第一批 F11 口径)。
覆盖:AC-50/51/52、BR-48/49、E-28;页面入口部分覆盖 BR-50(三个入口中的第一个)。
### 页面入口
| 入口 | 位置 |
|---|---|
| 历史经验加工 | 顶部导航「历史经验加工」→ `/experience-center?project=<项目>` |
| 流程四段 | ① 来源:历史过程时间线 → ② 提炼:用真实模型生成候选 → ③ 候选:修订/评测/发布 → ④ 方案:让卡片影响核查 |
### 操作步骤(实现并按此验收)
1. 「从项目材料重建时间线」→ `POST /prescreen/projects/{id}/case-timeline`(确定性,不调用模型)。
2. 勾选来源事件、填写提炼要求 →「请求提炼」→ `POST .../knowledge-extractions`。
3. 候选卡上「自然语言修改适用范围」或「补充独立测试样本」→ `PATCH .../knowledge-candidates/{card_id}`。
4. 「隔离评测」→ 由**另一位**有发布资格的人「审核发布」→ `POST .../knowledge-candidates/{card_id}/transitions`。
5. 已发布卡「选入新方案」→「评测方案」→「发布方案」→ `POST .../review-plans` 与 `/review-plans/{id}/transitions`。
6. 在项目工作台用该方案发起预审;运行结果冻结并记录卡片版本。
### 实际结果
- **提炼(模型未配置)**:记录 `status=failed`,`candidate_id=null`,degradations 带
`EXTRACTION_UNAVAILABLE`,文案"本次未能完成经验提炼,请稍后重试或改为人工创建";
**提炼跑完后库里一张候选草稿都没有**(`test_experience_extraction` 的反例断言)。
这与第一批"模型不可用如实标未完成"同口径。
- **提炼(模型可用)**:以假传输层走真实 `agent_manager.invoke_scoped` 路径,
产出 `origin=history_derived` 且带来源事件 id 的 Skill 候选;记录保存
`prompt_version=history-extraction.v1` 与模型名,可核对"确实发起了调用"。
**真实模型调用未实测**(见剩余缺口)。
- **候选治理**:自然语言修订真的发起一次模型调用(测试断言调用次数为 1);
模型不可用时**拒绝且卡片一字未改**(比对修订前后 revision 与 conditions);
修订后仍为 `history_derived` 且保留来源、状态仍为 draft;已发布后修订升版本并记 `parent_version`。
- **卡片影响核查**:同项目两次运行对照——基座方案 `corporate.pre-review` 不含该卡片,
运行里没有该核查项;含卡片的新方案运行里出现 1 条 `history.repayment.dependency`,
其 `basis_ids=[skill.history.repayment@1.0.0]`,`component_versions` 含 `(卡片id, 1.0.0)`。
- **依赖门禁**:草稿卡片进方案时,发布被 409 拒绝;引用不存在组件时评测 `passed=false` 且发布被拒。
### 证据位置
| 内容 | 位置 |
|---|---|
| 提炼入口(15 项) | `backend/test_experience_extraction.py` |
| 候选治理与自然语言修订(15 项) | `backend/test_knowledge_governance.py` |
| 卡片 → 方案 → 运行(6 项) | `backend/test_card_to_run.py` |
| 界面源码守卫(新增) | `scripts/test_experience_center_ui.cjs`(已登记进 `scripts/verify.py`) |
| 全量验证 | `test-evidence/20261001-003148-2e7e194/`(`scripts/verify.py` **12/12 PASS**,含 `backend-unit` 全量 567 项、`frontend-build`、新增 `experience-center-ui` 守卫) |
### 剩余缺口
- **真实模型提炼未实测(P0)**:AC-50 的"若模型已配置则实际调用"需要一次真实调用证据。
本轮机器上没有设置 `XINGBANG_LOCAL_MODEL_*`,因此只交付了"不可用路径"与"假传输成功路径"。
实测方法:带 `XINGBANG_DEMO_ROLE_LOGIN=1` 与三个模型变量启动后端,再走上面步骤 2;
在此之前不得宣称"真实提炼已跑通"。
- **界面点击未由自动化驱动**:本机无 playwright/puppeteer/chromium-cli。界面证据是
"源码守卫 + 生产构建(`/experience-center` 6.08 kB)+ 代码走查",**不是**端到端点击证明;
本批的"页面入口/操作步骤"是按实现与接口核对写出的,不是浏览器截图。
- **例外边界未进入可求值条件语言**:注册表条件只支持数值阈值算子,`present/absent` 被既有断言
锁定拒绝,因此模型给出的例外保存为文本 `exception_note`,供专家修订,不作为可执行条件。
- **卡片适用条件不参与运行内逐项判定**:`conditions` 目前只用于域/范围/有效期过滤
(`knowledge_cards.effective()`);运行内条件求值需独立设计,不在本批冒充完成。
- **治理状态只实现 draft/published**:`in_review`/`rejected`/`withdrawn` 在注册表没有落地表达,
候选状态机因此只提供 `evaluate` 与 `publish`,不造一个假状态掩盖。
- **规则类(Rule)候选不在本批**:数值阈值与正式依据门禁(`_check_hard_basis`)需要单独设计,
本批只产出 Skill 类候选(可验证的缺件核查动作)。
- **顺带发现、未修**:`01-requirements.md` 的 E-18 写作 `HARD_RULE_BASIS_REQUIRED`,
但代码走的是 `ValueError` → 422 `INVALID_REQUEST`,错误码未对齐(既有问题,非本批引入)。
## 第三批:按已确认原型完成新版界面
状态:**未开始**。
## 第四批:接通评审反馈与改进发布
状态:**未开始**。