diff --git a/docs/v2/15-development-handoff.md b/docs/v2/15-development-handoff.md index 5042d10..b484848 100644 --- a/docs/v2/15-development-handoff.md +++ b/docs/v2/15-development-handoff.md @@ -105,45 +105,43 @@ docs/project-process/README.md、XINGBANG-ADAPTATION.md,执行 git status --sh > 交付定义与四批顺序以 [16 交付纠偏规格](16-delivery-corrections.md) 为准; > 下表的"已交付"只表示该任务包的代码与测试存在,不再表示产品功能可用。 -- 日期:2026-09-30(T08–T11 实施轮;前一轮 T00–T07 见 git 历史)。 +- 日期:2026-10-01(**纠偏第二批实施轮**;第一批见 git 历史,T08–T11 见更早提交)。 - 仓库:`F:/mini-OpenClaw-v2`;远程 `http://192.168.10.111:3000/qiaoqichao/mini-openclaw-v2.git` - (2026-09-30 新建并首次推送,OQ-06 Q2 的远程归属就此定案;端口/资源/CI 三问仍 open)。 -- 完成范围:**T08–T11 各自提交并跑通 `scripts/verify.py`**(11 项检查,含 6 项 UI 源码守卫)。 + (OQ-06 Q2 的远程归属已定案;端口/资源/CI 三问仍 open;**本轮未推送**)。 +- 完成范围:**纠偏第二批「历史经验加工」**——真实提炼入口、候选治理、 + 卡片进方案并影响运行,加本模块独立页面入口。`scripts/verify.py` **12 项检查**全通过 + (新增 `experience-center-ui` 源码守卫)。 - 验证入口:`cd F:/mini-OpenClaw-v2 && backend/venv/Scripts/python.exe scripts/verify.py`; - 逐次证据在 `test-evidence/<时间戳>-<短SHA>/`。 -- 测试规模:全量 519 项 unittest(T07 时 410 项),既有测试无回归。 -- 本轮提交: - - T08 专项离线质检 —— `501a4d9` - - T09 预审与推进沙盘 —— `22f8a37` - - T10 轨迹与会议结果复盘 —— `f2bbac0` - - T11 改进治理与演示交付 —— `d6bc848` -- 卡片验收对照: - - T08:AC-16/17/18/19/20/38/39/40/41(fixture 契约、逐任务逐用途准入、 - 冻结 checkpoint、上下文预算 E-25、中文否定与例外不硬选正面结果)。 - - T09:AC-11/12/29/30/31/42/44(模拟不改原运行、演示值只在 demo 域、 - 组合查表非加和、乱序丢弃与失败保基线、同刻度 3–8 维才画雷达、来源文字+图标)。 - - T10:AC-22/32/33(一个 run 多 step、失败保留、无可观察推理字段、成本未知留空、 - unmatched 单列、更正追加并引用旧版、回放只读)。 - - T11:AC-15/16/34/37/41(泄漏样本作废、零分母不填 0%、非独立评测不得声称改进、 - 没有对照不发布、自批拒绝、发布幂等且引用不可变版本)。 + 本轮证据:`test-evidence/20261001-003148-2e7e194/`(12/12 PASS)。 +- 测试规模:全量 **567 项** unittest(本批新增 36 项:提炼 15 / 候选治理 15 / 卡片到运行 6),既有测试无回归。 +- 本轮提交:`2e7e194` —— `feat(v2): 纠偏第二批——接通历史经验加工闭环`。 +- 卡片验收对照(详见 [17 四批交付记录](17-batch-delivery-records.md) 第二批): + - AC-50:真的调用模型才产候选;模型不可用 → E-28 且**候选数为 0** + (提炼跑完后复查库,而不是只看返回值)。 + - AC-51:自然语言修订真的发起一次模型调用;修订只产草稿、保留 origin 与来源、不自批; + 模型不可用时拒绝且卡片一字未改。 + - AC-52:同一项目两次运行对照——基座方案无该核查项,含卡片的方案有 1 条, + `basis_ids=[卡片id@1.0.0]`,`component_versions` 含卡片版本。 + - BR-50(部分):历史经验加工获得独立入口 `/experience-center`;另两个入口与深色导航属第三批。 - 未决项(阻塞后续): - - **F8** Docker 运行时冒烟未实测(本机 Docker Desktop 守护进程不可达) - - **F11** 界面仍未经浏览器验证:T09 面板只有类型检查、构建与源码守卫三层证据 - - **F7** 各卡门禁仍 `proposed`,审阅者未指派——用户授权不等于评审通过 - - **F6** OQ-06 Q2–Q5:远程归属已定(`origin/main`,见上);**端口冲突核验、运行资源、 - Gitea CI 是否启用仍 open** - - **F12** 主审自身的模型调用仍走既有 `assistant_model`,冻结口径未统一 - - **F13** 运行写入方缺位:`prescreen_run` 视图目前由测试写入, - 真正的执行链路(把装配结果落库)属 T07/T10 执行侧,尚未接线 - - **F14** 轨迹写入仍是既有 `DurableWorker.save_step`,因此暂无 judgment/rule - 类步骤的产出方;会议标签映射(E-26)未实现 - - **F15** 改进发布只委托注入的 publisher;与 `knowledge_cards.publish` - 的实际接线未做(发布幂等与版本引用已由测试覆盖) - - **F16** 沙盘的假设动作登记表(ASSUMPTIONS)是 P0 固定两项, - 方案级动作清单仍待 T06 方案装配产出 -- 下一任务:**T12(可选)Jev 与实时专项**需要端点与凭据;无凭据时先做 - **收口评审**(F7 审阅者签署、F8/F11 补验证),不要为了推进而把演示当验收。 -- 待输入:真实数据/制度/会议标签映射与客户身份权限(M5/M6);Laya 硬件与中文 - 效果需实机探测;Jev 端点与凭据。 -- Git:本轮已推送 `origin/main`;核对命令 `git ls-remote origin main`,返回 SHA 与本地 - HEAD 一致(`b6f1e80`)。推送后仍不得从旧恢复点 4d5a420 推断最新版本已备份。 + - **F17(新)真实模型提炼未实测**:本机未设置 `XINGBANG_LOCAL_MODEL_*`, + AC-50 前半句目前只有"不可用路径 + 假传输成功路径"两类证据。 + 需端点后按 17 的操作步骤补一次真实调用;在此之前不得宣称"真实提炼已跑通"。 + - **F18(新)例外边界未进入可求值条件语言**:注册表条件只支持数值阈值算子 + (`present/absent` 被既有断言锁定拒绝),模型给出的例外保存为文本 `exception_note`。 + - **F19(新)卡片适用条件不参与运行内逐项判定**:只用于域/范围/有效期过滤 + (`knowledge_cards.effective()`);运行内条件求值需独立设计。 + - **F11** 界面仍未经浏览器验证:新增的 `/experience-center` 同样只有源码守卫与 + 生产构建两层证据(本机无 playwright/puppeteer/chromium)。 + - **F7** 各卡门禁仍 `proposed`,审阅者未指派——用户授权不等于评审通过。 + - **F8** Docker 运行时冒烟未实测(本机 Docker Desktop 守护进程不可达)。 + - **F6** OQ-06 Q3–Q5:端口冲突核验、运行资源、Gitea CI 是否启用仍 open。 + - **F12/F13/F14/F16** 仍有效(F13 已由第一批关闭:运行视图改由执行链出口产生)。 + - **F15** 改进发布仍未接真实知识发布入口,属**第三/四批**范围。 +- 下一任务:**第三批「按已确认原型完成新版界面」**(深色导航 + 三入口 + AC-53/54/55); + 或先补 **F17**(需要你提供模型端点与调用时机)。不要为了推进而把演示当验收。 +- 待输入:模型端点与调用时机(F17);真实数据/制度/会议标签映射与客户身份权限(M5/M6); + Laya 硬件与中文效果需实机探测;Jev 端点与凭据。 +- Git:本轮提交在 `codex/xingbang-v2-model-field-fix` 分支,**尚未推送**; + 核对命令 `git log --oneline -3`(当前 HEAD `2e7e194`)。 + 不得从旧恢复点 4d5a420 推断最新版本已备份。 diff --git a/docs/v2/17-batch-delivery-records.md b/docs/v2/17-batch-delivery-records.md index 8230483..638e368 100644 --- a/docs/v2/17-batch-delivery-records.md +++ b/docs/v2/17-batch-delivery-records.md @@ -130,7 +130,76 @@ XINGBANG_LOCAL_MODEL_KEY=<你的 DeepSeek API Key> ## 第二批:完成历史经验加工流程 -状态:**未开始**。 +状态:**部分完成**。后端闭环(真实提炼入口 → 候选治理 → 卡片进方案并影响运行)已接通, +并经真实执行链测试;本模块页面入口已建并通过生产构建与源码守卫。 +**未闭合**:① 真实模型提炼调用尚未实测(需要模型端点,见"剩余缺口"); +② 界面点击未由自动化驱动(本机无浏览器自动化,沿用第一批 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`,错误码未对齐(既有问题,非本批引入)。 ## 第三批:按已确认原型完成新版界面