You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

204 lines
23 KiB

17 hours ago
# 客户模块第二轮 E2E 验收报告(e2e-report-v2.md 终稿)
> **票 06 聚合产出**(2026-09-06)· 聚合自票 01 套件改写(`matrix-r2.md` / `calls-r2.json`)+ 票 02 增量套件(`e2e-incr-checks.json` / `calls-incr.json`)+ 票 04 起服全量执行(三套件 checks/specimens/log)+ 票 05 UI 扩展冒烟(`demo-smoke-r2-result.json`)。
> **代码基线**:客户模块返工后源码(jar 为 2026-09-05 22:29 全量重建产物,本 effort 未改后端源码);**契约权威**:`.scratch/customer-module/API-SUMMARY.md`(73 端点)+ Controller 扫描基准 `dump_api_out.txt`(105 端点全平台)。
> **环境**:本地后端 `localhost:8080`(verify profile,corretto-17,`CRM_MINIO_AK/SK`)+ 远程共享库 `8.129.84.155`;debug token `GET /api/auth/debug/token?userId=`。
> **数据基线**:round-1 seed 17 客户 `e2c-`(KH202609030006-0022)维持复用;增量夹具 `e2c-r2i-A/B` 幂等自清理;UI 夹具 `e2c-r2demo-浏览器-*` 正门 archive。
> **判定纪律**(沿用 round-1):原型 > spec > 问用户;缺陷只测不修(D-xx 预期失败 warn 不阻断、不重复排查);判 ❌ 前必须核对 Controller 实际 flat 路径;孤立 401 先重试再判缺陷。
> **图例**:✅ 存在且业务可用|⚠ 行为不符/契约差异/被缺陷阻断/取证型断言|❌ 缺失或真实 bug(r2 全部 ❌ 经取证归因用例侧,见 §二 F-15 与 §三 I-04)。
---
## 一、执行摘要(round-1 → r2 总对照)
| 维度 | round-1(2026-09-04) | r2(2026-09-05/06) | delta 定性 |
|------|------|------|------|
| API 用例 | 170(core 112 + heavy 58):✅164 ⚠6 ❌0 | **233(core 112 + heavy 58 + incr 63):✅221 ⚠9 ❌3** | 用例 +63(增量套件);⚠ +3(D-02/03 复现口径不变 + 2 条取证型);❌ +3 **全部归因用例侧,产品回归 0** |
| core F-01..F-12 | 112 例 ✅110 ⚠2(D-03/D-02) | ✅109 ⚠3 ❌0(D-03/D-02 复现 + F-01 数据态 1 条) | 结论维持;D-01 复验转绿 |
| heavy F-13..F-16 | 58 例 ✅54 ⚠4(D-07/D-05/D-04 连锁) | ✅52 ⚠4 ❌2(D-07/D-05 复现 + F-15 改写偏差 ×2) | 缺陷模式全复现;F-15 ❌ 为用例侧(DB 取证 Job 行为与 r1 一致) |
| 增量 I-01..I-07 | —(端点未存在) | 63 例 ✅60 ⚠2 ❌1(I-04 空 ids 分支盲区) | 返工新增端点族首测,10 端点全覆盖,新缺陷 0 |
| UI 冒烟 | demo_selftest 31 步全 PASS(旧契约) | demo_smoke_r2 **20 步全 PASS 首轮一次过**(console=0 / page=0 / 57 请求零旧契约形态) | 基线收敛为 11 步 + 详情页签 + 四新入口块 |
| 端点覆盖 | 55 端点(客户域内 54) | **客户域 64/73**(core+heavy 54 + incr 新增 10);未覆盖 9 维持项 | +10 = 返工新增端点全量(agreement×5 / dedup×2 / view-form×2 / batch-update) |
| 缺陷台账 | D-01..D-07 有效 6(D-01 已修) | **新缺陷 0**;D-01 转绿兑现;D-02/03/05/07 复现;D-08 预留未触发;D-05 家族 UPDATE 路径新证据 | 台账刷新见 §五 |
| Bruno/API-SUMMARY | 57 .bru 交付 + verify_a4 PASS | **只对账不重构**;漂移观察位 3 项实证收敛,处置见 §六 | 小漂移 2 处已 patch API-SUMMARY(记档式) |
**执行与耗时**:core 23.7s(首轮 ❌2 数据态修复后复跑全绿)→ heavy ~7.5min(六轮全跑,fog「执行深度」票 04 现场定案)→ incr 19.8s;UI 冒烟独立起服一轮过。
**结论**:返工后契约上**无产品回归**;round-1 五条有效缺陷(D-02/03/04/05/07)全部按预期复现、零恶化;返工新增能力(战略协议/查重设置/批量工商/F8 策略/confirmSimilar/viewTouch/形态偏好)在 API 与 UI 两层全部验证通过。❌3 与 ⚠ 中 2 条取证型均为测试资产质量问题,定性见各节,不阻断收官。
---
## 二、API 全量回归 delta(core F-01..F-12 / heavy F-13..F-16)
### 2.1 core 逐流程对照(r2:✅109 ⚠3 ❌0 | 23.7s)
| 流程 | 用例 | r1 | r2 | delta 说明 |
|---|---|---|---|---|
| F-01 三 workspace 列表 | 12 | ✅ | ⚠1 | **唯一新增 ⚠**:`customerStage=2` 精确过滤命中含 5 家非 seed 公司客户(共享库数据态演化,断言按 seed 名单精确比对不再成立)——行为正确,fog ③ 收敛定案「非文档项」,仅记档 |
| F-02 看板三分组 | 7 | ✅ | ✅ | 维持(stage/star/relation 三列齐、summary 与 page 自洽、越界静默) |
| F-03 saved-view | 10 | ✅ | ✅ | 维持(三 scope 隔离、JSON 例外端点、set-default/delete) |
| F-04 新增+三层查重 | 9 | ✅ | ✅ | 维持(L1/L2 needConfirm/L3 67003;快创 confirmSimilar 主链在此流程) |
| F-05 编辑 | 5 | ⚠ D-03 | ⚠ D-03 | **复现维持**:缺 version 实回 67001(spec 约定 67005);CAS 正常路径 ✅ |
| F-06 联系人 | 9 | ✅ | ✅ | 维持(形态改 POST 动词后 create/edit/delete/page/search/check-phone 全通) |
| F-07 详情头部+页签 | 8 | ✅ | ✅ | **D-01 复验转绿兑现**(交割-甲 opportunityCount==1);汇总卡 5 字段恒 null 维持(占位契约,§5.3 预登记);oplog 值域 17 种白名单通过 |
| F-08 跟进 | 12 | ⚠ D-02 | ⚠ D-02 | **复现维持**:过期 nextFollowTime 未拦(应 67009);append-only 探测改打未注册 `follow/edit` 端点断言非 0(语义等价强化) |
| F-09 关注/重点 | 7 | ✅ | ✅ | 维持(focus 族扁平化后幂等/置位/视图命中全通) |
| F-10 团队成员 | 10 | ✅ | ✅ | 维持(`roleType`→`role` 显式断言 OWNER/COLLABORATOR 替代 r1 探测式) |
| F-11 归属动作 | 17 | ✅ | ✅ | 维持(Ownership 族同形不改;archive-batch 整批预检语义不变) |
| F-12 商机侧硬依赖 | 7 | ✅ | ✅ | **翻转①**:r1 §5.①「confirmSimilar 无解」销号——needConfirm 后带 `confirmSimilar=true` 重发落库回新 id(返工票 04 透传);search 三维/excludeCustomerIds/contacts 带出维持 |
### 2.2 heavy 逐流程对照(r2:✅52 ⚠4 ❌2 | ~7.5min 六轮全跑)
| 流程 | 用例 | r1 | r2 | delta 说明 |
|---|---|---|---|---|
| F-13 客户交割 | 18 | ✅(⚠ D-07) | ✅17 ⚠1 | **D-07 复现维持**(assignable 30s×2 稳定超时;assign 本体不受影响);preview 圈定/initiate/D22/D23/整批原子/续号全维持。⚠ **套件副作用盲区沉淀**:F-13 交割圈定 BUDDY 名下全量且 teardown 不还原——复跑必漂移 collab owner(本轮两次还原,UI 冒烟按此解耦) |
| F-14 客户导入 | 14 | 10✅ 4⚠ | ✅11 ⚠3 | **D-05+D-04 连锁复现维持**(终态 FAILED / 失败明细 0 行 / r2 行未更新三 warn,缺陷验证模式);r2 文件纯 UPDATE 行的 UPDATE_ONLY 路径正常(F-8 策略变体移交增量套件 I-07) |
| F-15 提醒规则族 | 11 | ✅11 | ✅9 ❌2 | **r1 全绿 → r2 两 ❌,经取证归因用例侧**:票 01 改写把「升级链每轮补下一条」断言收窄成「恰好 1 条」,实跑 5 条判 ❌;DB 取证(`evidence-f15-t04.py`)5 条 remindSeq 0..4 连续、plan 逐日递进无重复、终被锚点刷新置失效——**Job 行为与 r1 观测完全一致,非产品回归**。GET/save/64023/缺省开关/落表字段等 9 例维持 ✅ |
| F-16 查重消费侧 | 7 | ✅7 | ✅7 | **翻转②**:r1「单例未落地(customer_dedup_rule 表不存在)」→ r2 单例已落地(RuleBackedCustomerDedupSettingProvider @Primary),F-16.5 前提更新;check 族/创建硬拦/needConfirm 全维持 |
### 2.3 结论翻转清单(round-1 报告记载 → r2 实测)
| # | round-1 记载 | r2 实测 | 载体 |
|---|---|---|---|
| 1 | §5.① confirmSimilar 缺口:快创遇相似名无解 | **销号**:透传落库(返工票 04 修复,断言翻转) | core F-12 |
| 2 | §5.② 查重设置无对外端点、单例未落地 | **销号**:dedup get/save 端点实测 + 单例 @Primary 生效 + demo 设置面板 | I-03 / F-16 / UI 步 14-15/20 |
| 3 | oplog 值域 11 种 | **扩为 17 种**(CONTACT_*3 + AGREEMENT_*3 入域),17 种白名单断言通过 | core F-07 / I-02 |
| 4 | D-05 未知面:「导入对新增场景事实不可用」 | **收窄**:INSERT 路径必败维持,**UPDATE 路径实测正常**(I-07 两策略执行面 DONE + DB 断言,D-08 未触发) | heavy F-14 / incr I-07 |
### 2.4 维持清单(要点)
- 五条有效缺陷 D-02/D-03/D-04/D-05/D-07 全部复现,证据在案(§五),无恶化、无新分支表现。
- 汇总卡 5 字段恒 null(wonProjectAmount/planEstimateAmount/ongoingOpportunityAmount/contractAmount/paidAmount)维持占位契约;projectCount 恒 null(A5 seam)。
- round-1 核心契约发现 12 条(Long→String 序列化、board 计数字段 `cnt`、ISO `T` 分隔、edit 全量覆盖+CAS、archive-batch 整批预检、PageResult `content` 等)在 r2 扁平契约下全部复验成立,无新增契约形态偏差。
- 范围外划出项维持(三档脱敏/客户导出/联系人子表导入/合并客户——沿返工图划出)。
---
## 三、增量端点族 I-01..I-07(返工新增端点首测,票 02 产物)
独立 `e2e-incr.py`(620 行,SETUP + I-01..I-07 + TEARDOWN,夹具 `e2c-r2i-A/B` 幂等,自带 teardown 清扫 → `e2c-r2i-*` 零残留)。**63 例 ✅60 ⚠2 ❌1(19.8s),defects 空,新缺陷 0**。
| 流程 | 覆盖端点 | verdict | 要点 |
|---|---|---|---|
| I-01 战略协议全链 | agreement create/list/detail/edit/delete(5) | ✅(⚠1) | 全链 + DB 快照 2→3→NULL + **归属不可换**(edit 带 customerId 被忽略)+ 负例 67001/67002(防探测同码)/67017×5;⚠1 = oplog 等级文案「新增战略协议【二级】」**取证型断言**(设计即 warn,捕获留档) |
| I-02 联系人 oplog | oplog/page(复用) | ✅ | CONTACT_ADD/EDIT/DELETE + AGREEMENT×3 六动作齐现 + 17 种值域对账 + `action=` 过滤生效 |
| I-03 查重设置 | dedup get/save(2) | ✅ | save 响应即保存后单例 + 回读 + **缺省语义三连**(开关→0 / 方式→模糊 / 阈值→**出厂 80 非静默保留**)+ 64023 越界×3 + 校验失败不落库 + 原值还原 |
| I-04 批量工商 | company-lookup/batch-update(1) | ✅+**❌1** | NO_HIT×2 + filledFields=0 档案全等(只补空缺空转证据)+ 幽灵行 NOT_FOUND + 101 ids→67001(上限先于 distinct);**❌1 = 用例侧分支盲区**:空 ids 实回**全局码 40001**「缺少必填参数:ids」(`@RequestParam` required,HTTP 400),用例只预设 67001/HTTP400 二分支——拒绝行为合理,§2.2 对账处置见 §六 |
| I-05 viewTouch | detail-head(复用) | ✅ | `customer_view_log` 首访插入→再访 upsert 仍 1 行 + last_view_time 刷新 + BUDDY 独立行(user 维度隔离)+ 自清 |
| I-06 形态偏好 | view-form get/save(2) | ✅+⚠1 | save→get 两跳回读 + 跨用户隔离 + 非法值 68001;**⚠1 = pool·board 契约漂移探测兑现**(§2.14 称公海 board 被拒 680xx,实现白名单无 pool 特判实回 code=0)——漂移非缺陷,处置见 §六 |
| I-07 导入 F8 | import upload/confirm/result(复用+新参) | ✅ | SKIP 回显 + 文件内重复组不写入(u=0);OVERWRITE 回显 + 末行生效(u=1);非法 67013;**执行面 DB 断言**(B 星级不变/变 5);D-05 UPDATE 路径观测分支(D-08 预留)未触发 |
**静态对账**(`scan_calls_incr.py` 保留可复跑):20 调用端点 = 105 基准全命中零未知;票 02 范围 10/10 全覆盖(范围外 10 = 夹具支撑端点)。
---
## 四、UI 冒烟(票 05 · demo Playwright 扩展)
`demo_smoke_r2.py`(新建复制扩展,350 行;smoke10 11 步基线保留 + 详情六页签 + 四新入口块 + 三段收尾清理)——**20 步全 PASS 首轮一次过**;console_errors=0、page_errors=0;网络层 57 请求**零旧契约形态**(`/api/customer/<digits>/`=0、PUT/DELETE=0)。产物:`.scratch/customer-e2e/demo-smoke-r2-result.json` + `shots-r2/`×11。
### 4.1 demo 新入口清单(票 03 落地 → 票 05 实测)
| 入口 | demo 形态(票 03) | UI 实测(票 05) |
|---|---|---|
| 战略协议 subtab | 详情页签 6(插在关联商机与成员之间);五端点全接;edit **不带 customerId**(归属不可换);list 缓存回显 | 步 9-13:create(level=2, 300万-r2)→**客户快照同步实证**(info.grid 战略协议='2')→edit 预填断言+升三级→detail→**原生 confirm 删除流**(Playwright dialog accept)→列表空。**软删证实**:DB `deleted=1` 墓碑、list 已过滤,删空后快照回 NULL——DB 口径按 `deleted=0` |
| 查重设置面板 | settings tab 新面板;GET 回显(阈值空→80 兜底显示);save 阈值空值经 qs 丢弃走缺省 80 | 步 14-15/20:save(66/精确/phone=0)→重入 tab 回读断言→UI 恢复原值→**起测前 GET 原值无条件 POST 兜底恢复**双保险;DB 终态=原值(master=1/name=1/mode=2/threshold=80/phone=1) |
| F6 批量工商 | 列表批量操作栏按钮;ids 前端拦 100;五状态徽标弹窗;**stub 恒 NO_HIT 弹窗 hint 如实呈现** | 步 16:勾选自建客户 1 行→batch-update→结果行=1 且「未命中」徽标命中——stub 语义如实 |
| F8 导入策略 | `#impStrategy` 下拉(SKIP 缺省/OVERWRITE)插在 impMode 与文件框之间;upload 追加字段 | 步 17:OVERWRITE→上传预检 toast 回显 `策略=OVERWRITE`(t=1 suspect=1,只预检不 confirm) |
### 4.2 BUDDY 归属解耦(票 04 移交项落实)
协议/F6 全部挂自建客户(owner=admin);交割只 page+preview **不 initiate**(步 18,规避 heavy F-13 同款名下全量圈定);事后 DB 复核 collab owner 仍=曾偲青未漂移。残留终态:r2demo 客户 arch=2、协议活行=0、成员位无活跃 BUDDY 行、`e2c-*` 活跃 **16 = seed 基准**、dedup 单例原值(`scan-residue-t05.py` 实扫);导入留 2 条任务痕迹(round-1 DRAFT + 本轮预检,无业务写入,对齐 heavy F-14 先例不清理)。
### 4.3 坑位沉淀(脚本维护者向)
① settings 重入「已加载」toast 残留竞态——回读断言盯控件值 + 900ms 等 GET 覆盖;② `customer_team_member` 列名 `user_id`/`member_role`(非 member_user_id/role);③ Playwright 原生 confirm 需 `page.once("dialog", accept)` 且注册先于点击。
---
## 五、缺陷清单刷新(对照 round-1 §五)
> 复现基线:seed 17 客户维持 + 对应脚本;**本轮只报告不修复**(map 拍板,修复另起 effort)。台账编号沿用 D-xx 续编。
| 编号 | 级别 | 现象(期望 vs 实际) | r1 状态 | r2 状态与证据 |
|---|---|---|---|---|
| D-01 | P0 | 公海列表 pool/page 500 | 已修复 | ✅ **复验转绿兑现**:公海 200 + core F-07 交割-甲 opportunityCount==1 |
| D-02 | P2 | 跟进 nextFollowTime 早于当前未拦(期望 67009)→ 永久超期提醒 | ⚠ 未修复 | ⚠ **复现**:`POST /api/customer/follow/add` 过去时间落库成功(core F-08 warn;checks JSON 在案) |
| D-03 | P2 | 编辑缺 version 报 67001,spec 约定 67005 | ⚠ 未修复 | ⚠ **复现**:`POST /api/customer/edit` 缺 version → 67001「缺少乐观锁版本号」(core F-05 warn) |
| D-04 | P2 | 导入失败明细全丢(异常文本超 long 二次炸 → fail 表 0 行) | ⚠ 未修复 | ⚠ **维持**:随 D-05 连锁观测——失败明细 0 行(heavy F-14 warn) |
| D-05 | P1 | 含 INSERT 行导入必 FAILED(is_biz_negotiated NOT NULL 无默认) | ⚠ 未修复 | ⚠ **复现**(heavy F-14 终态 FAILED + r2 行未更新,缺陷验证模式);**新证据:UPDATE 路径正常**——I-07 纯 UPDATE 行两策略执行面 DONE + DB 断言过,D-08 预留分支未触发。修复面收窄为 createCustomer 补缺省 |
| D-06 | — | 已撤回(r1 脚本取错字段) | ❌ 撤回 | 无关 |
| D-07 | P1 | 交割 assignable 辅助接口稳定超时 | ⚠ 未修复 | ⚠ **复现**:30s×2 超时(heavy F-13 warn);assign 本体不受影响维持 |
| D-08 | — | (r2 预留续编:D-05 家族 UPDATE 路径观测) | — | **未触发**(I-07 DONE)——编号保留,不消费 |
| 新缺陷 | — | — | — | **0 条** |
**用例侧缺陷(不进 D-xx 台账,供套件维护者修复)**:① heavy F-15 断言收窄 ×2(票 01 改写偏差,§2.2);② incr I-04 空 ids 分支盲区 ×1(票 02 未预设 40001 分支,§三/§六)。
**round-1 已知缺口对账**:§5.① confirmSimilar **销号**、§5.② 查重设置端点 **销号**、§5.③ 汇总卡 5 字段恒 null **维持**(占位契约)、§5.④⑤ 范围外**维持划出**。W-01 contact_source 字典组缺失维持挂账(本轮未触碰字典面);「升级提醒链无上限」维持挂账(F-15 证据仍在,remindSeq 连续堆积现象与 r1 一致)。
---
## 六、文档漂移观察位处置(map fog 收敛定案)
> map fog「Bruno 文档漂移的处置边界」三项观察位全部实证收敛,处置按 map 工作约定「小漂移顺手 patch 可接受,大漂移另起」执行。**均无新增产品缺陷**。
| # | 观察位 | 实证 | 处置 |
|---|---|---|---|
| ① | pool·board:API-SUMMARY §2.14「公海 board 被平台拒绝(白名单校验 680xx,返工票 03/05)」;实现 `ViewFormServiceImpl` 白名单仅全局三值 {list,split,board},**无 pool 特判**(crm-preference 全模块 grep 无 pool 分支) | I-06 预埋探测实回 **code=0**(公海 scopeKey 保存 board 形态被接受) | **记档式 patch API-SUMMARY §2.14**(拒绝约定保留 + 漂移警示:前端不得依赖拒绝行为,待实现侧补特判或产品改口径)。Bruno 仓无需动作(view-form 属 crm-preference,tag 挂 A3 未在 D 盘 A4 仓生成副本) |
| ② | §2.2 batch-update 空/缺 ids 错误码未登记(I-04 断言预设 67001/HTTP400 二分支均未命中) | 实回**全局码 40001**「缺少必填参数:ids」(HTTP 400,`@RequestParam` required) | **补登记 API-SUMMARY §2.2** batch-update 错误码列:40001(空/缺 ids)+ 67001(上限超 100,含 101 重复 id 场景);I-04 用例分支修正留套件维护者 |
| ③ | core F-01 stage=2 过滤命中含非 seed 公司客户 | 共享库数据态演化(其他流程数据进入 stage=2),行为正确 | **非文档项**,仅本报告 §2.1 记档,断言按 seed 名单精确比对的前提失效由套件维护者知晓 |
另记档两处**不改**:① 代码侧 `OplogPageParam` @Schema 描述仍写 11 种(API-SUMMARY §3 已有 ⚠ 记录「以 17 种真值为准」——票 11 纪律不动代码,维持);② §2.1「pool 看板 67001 拒绝」为 crm-customer workspace/board 自身行为(返工票 03 实现),本轮无负例用例实测、无证据变更,维持原文。
---
## 七、环境与残留终态
**构建与起服**(票 04/05 实录):
- 构建:先删 `crm-app/target\*.jar`(fat jar 落后源码坑)→ IDEA maven + corretto-17 `-pl crm-app -am package` BUILD SUCCESS;沙箱对 D 盘 `mvn.cmd` 持续拒绝访问需 `required_permissions=all`(环境修正,非瞬时锁)。
- 起服:corretto-17(`C:\Users\Administrator\.jdks\corretto-17.0.13`)+ `SPRING_PROFILES_ACTIVE=verify` + `CRM_MINIO_AK/SK` env;判活 `GET /api/auth/debug/token?userId=739564171091247104` HTTP 200(26.8s / ~40s 两次起服);ping 401 = 鉴权门 ≠ 服务挂。
- **解释器修正**(票 02 移交口径修正):套件三脚本解释器 = **`py -X utf8`(3.13.3)**——venv10 实为 Playwright 专用环境(无 requests/pymysql,openpyxl 补装后仍不承载套件),compile/对账用 venv10 解释器的口径仅适用于 Playwright 脚本与 `scan_calls*` 工具。
**执行时长**:core 23.7s + heavy ~7.5min(两次自重启 + 70s×3 Job 等待 + D-07 超时 30s×2)+ incr 19.8s;UI 冒烟独立起服一轮 ~2min 量级。
**数据态修复**(测试基建操作,脚本留档可审计):① collab owner 漂移溯源(heavy F-13 圈定 BUDDY 名下全量且 teardown 不还原)+ 两次还原——**套件复跑副作用盲区已沉淀**(复跑必漂移,先还原再跑);② followFuture 补未来回访(seed「明天」过期两天);③ followOld 清 pending_notice 31 条失效历史 + 锚点重置 30 天前。
**残留终态(票 04 清理 + 票 05 复扫)**:
- 非 seed 活跃 `e2c-` 残留 **0**(r1 撞码对/恒信达系 5 + 本轮 core 二跑快创/confirmSimilar 5 全部 `POST /api/customer/archive?id=` 正门归档,DB 复核 arch=2)。
- `e2c-*` 活跃 **16 条 = seed 名单全量**(第 17 个 seed 样例「e2c-已归档」本就 arch=2)——按设计保留供前端联调。
- `e2c-r2i-*` 零残留(incr 自带 teardown);`e2c-r2demo-浏览器*` arch=2;协议活行 0;dedup 单例原值。
- 服务已停(8080 释放)。
---
## 八、对账附录
### 8.1 调用×端点覆盖面(对 `dump_api_out.txt` 105 端点基准 / 客户域 73)
| 套件 | 调用端点 | 对账结果 | 工具(可复跑) |
|---|---|---|---|
| core+heavy r2 | 55 | 54 命中客户域 + 1 预期例外(`POST /api/customer/follow/edit` 未注册,append-only 断言故意打)+ **0 未知** | `scan_calls.py``calls-r2.json` |
| incr | 20 | 105 基准全命中 **0 未知**;票 02 范围 10/10 | `scan_calls_incr.py``calls-incr.json` |
| **客户域合计** | — | **覆盖 64/73**(54 + 10);未覆盖 **9 维持项** | — |
**未覆盖 9 维持项**(round-1 即未覆盖,非本轮退化;旧套件 PUT 读写一体,返工拆分后未补读):`GET /api/auth/ping`(跨域)、`POST /api/customer/page`(基础分页,workspace/page 已覆盖同口径)、`GET /api/customer/contact/detail`、列偏好 `GET|POST /api/preference/view/(get|save)`×2、批量三兄弟 `claim-batch`/`assign-batch`/`release-pool-batch`×3、`GET /api/rule/customer/reminder`(读端点,save 侧已覆盖)。若需扩测另起票(map 拍板不进本轮票面)。
### 8.2 实测样本留档(specimens)
| 文件 | 条目 | 说明 |
|---|---|---|
| `specimens-core-r2.json` | 42 | core 端点真实请求/响应 |
| `specimens-heavy-r2.json` | 19 | heavy 端点真实请求/响应 |
| `specimens-incr.json` | 20 | 增量 10 端点 + 支撑端点样本(票 06 Bruno 对账素材) |
### 8.3 Bruno 文档对账(只对账不重构,沿 map 拍板)
D 盘 `D:\code\crm-api-docs\A4 客户管理\`(57 .bru / 10 目录,git 仓 **agent 不提交,用户审查后自行提交**)维持不动;r2 无新增端点形态变更(34 处改写均已在 r1 后 Bruno 同步轮覆盖),本轮 3 观察位中可影响 .bru 的 §2.14/§2.2 两处已 patch API-SUMMARY(§六),**Bruno 仓无需同步动作**;后续如重跑 bruno-sync 以 API-SUMMARY 最新版为契约权威。
### 8.4 产物索引(`.scratch/customer-e2e-r2/`)
改写与矩阵:`matrix-r2.md` / `calls-r2.json` / `calls-incr.json`;结果:`e2e-core-r2-checks.json` / `e2e-heavy-r2-checks.json` / `e2e-heavy-r2-defects.json` / `e2e-incr-checks.json`;样本:`specimens-{core-r2,heavy-r2,incr}.json`;日志:`core-r2-run.log` / `heavy-r2-run.log` / `incr-run.log`;审计脚本:`db-check-t04.py` / `db-fix-t04.py` / `clean-notice-t04.py` / `reset-anchor-t04.py` / `evidence-f15-t04.py` / `scan-residue-t04.py` / `final-clean-t04.py` / `scan-residue-t05.py` / `scan_calls.py` / `scan_calls_incr.py`;套件:`.scratch/customer-e2e/{e2e-core-r2,e2e-heavy-r2,e2e-incr,demo_smoke_r2}.py`。
---
*round-1 报告 `.scratch/customer-e2e/e2e-report.md` 保留为历史档案不覆盖;本报告为第二轮收官终稿。*