fix(risk/report): close Phase 17 KEEP-VERIFY/EXTEND — 6 defects + 1 hidden compile defect (jakarta) + test-coverage blind zone (3 missing tables); add sensitive-access audit + ReportAndRiskPhase17IntegrationTest (7); full regression 488 green

This commit is contained in:
WorkBuddy
2026-09-17 20:42:09 +08:00
parent 556f95a562
commit 307c9efb36
13 changed files with 540 additions and 17 deletions
+14 -3
View File
@@ -16,7 +16,10 @@
> `RelationshipService.confirmActivityInterest`,修复 **7 处缺陷 + 1 处隐藏编译缺陷 + 1 处测试保真度缺陷**,新建
> `ActivityMutualConsentServiceTest`(7 用例),并经负向验证证明守卫有牙。新增 V041 `expires_at`+`match_id`。
> 证据:`docs/Phase-16-V11-Recovery-Completion-Report-2026-09-17.md`。
> **Phase 17 需用户确认后启动。**
>
> **2026-09-17 Phase 17 复验关闭:** EPIC-P17-V11 已完成。复验发现风控/举报整条真实 DB 路径因测试库缺 `reports`/`risk_events`/`risk_actions` 三表而**零覆盖**,`ReportServiceTest` 全是 `assertTrue(true)` 假绿;且敏感访问(查看他人风险画像/举报)此前**无审计**(违反 AGENTS.md #8 默认拒绝 + 查看需审计);另修复审计缺 `ip`/`userAgent`、`findByUserId` 未过滤软删、人工标记无审计,以及 `javax`→`jakarta` 隐藏编译缺陷与 `risk_events` 漏 `updated_at` 列。共修复 **6 处真实缺陷**,补齐三表并新增 `ReportAndRiskPhase17IntegrationTest`(7 例),负向验证证明守卫有牙。全量回归 **488 tests 全绿**。
> 证据:`docs/Phase-17-V11-Recovery-Completion-Report-2026-09-17.md`。
> **Phase 18 需用户确认后启动。**
> **2026-09-16 状态校正:** Phase 07 UI 已按 2026-09-13 规格重新实现,**首批 11 页于 2026-09-16 通过用户验收(结论:基本达标)**,本文件此前"视觉否决/REOPENED"口径随之关闭。
>
@@ -137,6 +140,7 @@
| Phase 14 多类型公益活动复验 | 已完成(2026-09-17) | 见 `Phase-14-V11-Recovery-Completion-Report-2026-09-17.md`;修复 **11 处后端缺陷**(**D1 `ActivityMapper.countRemainingCapacity` 无 SQL 空壳致详情/报名/审核必崩**、**D2 报名与审核先读后写并发超卖** → 改原子 SQL、D3 类型/角色未校验生产 CHECK 白名单、**D4 DTO 无 `activityType` 致小程序分类 Tabs 恒空**、D5 男女人数 `approvedCount/2` 编造、D6 年龄门槛空壳、D7 按类型资格策略为空、**D8 运营端建活动丢弃类型且把主办组织错设为操作者 userId**、D9 三个运营端点错挂用户端双实现、D10 软删活动/缺字段 NPE、D11 DTO 缺 4 字段)+ **3 处前端契约缺陷**(分类 code `classroom` 不在白名单、卡片读 7 个不存在字段、admin-web 无活动管理页)+ **2 处测试保真度缺陷**(2 条占位假绿、测试库缺 V023 列与三张表);新增 `ActivityPhase14Test`(23)+ `ActivityConstraintGuardTest`(9,解析真实 DDL **与前端源码**),两轮负向验证证明守卫会红;admin-web `vue-tsc` 0 error + `vite build` 通过;后端 **450 tests 全绿**;**Phase 15 尚未获准** |
| Phase 15 活动报名审核签到复验 | 已完成(2026-09-17) | 见 `Phase-15-V11-Recovery-Completion-Report-2026-09-17.md`;修复 **16 处缺陷**(**D1 签到码一生成即作废**:`generateCheckinToken` 把 token 写 `"used"` 而扫码端见 `"used"` 即拒 → 扫码 100% 失败;**D9 取消/拒绝后永远无法再报名**:撞生产 `UNIQUE(activity_id,user_id)`,测试库缺该约束故零覆盖 → 改复用记录;D2 重复签到竞态、D3 签到无数据范围、D4 手工签到无校验、D5 统计 NPE+语义错、D6 非法 token 500、D7 签名非恒定时间比较、D10 后台审核列表无 pending、D11 报名窗口不生效、D12 取消无审计、D13 审核/取消非原子、D14 容量分组不参与扣减)+ **2 处前端契约缺陷**(admin-web 无签到工作台、小程序无取消报名入口);新增 V040 `activity_staff_assignments` 落实 INV-020 活动数据范围;**3 处测试保真度缺陷**(测试库缺 UNIQUE+2 CHECK、3 条 `assertTrue(true)` 假绿、表未入必选集合);新增 `ActivityPhase15Test`(21),`CheckinServiceTest` 假绿改真实守卫(5),约束守卫 +2,迁移基线 39→40;一轮负向验证 3 处注入 → 8 条用例精准变红并还原;admin-web `vue-tsc` 0 error + `vite build` 通过;后端 **474 tests 全绿**;**Phase 16 尚未获准** |
| Phase 16 活动互选二阶段同意复验 | 已完成(2026-09-17) | 见 `Phase-16-V11-Recovery-Completion-Report-2026-09-17.md`;修复 **7 处缺陷 + 1 处隐藏编译缺陷 + 1 处测试保真度缺陷**(**D1 双确认后根本不建 Match/会话(Gate 缺陷·INV-014/015)**、**D3 Phase 15 提交态引用未定义 `reopenEpisode` 致整个模块不编译("474 绿"为假象)**、D4 INV-006 单向意向泄露、D5 复用/新建 Match 后缺会话);统一双实现到 `RelationshipService.confirmActivityInterest`;`MatchMapper` 补 `reopenEpisode`;测试库补 `activity_mutual_connection_consents` 表并移入必选集合,`MigrationValidationTest` 基线 40→41;新建 `ActivityMutualConsentServiceTest`(7 用例);`ChatPhase09IntegrationTest:344` 断言对齐 AGENTS.md #20 复用语义;新增 V041 `expires_at`+`match_id`;负向验证 2 用例精准变红并还原;后端 **481 tests 全绿**;**Phase 17 尚未获准** |
| Phase 17 举报与风控复验 | 已完成(2026-09-17) | 见 `Phase-17-V11-Recovery-Completion-Report-2026-09-17.md`;修复 **6 处真实缺陷**(**D1(Critical,必崩级盲区)测试库缺 `reports`/`risk_events`/`risk_actions` 三表 → 风控/举报真实 DB 路径零覆盖,`ReportServiceTest` 全 `assertTrue(true)` 假绿**;**D3(High)敏感访问(查看他人风险画像/举报)无审计(违反 AGENTS.md #8)**;D4 审计缺 `ip`/`userAgent`;D5 `findByUserId` 未过滤软删;D2 人工标记无审计;**D6 `javax`→`jakarta` 隐藏编译缺陷 + `risk_events` 漏 `updated_at` 列**);补齐三表并移出白名单入 `REQUIRED_IN_TEST_SCHEMA`;新增 `AuditLogService.recordSensitiveAccess` 并接线三端点;新增 `ReportAndRiskPhase17IntegrationTest`(7 用例);负向验证(注释 getReportDetail 审计 → D3 守卫精准变红并还原);后端 **488 tests 全绿**;**Phase 18 尚未获准** |
| UI-CLEANUP-20260913 | 已完成 | 废弃 UI 代码、冲突规范、旧计划和无效验收证据已清理;`ui-document-baseline-contracts` 锁定唯一视觉入口 |
| UI-ADMIN-20260913 | 已完成(待桌面端目视复验) | 管理端全局框架与工作台已按规格交付;18 modules + 22 routes,vue-tsc 与 vite build 全绿 |
| UI-MINIAPP-20260913 | 已完成 | 小程序 11 个核心页面已重构;11/11 页 TS-only,2026-09-16 通过用户验收 |
@@ -174,8 +178,8 @@
| EPIC-P13A | P13A | 公益婚恋咨询与婚前辅导 | P1 | ✅
| EPIC-P14-V11 | P14 | 多类型公益活动 | P1 |
| EPIC-P15-V11 | P15 | 活动签到回归测试 | P1 |
| EPIC-P16-V11 | P16 | 活动互选二阶段同意重构 | P0 |
| EPIC-P17-V11 | P17 | 公益服务风险来源扩展 | P0 |
| EPIC-P16-V11 | P16 | 活动互选二阶段同意重构 | P0 | ✅
| EPIC-P17-V11 | P17 | 公益服务风险来源扩展 | P0 | ✅
| EPIC-P18-V11 | P18 | 申诉保持 | P1 |
| EPIC-P19-V11 | P19 | 善缘丹阳综合运营后台 | P1 |
| EPIC-P20-V11 | P20 | 公益项目数据统计扩展 | P1 |
@@ -494,6 +498,13 @@
- P17-V11-T02 risk source service_station ✅ (RiskReferralService.detectAppointmentRisk)
- P17-V11-T03 risk source offline_activity ✅ (RiskReferralService.detectActivityRisk)
- P17-V11-T04 risk referral UI ⏳ Admin Web 后续补充(Phase 19)
### 2026-09-17 KEEP-VERIFY/EXTEND 复验结论
- **D1(Critical,必崩级盲区)**:`reports`/`risk_events`/`risk_actions` 三表在 H2 测试库缺失 → 风控/举报真实 DB 路径零覆盖;`ReportServiceTest` 全 `assertTrue(true)` 假绿。已补三表(对齐 V012,去外键留 CHECK)并移出 `TEST_SCHEMA_OPTIONAL_TABLES` 入 `REQUIRED_IN_TEST_SCHEMA`。
- **D3(High)**:敏感访问(查看他人风险画像/举报详情/风险事件列表)此前无审计(违反 AGENTS.md #8)。新增 `AuditLogService.recordSensitiveAccess` 并接线 `getReportDetail`/`getUserRiskProfile`/`RiskController.getRiskEvents`。
- **D4**:`ReportService.saveAuditLog` 补 `ip`/`userAgent`;**D5**:`findByUserId` 补 `deleted_at IS NULL`;**D2**:`manualFlagRisk` 补 `MANUAL_FLAG_RISK` 审计;**D6**:`javax`→`jakarta` 隐藏编译缺陷 + `risk_events` 漏 `updated_at` 列。
- 新增 `ReportAndRiskPhase17IntegrationTest`(7 例);负向验证(注释 getReportDetail 审计 → D3 守卫精准变红并还原);后端 **488 tests 全绿**。
- 证据:`docs/Phase-17-V11-Recovery-Completion-Report-2026-09-17.md`
---
## EPIC-P18-V11: 申诉保持 ✅ 已验证(V1.0基础保持不变)