Files
danyang-match/docs/善缘丹阳 V1.1 当前进度校正与严格Phase修复计划.md
T

526 lines
31 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 善缘丹阳 V1.1 当前进度校正与严格 Phase 修复 Implementation Plan
> **2026-09-13 UI 状态覆盖:** Phase 07 的业务专项证据保留,但旧视觉结果已被用户否决。当前 UI 唯一规格为 `docs/superpowers/specs/2026-09-13-reference-driven-dual-client-ui-redesign-design.md`,唯一总计划为 `docs/superpowers/plans/2026-09-13-reference-driven-dual-client-ui-redesign.md`;先完成清理门禁,不得从本文件恢复旧视觉实现。
> **已被纠正并取代(2026-09-09):** 本文件错误地把客户修订文档解释为“全部 Phase 重开”,且对页面缺失范围判断不准确。当前唯一开发修复计划为 [善缘丹阳 V1.1 客户需求基线增量开发与修复计划.md](善缘丹阳%20V1.1%20客户需求基线增量开发与修复计划.md)。本文件只保留审查历史,不再作为执行依据。
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** 以《善缘丹阳 V1.1 Codex最终主启动提示词(整合版)》为最高产品基线,保留可验证成果,严格按 Phase 01~26 顺序修复偏差并形成用户端、后台端、数据、权限、测试和运维完整闭环。
**Architecture:** 保持现有 Java 21 + Spring Boot 模块化单体、PostgreSQL、Redis、WebSocket、私有对象存储、Vue 3 管理后台和微信原生 TypeScript 小程序。V001~V027 已应用迁移不可改写,后续修复只使用向前兼容的新迁移;不增加微服务、消息队列或独立 CMS/咨询服务。
**Tech Stack:** Java 21、Spring Boot 3.x、Spring Security、MyBatis-Plus、Flyway、PostgreSQL、Redis、S3-Compatible Private Object Storage、WebSocket、Vue 3、TypeScript、Vite、Pinia、Element Plus、微信原生小程序、Docker Compose、Nginx。
**Spec:** `docs/善缘丹阳 V1.1 Codex最终主启动提示词(整合版).md`(最高优先级);并结合 `AGENTS.md`、V1.1 专项修订文件、V1.0 未被修订的核心设计和 `docs/V1.1_REAUDIT_REPORT_2026-09-09.md`。
## Global Constraints
- 用户基础婚恋服务永久免费,禁止支付、会员、金币、礼物、付费曝光和付费聊天。
- 微信登录、手机号、实名认证、本地资格、婚恋资料和人工审核是进入匹配服务的准入链路。
- 实名不等于官方婚姻状态核验,禁止“100%真实、官方单身认证”等绝对承诺。
- Required 是 Hard Constraint;系统、算法、后台和红娘均不得自动放宽。
- 普通婚恋关系只有双向 Like 后才能 Match 和聊天;Block 优先级最高。
- 活动 Mutual Interest 不直接创建 Match/Chat;双方分别确认后才创建或复用 Match Episode 与 Conversation。
- 红娘、管理员和系统不得替用户 Like、确认成功或确认活动开启沟通。
- 后台权限必须由 RBAC + Data Scope + Sensitive Permission 在服务端共同控制。
- PostgreSQL 是业务事实源;Redis 只用于缓存、会话、限频、WebSocket 辅助和短期状态。
- 首页和 8 个核心入口顺序固定;底部导航固定为首页、找对象、消息、活动、我的。
- 默认简体中文、Asia/Shanghai、`YYYY-MM-DD`、人民币元、UTF-8,并优先适配 Windows 11、WSL2、Docker Desktop。
- 每个 Phase 完成后必须输出规定格式的 Completion Report 并立即停止,未收到下一阶段指令不得继续。
---
## 一、主提示词审查结论
### 1. 文档优先级
本次修复采用以下唯一冲突处理顺序:
```text
用户最新明确指令
> V1.1 最终主启动提示词
> V1.1 专项修订文件
> V1.0 未被修订的核心设计
> 旧代码
> 技术示例
```
现有代码、STATUS、JIRA 和 Completion Report 与主提示词冲突时,必须修复代码和状态,不得反向降低主提示词验收标准。
### 2. 上一版恢复计划需要纠正的地方
- 用 R0~R8 重排了阶段,违反正式 Phase 01~26 固定顺序。
- 把权限集中到一个恢复阶段,未体现 Phase 02 建底座、各业务 Phase 各自验证 DataScope 的要求。
- 没有逐项覆盖 Phase 03~12 的 V1.0 核心回归。
- 对通知必须在事务提交后发送、失败不回滚核心事实覆盖不足。
- 对 Analytics 的服务用户数/服务人次、活动互选各状态分离、有效交友口径版本化覆盖不足。
- 对新增依赖登记、生产禁 Debug、备份实际恢复、明确 Rollback 版本覆盖不足。
- 对“我的”页面固定结构、Design Token、前端七类状态和线下扫码服务闭环覆盖不足。
历史上本文件曾取代 `docs/V1.1_RECOVERY_DEVELOPMENT_PLAN_2026-09-09.md`;该结论现已失效,以文件顶部的取代声明为准。
---
## 二、当前成果的处理分类
### KEEP
- Java 21 + Spring Boot 3.x 模块化单体、Vue 3 管理后台、微信原生小程序和 Docker Compose 技术路线。
- PostgreSQL、Redis、MinIO、Nginx 的单体部署结构。
- V001~V027 Flyway 迁移历史;数据库已确认全部应用成功。
- 现有 Auth、Profile、Review、Match、Relationship、Messaging、Activity、Risk 等 V1.0 模块代码,进入逐 Phase 回归,不先推翻。
- V1.1 已建立的表、实体和模块目录,作为修复基础。
### EXTEND
- FeatureFlagConfig:补齐与 CapabilityService 的真实联动和灰度降级。
- Notification:改成事务提交后发送并补全失败隔离。
- Analytics:补齐统计事实、口径版本和权限隔离。
- Account Lifecycle:补齐引用完整性、匿名化和保留策略测试。
- Ops:补齐生产配置、Secret、监控、备份恢复与 Rollback 证据。
### REFACTOR
- 后端认证 Principal、接口级 Permission、DataScope、SensitiveAccessLog。
- Counseling、ServiceAppointment、Activity Mutual Consent 的权限和状态机。
- HomeApplicationService 与独立 CapabilityService 的职责边界。
- Admin Web 路由、工作台和角色菜单。
- E2E fixture、隔离数据、断言和清理策略。
### REPLACE
- 运行中的旧小程序首页 `.js`,替换为主提示词规定的 V1.1 首页。
- 同一小程序页面同时手写 `.ts`/`.js` 的双轨模式,替换为唯一 TypeScript 源。
- 用常量存在证明不变量成立的 `V11InvariantsTest`。
- 允许失败但只打印信息的 smoke/E2E 测试。
- `STATUS.md` 中“核心功能 100% 完成、可上线”的错误基线。
### ADD
- 独立 CapabilityService、明确 Principal 类型和业务 DataScope 策略。
- U49~U64 缺失页面与“我的”页面固定结构。
- Banner 后台完整 CRUD、内部目标验证、排期、排序、受众和预览。
- 咨询、服务站预约、活动互选、内容、专项服务的完整前后台闭环测试。
- `docs/DEPENDENCIES.md`、安全复验、备份恢复演练和发布回滚材料。
---
## 三、当前实际进度校正
| Phase | 提示词目标 | 当前证据状态 | 校正状态 | 处理 |
|---|---|---|---|---|
| 01 | 基础架构 | 目录和容器存在;Git 不可识别,版本混乱,门禁失真 | Partial | 首先重开 |
| 02 | Auth + Operator + RBAC | 多角色表存在;后端仅检查 `operator_login` | Critical Partial | 重构 |
| 03 | 实名认证 | 基础模块存在;首页把实名硬编码为 true | Partial | 修复并复验 |
| 04 | Profile + Preference + 本地资格 | 表/API/页面文件存在;佐证权限测试为空壳 | Partial | 修复并复验 |
| 05 | 审核 | V1.0 审核存在;本地资格审核与审计证据不足 | Partial | 扩展并复验 |
| 06 | Match Engine | 现有规则代码存在;需重新证明双向 Required | Unverified | 回归后判定 |
| 07 | V1.1 首页 + 找对象 | WXML/TS/JS 漂移、空推荐、错误入口、缺课堂区 | Failed | 替换 |
| 08 | Like / Match / Block | V1.0 代码存在;需并发与 Block 全链路复验 | Unverified | 回归后判定 |
| 09 | Text Chat | REST/WS 文件存在;未验证主体与 Match 门槛 | Unverified | 回归后判定 |
| 10 | Image & Chat Safety | 接口存在;私有对象访问和风险处理证据不足 | Partial | 扩展并复验 |
| 11 | Notification | 方法存在;事务提交后发送未形成统一保证 | Partial | 重构 |
| 12 | Relationship Progress | 代码存在;双确认和 Episode 回归证据不足 | Unverified | 回归后判定 |
| 13 | 公益红娘 | 服务和转介存在;权限与用户自主权测试不足 | Partial | 修复并复验 |
| 13A | 咨询与婚前辅导 | 后端骨架存在;权限、状态机和前端链路失败 | Failed | 重构 |
| 14 | 多类型活动 | 字段和表存在;用户端、后台表单和资格策略未闭环 | Partial | 扩展 |
| 15 | 活动签到 | 旧实现存在;多类型活动与站点数据范围未复验 | Unverified | 回归后判定 |
| 16 | 活动互选双确认 | Consent 表存在;Match/Conversation 事务闭环缺失 | Failed | 重构 |
| 17 | 举报与风控 | 风险来源代码存在;权限、审计和 UI 不完整 | Partial | 扩展 |
| 18 | 申诉 | 旧实现存在;V1.1 风险来源上下文未完整验证 | Unverified | 回归后判定 |
| 19 | 统一后台及新增服务 | 多个 Vue 文件存在;咨询空白、接口错位、页面缺失 | Failed | 重构 |
| 20 | Analytics | API 返回成功;低权限可访问,统计口径未证实 | Partial | 重构并复验 |
| 21 | Account Lifecycle | 方法存在;事务与匿名化证据不足 | Partial | 扩展并复验 |
| 22 | Deployment / Ops | 本地容器运行;镜像跳过测试,备份恢复未证明 | Partial | 修复 |
| 23 | System Testing | 大量 pass、缺 fixture、15/16 smoke | Failed | 重建 |
| 24 | UAT | 没有有效系统测试前置条件 | Not Started | 阻断 |
| 25 | RC | 真实内容与安全验收未完成 | Not Started | 阻断 |
| 26 | Production | V027 Seed 已应用;生产 Smoke/恢复/Rollback 未完成 | Not Started | 阻断 |
综合可验证完成度继续采用约 35%;随着每个 Phase 重新通过 Definition of Done,再按真实验收项更新比例。
---
## 四、严格 Phase 修复计划
## Phase 01:项目基础架构修复与基线重建
**Current status:** Partial,当前唯一允许执行的开发阶段。
**Files:**
- Modify: `docs/STATUS.md`
- Modify: `docs/PENDING_DECISIONS.md`
- Modify: `docs/JIRA_BACKLOG.md`
- Modify: `CHANGELOG.md`
- Modify: `VERSION`
- Modify: `.github/workflows/ci.yml`
- Modify: `backend/Dockerfile`
- Create: `docs/DEPENDENCIES.md`
- Create: `docs/Phase-01-Recovery-Completion-Report.md`
**Interfaces:**
- Consumes: 最新主启动提示词、现有 V001~V027 迁移、本次审查报告。
- Produces: 唯一版本基线、可运行质量门禁、后续 Phase 的真实状态台账。
- [ ] 恢复或定位正式 Git 仓库,保护当前目录并记录审计前快照。
- [ ] 将全项目版本统一为 `1.1.0-recovery`,把历史 Completion Report 标记为需复验。
- [ ] 按本文件的 26 行矩阵重写 STATUS Current Phase、Completed、Next Task、Known Issues、Test Results、Migration Version、Release State。
- [ ] 将确认项从 PENDING 移出;保留主提示词第七十四部分规定的未决事项。
- [ ] 将 JIRA 已完成状态改为 `REOPENED_FOR_VERIFICATION`、`PARTIAL`、`BLOCKED` 或 `VERIFIED`,禁止用文件存在标记 Done。
- [ ] 修复 CI:Backend `mvn verify -B`;Admin `type-check + lint(no-fix) + build`;Miniapp `type-check`;Migration 在临时 PostgreSQL 实际执行。
- [ ] 移除 Backend Dockerfile 的 `maven.test.skip=true`,镜像必须由已通过测试的构建产生。
- [ ] 登记全部直接依赖的版本、License、维护状态、国内安装方式和安全检查结果。
- [ ] 运行 Phase 01 全部检查并保存原始输出;无法运行的检查必须将环境原因列为 Blocked,不能写 Passed。
- [ ] 更新 OpenAPI、Migration Inventory 和 CHANGELOG 中的真实基线说明。
- [ ] 输出规定格式的 Phase 01 Recovery Completion Report,然后立即停止。
**Acceptance commands:**
```powershell
git status --short --branch
Set-Location backend; mvn verify -B
Set-Location ..\admin-web; npm ci; npm run type-check; npm run lint:check; npm run build
Set-Location ..\miniapp; npm ci; npm run type-check
Set-Location ..; python -m pytest -q tests/invariants
```
**Exit Gate:** Git 可追溯、版本唯一、CI 会因现有已知错误失败、文档没有虚假完成结论。完成后不得自动进入 Phase 02。
## Phase 02:Auth + Operator + RBAC 三层权限底座
**Current status:** Critical Partial。
**Core files:** `JwtAuthFilter.java`、`PermissionFilter.java`、`SecurityConfig.java`、`PermissionService.java`、V015 后续修复迁移、`PermissionMatrixTest.java`。
- [ ] 区分 User Principal 与 Operator Principal,禁止 Operator Token 被普通用户接口当作用户身份。
- [ ] 建立 API → Permission Code 明确映射,不再用 `operator_login` 保护全部后台接口。
- [ ] 建立 DataScope 接口:platform、organization、assigned_service、service_location、self。
- [ ] 建立 Sensitive Permission + Business Reason + SensitiveAccessLog 公共入口。
- [ ] 验证一个 Operator 多 Role 的并集权限,同时确保组织关系不自动产生数据权限。
- [ ] 真实测试 13 类角色最小权限和直接 URL/API 越权。
**Exit Gate:** RBAC、DataScope、Sensitive Permission 三层行为测试通过;低权限 API 越权全部返回 403/404。输出报告并停止。
## Phase 03:实名认证状态修复
**Current status:** Partial。
- [ ] 复验微信登录、手机号绑定、身份提交、状态查询和取消流程。
- [ ] 用 UserIdentity 的真实状态替换首页 `verified=true`。
- [ ] 保持本地资格独立建模,身份 DTO 不加入本地资格字段。
- [ ] 人脸仅保留 Provider 接口、状态和 Feature Flag;不保存人脸模板或自研识别。
- [ ] 验证日志、响应和截图中不存在身份证明文、Token 和默认密钥。
**Exit Gate:** 实名状态来自 PostgreSQL;文案不暗示婚姻状态官方核验。输出报告并停止。
## Phase 04:Profile + Preference + 本地资格
**Current status:** Partial。
- [ ] 复验 Profile、Preference、照片、兴趣、隐私设置与资料完成度。
- [ ] 真实实现本地资格声明:户籍、工作、居住、其他;默认先声明,按策略请求佐证。
- [ ] 佐证上传校验文件数、大小、类型、归属和私有对象存储。
- [ ] `/me/status` 返回真实 localEligibilityStatus,但不暴露原始证明。
- [ ] 复验 Required/Preferred 字段没有在 UI、API 或数据库默认值中混淆。
**Exit Gate:** 本地资格与实名完全分离,INV-011 的用户侧前置条件成立。输出报告并停止。
## Phase 05:审核与敏感佐证访问
**Current status:** Partial。
- [ ] 本地资格进入独立 review_type 队列,支持 claim、approve、need_evidence、reject。
- [ ] 只有具备资格审核权限和业务理由的 Reviewer 可获取短期私有访问地址。
- [ ] 每次访问记录 SensitiveAccessLog,内容不记录证明正文。
- [ ] 审核状态变更与通知使用事务后事件。
- [ ] 复验并发 claim 只能有一个工作人员成功。
**Exit Gate:** 未授权 Operator 无法看到证明;每次授权访问可审计。输出报告并停止。
## Phase 06:Match Engine 双向 Hard Constraint
**Current status:** Unverified。
- [ ] 复验 Eligibility → A Required → B Required → Directional Score → Mutual Score → Ranking → Reasons 全链路。
- [ ] 为双向 Required、Block、本地资格、暂停寻找和账号状态建立参数化测试矩阵。
- [ ] 禁止财富、房产、车辆、颜值、公司级别、职位、人气作为排序价值特征。
- [ ] 前端只显示“很合适/比较合适/值得了解”和真实理由,不显示数字匹配率。
**Exit Gate:** INV-001 有真实正反例,任何一方 Required 不满足都不会进入推荐。输出报告并停止。
## Phase 07:V1.1 首页 + 找对象整体替换(业务证据保留,UI 已重新打开)
**Current status:** Failed。
**Core files:** `HomeApplicationService.java`、`HomeDTO.java`、新增 `CapabilityService.java`、`miniapp/pages/index/*`、缺失的内容与服务站页面。
- [ ] 新建服务端 CapabilityService,统一计算七项能力,Home 只聚合不复制业务规则。
- [ ] 首页从真实身份、审核、本地资格、推荐、Banner、活动、服务站、Content 数据源聚合。
- [ ] 精确实现固定顺序:品牌、用户状态、Banner、8 入口、推荐、公益服务、活动、服务站、婚恋课堂、安全提醒。
- [ ] 8 入口精确顺序、目标路径和 Feature Flag/Capability 状态由自动化测试锁定。
- [ ] 替换旧运行 `.js` 首页;TypeScript 成为唯一手写源,消除 13 个页面的 TS/JS 漂移。
- [ ] 首页覆盖 onboarding、review-pending、searching、paused、successful 五种状态和 Loading/Skeleton/Empty/Error/Retry/Disabled Reason/Success Feedback。
- [ ] 第一屏确保品牌、不过高 Banner 和 8 入口在常见手机尺寸清晰可见。
**Exit Gate:** INV-016、017 通过;5 秒信息认知目标经截图与人工走查验证。输出报告并停止。
## Phase 08:Like / Match / Block
**Current status:** Unverified。
- [ ] 复验单向 Like 不创建聊天、双向 Like 原子创建一个 Match Episode。
- [ ] 并发 Like 只能生成一个 active Match 和一个 Conversation。
- [ ] Block 立即影响聊天、推荐、搜索、红娘候选和关系互动。
- [ ] Unblock 不恢复旧 Like、Match 或 Conversation。
- [ ] 管理员和红娘均无代 Like/Pass 能力。
**Exit Gate:** INV-002、003、004、007 通过。输出报告并停止。
## Phase 09:Text Chat
**Current status:** Unverified。
- [ ] 复验 REST Send + WebSocket Receive、历史、未读、失败重试和系统消息。
- [ ] 强制 `senderId + clientMessageId` 唯一,重复发送返回同一业务结果。
- [ ] 只有 active Match 双方可读写 Conversation。
- [ ] 不实现语音、视频、群聊、红包、转账、位置、文件、AI 代聊和公开已读回执。
**Exit Gate:** 未 Mutual、Unmatch、Block、越权用户均不能聊天。输出报告并停止。
## Phase 10:Image & Chat Safety
**Current status:** Partial。
- [ ] 图片上传只使用短期凭证和私有桶,读取 URL 校验 Conversation 成员关系。
- [ ] 风险关键词、频率限制和首次安全提示不记录私人聊天正文。
- [ ] 普通工作人员不能读取聊天;只有明确案件、权限、理由和审计时有限访问。
- [ ] 验证对象 URL 过期、越权访问、Block 后发送和恶意文件类型。
**Exit Gate:** INV-009 与图片私有访问测试通过。输出报告并停止。
## Phase 11:Notification 事务后发送
**Current status:** Partial。
- [ ] 把 Match、审核、预约、咨询、活动互选通知统一改为事务提交后事件。
- [ ] 通知失败只记录脱敏错误和重试状态,不回滚核心业务事实。
- [ ] 单向活动意向和咨询敏感内容不得进入通知文案。
- [ ] Feature Flag 关闭时不发送指向不可用功能的通知。
**Exit Gate:** 事务回滚不发送通知;通知故障不回滚 Match/服务记录。输出报告并停止。
## Phase 12:Relationship Progress 与 Match Episode
**Current status:** Unverified。
- [ ] 复验 searching、getting_to_know、paused、successful、exit 等状态迁移。
- [ ] 成功牵手必须一方发起、另一方确认;工作人员不能代确认。
- [ ] 一对用户允许在 prior unmatch 后建立新 Episode,保留历史且不串用 Conversation。
- [ ] 首页公益服务建议只消费关系状态,不修改关系事实。
**Exit Gate:** 双确认、历史 Episode 和非法迁移测试通过。输出报告并停止。
## Phase 13:公益红娘与用户自主权
**Current status:** Partial。
- [ ] 红娘只能看 DataScope 内必要资料和系统候选,不读取私人聊天、完整身份证、手机号和咨询正文。
- [ ] 红娘推荐不得绕过 Required,不得替用户 Like/Pass/确认成功。
- [ ] 咨询、活动和服务站转介必须由用户确认后生效。
- [ ] 服务申请、分配、推荐、跟进、完成形成完整留痕。
**Exit Gate:** INV-007、013 和转介用户确认测试通过。输出报告并停止。
## Phase 13A:婚恋咨询与婚前辅导
**Current status:** Failed。
- [ ] 将后台 API 置于受保护的 `/api/v1/operator/counseling/**`,用户 API 保持独立。
- [ ] 实现 pending → assigned → scheduled → in_progress → completed/closed/cancelled 合法状态机。
- [ ] Counselor 只能读取和操作 Assigned Service;Counseling Manager 才能查看队列和分配。
- [ ] Matchmaker、普通管理员和其他 Counselor 看不到咨询正文和 followup。
- [ ] 婚前辅导复用 CounselingService 类型,不建立重复系统。
- [ ] 修复 Admin 空白页、路由和接口;完成 U55~U59 的申请、我的咨询、排期和结果状态。
- [ ] 只记录必要摘要、服务结果和下一步,不记录逐字谈话,不建设咨询即时 IM。
**Exit Gate:** INV-012、013 及申请→分配→预约→服务→摘要→完成全链路通过。输出报告并停止。
## Phase 14:多类型公益活动
**Current status:** Partial。
- [ ] 六类活动使用明确枚举与中文展示。
- [ ] registration_policy 按类型校验,反诈课堂不得被相亲联谊资格规则错误阻断。
- [ ] 使用 total_capacity + 可选 capacity groups,不重新引入固定男女容量模型。
- [ ] 用户端完成类型 Tabs、类型化卡片和动态报名资格提示。
- [ ] Admin 完成类型、报名规则、多组织与容量组表单。
**Exit Gate:** 每类活动的准入、容量和前后台展示测试通过。输出报告并停止。
## Phase 15:活动报名、审核与签到
**Current status:** Unverified。
- [ ] 复验报名幂等、最后名额并发批准、取消和候补逻辑。
- [ ] 非 matchmaking 活动不出现互选设置。
- [ ] 扫码签到、人工签到、重复签到和签到统计完整留痕。
- [ ] Service Station Operator 只能处理指定现场任务。
**Exit Gate:** INV-005 和多类型活动签到回归通过。输出报告并停止。
## Phase 16:活动互选 + 双向沟通确认
**Current status:** Failed。
- [ ] Mutual Interest 形成 consent pair,但不创建 Match/Conversation。
- [ ] 双方分别确认后,在一个事务中锁定 pair 并幂等创建或复用关系。
- [ ] 已有 active Match 复用聊天;prior unmatch 创建新 Match Episode 和 Conversation。
- [ ] 一方拒绝、超时、重复提交、并发确认均有明确状态和隐私安全结果。
- [ ] 用户端结果页覆盖本人确认、等待对方、双方完成、已有聊天、拒绝和超时。
- [ ] Analytics 分开记录 Interest、Mutual Interest、Consent、Match、Two-Way Chat、Successful。
**Exit Gate:** INV-006、014、015 和并发事务测试通过。输出报告并停止。
## Phase 17:举报与风控
**Current status:** Partial。
- [ ] 风险来源覆盖 counseling、service_station、offline_activity,但不把咨询正文写入日志。
- [ ] RiskAction 具备权限、理由、事务和审计;举报证据保持私有。
- [ ] 普通用户不可看到公开黑名单或他人处罚信息。
- [ ] Admin 工作台展示高风险和待处理任务,不显示无权内容。
**Exit Gate:** 风险越权、敏感日志和处置事务测试通过。输出报告并停止。
## Phase 18:申诉
**Current status:** Unverified。
- [ ] 根据 Confirmed/Pending 决议确认是否首发;若首发,保持现有 V1.0 模型并扩展 V1.1 风险上下文。
- [ ] 只有允许申诉的有效处置可提交,提交与处理均幂等。
- [ ] 通过后撤销对应 RiskAction,拒绝后保持原处置,全程审计。
- [ ] 页面不泄露举报人、证据和内部风控规则。
**Exit Gate:** 用户申诉和后台处理闭环通过。输出报告并停止。
## Phase 19:统一运营后台 + Banner + Content + 服务站 + ServiceProgram
**Current status:** Failed。
- [ ] 修复 Admin type-check,注册全部路由并按角色对导航分组。
- [ ] 工作台按角色展示:Reviewer 待审核、Matchmaker 待服务、Counselor 今日预约、Service Station 今日预约、Activity Manager 报名签到、Risk 高风险。
- [ ] Banner 支持图片、标题、副标题、按钮、内部目标、起止时间、排序、受众、上下架和移动端预览。
- [ ] Content 只实现分类、列表、详情、创建、编辑、发布、下架,不增加评论、点赞、投稿、Feed、热搜和排行榜。
- [ ] 服务站实现详情、地址、开放时间、联系电话、地图导航、服务项目和预约后台处理。
- [ ] ServiceProgram 支持公益项目与成员服务,不使用“高价值/低价值/困难匹配”标签。
- [ ] 补齐 U49~U54、U60、U61、U64,并按固定结构重建“我的”页面。
- [ ] 统一 Design Token,清理每页重复硬编码,补齐七类前端状态。
**Exit Gate:** 新增服务全部具备用户端、后台端、数据、权限和测试闭环。输出报告并停止。
## Phase 20:Analytics 真实口径
**Current status:** Partial。
- [ ] 统计服务站访问、预约、咨询申请/完成、婚前辅导、课堂、反诈、专项服务和用户来源。
- [ ] 明确区分服务用户数与服务人次。
- [ ] 分开统计 Activity Interest、Mutual Interest、Consent、Match、Two-Way Chat、Successful。
- [ ] 有效交友指标使用版本化口径,运营未确认前标记 provisional,不永久固化。
- [ ] Dashboard 不读取咨询正文,所有统计接口执行 Permission + DataScope。
**Exit Gate:** 用固定数据库样本验证每个指标分子、分母、去重规则和权限。输出报告并停止。
## Phase 21:Account Lifecycle
**Current status:** Partial。
- [ ] 注销/关闭账户处理未来预约、进行中咨询、项目成员、本地资格、Match 和 Conversation。
- [ ] 历史服务记录按保留策略匿名化,不破坏外键和统计。
- [ ] 注销、恢复、关闭的并发和失败回滚测试覆盖 V1.1 新表。
- [ ] 账号关闭后不能发起新服务或继续互动。
**Exit Gate:** 生命周期跨模块一致性与匿名化测试通过。输出报告并停止。
## Phase 22:Deployment / Ops
**Current status:** Partial。
- [ ] 全部新增模块可由 Feature Flag 独立关闭,首页正确降级但不永久隐藏已确认功能。
- [ ] Production 无 Mock 实名、测试 API、默认密码、公开管理 Swagger 和 Debug 日志。
- [ ] Secret 只从环境或 Secret 文件注入,不进入源码、Git、日志和交付文档。
- [ ] `/health/live`、`/health/ready`、`/version` 返回可监控且不泄密的信息。
- [ ] 建立自动加密备份到独立存储,并在隔离环境实际恢复验证。
- [ ] 明确上一个稳定版本和应用/数据库 Rollback 手册,Migration 保持向前兼容。
- [ ] 提供 PowerShell 与 Bash 部署、检查、备份、恢复命令和国内镜像说明。
**Exit Gate:** 部署可复现、恢复演练成功、Rollback 可执行、生产安全配置检查通过。输出报告并停止。
## Phase 23:System Testing 重建
**Current status:** Failed。
- [ ] 建立 pytest fixture、隔离数据库、角色令牌、数据工厂和测试清理。
- [ ] 清除所有空 `pass`,每个测试必须具备 Given/When/Then 与强断言。
- [ ] 重写 INV-001~020 为真实行为测试,不用常量存在代替权限和业务验证。
- [ ] 执行 Backend 单元/集成、Admin type-check/lint/test/build、Miniapp type-check/静态路由测试、API E2E、Migration Test。
- [ ] 最高优先覆盖权限、隐私、数据一致性、Match、Block、Chat、本地资格、活动容量、互选同意和咨询权限。
- [ ] 生成机器可读测试报告并在 CI 留存,不再用手工“25/25”文字作为证据。
**Exit Gate:** 所有自动化测试零失败、零错误、零意外跳过;P0/P1 缺陷清零。输出报告并停止。
## Phase 24:UAT
**Current status:** Not Started。
- [ ] 使用独立 UAT 环境和真实角色,不复用开发脏数据。
- [ ] 完成婚恋核心、首页、本地资格、红娘、咨询、婚前辅导、多类型活动、活动确认、服务站预约、内容和专项服务场景。
- [ ] 完成群众到万善公园→扫码→登录→预约/报名→后台处理→到场→完成→留痕的线上线下闭环。
- [ ] 确认正式事实不依赖 Excel、个人微信或纸质临时台账。
- [ ] 验证普通用户无需培训即可完成核心任务,重要页面一步一个任务。
**Exit Gate:** UAT 用例、问题清单、复测结果和业务负责人签字齐全。输出报告并停止。
## Phase 25:RC
**Current status:** Not Started。
- [ ] 审核真实 Banner、服务站地址/开放时间、咨询介绍、婚前辅导、反诈、课堂、关于、主办/执行信息。
- [ ] 删除测试文案、默认账号、Mock 数据和开发入口。
- [ ] 完成安全、隐私、无障碍、弱网、空状态、错误恢复、常见 Windows 浏览器与真机检查。
- [ ] 复核所有文案无商业化标签和绝对安全承诺。
- [ ] 建立 RC 文件清单、校验值、依赖清单、已知限制和 Go/No-Go 结论。
**Exit Gate:** 发布阻断项为零,RC 可在全新环境复现。输出报告并停止。
## Phase 26:Production
**Current status:** Not Started;仅 V027 Seed 可 KEEP。
- [ ] 上线前确认备份、恢复、Rollback、Secret、证书、监控和告警。
- [ ] 应用已审核的初始化分类、活动类型、服务类型、角色权限、服务站和 Banner。
- [ ] 执行 Home、Quick Entry、Service Station、Counseling、Content、Activity Consent、Match、Block、Chat、权限矩阵 Smoke。
- [ ] 验证 PostgreSQL 是唯一事实源,生产无测试账号和默认密钥。
- [ ] 记录部署版本、Migration Version、前一稳定版本、Smoke 结果和回滚窗口。
**Exit Gate:** 主提示词第九十七部分全部满足后,才允许将版本定义为“善缘丹阳 V1.1 完成”。输出 Production Completion Report 并停止。
---
## 五、统一 Definition of Done
每个 Story/Task 必须同时满足:代码完成、测试完成、Lint 通过、Build 通过、Migration 通过、权限验证通过、OpenAPI 更新、文档更新、Regression 通过。任何一项缺失,状态只能是 Partial 或 Blocked。
每个 Phase Completion Report 必须逐项回答:本次具体完成、实际测试与原始输出、代码和数据库变化、安全影响、未决事项、回归影响和下一 Phase;报告生成后立即停止。
## 六、计划自检
- Spec coverage:已覆盖主提示词 100 个部分中的产品红线、首页、Banner、服务站、咨询、内容、活动、专项服务、多组织、架构、数据、算法、聊天、权限、页面、UI、阶段、DoD、不变量、事务、测试、Analytics、线下闭环、依赖、Secret、部署、备份、Rollback、Feature Flag、Pending、UAT、RC 与 Production。
- Placeholder scan:每个 Phase 均有明确修复动作和 Exit Gate,没有以文件存在或空测试代替验收。
- Type consistency:统一使用 User/Operator Principal、Permission + DataScope + Sensitive Permission、CapabilityService、Match Episode、Conversation 和事务后事件。
- Scope check:坚持模块化单体和现有技术栈,不新增主提示词禁止的系统。
## 七、历史建议(已失效)
只执行 Phase 01。Phase 01 Completion Report 经用户审核并收到继续指令后,才允许进入 Phase 02。