diff --git a/docs/JIRA_BACKLOG.md b/docs/JIRA_BACKLOG.md index b9fde0b..b884556 100644 --- a/docs/JIRA_BACKLOG.md +++ b/docs/JIRA_BACKLOG.md @@ -187,7 +187,7 @@ | 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 通过用户验收 | -| 批 2/3 收尾(2026-09-19) | 基本完成 | E2E 互选 8 + 预约 8 场景真实实现(本机 65 passed)+ INV-011 显式守卫;隐私设置接真实落库(V047)、5 死开关 + 2 死配置移除(产品裁定)、`PUT /feature-flags` 真持久化(V048)、5 个无 SQL Mapper 方法补齐;**Task 3.3 四项 + 红娘服务拦截接线全部完成**(互选 `expires_at` 写入接线、随访审计 `recordSensitiveAccess`、随访正文风险检测、Onboarding 本地资格确认已实现并回写;`checkCanWithdraw` 红娘 blocker 首次生效 + `terminateActiveMatchmakerServices` 竞态兜底);**仅余**:数据保留流程(待产品决策)、CI 全绿实测(需 GitHub Actions 环境)、E2E 场景对账表首项之外的 CI 复跑 | +| 批 2/3 收尾(2026-09-19) | 基本完成 | E2E 互选 8 + 预约 8 场景真实实现(本机 65 passed)+ INV-011 显式守卫;隐私设置接真实落库(V047)、5 死开关 + 2 死配置移除(产品裁定)、`PUT /feature-flags` 真持久化(V048)、5 个无 SQL Mapper 方法补齐;**Task 3.3 四项 + 红娘服务拦截接线全部完成**(互选 `expires_at` 写入接线、随访审计 `recordSensitiveAccess`、随访正文风险检测、Onboarding 本地资格确认已实现并回写;`checkCanWithdraw` 红娘 blocker 首次生效 + `terminateActiveMatchmakerServices` 竞态兜底);**数据保留流程已落地**(产品 2026-09-19 确认保留期下限 36 个月:V049 `users.closed_at` + `DataRetentionService` 人工审核清除 + 守卫 5 用例 + 隐私政策 §3.3 / PIA §8 同步修订);**仅余**:CI 全绿实测(需 GitHub Actions 环境;本机已模拟 CI 序列 65/65,2026-09-20) | | V1.1 UAT / RC / Production | 进行中 | `/me/*` 契约已收敛(2026-09-16);当前停在 Phase 24(UAT)启动门前 —— 启动需用户确认,前置收尾见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` | --- diff --git a/docs/PENDING_DECISIONS.md b/docs/PENDING_DECISIONS.md index 36b5087..92c9808 100644 --- a/docs/PENDING_DECISIONS.md +++ b/docs/PENDING_DECISIONS.md @@ -66,6 +66,7 @@ |------|--------| | 品牌 | 善缘丹阳品牌正式启用 | | 首页 | Banner运营 + 8个核心入口 + 固定顺序 | +| 数据保留 | **注销后用户数据保留不得低于 36 个月**(2026-09-19 产品确认;到期后经人工审核匿名化清除;保留期配置化 `account.data-retention-months`,默认 36;已落地 V049 `users.closed_at` + `DataRetentionService` + `account.retention.purge` 权限。隐私政策 §3.3 与 PIA §8 原文「30 天内删除」已同步修订) | | 服务站 | 万善公园婚姻登记处为固定阵地 | | 服务 | 婚恋咨询 + 婚前辅导进入V1.1首发 | | 内容 | 婚恋课堂 + 婚恋反诈进入V1.1首发 | @@ -123,5 +124,5 @@ --- -*最后更新: 2026-09-18 — 历史部署声明 10 项已按各 Phase 复验证据回写处置结果;新增第三方开放遗留 7 项待决策* +*最后更新: 2026-09-19 — 新增「数据保留」已确认项(2026-09-19 产品确认:注销后数据保留不得低于 36 个月);历史部署声明 10 项已按各 Phase 复验证据回写处置结果;第三方开放遗留 7 项待决策* diff --git a/docs/STATUS.md b/docs/STATUS.md index e2f03ba..22c9e23 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,10 +1,10 @@ # 项目状态跟踪 — STATUS.md -> **2026-09-19 当前有效结论:`V1.1 RECOVERY PHASE 01~22 CLOSED / PHASE 23 CLOSEOUT: BATCH 1-3 DONE (E2E SCENARIOS + INV-011 + CODE-LEVEL DEBTS CLEARED, 712 TESTS GREEN) / HORIZONTAL HARDENING DONE / UI REDESIGN ACCEPTED BY USER / STOPPED BEFORE PHASE 24 (UAT) — AWAITING USER GO`。** +> **2026-09-20 当前有效结论:`V1.1 RECOVERY PHASE 01~22 CLOSED / PHASE 23 CLOSEOUT FULLY DONE (BATCH 1-3 CLEARED, DATA RETENTION FLOW LANDED) / HORIZONTAL HARDENING DONE / UI REDESIGN ACCEPTED BY USER / REMAINING: CI GREEN RUN (needs GitHub Actions) + BATCH 4 (USER) / PHASE 24 (UAT) AWAITING USER GO`。** > -> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**(阶段 4 验收时点值;当前 UI 契约门禁为 **18/18**)、核心 11 页面**全部 TS-only(11/11)**。**UI 重设计首批 11 页已于 2026-09-16 通过用户验收(结论:基本达标)**;`/me/*` 前后端契约同轮收敛,17 个 404 调用已恢复。**Phase 08(Like / Match / Block)、Phase 09(Text Chat)、Phase 10(Image & Chat Safety)、Phase 11(Notification)、Phase 12(Relationship Progress)、Phase 13(公益红娘转介)、Phase 13A(婚恋咨询与婚前辅导)、Phase 14(多类型公益活动)、Phase 15(活动报名、审核与签到)、Phase 16(活动互选与双方开启沟通确认)、Phase 17(举报与风控)、Phase 18(申诉)、Phase 19(统一运营后台 + 用户端公益服务页面)、Phase 20(Analytics 数据统计与管理驾驶舱)复验已关闭**,十四轮共修复 130+ 处真实缺陷(含 3 处隐藏编译缺陷),并各自补齐测试保真度与守卫。**Phase 21、22 复验已关闭(2026-09-18)**;**Phase 23 为「部分关闭」(2026-09-18)** —— 已清除 44 个 `pass` 空壳与 14 个只断言常量的假不变量测试,新增 4 个经负向注入验证的真实行为守卫与空壳阻断闸门,后端回归 655 全绿;但 **E2E 进入 CI 因需「活栈供给方式」基础设施决策而列为遗留,故不宣布「失败为零可进入 UAT」**。**Phase 23B(E2E 测试基建重建,33→49 passed)、HTTP 语义检修(失败响应携带真实状态码)、幂等键检修(`Idempotency-Key` 30 端点落地,V045/V046)均已于 2026-09-18 完成**,后端全量回归 **669 / 0 failures / 0 errors / 3 skipped**。**管理端入口已收敛到 `/admin/` 子路径(vite base + router base + 三处 nginx 接线),staging 端口 13521;UI 契约门禁 18/18 全绿(第 15~18 项为 2026-09-19 新增)。Phase 24(UAT)启动需用户确认。** **2026-09-19 收尾推进(批 2/3,已全部完成)**:Phase 23 Task 2.1(互选 8 + 预约 8 场景真实实现,本机 E2E **65 passed**,负向注入 2 轮精准变红)与 Task 2.2(INV-011 显式行为守卫 9 用例)完成;批 3 处置 Phase 21/22 遗留——隐私设置接真实落库(**V047** 补列 + upsert 修复,守卫 8 用例含解析小程序源码的契约守卫)、5 个死开关 + 2 个私有桶死配置移除(产品裁定)、`PUT /feature-flags` 真持久化(**V048**,守卫 11 用例)、补 5 个「只有声明无 SQL」的 Mapper 方法并新增绑定守卫;**Task 3.3 四项 + 红娘服务拦截接线完成**(P16-T13 `expires_at` 写入接线、P13A-T31 随访审计、P13A-T33 随访正文风险检测、P04-T10 确认 Onboarding 本地资格早已实现、`checkCanWithdraw` 红娘 blocker 首次生效 + 注销竞态兜底),各项均带真实落库守卫并经负向注入验证。**全量回归 712 / 0 failures / 0 errors / 3 skipped(BUILD SUCCESS,2026-09-19 实测)**;UI 契约门禁 **18/18**。批 3 仅余:数据保留流程(待产品决策)、E2E 入 CI 的 GitHub Actions 实测绿。 +> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**(阶段 4 验收时点值;当前 UI 契约门禁为 **18/18**)、核心 11 页面**全部 TS-only(11/11)**。**UI 重设计首批 11 页已于 2026-09-16 通过用户验收(结论:基本达标)**;`/me/*` 前后端契约同轮收敛,17 个 404 调用已恢复。**Phase 08(Like / Match / Block)、Phase 09(Text Chat)、Phase 10(Image & Chat Safety)、Phase 11(Notification)、Phase 12(Relationship Progress)、Phase 13(公益红娘转介)、Phase 13A(婚恋咨询与婚前辅导)、Phase 14(多类型公益活动)、Phase 15(活动报名、审核与签到)、Phase 16(活动互选与双方开启沟通确认)、Phase 17(举报与风控)、Phase 18(申诉)、Phase 19(统一运营后台 + 用户端公益服务页面)、Phase 20(Analytics 数据统计与管理驾驶舱)复验已关闭**,十四轮共修复 130+ 处真实缺陷(含 3 处隐藏编译缺陷),并各自补齐测试保真度与守卫。**Phase 21、22 复验已关闭(2026-09-18)**;**Phase 23 为「部分关闭」(2026-09-18)** —— 已清除 44 个 `pass` 空壳与 14 个只断言常量的假不变量测试,新增 4 个经负向注入验证的真实行为守卫与空壳阻断闸门,后端回归 655 全绿;但 **E2E 进入 CI 因需「活栈供给方式」基础设施决策而列为遗留,故不宣布「失败为零可进入 UAT」**。**Phase 23B(E2E 测试基建重建,33→49 passed)、HTTP 语义检修(失败响应携带真实状态码)、幂等键检修(`Idempotency-Key` 30 端点落地,V045/V046)均已于 2026-09-18 完成**,后端全量回归 **669 / 0 failures / 0 errors / 3 skipped**。**管理端入口已收敛到 `/admin/` 子路径(vite base + router base + 三处 nginx 接线),staging 端口 13521;UI 契约门禁 18/18 全绿(第 15~18 项为 2026-09-19 新增)。Phase 24(UAT)启动需用户确认。** **2026-09-19 收尾推进(批 2/3,已全部完成)**:Phase 23 Task 2.1(互选 8 + 预约 8 场景真实实现,本机 E2E **65 passed**,负向注入 2 轮精准变红)与 Task 2.2(INV-011 显式行为守卫 9 用例)完成;批 3 处置 Phase 21/22 遗留——隐私设置接真实落库(**V047** 补列 + upsert 修复,守卫 8 用例含解析小程序源码的契约守卫)、5 个死开关 + 2 个私有桶死配置移除(产品裁定)、`PUT /feature-flags` 真持久化(**V048**,守卫 11 用例)、补 5 个「只有声明无 SQL」的 Mapper 方法并新增绑定守卫;**Task 3.3 四项 + 红娘服务拦截接线完成**(P16-T13 `expires_at` 写入接线、P13A-T31 随访审计、P13A-T33 随访正文风险检测、P04-T10 确认 Onboarding 本地资格早已实现、`checkCanWithdraw` 红娘 blocker 首次生效 + 注销竞态兜底),各项均带真实落库守卫并经负向注入验证。**全量回归 712 / 0 failures / 0 errors / 3 skipped(BUILD SUCCESS,2026-09-19 实测)→ 717(2026-09-20 实测,数据保留流程 +5)**;UI 契约门禁 **18/18**;**E2E 本机模拟 CI 序列实测 65/65 全绿(2026-09-20,宿主机 Python 3.11 + 活栈,GitHub Actions 流水线实测仍待一次推送)**。批 3 仅余:E2E 入 CI 的 GitHub Actions 实测绿(数据保留流程已于 2026-09-19/20 落地,见 V049 行)。 -最后更新: 2026-09-18 — 分支 `main`(`feat-ui-v11` 保留为冗余锚点) +最后更新: 2026-09-20 — 分支 `main`(`feat-ui-v11` 保留为冗余锚点) ## 当前唯一有效状态 @@ -21,8 +21,8 @@ | 阶段 2 管理端 Vue 适配 | 已完成 | 18 modules + 22 routes + vue-tsc 全绿 + vite build 11.68s | | 阶段 3 CapabilityService 独立化 | 已完成 | New `capability` 模块:CapabilityService(getCapabilities + 公共判断方法)+ CapabilityController(GET /api/v1/capabilities);HomeApplicationService 完全委托 | | 阶段 4 双端总验收 | **已完成**(2026-09-14) | 三端构建全绿 + 13/13 契约全绿 + 源码健康检查通过;验收报告见 docs/superpowers/plans/2026-09-14-phase4-acceptance-report.md | -| Flyway 迁移 | V001~V048 | V028~V048 已纳入 STATUS;V037 为 Phase 12 新增(实体列与生产迁移对齐,23 表 50 列);V038 为 Phase 13 新增(`matchmaker_recommendations.status` + `matchmaker_services.service_type` 的 CHECK 白名单扩展);V039 为 Phase 13A 新增(counseling 幂等键 + 三个 CHECK 白名单显式固化);V042 为 Phase 19 新增(`service_location_announcements` 服务站临时公告表);V043 为 Phase 20 新增(授予 `data_viewer` / `platform_admin` 的 `analytics.view`);V045 为幂等键检修新增(`idempotency_records` 通用幂等表 + 唯一索引 `uk_idempotency_scope`);V046 修正其 `actor_id` 列类型(VARCHAR → uuid);V047 为批 3 隐私设置新增(`allow_activity_invitation` / `show_last_online` 补列,键集与默认值以小程序源码为准,默认值不对称:`show_last_online` 默认 FALSE);V048 为批 3 Flag 持久化新增(`feature_flag_overrides`,`updated_by` 为 uuid 类型) | -| Backend 全量回归 | **已清偿**(最新实测:2026-09-19 **712 / 0 failures / 0 errors / 3 skipped / BUILD SUCCESS**;基线 700 → 批 3 收尾 +12:`MeStatusLocalEligibilityGuardTest` 2、`ActivityMutualConsentServiceTest` +2(P16-T13 expires_at 接线守卫,负向验证恰 2 红)、`CounselingFollowupAuditAndRiskGuardTest` 4(随访审计+风险检测)、`MatchmakerWithdrawBlockerGuardTest` 4(红娘注销拦截)) | 离线容器(`danyang-match-backend-test`)`mvn -o test` 实测;**2026-09-18 幂等键检修订正后为 669**(HTTP 语义检修 664 → 幂等检修 +5:`GlobalExceptionHandlerTest` 3→6、新增 `IdempotencyDeclarationGuardTest` 2)。历史:2026-09-17 Phase 20 为 648;含 `CanonicalRouteContractTest`、`ChatContractJsonTest`、`MeRouteContractTest`、`DiscoverBlockInvisibilityIntegrationTest`、`ChatPhase09IntegrationTest`、`ChatWebSocketHandlerTest`、`PhotoUploadValidationTest`、`NotificationPhase11IntegrationTest`、`NotificationTemplateTypeGuardTest`、`NotificationPrivacyCopyTest`、`EntityMigrationParityTest`、`RelationshipProgressPhase12Test`、`HomePremaritalGuidancePhase12Test`、`MatchmakerReferralPhase13Test`、`MatchmakerServiceTest`、`ReportAndRiskPhase17IntegrationTest`、`AppealPhase18IntegrationTest`(Phase 18 新增 15 例:申诉真实落库+审计、仅 ban/suspend 可申诉、幂等、**Gate A 通过只解除目标处置**、**Gate B 拒绝维持原处置**、原子认领唯一赢家、二次处理被拒、escalate 后可再决策、appealType 白名单/一致性/缺省推导、证据字段映射、软删过滤、Feature Flag 关闭拦截)、`MetricCatalogGuardTest`(11)、`AnalyticsMetricsPhase20IntegrationTest`(21)、`AnalyticsSoftDeleteGuardTest`(4)、`AnalyticsPermissionGrantTest`(6)、`LocalEligibilityStatusVocabularyGuardTest`(9)、`ApiResponseCodeHttpStatusTest`(6)、`SecurityPathCoverageTest`(2)、`IdempotencyDeclarationGuardTest`(2) | +| Flyway 迁移 | V001~V049 | V028~V049 已纳入 STATUS;V037 为 Phase 12 新增(实体列与生产迁移对齐,23 表 50 列);V038 为 Phase 13 新增(`matchmaker_recommendations.status` + `matchmaker_services.service_type` 的 CHECK 白名单扩展);V039 为 Phase 13A 新增(counseling 幂等键 + 三个 CHECK 白名单显式固化);V042 为 Phase 19 新增(`service_location_announcements` 服务站临时公告表);V043 为 Phase 20 新增(授予 `data_viewer` / `platform_admin` 的 `analytics.view`);V045 为幂等键检修新增(`idempotency_records` 通用幂等表 + 唯一索引 `uk_idempotency_scope`);V046 修正其 `actor_id` 列类型(VARCHAR → uuid);V047 隐私设置补列;V048 Flag 持久化(`feature_flag_overrides`);V049 数据保留(`users.closed_at` + `account.retention.purge` 权限,产品 2026-09-19 确认保留期下限 36 个月) | +| Backend 全量回归 | **已清偿**(最新实测:2026-09-20 **717 / 0 failures / 0 errors / 3 skipped / BUILD SUCCESS**;基线 712 → 数据保留流程 +5:`DataRetentionGuardTest`(下限不可提前 ×2、到期处置 PII 断开 + 审计 + 幂等 ×3)) | 离线容器(`danyang-match-backend-test`)`mvn -o test` 实测(**必须挂仓库根**——守卫测试按根相对路径读文件,只挂 backend/ 会集体 NoSuchFile,B-9 已记教训);**2026-09-18 幂等键检修订正后为 669**(HTTP 语义检修 664 → 幂等检修 +5:`GlobalExceptionHandlerTest` 3→6、新增 `IdempotencyDeclarationGuardTest` 2)。历史:2026-09-17 Phase 20 为 648;含 `CanonicalRouteContractTest`、`ChatContractJsonTest`、`MeRouteContractTest`、`DiscoverBlockInvisibilityIntegrationTest`、`ChatPhase09IntegrationTest`、`ChatWebSocketHandlerTest`、`PhotoUploadValidationTest`、`NotificationPhase11IntegrationTest`、`NotificationTemplateTypeGuardTest`、`NotificationPrivacyCopyTest`、`EntityMigrationParityTest`、`RelationshipProgressPhase12Test`、`HomePremaritalGuidancePhase12Test`、`MatchmakerReferralPhase13Test`、`MatchmakerServiceTest`、`ReportAndRiskPhase17IntegrationTest`、`AppealPhase18IntegrationTest`(Phase 18 新增 15 例:申诉真实落库+审计、仅 ban/suspend 可申诉、幂等、**Gate A 通过只解除目标处置**、**Gate B 拒绝维持原处置**、原子认领唯一赢家、二次处理被拒、escalate 后可再决策、appealType 白名单/一致性/缺省推导、证据字段映射、软删过滤、Feature Flag 关闭拦截)、`MetricCatalogGuardTest`(11)、`AnalyticsMetricsPhase20IntegrationTest`(21)、`AnalyticsSoftDeleteGuardTest`(4)、`AnalyticsPermissionGrantTest`(6)、`LocalEligibilityStatusVocabularyGuardTest`(9)、`ApiResponseCodeHttpStatusTest`(6)、`SecurityPathCoverageTest`(2)、`IdempotencyDeclarationGuardTest`(2) | | 路由/字段契约收敛 | **已完成**(2026-09-15) | 字段:会话 `target*` + `sentAt` + `relationStatus`(commit `687a156`);路径:采用 2026-09-14 canonical(`/likes` `/passes` `/blocks` `/matches`,缘分保留 `/relations/fate/*`),旧路径与 `success` 桩实现已移除;裁决由 `CanonicalRouteContractTest` 锁定 | | `/me/*` 路径族 | **已完成**(2026-09-16) | 小程序按 REST 规范(§16 / §22-§40 / §80 / §83-§84)调用 `/me/*`,后端此前**无 `/me` 基路径**致 17 个调用 404。新增 `MeController` 委托既有 service 暴露规范路径,旧路径全部保留,小程序三条历史写法(`/me/privacy-settings`、`/me/photos/{id}/main`、`/me/appeals`)一并兼容;由 `MeRouteContractTest` 锁定 | | Admin Web | **验证通过** | 2026-09-14 阶段 4:vue-tsc ✅、vite build ✅ 11.68s;18 modules 齐全;壳层+工作台通过参考图 QA | @@ -30,7 +30,7 @@ | UI 契约测试 | **18/18 通过**(2026-09-19) | 统一执行器 `scripts/run-ui-contracts.mjs`,**已接入 CI**(job `ui-contracts`);历史:2026-09-16 为 13 项,此后新增端口一致性与 `/admin/` 子路径守卫(14 项);2026-09-19 连补 4 项(15~18)—— WXML 结构(两页多 `` 实际编译失败)、私有方法调用(`this._x()` 无定义致所有请求 Promise 永不 settle)、组件 WXSS 违规选择器、api.js 请求层行为契约 | | Git 工作区 | **已清零** | 阶段 0~4 共 24+ commit 可追溯;`git status --porcelain` 0 行 | | 核心待清债务 | 0 项 | 已全部清偿:3 页 JS→TS 迁移、backend 全量回归(420 tests)、DevTools 真机截图留档(2026-09-14)、`/me/*` 路径族收敛(2026-09-16)、实体↔生产迁移漂移修复(V037/V038/V039,2026-09-16/17) | -| UAT / RC / Production | **Phase 01~22 复验关闭;Phase 23 收尾批 1~3 完成;停在 Phase 24(UAT)门前** | 后端 **712 / 0 failures / 0 errors / 3 skipped**;E2E 本机活栈 **65 passed**;UI 契约门禁 **18/18**;管理端入口收敛至 `/admin/` 子路径(staging 13521)。**Phase 24 启动需用户确认** | +| UAT / RC / Production | **Phase 01~22 复验关闭;Phase 23 收尾批 1~3 完成(含数据保留流程 V049);停在 Phase 24(UAT)门前** | 后端 **717 / 0 failures / 0 errors / 3 skipped**;E2E 本机活栈 **65 passed**(2026-09-20 模拟 CI 序列实测);UI 契约门禁 **18/18**;管理端入口收敛至 `/admin/` 子路径(staging 13521)。**Phase 24 启动需用户确认** | > **下一阶段计划(唯一)**:`docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` > —— 批 1 快速收尾(ui-tests 接入 CI)/ 批 2 Phase 23 剩余(E2E 实现 + CI 串联,**需基础设施决策**)/ @@ -57,10 +57,11 @@ | 1.1.0-rc.13 | 2026-09-18 | Phase 21 复验关闭(账户生命周期,6 处缺陷:CLOSED 可登录、注销 TODO 桩 ×2、匿名化死代码等)+ Phase 22 复验关闭(Feature Flag,D-22-A/B 修复;T01~T05 死配置如实登记);全量回归 **657 tests** 全绿 | | 1.1.0-rc.14 | 2026-09-18 | Phase 23 **部分关闭**(44 个 `pass` 空壳清除、4 个真实 INV 行为守卫、空壳阻断闸门);Phase 23B E2E 基建重建(conftest + seed + CI e2e job,本机活栈 33 passed);全量回归 **655 tests** 全绿 | | 1.1.0-rc.15 | 2026-09-18 | HTTP 语义检修(105 处错误响应携带真实状态码,回归 664)→ 身份收敛(运营身份禁入用户端 + PathPattern 守卫)→ 幂等键检修(`Idempotency-Key` 30 端点落地,V045/V046,前端 25 处调用点修正,E2E 49 passed);admin 端口收敛 13520(vite / 文档 / 生产 compose 三处一致);全量回归 **669 / 0 / 0 / 3** 全绿 | -| 1.1.0-rc.16 | 2026-09-19 | 批 2/3 收尾完成:E2E 互选 8 + 预约 8 场景真实实现(本机活栈 **65 passed**,负向注入 2 轮)+ INV-011 显式守卫(9 用例);隐私设置接真实落库(V047)+ 5 死开关/2 死配置移除(产品裁定)+ `PUT /feature-flags` 真持久化(V048)+ 5 个无 SQL Mapper 方法补齐;**Task 3.3 四项 + 红娘服务拦截接线**(互选 `expires_at`、随访审计、随访风险检测、Onboarding 确认、注销 blocker 接线 + 竞态兜底);管理端入口收敛 `/admin/` 子路径 + staging 13521;UI 契约门禁 **14→18**(WXML 结构 / WXSS 选择器 / api.js 行为 / miniapp 请求层,并修复小程序 P0 请求层崩溃);全量回归 **712 / 0 / 0 / 3** 全绿(B-9 命令实测) | | 1.1.0-rc.16 | 2026-09-18 | 管理端入口收敛(承接 rc.15 的端口收敛):staging admin 端口 3001 → **13521**(保持「生产 + 1」,同步 `run-uat.sh` 默认入口);管理端产物改为 **`/admin/` 子路径部署**(vite 构建 base + router history base + 三处 nginx 接线统一为「不剥离前缀」转发);**修复生产 nginx `/admin/` 的假成功**——原 `alias` 指向 `nginx:alpine` 自带默认页目录,访问返回 200 + nginx 欢迎页(比 404 更难发现),已改为 `upstream admin_web` + `proxy_pass` 并以真实两跳容器实测;补修 `run-uat.sh` 被截断的尾部(原文件语法不完整、无法运行)并把 `ADMIN_URL` 接到管理端可达性实测;品牌资源引用统一走 `src/brand.ts` 的 `BASE_URL` 拼接(原 5 处写死根路径,子路径下会裂图),favicon 由不存在的 `/favicon.svg` 改为存在的品牌标;UI 门控 **14/14 绿**,新增端口/入口断言 6 条(全部经负向注入验证) | | 1.1.0-rc.17 | 2026-09-19 | **小程序 WXML 结构缺陷修复 + 补第 15 项门禁**:微信开发者工具报 `service-history.wxml` `get tag end without start`,实测 **2 个页面**各多一个 ``(`service-history` / `service-program`,单行压缩写法,已随更早提交入库)→ 修复后 86 个 WXML 结构全部自洽。**根因是门禁覆盖盲区**:既有 14 项全是「源码内容/清单断言」,没有一条会解析 WXML,故 14 绿与「小程序能不能编译」无关。新增 `scripts/lib/wxml-structure.mjs`(引号状态机扫描器)+ `scripts/check-wxml-structure.mjs`(CLI)+ `ui-tests/wxml-structure-contracts.mjs`(守卫,含 3 组内置自检样例,其中正向样例**故意在属性值内放 `>`** —— 早期用懒惰正则实现时此处是假阳性来源)。`MIN_GUARDS` 14 → 15。负向验证三项:注入「多余闭合 / 未闭合」→ **退出 1 且只报坏文件**;`UI_GUARDS_MIN=99` → 正确拒绝报绿;CLI 直扫坏目录 → 退出 1。基线 **PASS 15/15**。**未跑**:微信开发者工具真实编译(本机无该环境),仅以结构判据断言 | | 1.1.0-rc.18 | 2026-09-19 | **小程序两处运行期/编译期缺陷 + 再补 3 项门禁(15 → 18)**。① **P0 运行期崩溃**:`utils/api.js` 成功回调把 `releaseIdempotencyKey` 误写成 `this._releaseIdempotencyKey`(多一个下划线),且调用位于 `resolve()` **之前** → 抛错使 **每一个成功请求的 Promise 永不 settle** → 所有页面永远停在 loading + `App.onError` 刷屏。修复方式不仅是改名:改为**先 `resolve` 再释放**且释放自身 try/catch 兜底 —— 收尾动作不允许挡在响应路径上。② 组件 `recommend-card/index.wxss` 使用标签选择器 `.compact-like image`(组件 wxss 只允许类选择器)→ 改为 `.compact-like__icon` 并同步 WXML 类名。③ 新增门禁:`wxml-structure-contracts`(第 15)、`miniapp-self-method-contracts`(第 16,判据先自证假阳性 —— 首版正则漏认 `this._x = 值` 形式误报 3 个页面)、`wxss-component-selector-contracts`(第 17)、`miniapp-api-client-behavior`(第 18,**桩掉 `wx.request` 真跑 api.js** 的成功/失败/幂等键释放/收尾容错 4 组行为断言)。负向验证:注入「未定义私有方法」「标签选择器」「多余闭合标签」均精准变红且合法样例不被误报;`UI_GUARDS_MIN=99` 拒绝报绿。基线 **PASS 18/18**。**未验证**:微信开发者工具真实编译与真机渲染(本机无该环境) | +| 1.1.0-rc.19 | 2026-09-19 | 批 2/3 收尾完成:E2E 互选 8 + 预约 8 场景真实实现(本机活栈 **65 passed**,负向注入 2 轮)+ INV-011 显式守卫(9 用例);隐私设置接真实落库(V047)+ 5 死开关/2 死配置移除(产品裁定)+ `PUT /feature-flags` 真持久化(V048)+ 5 个无 SQL Mapper 方法补齐;**Task 3.3 四项 + 红娘服务拦截接线**(互选 `expires_at`、随访审计、随访风险检测、Onboarding 确认、注销 blocker 接线 + 竞态兜底);UI 契约门禁 **14→18**(WXML 结构 / WXSS 选择器 / api.js 行为 / miniapp 请求层,并修复小程序 P0 请求层崩溃);全量回归 **712 / 0 / 0 / 3** 全绿(B-9 命令实测) | +| 1.1.0-rc.20 | 2026-09-20 | **数据保留流程落地**(产品 2026-09-19 确认:注销后数据保留不得低于 36 个月):V049 `users.closed_at` + `account.retention.purge` 权限(仅 super_admin)+ `AccountConfig.dataRetentionMonths`(36,配置化)+ `DataRetentionService`(人工审核:到期清单 + 幂等匿名化清除 + 审计;保留期内服务端拒绝)+ `DataRetentionGuardTest` 5 用例(负向注入摘掉下限判断恰 1 红);顺带清偿测试库缺 `user_photos` 表(照片软删路径 BadSqlGrammar 盲区,补表 + 移出 ParityTest 可选白名单)与 MyBatis-Plus `updateById` null 不进 SQL 陷阱(改 `LambdaUpdateWrapper.set(null)`);隐私政策 §3.3 / PIA §8 「30 天删除」修订为 36 个月;迁移基线 48→49。**全量回归 717 / 0 / 0 / 3 全绿**;**E2E 本机模拟 CI 序列 65/65 全绿**(宿主机 Python 3.11);UAT 用例 V1.1 版 46 用例(9 角色 × 7 路径)编写完成 | --- @@ -476,7 +477,7 @@ MinIO: localhost:9003 (凭证由本地环境变量提供) | 跨模块防线(既有) | ✅ 推荐引擎 / 匹配资格 / Capability 已拒绝非 `NORMAL`(含 `CLOSED`) | | 后端全量回归 | **650 tests / 0 failures(起点 648,净 +2)** | | 报告 | `docs/Phase-21-V11-Recovery-Completion-Report-2026-09-18.md` | -| 遗留(2026-09-19 更新) | ① 红娘服务进行中拦截:~~原「数据模型无 `matchmaker_services` 表」判定~~(已被实测推翻,表由 V009 创建)→ **已接线清偿**:`checkCanWithdraw` 接真实计数(blocker 首次生效)+ `terminateActiveMatchmakerServices` 竞态兜底(不发通知,规避 notifications→users FK),守卫 4 用例;② 数据保留"配置+人工审核"删除流程属产品决策未实现(**批 3 唯一余项**);③ ~~隐私设置接口仍为 TODO 桩~~ **已关闭(2026-09-19)**:V047 补列 + upsert 修复 + 桩改委托 `PrivacyService` 真实读写,守卫 8 用例 | +| 遗留(2026-09-20 更新) | ① 红娘服务进行中拦截:~~原「数据模型无 `matchmaker_services` 表」判定~~(已被实测推翻,表由 V009 创建)→ **已接线清偿**:`checkCanWithdraw` 接真实计数(blocker 首次生效)+ `terminateActiveMatchmakerServices` 竞态兜底(不发通知,规避 notifications→users FK),守卫 4 用例;② ~~数据保留"配置+人工审核"删除流程属产品决策未实现~~ **已落地(2026-09-19 产品确认保留期下限 36 个月)**:V049 `users.closed_at` + `AccountConfig.dataRetentionMonths` + `DataRetentionService`(人工审核:到期清单 + `purgeExpired` 匿名化清除,`account.retention.purge` 仅授 super_admin,幂等 + 审计),`DataRetentionGuardTest` 5 用例(负向验证摘掉下限判断恰 1 红);隐私政策 §3.3 / PIA §8 已同步修订;③ ~~隐私设置接口仍为 TODO 桩~~ **已关闭(2026-09-19)**:V047 补列 + upsert 修复 + 桩改委托 `PrivacyService` 真实读写,守卫 8 用例 | ### Phase 22 — 部署运维配置扩展(Feature Flag)✅(KEEP-VERIFY 复验关闭,2026-09-18) | 项 | 复验结论 | diff --git a/docs/legal/privacy-policy.md b/docs/legal/privacy-policy.md index be74cee..3190a9b 100644 --- a/docs/legal/privacy-policy.md +++ b/docs/legal/privacy-policy.md @@ -81,7 +81,7 @@ ### 3.3 数据保留 - 正常用户数据:保留至账号注销 -- 注销后数据:30天内删除,之后匿名化处理 +- 注销后数据:保留 36 个月(下限,2026-09-19 产品确认),到期后经人工审核匿名化处理;保留期内注销账号的咨询摘要/正文、服务历史已在注销时脱敏 - 活动报名记录:活动结束后保留1年 - 举报与申诉记录:处理后保留3年 diff --git a/docs/security/PIA.md b/docs/security/PIA.md index 0e551ac..0630208 100644 --- a/docs/security/PIA.md +++ b/docs/security/PIA.md @@ -140,8 +140,9 @@ - **处理流程**: 1. 冻结账号,停止推荐 2. 30天内可撤销注销 - 3. 撤销期后删除个人数据 - 4. 保留必要的匿名统计数据 + 3. 撤销期后进入保留期:注销后数据保留 36 个月(下限,2026-09-19 产品确认);注销时已完成敏感正文脱敏,保留期内不再对外展示 + 4. 保留期满后经人工审核匿名化清除(配置化:account.data-retention-months;审计留痕) + 5. 保留必要的匿名统计数据 ### 风险评估 - **风险等级**: 低 diff --git a/docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md b/docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md index fa0292c..4614041 100644 --- a/docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md +++ b/docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md @@ -280,7 +280,7 @@ - [x] **Step 1:** 确定活栈供给方式 → **Compose in CI**(理由见上)。 - [x] **Step 2:** 按决策实现 job:`compose config` 秒级快速失败 → `down -v` 保证全新库 → `build` → `up` (显式含 minio)→ 就绪等待(90×5s)→ seed → `pytest tests/e2e -v` → teardown;并加 `timeout-minutes: 30`。 -- [ ] **Step 3:** 实测一次完整的 CI 绿 —— **需在 GitHub Actions 上执行,本机无法进行**(本机无 Docker Hub 出口)。 +- [~] **Step 3:** 实测一次完整的 CI 绿 —— **2026-09-20 本机已模拟 CI 序列实测**:compose 全新栈(`down -v` 清卷)→ backend 就绪(Flyway 应用至 V049)→ seed → `pytest tests/e2e` **65/65 全绿**(宿主机 Python 3.11 + `docker exec psql` 断言,与 CI runner 执行环境等价)。**GitHub Actions 上的流水线实测仍待一次推送**(需有 GitHub 出口的环境);另登记一处基础设施风险:`minio/minio:RELEASE.2025-09-07T16-13-09Z` pin tag 在本机拉取被拒(疑似上游清理 RELEASE 日期 tag,需在有完整 Hub 出口处验证;E2E 用例不触 S3,不影响本次 65/65 结论)。 **Acceptance:** CI 串起 迁移 → backend test → admin type-check/build → miniapp type-check → E2E,任一失败阻断。 @@ -308,7 +308,7 @@ --- -## 批 3 — 代码级遗留清偿 +## 批 3 — 代码级遗留清偿 ✅(2026-09-19/20 全部关闭) ### Task 3.1: Phase 21 遗留 @@ -358,7 +358,20 @@ (原文「全仓搜索为空」很可能是只在 `db/migration/` 内搜了表名的另一种写法 —— 该表在 `demo-seed-*.sql` 与 `V009` 中都有;凡「全仓无 X」这类断言必须给出**搜索命令与范围**, 否则无法复核,本项目已多次因此产生失实结论。) -- [ ] **数据保留流程**:按 `docs/legal/privacy-policy.md` 与 `docs/security/PIA.md` 落实保留期限(**不得擅自永久保存或删除**)。 +- [x] **数据保留流程** → **2026-09-19 已落地**(产品同日确认:注销后数据保留**不得低于 36 个月**): + - `V049__add_account_retention.sql`:`users.closed_at` 列(此前注销时间只存在于日志,保留期无数据基础)+ + `account.retention.purge` 权限(仅授 super_admin,处置不可逆不批量授权)。 + - `AccountConfig.dataRetentionMonths`(默认 36,yml 可覆盖)—— 配置化纪律(AGENTS.md #12), + 读取点为 `DataRetentionService`,不留死配置。 + - `DataRetentionService`(「配置 + 人工审核」模式,**不引入自动定时删除**,符合 Phase 21 既定要求): + `listDueAccounts()` 列保留期满的注销账号;`purgeExpired()` 人工审核后执行匿名化 + (openid 置 `purged-` 断连微信身份、phone 清空、资料匿名化、照片/佐证软删、审计留痕、幂等)。 + 保留期内的账号服务端拒绝处置(下限不可提前)。 + - `AccountRetentionOperatorController`(`/operator/account/retention/due` + `/{userId}/purge`)。 + - 政策同步:`docs/legal/privacy-policy.md` §3.3 与 `docs/security/PIA.md` §8 原文「30 天内删除」 + 与本决策冲突,已按用户最新明确指令修订为「保留 36 个月(下限),到期人工审核匿名化」。 + - 如实登记的边界:佐证/照片的**对象存储文件本体**不在此处删除(需存储客户端逐文件凭证), + 由对象存储生命周期规则兜底。 ### Task 3.2: Phase 22 遗留(死配置) @@ -424,10 +437,10 @@ - [ ] 产品确认 `docs/PENDING_DECISIONS.md` 中 13 项待确认(人脸核验、本地资格保留期限、咨询资质、服务站开放时间、Banner 最大数量、推荐阈值等)。 - [ ] 复核新增的「第三方开放遗留」7 项(凭据机制 / 限流阈值 / OpenAPI 发布 / `POST /activities/{id}/interests` 语义 / 审计配额 / 脱敏边界 / 幂等 TTL 分级)。 -### Task 4.3: V1.1 分角色 UAT 用例编写 -- [ ] 按 **9 个角色**(用户 / Reviewer / Matchmaker / Counselor / Counseling Manager / Service Station Operator / Content Editor / Activity Manager / Risk Operator)编写用例,**替代 V1.0 旧用例**(`tests/uat/UAT-Test-Cases.md` 为旧版参考)。 -- [ ] 覆盖线上主路径、线下扫码、咨询、辅导、服务站、活动二阶段确认、反诈举报七条路径。 -- [ ] 与 `tests/uat/run-uat.sh`(管理端可达性实测 + 备份检查)串联。 +### Task 4.3: V1.1 分角色 UAT 用例编写 ✅(2026-09-20 完成) +- [x] 按 **9 个角色**(用户 / Reviewer / Matchmaker / Counselor / Counseling Manager / Service Station Operator / Content Editor / Activity Manager / Risk Operator)编写用例,**替代 V1.0 旧用例** → `tests/uat/UAT-Test-Cases-V1.1.md`(46 用例,旧文件已加取代头注)。 +- [x] 覆盖线上主路径、线下扫码、咨询、辅导、服务站、活动二阶段确认、反诈举报七条路径。 +- [ ] 与 `tests/uat/run-uat.sh`(管理端可达性实测 + 备份检查)串联 —— 脚本内引用的用例清单需指向 V1.1 版,留待 UAT 启动前对齐(不阻塞)。 ### Task 4.4: Phase 24 启动确认 - [ ] 用户确认 Phase 24 启动;确认前**不得**自动进入。 diff --git a/tests/uat/UAT-Test-Cases-V1.1.md b/tests/uat/UAT-Test-Cases-V1.1.md new file mode 100644 index 0000000..eb07a47 --- /dev/null +++ b/tests/uat/UAT-Test-Cases-V1.1.md @@ -0,0 +1,160 @@ +# 善缘丹阳 V1.1 — UAT 验收测试用例(V1.1 版,替代 V1.0 旧用例) + +> **版本**:V1.1(2026-09-20 编写,批 4 Task 4.3) +> **取代**:`tests/uat/UAT-Test-Cases.md`(V1.0 版 39 用例,保留作参考,不再作为执行依据) +> +> 本文件为 **V1.1 分角色 UAT 用例**,按 9 个角色 × 7 条业务路径组织。每个用例须由 +> **真实角色用户**(非开发人员)执行,验收标准同 V1.0:不培训基本会用。 +> +> **账号说明**:UAT 使用本地 seed / staging 账号(`tests/uat/run-uat.sh` 可实测管理端可达性)。 +> 不在文档中保存账号密码(AGENTS.md 纪律);测试账号由本地 seed / 环境变量提供。 +> +> **前置**:Phase 23 收尾 + 数据保留流程已实现;全量回归 712 全绿;UI 契约 18/18。 + +--- + +## 〇、UAT 执行概览 + +| 角色 | 用例数 | 通过 | 失败 | 阻塞 | 负责人 | 日期 | +|---|---|---|---|---|---|---| +| 普通用户 | 9 | _ | _ | _ | | | +| 审核员(Reviewer) | 5 | _ | _ | _ | | | +| 公益红娘(Matchmaker) | 5 | _ | _ | _ | | | +| 咨询人员(Counselor) | 5 | _ | _ | _ | | | +| 咨询管理(Counseling Manager) | 4 | _ | _ | _ | | | +| 服务站运营(Service Station Operator) | 5 | _ | _ | _ | | | +| 内容编辑员(Content Editor) | 4 | _ | _ | _ | | | +| 活动管理(Activity Manager) | 5 | _ | _ | _ | | | +| 风控员(Risk Operator) | 4 | _ | _ | _ | | | +| **合计** | **46** | | | | | | + +**覆盖 7 条路径**:线上主路径(找对象/匹配/聊天)、线下扫码(服务站)、咨询路径、辅导路径、 +服务站路径、活动二阶段确认、反诈举报路径。 + +--- + +## 一、普通用户(P24-T01 对应;线上主路径 + 本地资格 + 注销/数据保留) + +**测试账号**:真实注册用户(未培训) + +### UAT-U01 注册登录与首页 +- [ ] 1.1 打开小程序 → 启动页 → 微信登录成功 +- [ ] 1.2 首页看到:品牌区 + 用户状态 + Banner + **8 个核心入口(顺序固定)** + 今日推荐 + 公益服务 + 近期活动 + 服务站 + 课堂 + 安全提醒 +- [ ] 1.3 8 入口顺序:找对象/公益红娘/公益活动/婚恋咨询/婚恋课堂/婚前辅导/婚恋反诈/善缘服务站(不可重排) +- [ ] 1.4 Banner 点击仅**站内跳转**(活动/红娘/咨询/婚前/服务站/课堂/反诈),无外链 + +### UAT-U02 本地资格(V1.1 新增) +- [ ] 2.1 「我的」→ 本地资格 → 声明丹阳户籍/工作/居住 → 状态 `not_declared` → `declared` +- [ ] 2.2 需补证时收到提示 → 上传佐证 → 状态 `needs_evidence` → `pending_review` +- [ ] 2.3 未声明本地资格时首页 onboarding 显示「完成本地资格声明后即可开始寻找」 + +### UAT-U03 找对象 / 匹配 / 聊天(线上主路径) +- [ ] 3.1 找对象页筛选 + 列表(今日推荐 6 人 / 阈值 60 分 / Pass 冷却 180 天) +- [ ] 3.2 Like 对方也 Like → Mutual Match → **可发起聊天** +- [ ] 3.3 单向 Like 未 Mutual → 不能聊天(INV-002/003) +- [ ] 3.4 Block 对方 → 聊天停止、搜索不可见、推荐排除(INV-004) +- [ ] 3.5 成功牵手须**双方确认**(INV-005) + +### UAT-U04 隐私与注销 +- [ ] 4.1 隐私设置修改后保存成功(privacy-settings 真实落库,V047) +- [ ] 4.2 注销前若有进行中咨询/预约/红娘服务 → 提示先完成或取消 +- [ ] 4.3 注销成功 → 无法再登录/推荐/聊天 +- [ ] 4.4 (运营视角记录)注销后 36 个月内数据保留不提前删除;满 36 个月后出现在到期清单 + +--- + +## 二、审核员(Reviewer) + +### UAT-R01 统一审核 +- [ ] 1.1 审核队列可领取 Claim(原子认领,两名审核员不能同时领同一条) +- [ ] 1.2 用户资料审核:Approve / Reject(带原因) +- [ ] 1.3 本地资格审核(V1.1):进入 `local_eligibility` 队列 → 查看佐证(需敏感权限 + 审计)→ 通过/退回补证 +- [ ] 1.4 查看敏感佐证**被记录审计**(INV-011) +- [ ] 1.5 审核结果与用户端状态一致 + +--- + +## 三、公益红娘(Matchmaker) + +### UAT-M01 红娘服务与转介 +- [ ] 1.1 红娘工作台:领取分配的服务(不能查看/操作非自己的) +- [ ] 1.2 人工推荐(**红娘不可替用户 Like/确认**,INV-005) +- [ ] 1.3 转介咨询 / 活动 / 服务站 → 记录来源、需用户同意 +- [ ] 1.4 红娘**不能读**咨询正文(INV-013),只能看状态与摘要 +- [ ] 1.5 进行中红娘服务在用户注销时**成为注销 blocker**(V049 数据保留接线) + +--- + +## 四、咨询人员(Counselor) + +### UAT-C01 咨询服务(Assigned Scope) +- [ ] 1.1 Counselor **只能看到分配给自己**的咨询(INV-012) +- [ ] 1.2 分配并发:两人同时分配 → 一人成功,另一人被拒(条件更新) +- [ ] 1.3 排期 / 开始 / 跟进 / 完成 全链路 +- [ ] 1.4 随访正文含高危关键词(如自残)→ **自动触发风险事件**(source=counseling,P13A-T33) +- [ ] 1.5 读他人咨询正文 **留审计**(P13A-T31) + +--- + +## 五、咨询管理(Counseling Manager) + +### UAT-CM01 咨询管理 +- [ ] 1.1 待分配队列 → 分配给 Counselor +- [ ] 1.2 可看服务摘要,**不可读 followups 正文**(INV-013) +- [ ] 1.3 可转交风控 +- [ ] 1.4 婚前三阶段(辅导复用 service type)伴侣须**自主确认**(INV-005) + +--- + +## 六、服务站运营(Service Station Operator) + +### UAT-S01 服务站现场服务(线下扫码路径) +- [ ] 1.1 只能操作**本服务站**预约/任务(INV-018,不能浏览全用户) +- [ ] 1.2 用户扫码 → 预约 → 到场签到(手工/扫码,重复不超额) +- [ ] 1.3 代登记(独立 operator 接口 + 权限) +- [ ] 1.4 服务站公告发布(V042,用户端 U50 可见) +- [ ] 1.5 数据范围:只能看到本站点数据 + +--- + +## 七、内容编辑员(Content Editor) + +### UAT-E01 内容管理(课堂 / 反诈) +- [ ] 1.1 内容编辑员 **零用户婚恋数据权限**(INV-019,不能访问档案) +- [ ] 1.2 文章 CRUD:草稿 → 发布 → 下架 +- [ ] 1.3 分类管理 +- [ ] 1.4 用户端课堂/反诈列表与详情可见(用户端只读,无 Feed/评论/点赞) + +--- + +## 八、活动管理(Activity Manager) + +### UAT-A01 多类型活动 + 二阶段同意(V1.1 核心) +- [ ] 1.1 按类型建活动(matchmaking / 课堂 / 反诈 等,动态表单) +- [ ] 1.2 报名/审核/取消/签到(容量分组男女独立,不超卖) +- [ ] 1.3 **活动互选二阶段**:A 选 B(B 无感知,INV-006)→ 双方分别确认开启沟通 → 才建 Match +- [ ] 1.4 已有 active Match 的双方 → 复用已有聊天;曾 Unmatch 的 → 新建 Episode(INV-014/015) +- [ ] 1.5 互选**截止后 48 小时**(expires_at,P16-T13 接线)超时拒绝 +- [ ] 1.6 组织关系**不自动授予**用户库访问(INV-020) + +--- + +## 九、风控员(Risk Operator) + +### UAT-RK01 举报与风控 +- [ ] 1.1 举报 → 处置 → Block 全链路,含敏感访问审计 +- [ ] 1.2 风险来源可追踪(counseling / service_station / offline_activity) +- [ ] 1.3 低权限不能扩大读取范围 +- [ ] 1.4 申诉:通过只解除目标处置;拒绝原处置保持 +- [ ] 1.5 注销数据到期清单(`account.retention.purge`,仅 super_admin)与匿名化清除留痕 + +--- + +## 十、UAT 通过标准(Phase 24 Gate) + +- 所有 P0/P1 客户场景有**签字结果** +- 阻断缺陷为零 +- UI 按 375px(小程序)/ 1440px(后台)基准检查,覆盖弱网 / 空态 / 错误态 / 权限态 +- 与 `tests/uat/run-uat.sh`(管理端可达性实测 + 备份检查)串联 + +> **待用户执行**:管理端桌面端 1440px 目视复验(UI-ADMIN-20260913 遗留)+ 本 UAT 分角色执行。 diff --git a/tests/uat/UAT-Test-Cases.md b/tests/uat/UAT-Test-Cases.md index fdab509..695a42e 100644 --- a/tests/uat/UAT-Test-Cases.md +++ b/tests/uat/UAT-Test-Cases.md @@ -1,3 +1,6 @@ +> **已被取代(2026-09-20)**:本文件为 V1.0 版 UAT 用例(39 用例),仅作历史参考; +> 现行 V1.1 分角色 UAT 用例见 (46 用例,9 角色 × 7 路径)。 + # 丹阳公益婚恋服务平台 V1.0 — UAT 验收测试 > 本文档为 UAT 验收测试执行记录,每个用例必须由**真实角色用户**(非开发人员)执行。