From ae2405f64565f48da1e9068c96982b23815bd08f Mon Sep 17 00:00:00 2001 From: WorkBuddy Date: Fri, 18 Sep 2026 21:15:29 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E7=8A=B6=E6=80=81=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=88=B0=202026-09-18=20=E5=AE=9E=E5=86=B5?= =?UTF-8?q?=EF=BC=88=E6=96=B9=E6=A1=88=E4=BB=BB=E5=8A=A1=E4=B8=89=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - STATUS.md:顶部权威行由 "PHASE 20 COMPLETE"(09-17)更新为 09-18 口径(Phase 01~22 关闭 / Phase 23 部分关闭 / 三轮横向加固 / 669 tests / 停在 Phase 24 门前);版本演进表补 rc.11~rc.16; **合并三处重复的「V1.1 本地部署完成 (2026-09-09)」区块为一处**(996 行 → 946 行)并加 「历史记录边界」声明;清「Phase 04~05 ⏳ 待开发」等与实测矛盾项。契约锚点全部保住 (UI REDESIGN ACCEPTED BY USER / Phase 07 已通过用户验收 / 管理后台: http://localhost:13520/)。 - AGENTS.md + STATUS.md:UI 契约门禁口径 13/13 → **14/14**(历史时点行保留原值并注明, 不篡改史实)。 - JIRA_BACKLOG.md:Epic 总览表补 P14/P15/P19~P23 的 ✅(P23 标「部分关闭」)。 - 客户需求基线计划:Phase 07 标题去 "UI REOPENED";Phase 10~15/19 补 ✅;Phase 20/21 勾选 checkbox 并注日期;**Phase 22 如实标「未复验」**(口径澄清:计划的 Deployment/Ops 与 STATUS 的 「部署运维配置扩展(Feature Flag)」是两份不同工作,后者复验结论不构成本节证据); Phase 23 标「部分关闭」,第 3/5 项(E2E 场景实现、CI 串联)**不虚勾**。 - PENDING_DECISIONS.md:历史部署声明 10 项按各 Phase Recovery 报告证据回写处置结果 (9 项已关闭 / 1 项部分);补登 HTTP 与幂等检修遗留的第三方开放待决策 7 项。 - REMAINING_WORK.md:整体重写 —— 原文称 CHANGELOG 3.3MB(实为 4234 字节)、P1-3 指向从未存在的 Phase-23-Completion-Report.md;改为「已关闭 / 仍未完成 / 原编号索引 / 验收标准」四段,保留原编号 以便对照历史引用。 - database 两份:TABLE_INVENTORY 40 表 → **59 表**(带「来源迁移」列);MIGRATION_GUIDE V001~V011 → **V001~V046(46 个)**;两份均标注「以 backend/src/main/resources/db/migration/ 为准」。 --- AGENTS.md | 2 +- REMAINING_WORK.md | 374 ++++-------------- docs/JIRA_BACKLOG.md | 14 +- docs/PENDING_DECISIONS.md | 50 ++- docs/STATUS.md | 106 ++--- docs/database/MIGRATION_GUIDE.md | 101 +++-- docs/database/TABLE_INVENTORY.md | 129 ++++-- ...阳 V1.1 客户需求基线增量开发与修复计划.md | 69 ++-- 8 files changed, 347 insertions(+), 498 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 5a0d74d..d80dba6 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -22,7 +22,7 @@ V1.1 是 V1.0 的增量升级。正确的 V1.0 核心按 KEEP 处理,不得因 业务 Phase 唯一执行计划:`docs/善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md`。 -当前 UI 重设计唯一总计划:`docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`。首批范围(小程序 11 个核心页面 + 管理端框架/工作台)已于 **2026-09-16 通过用户验收(结论:基本达标)**,此前"视觉否决 / REOPENED"的判定随之关闭,UI 契约门禁 13/13 全绿。管理端桌面端目视复验仍待用户执行。 +当前 UI 重设计唯一总计划:`docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`。首批范围(小程序 11 个核心页面 + 管理端框架/工作台)已于 **2026-09-16 通过用户验收(结论:基本达标)**,此前"视觉否决 / REOPENED"的判定随之关闭,UI 契约门禁 **14/14** 全绿(2026-09-16 时为 13 项,此后新增端口与 `/admin/` 子路径一致性门禁)。管理端桌面端目视复验仍待用户执行。 --- diff --git a/REMAINING_WORK.md b/REMAINING_WORK.md index bd8ea66..065a54a 100644 --- a/REMAINING_WORK.md +++ b/REMAINING_WORK.md @@ -1,322 +1,96 @@ -# 丹阳公益婚恋服务平台 V1.0 — 上线前剩余工作 +# 丹阳公益婚恋服务平台 V1.1 — 上线前剩余工作 -> 本文件为上线前必须完成的工作清单,按优先级排序。 -> 交由 WorkBuddy 执行。 +> **最后更新:2026-09-18**(原文为 2026-09-01,内容已严重过期,本轮按实测重写) +> +> ⚠️ **重写说明**:本文件此前被多处引用,但内容与实际严重不符 —— 称 `CHANGELOG.md` 有 **3.3MB**(实际 +> **4234 字节 / 73 行**);P1-3 指向**已删除**的 `docs/Phase-23-Completion-Report.md`。2026-09-18 文档治理按实测重写, +> 并保留原编号以便对照历史引用。**逐项处置计划与批次划分**见 +> `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md`。 --- -## P0 — 上线前必须完成(阻塞性) +## 一、已关闭项(原文标为阻塞 / 重要,实测已完成) -### P0-1: 产品确认16项技术默认值 - -**文件**: `docs/PENDING_DECISIONS.md` - -**问题**: 以下技术默认值已硬编码,但无产品最终确认: - -| 决策项 | 当前技术默认值 | 需要确认 | +| 原编号 | 事项 | 结论(2026-09-18 复核) | |---|---|---| -| 每日推荐数量 | 6 人 | 产品确认 | -| 推荐最低阈值分数 | 60 分 | 产品确认 | -| Pass 冷却时间 | 180 天 | 产品确认 | -| 照片上限 | 6 张 | 产品确认 | -| 兴趣标签上限 | 8 个 | 产品确认 | -| 自我介绍长度上限 | 500 字符 | 产品确认 | -| Privacy 默认值 | 全部 TRUE | 产品确认 | -| 活动是否需要审核 | TRUE | 产品确认 | -| 活动互选最大人数 | 3 人 | 产品确认 | -| 活动互选截止时间 | 48 小时 | 产品确认 | -| 红娘是否允许电话联系 | FALSE | 产品确认 | -| "正在了解"是否自动暂停推荐 | 用户选择 | 产品确认 | -| RelationshipStatus 最终命名 | searching/getting_to_know/paused/matched_successfully/service_exited | 产品确认 | -| Appeal 是否 V1.0 首发 | 否(Feature Flag 预留) | 产品确认 | -| 每日推荐重置时间 | 00:00 Asia/Shanghai | 产品确认 | - -**操作**: -1. 产品负责人逐一确认以上16项 -2. 确认后更新 `application.yml` 或对应配置类 -3. 从 `docs/PENDING_DECISIONS.md` 移除已确认项 -4. 更新 `AGENTS.md` 中的规则说明(如有影响) +| P0-1 | 产品确认 16 项技术默认值 | ✅ **已确认 16 项**(见 `docs/PENDING_DECISIONS.md`「已确认决策列表」);仍有 13 项待确认(另见该文件「第三方开放遗留」7 项) | +| P0-2 | 隐私政策最终版本确认 | ✅ `docs/legal/privacy-policy.md` 已存在(2996 字节)。上线前仍需确认是否经法务终审签署 | +| P0-3 | PIA(隐私影响评估)书面记录 | ✅ `docs/security/PIA.md` 已存在(4700 字节) | +| P1-1 | CoreInvariantsTest 补实质性测试 | ✅ **已如实处置**:该类(195 行 / 12 用例)已明确降级为「**常量取值口径守卫,不验证行为**」(DisplayName 已改),真实行为验证转由各 Integration 测试承担(Phase 13 复验)。原文"只是检查常量定义"的批评成立,但处置方式是**如实命名 + 转移**,而非硬塞行为断言 | +| P1-2 | PermissionMatrixTest 补自动化验证 | ✅ 已有 341 行 / 12 用例;权限覆盖另由 `V11PermissionMatrixContractTest`(**扫描全部迁移**)+ `OperatorEndpointPermissionCoverageTest` 承担 | +| P1-3 | 补全 Phase 23 系统测试完成报告 | ✅ `docs/Phase-23-V11-Recovery-Completion-Report-2026-09-18.md` 已存在(结论:**部分关闭**)。**注意原文指向的 `docs/Phase-23-Completion-Report.md` 从未存在** | +| P1-4 | 清理 CHANGELOG 重复内容 | ✅ **不成立**:`CHANGELOG.md` 实际 **4234 字节 / 73 行**,无重复条目问题;已加指向 `docs/V1_1_CHANGELOG.md` 的指针头注(2026-09-18) | +| P2-1 | AccountLifecycle 注销联动完善 | ✅ Phase 21 复验关闭(2026-09-18):**CLOSED 仍可登录、两处 TODO 桩、匿名化死代码、注销障碍设计矛盾**等 6 处缺陷已修 | +| P2-2 | PhotoService Presigned URL 实现 | ⚠️ **部分**:`PhotoService` 魔数校验恒失败、PDF 被误挡等已修(Phase 10 复验);`POST /me/photos/upload-token` / 下载凭证 / EXIF 清理的落地程度**待确认** | +| P2-3 | WebSocket 在线状态管理 | ✅ Phase 09 复验关闭(2026-09-16):下行链路死代码、握手鉴权、Unmatch 不联动会话等 4 处缺陷已修 | --- -### P0-2: 隐私政策最终版本确认 +## 二、仍未完成(按优先级) -**问题**: Go/No-Go 检查单标注"待确认",为上线前绝对阻塞项。 +### A. 阻塞 Phase 24(UAT)启动 -**操作**: -1. 确认隐私政策文本(用户数据采集、存储、使用、共享、权利) -2. 确认用户协议文本 -3. 将最终版本放入 `docs/legal/` 目录 -4. 更新小程序登录页和设置页的协议链接 +1. **Phase 23 剩余**:E2E 场景真实实现 + CI 串联 E2E —— 需「活栈供给方式」**基础设施决策** + (占位文件头已保留场景清单:首页 11 / 本地资格 11 / 互选 8 / 权限 10 / 预约 7 项)。 +2. **管理端桌面端目视复验** —— 需**用户执行**。 +3. **`docs/PENDING_DECISIONS.md` 13 项待决策** —— 需产品确认。 + +> 在 A 组完成前,**不应宣布「失败为零可进入 UAT」**(Phase 23 Gate 要求端到端链路被真实执行)。 + +### B. 上线前(运维 / 产品,需人工) + +- **P0-4** 微信小程序审核提交(人工)。 +- **P0-5** SSL 证书申请与 DNS 配置(人工)。 +- **Phase 22 Deployment / Ops 口径 5 项未复验**:删除镜像跳过测试的发布路径、生产关 Mock WeChat/演示 Seed/Debug/Swagger、 + 端口与依赖检测、**备份加密 + 真实恢复演练**、Rollback 目标明确。 + ⚠️ 该 Phase 与 `STATUS.md` 所述「Phase 22 部署运维配置扩展(Feature Flag)」**是两份不同工作**。 +- **Phase 25 运营素材**(真实 Banner/站点/咨询/课堂/反诈内容,不 Seed 假数据)、**Phase 26 上线前 13 项 smoke**。 + +### C. 代码级遗留(不阻塞 UAT,但需清偿) + +- **Phase 21**:① 红娘服务进行中拦截**硬编码 `0`** —— 根因是数据模型**没有 `matchmaker_services` 表**, + 拦截项在设计上无法落地(建表属扩权,待产品确认存储模型);② `getPrivacySettings` / `updatePrivacySettings` 仍是 TODO 桩。 +- **Phase 22**:T01~T05 五个模块开关 + T07 私有桶为**死配置**(配置暴露但从未被业务读取)。 +- **任务级 ⏳**:P16-T13(互选超时接线)、P13A-T31(随访审计)、P13A-T33(`RiskEvent source=counseling`)、 + P04-T10(Onboarding 本地资格步骤)。 --- -### P0-3: PIA(隐私影响评估)书面记录 +## 三、原编号索引(便于对照历史引用) -**问题**: 9个场景需要书面记录,当前无记录。 - -**操作**: -1. 按以下场景撰写PIA记录: - - 实名认证(身份证采集) - - 照片存储与展示 - - 位置/地区信息 - - 聊天消息存储 - - 活动报名数据 - - 红娘服务数据 - - 举报与风控数据 - - 账号注销与数据删除 - - 跨组织数据访问 -2. 保存到 `docs/security/PIA.md` +| 原编号 | 原文标题 | 本文件位置 | +|---|---|---| +| P0-1 | 产品确认 16 项技术默认值 | 一、已关闭 | +| P0-2 | 隐私政策最终版本确认 | 一、已关闭(待法务终审) | +| P0-3 | PIA 书面记录 | 一、已关闭 | +| P0-4 | 提交微信小程序审核 | 二、B | +| P0-5 | SSL 证书申请与 DNS 配置 | 二、B | +| P1-1 | CoreInvariantsTest 补充实质性测试 | 一、已关闭 | +| P1-2 | PermissionMatrixTest 补充自动化验证 | 一、已关闭 | +| P1-3 | 补全 Phase 23 系统测试完成报告 | 一、已关闭 | +| P1-4 | 清理 CHANGELOG.md 重复内容 | 一、已关闭(原描述不成立) | +| P2-1 | AccountLifecycle 注销联动完善 | 一、已关闭 | +| P2-2 | PhotoService Presigned URL 实现 | 一、部分 | +| P2-3 | WebSocket 在线状态管理 | 一、已关闭 | --- -### P0-4: 提交微信小程序审核 +## 四、验收标准(更新) -**问题**: 用户端核心入口,无审核通过的小程序无法服务用户。 - -**操作**: -1. 在微信公众平台提交小程序审核 -2. 确保所有页面符合微信小程序审核规范 -3. 配置好 `app.json` 中的类目和标签 -4. 准备好隐私政策链接(见 P0-2) +| 项目 | 验收条件 | 状态 | +|---|---|---| +| P0-1 | 16 项全部产品确认,配置正确,文档更新 | ✅ 已完成 | +| P0-2 | 隐私政策文本在 `docs/legal/` 中,链接正确 | ✅ 文件已就位(待终审确认) | +| P0-3 | `PIA.md` 存在,覆盖全部 9 个场景 | ✅ 文件已就位 | +| P1-1 | CoreInvariantsTest 用例如实命名;真实行为由 Integration 测试覆盖 | ✅ 已如实处置 | +| P1-2 | 权限矩阵 9×18 覆盖,实际调用验证 | ✅ 由契约守卫承担 | +| P1-3 | Phase 23 完成报告存在且内容完整 | ✅ 已存在(部分关闭) | +| P1-4 | `CHANGELOG.md` < 100KB,无重复条目 | ✅ 已满足(4.2KB) | +| P0-4 | 微信审核提交并通过 | ⬜ 待人工 | +| P0-5 | HTTPS 正常,证书有效 | ⬜ 待人工 | +| Phase 23 剩余 | E2E 场景实现 + CI 串联 | ⬜ 待决策 | +| Phase 24 | UAT 分角色验收,阻断缺陷为零 | ⬜ 待用户确认启动 | --- -### P0-5: SSL证书申请与DNS配置 - -**问题**: 生产HTTPS必需。 - -**操作**: -1. 申请SSL证书(Let's Encrypt 或商业证书) -2. 配置生产域名 DNS 解析(`match.danyang.gov.cn` 或约定域名) -3. 将证书放入 `infrastructure/certs/` -4. 验证 `nginx-production.conf` 中的证书路径 - ---- - -## P1 — 上线前应该完成(重要) - -### P1-1: CoreInvariantsTest 补充实质性测试 - -**文件**: `backend/src/test/java/com/danyang/match/platform/invariants/CoreInvariantsTest.java` - -**问题**: 当前测试只是检查常量定义,不是真正的业务逻辑验证。 - -**需要实现**(每个不变量需要真实业务逻辑测试): - -```java -// INV-001: Required不可自动放宽 -@Test -void testRequiredConditionNotRelaxed() { - // 创建用户A(要求对方学历=本科)和用户B(学历=专科) - // B进入A的推荐池 → 应该被Required条件过滤 - // 验证B不在推荐结果中 -} - -// INV-002: 未Mutual不可聊天 -@Test -void testCannotMessageWithoutMutual() { - // 用户A Like用户B,但B未Like A - // 调用发送消息接口 → 应返回403/禁止 -} - -// INV-003: Block优先级最高 -@Test -void testBlockStopsAllInteractions() { - // A Block B后 - // 验证B不在A的推荐中 - // 验证A Like B后自动取消 - // 验证A和B的Match自动解除 -} - -// INV-004: 双向并发Like只创建一个Match -@Test -void testConcurrentLikeCreatesOneMatch() { - // 线程A: A Like B - // 线程B: B Like A(并发) - // 验证只创建1个Match记录 -} - -// INV-005: 活动名额不超卖 -@Test -void testActivityCapacityNotOversold() { - // 活动剩余1个名额 - // 线程A和线程B同时报名 - // 验证只有1人成功,1人被拒绝 -} - -// INV-006: 单向活动意向不泄露 -@Test -void testActivityInterestNotDisclosed() { - // A选择B,但B没选A - // 验证B的查询结果中看不到A的选择 -} - -// INV-007: 红娘不能替用户Like -@Test -void testMatchmakerCannotLikeForUser() { - // 红娘角色调用Like接口 → 应返回403 -} - -// INV-008: 非授权Operator不能读取身份证 -@Test -void testUnauthorizedOperatorCannotViewIdCard() { - // reviewer角色调用敏感身份查看接口 → 应返回403 -} - -// INV-009: 非案件上下文不能读取聊天 -@Test -void testNoChatAccessOutsideCaseContext() { - // risk_operator无案件授权调用聊天记录 → 应返回403 -} - -// INV-010: 跨Organization不能越权 -@Test -void testCrossOrgCannotAccess() { - // Organization A的用户,不能访问Organization B的数据 -} -``` - -**注意**: 测试应使用真实数据库(集成测试模式),通过 `@SpringBootTest` + Testcontainers 或指定测试数据库。 - ---- - -### P1-2: PermissionMatrixTest 补充自动化验证 - -**文件**: `backend/src/test/java/com/danyang/match/platform/invariants/PermissionMatrixTest.java` - -**问题**: 当前只有权限矩阵定义,没有实际API调用验证。 - -**需要实现**: - -```java -@Test -void testPermissionMatrixAllRoles() { - // 遍历9个角色 × 18个权限 - // 每个组合: - // 有权限 → 调用对应API → 应返回2xx - // 无权限 → 调用对应API → 应返回403 -} - -// 需要验证的角色: -// super_admin, platform_admin, organization_admin, -// reviewer, matchmaker, activity_manager, -// risk_operator, volunteer, data_viewer - -// 需要验证的权限模块: -// user.view, user.sensitive.view, user.status.change, -// review.view, review.process, -// matchmaker.view, matchmaker.assign, matchmaker.service, -// activity.view, activity.create, activity.review_registration, -// risk.report.view, risk.report.process, risk.user.ban, -// organization.manage, permission.manage, -// analytics.view, data.export -``` - -**验证方式**: 通过 `MockMvc` 或 `RestAssured` 调用管理端API,使用不同角色的JWT Token认证。 - ---- - -### P1-3: 补全 Phase 23 系统测试完成报告 - -**文件**: `docs/Phase-23-Completion-Report.md` - -**问题**: Phase 23(系统测试)缺少完成报告。 - -**需要包含**: -- 执行的测试类型和数量 -- 测试结果(通过/失败/阻塞) -- 安全测试结果(SQL注入/XSS/CSRF等) -- 并发测试结果 -- 发现的问题和修复情况 - ---- - -### P1-4: 清理 CHANGELOG.md 重复内容 - -**文件**: `CHANGELOG.md` - -**问题**: 文件大小3.3MB,存在大量重复条目(同一个Phase变更被复制数十次)。 - -**操作**: -1. 去重,保留每项变更的唯一记录 -2. 按版本(v1.0.0-rc.1, v1.0.0)组织 -3. 文件压缩到合理大小(目标 < 100KB) - ---- - -## P2 — 建议完成(非阻塞) - -### P2-1: AccountLifecycle 注销联动完善 - -**现状**: 代码已实现,STATUS.md 标记为TODO。 - -**验证**: 确认注销后以下联动正确: -- 推荐停止 -- 聊天停止(新消息禁止) -- 红娘服务停止 -- 活动处理(未开始的按规则) -- 历史关系保留但标记为已注销 - ---- - -### P2-2: PhotoService Presigned URL 实现 - -**现状**: 代码骨架存在,功能未完整实现。 - -**需要完成**: -- `PhotoService` 生成 MinIO Presigned URL -- 上传凭证接口 `POST /me/photos/upload-token` -- 下载凭证接口(私有图片访问) -- EXIF信息清理逻辑 - ---- - -### P2-3: WebSocket 在线状态管理 - -**现状**: 骨架实现。 - -**需要完善**: -- 用户在线/离线状态跟踪 -- 消息送达状态(已发送/已读) -- WebSocket 重连后的状态恢复 -- 通知推送(`notification.new` 事件) - ---- - -## 执行顺序建议 - -``` -1. P0-1 (产品确认) → 产品负责人 -2. P0-2 (隐私政策) → 产品/法务 -3. P0-3 (PIA记录) → 安全负责人 -4. P1-1 (Invariants测试) → 研发 -5. P1-2 (权限矩阵测试) → 研发 -6. P1-3 (Phase23报告) → 研发 -7. P1-4 (CHANGELOG) → 研发 -8. P0-4 (微信审核) → 产品 -9. P0-5 (SSL/DNS) → 运维 -10. P2-1 ~ P2-3 → 研发(可并行) -``` - ---- - -## 验收标准 - -每项完成后应满足: - -| 项目 | 验收条件 | -|---|---| -| P0-1 | 16项全部产品确认,配置正确,文档更新 | -| P0-2 | 隐私政策文本在 `docs/legal/` 中,链接正确 | -| P0-3 | PIA.md 存在,覆盖全部9个场景 | -| P1-1 | CoreInvariantsTest 10个用例全部包含真实业务逻辑 | -| P1-2 | PermissionMatrixTest 9×18全部覆盖,实际调用验证 | -| P1-3 | Phase-23-Completion-Report.md 存在且内容完整 | -| P1-4 | CHANGELOG.md < 100KB,无重复条目 | -| P0-4 | 微信审核提交并通过 | -| P0-5 | HTTPS正常,证书有效 | - ---- - -*最后更新: 2026-09-01* +*最后更新: 2026-09-18 — 按实测重写(原文 2026-09-01,含 3 处与实际不符的陈述)* diff --git a/docs/JIRA_BACKLOG.md b/docs/JIRA_BACKLOG.md index d264e0d..f286c99 100644 --- a/docs/JIRA_BACKLOG.md +++ b/docs/JIRA_BACKLOG.md @@ -219,16 +219,16 @@ | EPIC-P12-V11 | P12 | 关系状态轻量扩展 | P1 | ✅ | EPIC-P13-V11 | P13 | 红娘服务转介扩展 | P1 | ✅ | EPIC-P13A | P13A | 公益婚恋咨询与婚前辅导 | P1 | ✅ -| EPIC-P14-V11 | P14 | 多类型公益活动 | P1 | -| EPIC-P15-V11 | P15 | 活动签到回归测试 | P1 | +| EPIC-P14-V11 | P14 | 多类型公益活动 | P1 | ✅ +| EPIC-P15-V11 | P15 | 活动签到回归测试 | P1 | ✅ | 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 | -| EPIC-P21-V11 | P21 | 账户生命周期增量 | P1 | -| EPIC-P22-V11 | P22 | 部署运维配置扩展 | P1 | -| EPIC-P23-V11 | P23 | V1.1专项测试 | P0 | +| EPIC-P19-V11 | P19 | 善缘丹阳综合运营后台 | P1 | ✅ +| EPIC-P20-V11 | P20 | 公益项目数据统计扩展 | P1 | ✅ +| EPIC-P21-V11 | P21 | 账户生命周期增量 | P1 | ✅ +| EPIC-P22-V11 | P22 | 部署运维配置扩展 | P1 | ✅ +| EPIC-P23-V11 | P23 | V1.1专项测试 | P0 | ✅(部分关闭:E2E 场景实现与 CI 串联列为遗留) | EPIC-P24-V11 | P24 | UAT增量 | P1 | | EPIC-P25-V11 | P25 | RC内容检查 | P1 | | EPIC-P26-V11 | P26 | Production初始化 | P1 | diff --git a/docs/PENDING_DECISIONS.md b/docs/PENDING_DECISIONS.md index 0f2de22..36b5087 100644 --- a/docs/PENDING_DECISIONS.md +++ b/docs/PENDING_DECISIONS.md @@ -84,20 +84,44 @@ --- -## V1.1 历史部署声明(当前待复验) +## V1.1 历史部署声明(复验处置结果,2026-09-18 回写) -以下记录只说明相关代码、配置或迁移曾被创建。重新审查已发现部分声明与实际运行不一致,因此在对应 Phase 重新通过前不得称为“已上线”: +以下记录只说明相关代码、配置或迁移曾被创建。重新审查曾发现部分声明与实际运行不一致,故在对应 Phase 重新通过前不得称为“已上线”。 -| 决策项 | 确认值 | 状态 | +> **2026-09-18 文档治理**:按各 Phase Recovery 报告的实测证据回写处置结果 ——「待 Phase XX 复验」不得长期停留为悬空状态。 + +| 决策项 | 确认值 | 处置结果(2026-09-18 回写) | |--------|--------|------| -| 首页8核心入口固定顺序 | 找对象/公益红娘/公益活动/婚恋咨询/婚恋课堂/婚前辅导/婚恋反诈/善缘服务站 | 待 Phase 07 复验 | -| Banner仅内部跳转 | target_type CHECK约束已生效 | 待 Phase 07/19 复验 | -| 活动互选二阶段同意 | 互选→双方确认→Match/Conversation | 已发现闭环缺失,待 Phase 16 修复 | -| Counselor只能访问Assigned Service | Assigned DataScope | 已发现接口绕过风险,待 Phase 02/13A 修复 | -| ContentEditor零用户数据权限 | 默认无user.view权限 | 待 Phase 02 负向测试 | -| ServiceStationOperator数据范围 | 仅服务站相关操作 | 已发现越权风险,待 Phase 02/19 修复 | -| 本地资格与实名认证分离 | 独立表、独立流程 | 数据结构存在,待 Phase 04/05 复验 | -| 运营商密码登录 | 凭证由本地环境变量或安全 Seed 提供 | 不在文档保存密码 | -| Feature Flags灰度控制 | 配置项存在 | 待 Phase 07/22 验证实际联动 | -| V1.1仪表盘 | 统计接口存在 | 已发现权限和口径风险,待 Phase 20 修复 | +| 首页8核心入口固定顺序 | 找对象/公益红娘/公益活动/婚恋咨询/婚恋课堂/婚前辅导/婚恋反诈/善缘服务站 | ✅ 已关闭(Phase 07 业务复验 2026-09-13;UI 首批 11 页 2026-09-16 通过用户验收) | +| Banner仅内部跳转 | target_type CHECK约束已生效 | ✅ 已关闭(Phase 19 复验 2026-09-17;外链校验 + 软删过滤已修) | +| 活动互选二阶段同意 | 互选→双方确认→Match/Conversation | ✅ 已关闭(Phase 16 复验 2026-09-17;**原「双确认后根本不建 Match/会话」Gate 缺陷已修**) | +| Counselor只能访问Assigned Service | Assigned DataScope | ✅ 已关闭(Phase 13A 复验 2026-09-17;INV-012 守卫 + 权限矩阵守卫) | +| ContentEditor零用户数据权限 | 默认无user.view权限 | ✅ 已关闭(权限矩阵守卫由硬编码改为**扫描全部迁移**,消除后续迁移权限变更隐形) | +| ServiceStationOperator数据范围 | 仅服务站相关操作 | ✅ 已关闭(Phase 19 复验 2026-09-17;**原类级 `view` 兜底致越权写已修**,权限下沉方法级并纳入覆盖守卫) | +| 本地资格与实名认证分离 | 独立表、独立流程 | ✅ 已关闭(Phase 04/05 复验 2026-09-12) | +| 运营商密码登录 | 凭证由本地环境变量或安全 Seed 提供 | ✅ 纪律项(非待办):不在文档保存密码,继续由环境变量/安全 Seed 提供 | +| Feature Flags灰度控制 | 配置项存在 | ⚠️ **部分关闭**(Phase 22 复验 2026-09-18):`FeatureFlagController` 的 2 处真实缺陷已修;但 **T01~T05 与 T07 为「死配置」——配置暴露但从未被业务读取**,已如实降级登记,交各模块 Phase 处理 | +| V1.1仪表盘 | 统计接口存在 | ✅ 已关闭(Phase 20 复验 2026-09-17;**D12 口径造假/死代码/系统性软删过滤修复 45 处**) | + +--- + +## 第三方开放 / 平台化遗留待决策项(2026-09-18 补登) + +> 来源:`docs/HTTP语义检修报告-2026-09-18.md` 第六节「遗留:真正开放第三方还需要什么」+ +> `docs/幂等键检修报告-2026-09-18.md` 第七节「遗留与需要留意」。 +> 均属**范围扩张**,需产品决策 —— 本轮及此前检修均**未擅自实施**。 + +| 决策项 | 现状(已就位部分) | 待确认 | +|---|---|---| +| 第三方凭据机制 | 目前只有微信登录与运营账号登录;第三方**无标准途径获取 token** | 是否定义 API Key / OAuth Client Credentials,及其**权限范围与配额** | +| 限流是否真实生效 | `RATE_LIMITED` 业务码与 429 映射已就位 | 限流本身**是否启用、阈值多少**(本轮未验证) | +| OpenAPI 文档对外发布 | `OpenApiConfig` 已存在 | 是否对外开放、**开放哪些端点** | +| `POST /activities/{id}/interests` 语义 | `API_INVENTORY` 曾承诺、后端**从未实现**;已更正文档并删除指向 404 的前端死代码 | 该端点**是否需要在 V1.1 内真正实现**(涉及活动意向的产品语义) | +| 第三方调用审计与配额计量 | 内部角色的敏感访问审计已就位(Phase 17) | 第三方需**独立的调用审计与配额计量** | +| 敏感字段脱敏边界(第三方场景) | INV-011 等约束面向内部角色 | 第三方场景需**重新界定**脱敏边界 | +| 幂等键 TTL 语义 | `idempotency_records` 有 TTL(默认 86400s)+ `idx_idempotency_expires` 清理扫描 | 需知悉:**清理后同一把键会被当作新操作** —— 幂等保证的是「短时间内不重复」,**不是「永久去重」**(永久去重仍由业务层唯一约束承担)。若开放第三方,需决定**键的 TTL 是否按调用方分级** | + +--- + +*最后更新: 2026-09-18 — 历史部署声明 10 项已按各 Phase 复验证据回写处置结果;新增第三方开放遗留 7 项待决策* diff --git a/docs/STATUS.md b/docs/STATUS.md index 8170d9d..6b22ac9 100644 --- a/docs/STATUS.md +++ b/docs/STATUS.md @@ -1,8 +1,8 @@ # 项目状态跟踪 — STATUS.md -> **2026-09-17 当前有效结论:`V1.1 INCREMENTAL RECOVERY PHASE 20 COMPLETE / UI REDESIGN ACCEPTED BY USER / GIT CLEAN`。** +> **2026-09-18 当前有效结论:`V1.1 RECOVERY PHASE 01~22 CLOSED / PHASE 23 PARTIALLY CLOSED / HORIZONTAL HARDENING DONE (HTTP SEMANTICS + IDEMPOTENCY + PORT/ENTRY GUARDS) / UI REDESIGN ACCEPTED BY USER / 669 TESTS GREEN / STOPPED BEFORE PHASE 24 (UAT) — AWAITING USER GO`。** > -> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**、核心 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 24 起需用户确认后启动。** +> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**、核心 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 契约门禁 14/14 全绿。Phase 24(UAT)启动需用户确认。** 最后更新: 2026-09-18 — 分支 `main`(`feat-ui-v11` 保留为冗余锚点) @@ -30,7 +30,11 @@ | UI 契约测试 | **13/13 通过** | 2026-09-16 运行:全部退出码 0;含 capability 独立化适配与文档基线口径 | | 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 | **UI 验收通过,前后端契约已收敛,Phase 08-13 已关闭** | 双端构建/契约/源码全部通过;UI 首批 11 页 2026-09-16 通过用户验收;`/me/*` 契约同轮收敛;Phase 08/09/10/11/12/13 复验通过并关闭,累计修复 23 处真实缺陷,可推进 Phase 13A(**需用户确认后启动**) | +| UAT / RC / Production | **Phase 01~22 复验关闭;Phase 23 部分关闭;停在 Phase 24(UAT)门前** | 后端 **669 / 0 failures / 0 errors / 3 skipped**;UI 契约门禁 **14/14**;管理端入口收敛至 `/admin/` 子路径(staging 13521);HTTP 语义 + 身份收敛 + 幂等键三轮横向加固完成。**Phase 24 启动需用户确认** | + +> **下一阶段计划(唯一)**:`docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` +> —— 批 1 快速收尾(ui-tests 接入 CI)/ 批 2 Phase 23 剩余(E2E 实现 + CI 串联,**需基础设施决策**)/ +> 批 3 代码级遗留清偿 / 批 4 UAT 就绪(**需用户协作**)/ 批 5 Phase 25-26 前置登记。 --- @@ -48,6 +52,12 @@ | 1.1.0-rc.8 | 2026-09-17 | Phase 16 复验关闭(活动互选与双方开启沟通确认,7 处缺陷 + 1 处隐藏编译缺陷 + 1 处测试保真度:含**双确认后根本不建 Match/会话(Gate 缺陷)**、**Phase 15 提交态引用未定义 `reopenEpisode` 致模块不编译("474 绿"为假象)**、**INV-006 单向意向泄露**、**复用/新建 Match 后缺会话**;统一双实现到 `RelationshipService.confirmActivityInterest`;新增 V041 `expires_at`+`match_id`;新建 `ActivityMutualConsentServiceTest`(7 用例);全量回归 **481 tests** 全绿 | | 1.1.0-rc.9 | 2026-09-17 | Phase 17 复验关闭(举报与风控,6 处真实缺陷:含**D1 测试库缺 reports/risk_events/risk_actions 三表致风控/举报真实 DB 路径零覆盖(必崩级盲区)+ ReportServiceTest 假绿**、**D3 敏感访问(查看他人风险画像/举报)无审计(AGENTS.md #8)**、**D4 审计缺 ip/userAgent**、**D5 findByUserId 未过滤软删**、**D2 人工标记无审计**、**D6 javax→jakarta 隐藏编译缺陷 + risk_events 漏 updated_at**);补齐三表并移出白名单入 REQUIRED_IN_TEST_SCHEMA;新增 `AuditLogService.recordSensitiveAccess` 并接线三端点;新增 `ReportAndRiskPhase17IntegrationTest`(7 用例);全量回归 **488 tests** 全绿 | | 1.1.0-rc.10 | 2026-09-17 | Phase 18 复验关闭(申诉,8 处真实缺陷:含**D1 测试库缺 appeals 表 + AppealServiceTest 6 处 assertTrue(true) 假绿 → 申诉真实 DB 路径零覆盖**、**D2 escalate 向 operator 发用户通知撞 notifications.user_id→users(id) FK → PG 上升级 100% 失败**、**D3 appealType 未校验生产 chk_appeal_type**、D4 escalated 死胡同、D5 processAppeal 先读后写并发竞态、D6 三处查询漏软删过滤、D7 硬编码 resolved、D8 证据字段契约 evidenceFileIds);补 appeals 表并移出白名单入 REQUIRED_IN_TEST_SCHEMA;新增原子认领 `markReviewingIfProcessable`;新增 `AppealPhase18IntegrationTest`(15 用例),删除假绿 `AppealServiceTest`(9 用例);全量回归 **494 tests** 全绿;admin-web `vue-tsc` EXITCODE=0 | +| 1.1.0-rc.11 | 2026-09-17 | Phase 19 复验关闭(统一运营后台 + 用户端公益服务页面,修复 25 处真实缺陷:服务站公告整条不可达、服务站越权写、Banner 500、Content 发布死路、ServiceProgram 审批死路等);新增 V042 `service_location_announcements`;全量回归 **602 tests** 全绿 | +| 1.1.0-rc.12 | 2026-09-17 | Phase 20 复验关闭(Analytics,口径造假 / 死代码 / 系统性软删缺陷 D12 修复 45 处 / 权限授予脱节);新增 V043 `analytics.view` 授权;指标字典 `docs/ANALYTICS_METRICS.md` + `MetricCatalogGuardTest`;全量回归 **648 tests** 全绿 | +| 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-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 条(全部经负向注入验证) | --- @@ -916,81 +926,25 @@ OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界 --- -## V1.1 本地部署完成 (2026-09-09) +## V1.1 本地部署完成(2026-09-09,历史记录) -### 已修复的关键问题 -1. **CounselingServiceApp 通知FK约束** — 新增UserMapper检查,operator用户跳过通知 -2. **HomeController路径重复** — `/api/v1/home` → `/home`(与其他Controller一致) -3. **LocalEligibilityController路径重复** — `/api/v1/local-eligibility` → `/local-eligibility` -4. **数据库updated_at列缺失** — 为18个表补充ALTER COLUMN +> ⚠️ **历史记录边界**:本节为 2026-09-09 的部署时点记录,其中的测试声明(11/11、25/25、16/16) +> **已在后续重新审查中被推翻**,不作为验收证据。当前有效状态见文首「当前有效结论」。 +> 本区块在原文件中重复出现三次(内容高度雷同),2026-09-18 文档治理合并为一处。 -### 部署状态 -- Backend: http://localhost:8085 ✅ -- Admin Web: http://localhost:8086 ✅ -- PostgreSQL: localhost:5434 ✅ -- Redis: localhost:6381 ✅ -- MinIO: localhost:9003 ✅ +### 修复的关键问题 +- **CounselingServiceApp 通知 FK 约束** — operator 用户不在 `users` 表,改为检查后再发送通知 +- **HomeController 路径重复** — `@RequestMapping("/api/v1/home")` → `"/home"` +- **LocalEligibilityController 路径重复** — 同上修复 +- **数据库 `updated_at` 列缺失** — 为 18 个 V1.1 表补充 `ALTER COLUMN` +- **前端** — `CounselingView` / `ContentManagementView` 截断、路由缺失、侧边栏菜单缺失 -### 测试结果: 11/11 PASS -健康检查、首页聚合、内容管理、服务预约、咨询创建、转介服务、V1.1仪表盘、Feature Flags、文章发布、活动列表、Admin Web - -### 运营阶段遗留 -- Phase 24: UAT(需真实用户) -- Phase 25: RC内容检查(需运营数据) -- Phase 26: Production Smoke Tests(13项手动验证) - - ---- - -## V1.1 本地部署完成 (2026-09-09) - -### 修复的关键Bug -1. **CounselingServiceApp 通知FK约束** — operator用户不在users表,修复为检查后再发送通知 -2. **HomeController路径重复** — @RequestMapping("/api/v1/home") → "/home" -3. **LocalEligibilityController路径重复** — 同上修复 -4. **数据库updated_at列缺失** — 为18个V1.1表补充ALTER COLUMN - -### 部署架构 - - -### 历史测试声明: 25/25 PASS(已失效,待可信测试重建) -- 20个API端点全部正常 -- 3个业务操作(咨询创建/转介/文章)全部正常 -- Admin Web前端正常访问 - -### 运营商登录凭证 - -不在文档保存账号密码。开发/测试凭证由本地环境变量或安全 Seed 提供。 - -### 下一步: Phase 24-26 (UAT/RC/Production) -- Phase 24: UAT — 需要真实用户参与测试 -- Phase 25: RC内容检查 — 运营团队填充真实内容 -- Phase 26: Production Smoke Tests — 13项手动验证 - - ---- - -## V1.1 本地部署完成 (2026-09-09) - -### 修复的Bug (10项) -- 后端: 咨询通知FK约束、HomeController路径重复、LocalEligibility路径重复、服务预约userId获取 -- 数据库: 18张表补充updated_at列 -- 前端: CounselingView/ContentManagementView截断、路由缺失、侧边栏菜单缺失 - -### 历史测试结果(重新审查后失效) -- E2E 的 16/16 记录不能复现,测试文件存在大量空 `pass`。 +### 为什么这些声明被推翻(保留为治理证据) +- E2E 的「16/16」记录**不可复现**,测试文件存在大量空 `pass` —— 这是 Phase 23「可信系统测试重建」的直接起因。 - API 人工测试未证明 Permission、DataScope 和业务闭环,不能作为上线依据。 +- 「25/25 PASS」「11/11 PASS」均为当时自报,未附可复现命令与失败处理。 -### 运行中的服务 -| 服务 | 地址 | 状态 | -|------|------|------| -| 后端API | http://localhost:8085/api/v1 | UP | -| Admin Web | http://localhost:8086 | UP | -| PostgreSQL | localhost:5434 | Healthy | -| Redis | localhost:6381 | Healthy | -| MinIO | localhost:9003 | Healthy | - -### 运营商账号 -不在文档保存账号密码;使用本地环境变量或安全 Seed。 - -### 下一步: Phase 24-26 (需运营团队配合) +### 运营阶段遗留(至今不变) +- Phase 24: UAT — 需真实用户参与并确认启动 +- Phase 25: RC 内容检查 — 需运营团队填充真实内容 +- Phase 26: Production Smoke Tests — 13 项手动验证 diff --git a/docs/database/MIGRATION_GUIDE.md b/docs/database/MIGRATION_GUIDE.md index 472bfe6..62f8a86 100644 --- a/docs/database/MIGRATION_GUIDE.md +++ b/docs/database/MIGRATION_GUIDE.md @@ -1,45 +1,78 @@ -# 数据库迁移文件 +# 数据库迁移清单 — MIGRATION_GUIDE.md + +> **最后更新:2026-09-18** —— 原文仅列 **V001~V011**,实测 **46** 个迁移(最新 **V046**),本轮按实测重写。 +> +> ⚠️ **权威来源**:`backend/src/main/resources/db/migration/`。本文件为**索引**,不一致时以迁移文件为准。 +> 生产由 Flyway 驱动;**已发布的迁移只向前修复,不修改**(Phase 22 Gate 明确要求)。 +> 相邻文档:`TABLE_INVENTORY.md`(表清单)、`docs/善缘丹阳 V1.1 数据库与API增量设计.md`(V1.1 增量设计)。 ## 迁移命名规范 ``` -V{版本号}__{描述}.sql +V{三位版本号}__{描述}.sql ``` -示例: -- `V001__init_base_tables.sql` — 初始化基础表 -- `V002__add_profiles.sql` — 添加资料表 -- `V003__add_review_tables.sql` — 添加审核表 -- `V004__add_match_tables.sql` — 添加匹配表 -- `V005__add_relationship_tables.sql` — 添加关系表 -- `V006__add_messaging_tables.sql` — 添加聊天表 -- `V007__add_activity_tables.sql` — 添加活动表 -- `V008__add_matchmaker_tables.sql` — 添加红娘表 -- `V009__add_risk_tables.sql` — 添加风控表 -- `V010__add_notification_tables.sql` — 添加通知表 -- `V011__add_analytics_tables.sql` — 添加统计表 +## 迁移清单(V001~V046,共 46 个) -## 当前迁移 +| 版本 | 文件 | 建表 | 说明 | +|---|---|---|---| +| V001 | `V001__init_base_tables.sql` | 11 | 基础表:users / organizations / operators / roles / permissions / role_permissions / operator_roles / audit_logs / sensitive_access_logs / system_configs / interest_dictionary + 初始化数据 | +| V002 | `V002__add_user_and_verification_tables.sql` | 7 | 用户资料 / 偏好 / 兴趣 / 照片 / 隐私设置 / 实名认证 / 同意记录 | +| V003 | `V003__add_review_and_relation_tables.sql` | 6 | 审核任务 / 明细 / 原因字典 + 用户关系 / 匹配 / 成功牵手请求 | +| V004 | `V004__add_messaging_and_recommendation_tables.sql` | 5 | 会话 / 会话成员 / 消息 / 通知 / 推荐记录 | +| V005 | `V005__add_review_tables.sql` | — | 审核表补强(无建表) | +| V006 | `V006__add_match_tables.sql` | 1 | `match_rule_configs` + 初始化规则 | +| V007 | `V007__add_relationship_tables.sql` | — | 关系表补强(无建表) | +| V008 | `V008__add_messaging_tables.sql` | 3 | 消息类表补强(以 `IF NOT EXISTS` 形式,与 V004 同名表) | +| V009 | `V009__add_matchmaker_tables.sql` | 3 | 红娘服务 / 推荐 / 跟进 | +| V010 | `V010__add_activity_tables.sql` | 2 | 活动 / 活动报名 | +| V011 | `V011__add_activity_interests.sql` | 1 | 活动互选意向 | +| V012 | `V012__add_risk_and_report_tables.sql` | 3 | 举报 / 风险事件 / 风控处置 | +| V013 | `V013__add_appeals_table.sql` | 1 | 申诉 | +| V014 | `V014__add_consent_and_privacy_tables.sql` | — | 同意与隐私字段扩展 | +| V015 | `V015__add_v11_roles_and_permissions.sql` | — | **V1.1 角色与权限**(13 条 INSERT) | +| V016 | `V016__add_liveness_verification_fields.sql` | — | 活体核验字段 | +| V017 | `V017__add_local_eligibility_tables.sql` | 2 | 本地资格 / 佐证 | +| V018 | `V018__extend_review_for_local_eligibility.sql` | — | 审核扩展至本地资格 | +| V019 | `V019__add_home_banners_and_service_locations.sql` | 2 | 首页 Banner / 善缘服务站 | +| V020 | `V020__extend_notification_types.sql` | — | 通知类型扩展(对齐 `chk_notification_type` 短名白名单) | +| V021 | `V021__add_service_appointments_and_referral_fields.sql` | 1 | 服务预约 + 红娘转介字段 | +| V022 | `V022__add_counseling_services.sql` | 2 | 婚恋咨询 / 婚前辅导 + 随访 | +| V023 | `V023__extend_activities_v11.sql` | 2 | 活动 V1.1 扩展(名额分组 / 主办单位) | +| V024 | `V024__add_activity_mutual_connection_consents.sql` | 1 | **互选二阶段同意** | +| V025 | `V025__extend_risk_sources.sql` | — | 风险来源扩展 | +| V026 | `V026__add_content_and_program_tables.sql` | 5 | 内容分类 / 文章、服务项目 / 成员、组织关系 | +| V027 | `V027__seed_production_data.sql` | — | **生产基础数据种子**(3 条 INSERT) | +| V028 | `V028__add_service_location_operator_scope.sql` | 1 | 服务站人员数据范围 | +| V029 | `V029__complete_service_station_permissions.sql` | — | 服务站权限补全 | +| V030 | `V030__add_operator_soft_delete.sql` | — | 运营账号软删 | +| V031 | `V031__align_audit_log_base_fields.sql` | — | 审计日志基础字段对齐 | +| V032 | `V032__align_admin_soft_delete_columns.sql` | — | 管理端软删列对齐 | +| V033 | `V033__align_messaging_entity_base_fields.sql` | — | 消息实体基础字段对齐 | +| V034 | `V034__extend_sensitive_access_audit.sql` | — | 敏感访问审计扩展 | +| V035 | `V035__align_sensitive_access_base_fields.sql` | — | 敏感访问基础字段对齐 | +| V036 | `V036__add_notification_idempotency_index.sql` | — | 通知幂等 partial unique index | +| V037 | `V037__align_entity_columns_with_migrations.sql` | — | **实体↔迁移列对齐(23 处 ALTER)** | +| V038 | `V038__align_matchmaker_status_constraints.sql` | — | 红娘状态 CHECK 白名单扩展 | +| V039 | `V039__add_counseling_idempotency_and_status_guards.sql` | — | 咨询幂等键 + 三个 CHECK 白名单显式固化 | +| V040 | `V040__add_activity_staff_assignments.sql` | 1 | 活动工作人员分配 | +| V041 | `V041__extend_mutual_consent_expiry.sql` | — | 互选同意 `expires_at` + `match_id` | +| V042 | `V042__add_service_location_announcements.sql` | 1 | 服务站公告 | +| V043 | `V043__grant_analytics_view_to_data_roles.sql` | — | 授予 `data_viewer` / `platform_admin` 的 `analytics.view` | +| V044 | `V044__grant_all_permissions_to_super_admin.sql` | — | super_admin 全权限授予 | +| V045 | `V045__add_idempotency_records.sql` | 1 | **通用幂等表** + 唯一索引 `uk_idempotency_scope` | +| V046 | `V046__fix_idempotency_actor_id_type.sql` | — | 修正幂等表 `actor_id` 类型(VARCHAR → uuid) | -### V001__init_base_tables.sql(已完成) -- users 表 -- organizations 表 -- operators 表 -- roles 表 -- permissions 表 -- role_permissions 表 -- operator_roles 表 -- audit_logs 表 -- sensitive_access_logs 表 -- system_configs 表 -- interest_dictionary 表 -- match_rule_configs 表(需 V002 补充) -- 初始化数据(角色、权限、兴趣字典、系统配置) +--- ## 注意事项 -1. 所有迁移文件必须幂等(用 IF NOT EXISTS) -2. 敏感字段存储加密值 -3. 索引命名规范:`idx_{table}_{columns}` -4. 唯一约束命名规范:`uk_{table}_{columns}` -5. 外键约束命名规范:`fk_{table}_{column}` +1. 所有迁移文件必须幂等(`CREATE TABLE IF NOT EXISTS` / `ADD COLUMN IF NOT EXISTS` 等)。 +2. 敏感字段存储加密值。 +3. 命名规范:索引 `idx_{table}_{columns}`;唯一约束 `uk_{table}_{columns}`;外键 `fk_{table}_{column}`。 +4. **已发布的迁移不得修改** —— 修正一律追加新版本(如 V046 修正 V045 的列类型)。Phase 22 Gate 明确「Flyway 只向前修复,不破坏 V001~V027」。 +5. **文档与实际不一致时以迁移文件为准**:本文件曾长期停留在 V001~V011(实际 46 个);`TABLE_INVENTORY.md` 曾列 40 表(实际 59 张)。两处已于 2026-09-18 按实测重写。 + +--- + +*最后更新: 2026-09-18 — 由 V001~V011 重写为实测 V001~V046(46 个)* diff --git a/docs/database/TABLE_INVENTORY.md b/docs/database/TABLE_INVENTORY.md index c90c541..14fd5ae 100644 --- a/docs/database/TABLE_INVENTORY.md +++ b/docs/database/TABLE_INVENTORY.md @@ -1,41 +1,88 @@ -# 1. 用户账号表 -## 2. 实名认证表 -## 3. 用户资料表 -## 4. 用户偏好表 -## 5. 用户兴趣表 -## 6. 用户照片表 -## 7. 隐私设置表 -## 8. 兴趣字典表 -## 9. 审核任务表 -## 10. 审核明细表 -## 11. 审核原因字典表 -## 12. 推荐记录表 -## 13. 用户关系表 -## 14. 匹配关系表 -## 15. 成功牵手请求表 -## 16. 会话表 -## 17. 会话成员表 -## 18. 消息表 -## 19. 活动表 -## 20. 活动报名表 -## 21. 活动反馈表 -## 22. 红娘服务表 -## 23. 红娘推荐表 -## 24. 红娘跟进表 -## 25. 举报表 -## 26. 举报证据表 -## 27. 用户风险档案表 -## 28. 风险事件表 -## 29. 风控处置表 -## 30. 申诉表 -## 31. 通知表 -## 32. 组织表 -## 33. 操作员表 -## 34. 角色表 -## 35. 权限表 -## 36. 角色权限关联表 -## 37. 操作员角色关联表 -## 38. 操作审计日志表 -## 39. 敏感访问日志表 -## 40. 系统配置表 -## 41. 匹配规则配置表 +# 数据表清单 — TABLE_INVENTORY.md + +> **最后更新:2026-09-18** —— 原文列 **40** 表,实测 **59** 表 / **46** 个迁移,本轮按 `backend/src/main/resources/db/migration/` 重写。 +> +> ⚠️ **权威来源**:`backend/src/main/resources/db/migration/*.sql`。 +> 本文件只是**索引**;若与迁移文件不一致,**以迁移文件为准**(迁移是唯一可执行的真相)。 +> 相邻文档:`MIGRATION_GUIDE.md`(迁移清单)、`docs/善缘丹阳 V1.1 数据库与API增量设计.md`(V1.1 增量设计)、`docs/ANALYTICS_METRICS.md`(统计口径)。 + +**统计**:建表语句 **59** 张(去重后);迁移文件 **46** 个(V001~V046)。 +「来源」列 = **首次创建**该表的迁移;后续迁移对该表的 `ALTER` 不重复列出。 + +--- + +| # | 表名 | 域 | 说明 | 来源 | +|---|---|---|---|---| +| 1 | `users` | 基础 | 用户账号 | V001 | +| 2 | `organizations` | 基础 | 组织 | V001 | +| 3 | `operators` | 基础 | 运营人员 | V001 | +| 4 | `roles` | 权限 | 角色 | V001 | +| 5 | `permissions` | 权限 | 权限 | V001 | +| 6 | `role_permissions` | 权限 | 角色-权限关联 | V001 | +| 7 | `operator_roles` | 权限 | 运营-角色关联 | V001 | +| 8 | `audit_logs` | 审计 | 操作审计日志 | V001 | +| 9 | `sensitive_access_logs` | 审计 | 敏感访问日志 | V001 | +| 10 | `system_configs` | 基础 | 系统配置 | V001 | +| 11 | `interest_dictionary` | 基础 | 兴趣字典 | V001 | +| 12 | `user_profiles` | 资料 | 用户资料 | V002 | +| 13 | `user_preferences` | 资料 | 择偶偏好 | V002 | +| 14 | `user_interests` | 资料 | 用户兴趣 | V002 | +| 15 | `user_photos` | 资料 | 用户照片 | V002 | +| 16 | `user_privacy_settings` | 资料 | 隐私设置 | V002 | +| 17 | `user_identities` | 实名 | 实名认证 | V002 | +| 18 | `consent_records` | 合规 | 同意记录 | V002 | +| 19 | `review_tasks` | 审核 | 审核任务 | V003 | +| 20 | `review_items` | 审核 | 审核明细 | V003 | +| 21 | `review_reasons` | 审核 | 审核原因字典 | V003 | +| 22 | `user_relations` | 关系 | 用户关系(Like / Pass / Block) | V003 | +| 23 | `matches` | 关系 | 匹配关系(Match Episode) | V003 | +| 24 | `relationship_success_requests` | 关系 | 成功牵手请求 | V003 | +| 25 | `conversations` | 消息 | 会话 | V004 | +| 26 | `conversation_members` | 消息 | 会话成员 | V004 | +| 27 | `messages` | 消息 | 消息 | V004 | +| 28 | `notifications` | 消息 | 通知 | V004 | +| 29 | `recommendation_records` | 推荐 | 推荐记录 | V004 | +| 30 | `match_rule_configs` | 推荐 | 匹配规则配置 | V006 | +| 31 | `matchmaker_services` | 红娘 | 红娘服务 | V009 | +| 32 | `matchmaker_recommendations` | 红娘 | 红娘推荐 | V009 | +| 33 | `matchmaker_followups` | 红娘 | 红娘跟进 | V009 | +| 34 | `activities` | 活动 | 活动 | V010 | +| 35 | `activity_registrations` | 活动 | 活动报名 | V010 | +| 36 | `activity_interests` | 活动 | 活动互选意向 | V011 | +| 37 | `activity_capacity_groups` | 活动 | 活动名额分组(男女独立) | V023 | +| 38 | `activity_organizations` | 活动 | 活动主办单位 | V023 | +| 39 | `activity_mutual_connection_consents` | 活动 | **互选二阶段同意**(→ 双方确认 → Match) | V024 | +| 40 | `activity_staff_assignments` | 活动 | 活动工作人员分配 | V040 | +| 41 | `reports` | 风控 | 举报 | V012 | +| 42 | `risk_events` | 风控 | 风险事件 | V012 | +| 43 | `risk_actions` | 风控 | 风控处置 | V012 | +| 44 | `appeals` | 风控 | 申诉 | V013 | +| 45 | `user_local_eligibilities` | 资格 | 用户本地资格 | V017 | +| 46 | `local_eligibility_evidences` | 资格 | 本地资格佐证 | V017 | +| 47 | `home_banners` | 首页 | 首页 Banner | V019 | +| 48 | `service_locations` | 服务 | 善缘服务站 | V019 | +| 49 | `service_appointments` | 服务 | 服务预约 | V021 | +| 50 | `counseling_services` | 服务 | 婚恋咨询 / 婚前辅导 | V022 | +| 51 | `counseling_followups` | 服务 | 咨询随访 | V022 | +| 52 | `content_categories` | 内容 | 内容分类 | V026 | +| 53 | `content_articles` | 内容 | 内容文章(婚恋课堂 / 反诈) | V026 | +| 54 | `service_programs` | 服务 | 专项公益服务项目 | V026 | +| 55 | `service_program_members` | 服务 | 项目成员 | V026 | +| 56 | `organization_relationships` | 基础 | 组织关系(主办单位等) | V026 | +| 57 | `service_location_operators` | 服务 | 服务站人员数据范围 | V028 | +| 58 | `service_location_announcements` | 服务 | 服务站公告 | V042 | +| 59 | `idempotency_records` | 平台 | 通用幂等记录(+ 唯一索引 `uk_idempotency_scope`) | V045 | + +--- + +## 与原文的差异(治理证据) + +原文以 40 项**无表名**的中文编号列表记录(如「21. 活动反馈表」「26. 举报证据表」「27. 用户风险档案表」), +其中**多项在实际迁移中并不存在**(如活动反馈表、举报证据表),且缺少 V1.1 新增的 19 张表(Banner / 服务站 / +预约 / 咨询 / 内容 / 项目 / 本地资格 / 互选同意 / 幂等记录等)。 + +**结论**:以中文名枚举表清单会随实现漂移且无法机械核对 —— 这正是本轮改为「表名 + 来源迁移」并标注权威来源的原因。 + +--- + +*最后更新: 2026-09-18 — 由 40 表重写为实测 59 表 / 46 迁移* diff --git a/docs/善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md b/docs/善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md index e8fb26e..c89abaa 100644 --- a/docs/善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md +++ b/docs/善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md @@ -10,6 +10,8 @@ **Spec:** `docs/善缘丹阳 V1.1 WorkBuddy最终主启动提示词(整合版).md`、`docs/superpowers/specs/2026-09-13-reference-driven-dual-client-ui-redesign-design.md`、`docs/善缘丹阳 V1.1 数据库与API增量设计.md`、`docs/善缘丹阳 V1.1 页面级功能清单与交互流程修订版.md`、`docs/善缘丹阳 V1.1 WorkBuddy 开发执行计划修订版.md`、`docs/善缘丹阳 V1.1 WorkBuddy-Jira 最终开发任务增量清单.md`。 +**下一阶段计划(当前停点:Phase 23 收尾 → Phase 24 就绪):** `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` —— 批 1 快速收尾 / 批 2 Phase 23 剩余(E2E 实现 + CI 串联,**需基础设施决策**)/ 批 3 代码级遗留 / 批 4 UAT 就绪(**需用户协作**)/ 批 5 Phase 25-26 前置登记。 + ## Global Constraints - 这六份客户修订文档共同构成 V1.1 需求基线,不能以其中一份覆盖其余文档的专业域要求。 @@ -165,9 +167,9 @@ **Gate:** 双方任一 Required 不满足时永不入选;前台不显示数字匹配率。 -### Phase 07:V1.1 首页唯一实现 + 找对象 — 业务证据保留,UI REOPENED(2026-09-13) +### Phase 07:V1.1 首页唯一实现 + 找对象 — ✅ 已完成(业务证据保留,UI 于 2026-09-16 通过用户验收) -> 后端聚合、Capability、8 入口及推荐规则的专项证据保留;旧页面视觉已被用户否决。当前 UI 实施入口仅为 `docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`,不得按本节历史完成标记恢复旧设计。 +> 后端聚合、Capability、8 入口及推荐规则的专项证据保留。2026-09-13 作出的「旧页面视觉已被用户否决 / UI REOPENED」判定,已由 UI 按 2026-09-13 规格重新实现并于 **2026-09-16 通过用户验收(结论:基本达标)** 而**关闭**;当前 UI 实施入口仍为 `docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`。 **Files:** `home/**`、banner 读取服务、`miniapp/pages/index/**`、`miniapp/pages/discover/**`、首页组件、`miniapp/app.json`、Design Token。 @@ -211,7 +213,7 @@ **Gate:** 未 Mutual 或活动未双确认时不能发消息;正常会话不重复投递。 -### Phase 10:Image & Chat Safety — KEEP-VERIFY +### Phase 10:Image & Chat Safety — KEEP-VERIFY ✅ 已完成(2026-09-16 复验关闭) **Files:** photo 模块、message safety、对象存储配置和聊天页面。 @@ -222,7 +224,7 @@ **Gate:** 越权图片访问被拒绝,敏感内容不进入普通日志。 (2026-09-16 复验通过:修复 D1 图片上传魔数校验死代码——本地资格佐证上传曾 100% 失败;D2 高风险词写入普通日志。水印未实现,登记 gap。) -### Phase 11:Notification — EXTEND +### Phase 11:Notification — EXTEND ✅ 已完成(2026-09-16 复验关闭) **Files:** `notification/**`、预约/咨询/资格/活动服务及通知页面。 @@ -235,7 +237,7 @@ V036;D2——接线婚前辅导及管理端排期通知。`sendExternal` 在事务内执行的缺口已登记,接入真实微信 API 前须 改为提交后发送。真机文案 INV-010 达标。) -### Phase 12:Relationship Progress — KEEP-VERIFY/EXTEND +### Phase 12:Relationship Progress — KEEP-VERIFY/EXTEND ✅ 已完成(2026-09-16 复验关闭) **Files:** relationship 状态服务、Match Episode、relationship-status 页面。 @@ -253,7 +255,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M 「实体字段 ⊆ 生产迁移列」「测试库覆盖关键表」固化为自动守卫,并经负向验证证明会变红。 真机行为:双确认/并发确认/历史 Episode 不恢复旧聊天/非成员不可代确认 —— 14 项全绿。) -### Phase 13:公益红娘转介 — EXTEND +### Phase 13:公益红娘转介 — EXTEND ✅ 已完成(2026-09-16 复验关闭) **Files:** `matchmaker/**`、`referral/**`、Miniapp 红娘页面、Admin referral 页面。 @@ -303,7 +305,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M > Phase 12 基线 371 → 391(净 +20)。**Phase 13 已关闭。Phase 13A 未自动进入,等待用户确认。** > 报告:`docs/Phase-13-V11-Recovery-Completion-Report-2026-09-16.md` -### Phase 13A:婚恋咨询与婚前辅导 — REFACTOR/EXTEND +### Phase 13A:婚恋咨询与婚前辅导 — REFACTOR/EXTEND ✅ 已完成(2026-09-17 复验关闭) **Files:** `counseling/**`、`miniapp/pages/counseling-*`、`miniapp/pages/my-counseling/**`、`miniapp/pages/premarital-*`、`admin-web/src/modules/counseling/CounselingView.vue`、router。 @@ -347,7 +349,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M > **Phase 13A 已关闭。Phase 14 未自动进入,等待用户确认。** > 报告:`docs/Phase-13A-V11-Recovery-Completion-Report-2026-09-17.md` -### Phase 14:多类型公益活动 — REFACTOR/EXTEND +### Phase 14:多类型公益活动 — REFACTOR/EXTEND ✅ 已完成(2026-09-17 复验关闭) **Files:** activity 模块、Miniapp activity 页面、Admin activity 页面。 @@ -396,7 +398,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M > **Phase 14 已关闭。Phase 15 未自动进入,等待用户确认。** > 报告:`docs/Phase-14-V11-Recovery-Completion-Report-2026-09-17.md` -### Phase 15:活动报名、审核与签到 — KEEP-VERIFY/EXTEND +### Phase 15:活动报名、审核与签到 — KEEP-VERIFY/EXTEND ✅ 已完成(2026-09-17 复验关闭) **Files:** activity registration、checkin 服务和 U29~U32 页面。 @@ -475,7 +477,7 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M **复验结论:** 修复 8 处真实缺陷(D1 测试库缺 `appeals` 表 + `AppealServiceTest` 6 处假绿 → 零覆盖;**D2 escalate 向 operator 发用户通知撞 `notifications.user_id→users(id)` FK,PG 上升级 100% 失败**;**D3 appealType 未校验生产 `chk_appeal_type` 白名单**;D4 escalated 死胡同;D5 processAppeal 先读后写并发竞态;D6 三处查询漏软删过滤;D7 硬编码 resolved;D8 证据字段契约 evidenceFileIds);新增 `AppealPhase18IntegrationTest`(15 例),删除假绿 `AppealServiceTest`(9 例);全量回归 494 全绿。 **报告:** `docs/Phase-18-V11-Recovery-Completion-Report-2026-09-17.md`。**Phase 19 需用户确认后启动。** -### Phase 19:统一运营后台 + 用户端公益服务页面 — ADD/REFACTOR +### Phase 19:统一运营后台 + 用户端公益服务页面 — ADD/REFACTOR ✅ 已完成(2026-09-17 复验关闭) **Files:** Admin banner/content/service-station/service-appointment/service-program/counseling/referral 模块、MainLayout/router;Miniapp 新增 U49~U54、U60、U61、U64 页面;service API 文件。 @@ -501,31 +503,40 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M 全量回归 **602 tests 全绿**(起点 420);admin-web `vue-tsc` EXIT=0 + `vite build` EXIT=0;小程序 `tsc --noEmit` EXIT=0;ui-tests 14/14。 **报告:** `docs/Phase-19-V11-Recovery-Completion-Report-2026-09-17.md`。**Phase 20 需用户确认后启动。** -### Phase 20:公益服务 Analytics — EXTEND +### Phase 20:公益服务 Analytics — EXTEND ✅ 已完成(2026-09-17 复验关闭) **Files:** analytics 模块、统计查询/事实表后续迁移、Admin Analytics 页面、`docs/ANALYTICS_METRICS.md`。 -- [ ] 为每个指标登记名称、定义、分子分母、去重键、时间字段、时区、版本和负责人。 -- [ ] 分离服务用户数与服务人次、活动 mutual/confirmed/match/chat/success、Banner impression/click。 -- [ ] 有效交友匹配在口径未确认前标为 provisional,不能当正式成功或对外宣传。 -- [ ] 所有统计接口应用 `analytics.view` 和组织/站点 DataScope,低权限账号返回 403。 +- [x] 为每个指标登记名称、定义、分子分母、去重键、时间字段、时区、版本和负责人。(`docs/ANALYTICS_METRICS.md` + `MetricCatalogGuardTest` 11 例) +- [x] 分离服务用户数与服务人次、活动 mutual/confirmed/match/chat/success、Banner impression/click。 +- [x] 有效交友匹配在口径未确认前标为 provisional,不能当正式成功或对外宣传。 +- [x] 所有统计接口应用 `analytics.view` 和组织/站点 DataScope,低权限账号返回 403。(V043 授权 + `AnalyticsPermissionGrantTest` 6 例) **Gate:** 用固定测试数据人工复算一致;相同用户多次服务不会污染去重人数。 -### Phase 21:账户生命周期 — EXTEND +### Phase 21:账户生命周期 — EXTEND ✅ 已完成(2026-09-18 复验关闭) **Files:** `account/service/AccountLifecycleService.java`、预约/咨询/项目/资格服务、数据保留文档。 -- [ ] 注销前检查进行中的预约、咨询、项目和本地资格审核。 -- [ ] 注销事务关闭未来服务、退出项目、失效本地资格并匿名化允许保留的服务历史。 -- [ ] 数据保留期限未确认的敏感材料采用配置和人工审核,不擅自永久保存或删除。 +- [x] 注销前检查进行中的预约、咨询、项目和本地资格审核。(`checkCanWithdraw`;已从「硬抛异常阻断」改为「信息性日志 + 继续清理」,尊重「注销不设置障碍」) +- [x] 注销事务关闭未来服务、退出项目、失效本地资格并匿名化允许保留的服务历史。(`cancelPendingActivityRegistrations` / `notifyActiveMatches` 两处 TODO 桩已实现;`anonymizeServiceHistory` 已接线;身份证与姓名脱敏补齐) +- [x] 数据保留期限未确认的敏感材料采用配置和人工审核,不擅自永久保存或删除。 + +> **遗留(未静默扩权,见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` 批 3)**: +> ① 红娘服务进行中拦截仍硬编码 `0` —— 根因是数据模型**没有 `matchmaker_services` 表**,拦截项在设计上无法落地; +> ② `getPrivacySettings` / `updatePrivacySettings` 仍为 TODO 桩。 **Gate:** 注销后不能登录/推荐/聊天;统计留痕不反向暴露个人和咨询正文。 -### Phase 22:Deployment / Ops — EXTEND +### Phase 22:Deployment / Ops — EXTEND ⚠️ 未复验(与 STATUS 的「Phase 22 部署运维配置扩展」是两份不同工作) **Files:** Dockerfiles、`infrastructure/docker-compose*.yml`、Nginx、backup/restore/deploy/gray-release scripts、OPS/DEPENDENCIES 文档。 +> ⚠️ **口径澄清(2026-09-18 文档治理)**:本节为计划的 **Deployment / Ops 基础设施** Phase;而 `docs/STATUS.md` 遗留区与 +> `Phase-22-V11-Recovery-Completion-Report-2026-09-18.md` 复验的是 **7 个 V1.1 Feature Flag + FeatureFlagController** +> (「部署运维配置扩展」标签),**两者是不同工作**。后者的复验结论**不构成本节的验收证据**。 +> 下列 5 项**均未复验**,逐项处置见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` 批 2。 + - [ ] 删除 Backend 镜像跳过测试的发布路径;CI 构建必须先测试再打包。 - [ ] 生产关闭 Mock WeChat、默认密码、Debug、Swagger 和演示 Seed;Secret 全部由环境变量/Secret 文件注入。 - [ ] 建立 `/api/v1`、WebSocket、私有对象、6688 端口检测及国内依赖镜像说明。 @@ -534,18 +545,24 @@ D2——`RelationshipService.createMatch` 不写 episode/lastActivityAt,与 `M **Gate:** staging 部署、健康检查、恢复演练和版本回滚都有命令、日志与结果证据。 -### Phase 23:可信系统测试重建 — REFACTOR +### Phase 23:可信系统测试重建 — REFACTOR ⚠️ 部分关闭(2026-09-18) **Files:** `backend/src/test/**`、`tests/e2e/**`、`tests/invariants/**`、测试 fixture/seed、CI scripts。 -- [ ] 删除测试体中的空 `pass`,建立可隔离的用户、角色、组织、活动、咨询和预约 fixture。 -- [ ] INV-001~020 必须测试真实服务行为,不能只断言常量字符串存在。 -- [ ] E2E 覆盖首页聚合、Banner、资格、咨询、预约、内容、多类型活动、二阶段同意、组织隔离。 -- [ ] 增加 appointment owner、Counselor Assigned、ContentEditor zero-user-data、station scope 等负向安全测试。 -- [ ] CI 串联迁移、backend test、admin type-check/build、miniapp type-check 和 E2E,任何失败阻断发布。 +> ⚠️ **不虚勾**:下列第 3、5 项**确实未完成**,故本 Phase 判定为**部分关闭**,且**不宣布「失败为零可进入 UAT」**。 + +- [x] 删除测试体中的空 `pass`,建立可隔离的用户、角色、组织、活动、咨询和预约 fixture。(清除 44 个 `pass` 空壳 + 14 个只断言常量的假不变量测试;新增空壳阻断闸门) +- [x] INV-001~020 必须测试真实服务行为,不能只断言常量字符串存在。(新增 4 个经负向注入验证的真实行为守卫) +- [ ] E2E 覆盖首页聚合、Banner、资格、咨询、预约、内容、多类型活动、二阶段同意、组织隔离。**(未完成:场景清单已完整保留在各占位文件头部 —— 本地资格 11 项、互选 8 项、权限 10 项、预约 7 项、首页 11 项;待真实实现)** +- [ ] 增加 appointment owner、Counselor Assigned、ContentEditor zero-user-data、station scope 等负向安全测试。**(部分:INV-011 结构性满足但缺显式守卫,列为待补)** +- [ ] CI 串联迁移、backend test、admin type-check/build、miniapp type-check 和 E2E,任何失败阻断发布。**(未完成:D-23-D,CI 未串联 E2E)** **Gate:** 不允许 skip/pass 空壳;报告列出总数、通过、失败、跳过及原因,失败为零才进入 UAT。 +> **遗留(未静默扩权)**:E2E 需可用活栈(后端 + PostgreSQL + 种子数据 + `E2E_PASSWORD`),在 CI 中如何供给属**基础设施决策**, +> 按「不写无法验证的测试」纪律列为遗留。处置计划见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md` 批 2。 +> **报告**:`docs/Phase-23-V11-Recovery-Completion-Report-2026-09-18.md`(部分关闭);E2E 基建见 `docs/Phase-23B-V11-E2E-Infrastructure-Completion-Report-2026-09-18.md`。 + ### Phase 24:UAT — EXTEND - [ ] 按用户、Reviewer、Matchmaker、Counselor、Counseling Manager、Service Station Operator、Content Editor、Activity Manager、Risk Operator 分角色验收。