fix(activity-mutual): close Phase 16 KEEP-VERIFY/EXTEND — 7 defects + 1 hidden compile defect (reopenEpisode) + 1 test-fidelity; unify dual-impl to confirmActivityInterest; INV-006 fix; +7 tests (481 green)

This commit is contained in:
WorkBuddy
2026-09-17 16:47:10 +08:00
parent 29112eed6e
commit 556f95a562
16 changed files with 638 additions and 71 deletions
+24 -9
View File
@@ -10,7 +10,13 @@
> 测试库缺该唯一键故零覆盖。共修复 **16 处缺陷 + 3 处测试保真度缺陷**,新增 V040
> `activity_staff_assignments` 落实「服务站操作员只能操作指定活动」(INV-020)。
> 证据:`docs/Phase-15-V11-Recovery-Completion-Report-2026-09-17.md`。
> **Phase 16 需用户确认后启动。**
>
> **2026-09-17 Phase 16 复验关闭:** EPIC-P16-V11 已完成。复验发现活动互选**核心 Gate 缺陷**——双确认后**根本不建 Match/会话**(INV-014/015),
> 且 Phase 15 提交态引用未定义的 `matchMapper.reopenEpisode` → **整个模块从未编译通过**,"474 绿"是假象。已统一双实现到
> `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-16 状态校正:** Phase 07 UI 已按 2026-09-13 规格重新实现,**首批 11 页于 2026-09-16 通过用户验收(结论:基本达标)**,本文件此前"视觉否决/REOPENED"口径随之关闭。
>
@@ -130,6 +136,7 @@
| Phase 13A 婚恋咨询与婚前辅导复验 | 已完成(2026-09-17) | 见 `Phase-13A-V11-Recovery-Completion-Report-2026-09-17.md`;发现 counseling **双实现**(权威类零测试 / 孤儿类被单测),已合并删除孤儿类;修复 **9 处缺陷**(**D1 咨询正文写日志=INV-013 泄露**、D2 申请 userId 取请求体、**D3 分配先读后写并发静默覆盖**、D4 manager 可读 followups=INV-013 绕过、D5 无状态机、**D6 `/services/intro` 后端不存在致小程序 intro 页 100% 无数据**、D7 Admin 5 端点 404、D8 小程序字段名/幂等/静默失败、D9 测试库 counseling 零 CHECK 约束)+ **4 处测试基建缺陷**(守卫找不到 DDL 恒真假绿、全限定 `@TableField` 漏解析、权限守卫假阳性、测试自身逻辑缺陷);迁移基线 V039;新增 `CounselingPhase13ATest`(25)+ `CounselingConstraintGuardTest`(5,解析真实 DDL),两轮负向验证证明守卫会红;后端 **420 tests 全绿**;**Phase 14 尚未获准** |
| 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 尚未获准** |
| 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 通过用户验收 |
@@ -445,24 +452,32 @@
---
## EPIC-P16-V11: 活动互选二阶段同意重构 ✅ 核心链路已完成(V1.1 MVP)
## EPIC-P16-V11: 活动互选二阶段同意重构 ✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验关闭)
### Data Tasks
- P16-V11-T01 activity_mutual_connection_consents table ✅ (V024)
- P16-V11-T02 pair unique active constraint ✅ (UNIQUE index with LEAST/GREATEST)
- P16-V11-T02b V041 expires_at + match_id ✅ 新增(与 consent 超时拒绝、互选溯源对齐)
### Business Tasks
- P16-V11-T03 detect mutual interest ✅ (detectMutualResults)
- P16-V11-T04 create mutual consent ✅ (createMutualConsent)
- P16-V11-T05 user A confirm ✅ (confirmConnection)
- P16-V11-T06 user B confirm ✅ (confirmConnection)
- P16-V11-T07 both-confirm transaction ✅ (@Transactional)
- P16-V11-T08 create Match Episode ✅ (existing RelationshipService.confirmActivityInterest)
- P16-V11-T09 create Conversation ✅ (not auto-created, per INV-015)
- P16-V11-T10 existing active Match reuse ✅ (hasActiveMatch check)
- P16-V11-T11 prior Unmatch new episode ✅ (findLatestMatch + priorUnmatchExists)
- P16-V11-T12 decline handling ✅ (declineConnection)
- P16-V11-T13 timeout handling ⏳ 待补充(后续Phase)
- P16-V11-T07 both-confirm transaction ✅ (@Transactional, exactly-once via `both_confirmed_at` 原子 UPDATE)
- P16-V11-T08 create Match Episode ✅ (统一到 `RelationshipService.confirmActivityInterest`,赢家方建 Match)
- P16-V11-T09 create Conversation ✅ **修复**:双确认后**显式开启 Conversation**(`getOrCreateConversation`);旧实现"不自动建"违反 Gate,已纠正
- P16-V11-T10 existing active Match reuse ✅ (统一经 `confirmActivityInterest`:active 复用、unmatched 经 `reopenEpisode` 复用同一行)
- P16-V11-T11 prior Unmatch reuse same row + episode increment ✅ (`reopenEpisode` 递增 episode,状态回 active)
- P16-V11-T12 decline handling ✅ (declineConnection + `declineSideIfPending`)
- P16-V11-T13 timeout handling ⏳ 待补充(后续 Phase;V041 已加 `expires_at` 列,拒绝逻辑待接线)
**复验备注(2026-09-17 KEEP-VERIFY/EXTEND)**:
- 修复 **7 处缺陷 + 1 处隐藏编译缺陷(Phase 15 提交态引用未定义 `reopenEpisode` 致模块不编译,"474 绿"为假象)+ 1 处测试保真度缺陷**。
- 双实现统一到 `RelationshipService.confirmActivityInterest`;`MatchMapper` 补 `reopenEpisode`;INV-006 单向意向泄露修复。
- 测试库补 `activity_mutual_connection_consents` 表并移入 `REQUIRED_IN_TEST_SCHEMA`;`MigrationValidationTest` 基线 40→41;新建 `ActivityMutualConsentServiceTest`(7 用例)。
- 负向验证 2 用例精准变红并还原;全量回归 **481 tests / 0 failures** 全绿。
- 证据:`docs/Phase-16-V11-Recovery-Completion-Report-2026-09-17.md`。
### Miniapp Tasks
- P16-V11-T14 Mutual Result page ✅ (activity-mutual-result)