docs: STATUS 历史区收敛 951→783 行,修正两处残留假声明,同步治理报告与收尾计划

治理报告「八、遗留」第 2 项(STATUS 后半历史区过长)至此关闭。

STATUS.md(951 → 783 行,净减 168):
- 折叠 2026-09-09 期快照:Phase 01~11 逐项任务表 → 索引表(指向权威结论位置);旧 Phase 13
  首轮表 → 指针;「V1.0 基线状态 + 历史状态记录」两块 → 一段带历史边界声明的治理痕迹。
- 收敛作废/重复块:两块已作废的 Phase 22 历史声明、已作废的 Phase 23「已完成」声明、
  「整体进度总结」里重复的 Phase 24~26 摘要。
- 修正两处残留假声明(本轮新发现):
  ① `P26-T06 初始化Feature Flags | ✅ (application.yml配置)` → 标「不成立」(依据 Phase 22 复验:
     4 份 application*.yml 无 features 块,15 个 flag 实为 Java 字段默认且业务不读取);
  ② `Phase 23(V1.1专项测试)— 已完成 ✅` → 标「已被 2026-09-18 复验推翻,实为部分关闭」。
- 口径更新:UI 契约测试行 13/13 → 14/14(统一执行器 + 已接入 CI),并注明阶段 4 的历史时点值。
- 三个门禁锚点全部保留并复验:UI REDESIGN ACCEPTED BY USER、Phase 07…已通过用户验收、
  管理后台: http://localhost:13520/。

同步文档:
- 治理报告:4.4 漏网文档改为「已处置」;悬空引用表最后一行为已关闭;第七节补 UI 门禁入 CI、
  执行器负向验证、漏网文档处置三行,并改写 STATUS 收敛行;第八节改为「3 项遗留全部关闭」。
- 收尾计划:批 1 Task 1.1 标完成(Step 1~4 证据齐),并更正「15 个契约文件」为实测 14 个;
  验收口径由逐文件执行改为 `node scripts/run-ui-contracts.mjs`。

验证:`node scripts/run-ui-contracts.mjs` → PASS 14/14、退出码 0(含文档基线契约门禁)。
This commit is contained in:
WorkBuddy
2026-09-18 21:34:47 +08:00
parent b2ef60c04c
commit 70134dd62e
3 changed files with 92 additions and 241 deletions
+49 -217
View File
@@ -2,7 +2,7 @@
> **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 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)启动需用户确认。**
> 阶段 0(在途收口)、阶段 1(小程序 C 组 + discover 筛选重设计)、阶段 2(管理端 Vue 新框架适配)、阶段 3(CapabilityService 独立化)、阶段 4(双端总验收)全部完成。三端构建通过、**13/13 契约全绿**(阶段 4 验收时点值;当前 UI 契约门禁为 **14/14**)、核心 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` 保留为冗余锚点)
@@ -27,7 +27,7 @@
| `/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 |
| Miniapp | **验证通过** | 2026-09-16:tsc ✅;**11 核心页全部 TS-only(11/11)**;首批 11 页于 2026-09-16 通过用户验收;discover 筛选重设计已通过 DevTools 验证 |
| UI 契约测试 | **13/13 通过** | 2026-09-16 运行:全部退出码 0;含 capability 独立化适配与文档基线口径 |
| UI 契约测试 | **14/14 通过**(2026-09-18) | 统一执行器 `scripts/run-ui-contracts.mjs`,**已接入 CI**(job `ui-contracts`);历史:2026-09-16 为 13 项,此后新增端口一致性与 `/admin/` 子路径守卫 |
| 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 部分关闭;停在 Phase 24(UAT)门前** | 后端 **669 / 0 failures / 0 errors / 3 skipped**;UI 契约门禁 **14/14**;管理端入口收敛至 `/admin/` 子路径(staging 13521);HTTP 语义 + 身份收敛 + 幂等键三轮横向加固完成。**Phase 24 启动需用户确认** |
@@ -61,146 +61,38 @@
---
## V1.0 基线状态
## 历史基线快照(2026-09-09 及更早,仅供追溯)
> **历史记录边界:** 从本节起至文件末尾均为 2026-09-09 重新审查前的开发日志,仅用于追溯,不代表当前验收状态;其中所有 `✅`、`已完成`、`已部署`、测试数量和运行地址均须在对应新 Phase Completion Report 中重新举证。当前唯一有效状态如下。
| 当前有效项 | 状态 | 证据 |
|---|---|---|
| Phase 01 项目治理与检查基线 | 已交付,带阻断 | `scripts/verify-phase01.ps1` 可重复执行并真实返回 5 个失败门禁;详见 `Phase-01-V11-Recovery-Completion-Report-2026-09-09.md` |
| Git 基线 | 阻断 | 当前目录及父目录均无 `.git`,未擅自初始化新仓库 |
| Admin Web | 部分通过 | production build 通过;type-check 失败(3 个错误) |
| Miniapp | 失败 | TypeScript 检查失败(27 个错误) |
| Backend | 未验证 | 本机无 JDK/Maven,Docker Desktop 当前未运行 |
| V1.1 E2E | 失败 | 1 passed、26 failed、48 errors、9 warnings |
| Phase 02 及以后 | 未开始 | 等待 Phase 01 门禁确认 |
| UAT / RC / Production | NO-GO | 构建、权限、E2E 与页面闭环未通过 |
---
## 历史状态记录(仅供追溯,不作为验收证据)
| Phase | 名称 | 状态 |
|-------|------|------|
| P01~P26 | 全部核心功能 | **已完成** ✅ |
| 不变量 INV-001~010 | 核心不变量 | **23/23 通过** ✅ |
| 权限矩阵 9角色×18权限 | RBAC+DataScope | **已通过** ✅ |
| API 测试 | 16/16 | **通过** ✅ |
| 代码审查问题 | 16项 | **全部清零** ✅ |
| Demo数据 | 12用户+活动+红娘 | **已就绪** ✅ |
---
> **历史记录边界**:以下为 2026-09-09 重新审查前的开发日志快照,**仅用于追溯,不代表当前验收状态**;
> 其中的 ✅ / 已完成 / 已部署 / 测试数量 / 运行地址**均不可作为验收证据**,须以对应 Phase 的
> Completion Report 与本文顶部「当前唯一有效状态」为准。
>
> 保留为治理痕迹(**已被后续 14 轮 KEEP-VERIFY 复验整体推翻**):当时自述 Git 基线「无 `.git`」、
> Admin Web type-check 3 错误、Miniapp TS 27 错误、Backend「未验证」、V1.1 E2E「1 passed / 26 failed /
> 48 errors」、UAT/RC/Production「NO-GO」,以及一张「P01~P26 全部完成 ✅ / 不变量 23/23 ✅ / API 16/16 ✅」的自评表。
>
> 原文可从 Git 历史取回:`git log --all -- docs/STATUS.md`。
## V1.1 当前进度
### Phase 01 — V1.1 基线搭建 ✅ 已完成
| 任务 | 状态 |
|------|------|
| AGENTS.md 更新至 V1.1 | ✅ |
| STATUS.md 更新至 v1.1.0-dev | ✅ |
| PENDING_DECISIONS.md 新增V1.1 pending | ✅ |
| JIRA_BACKLOG.md 创建 | ✅ |
| 测试骨架(6个spec文件) | ✅ |
| Phase-01-V11-Completion-Report | ✅ |
### Phase 01~11 — V1.1 首轮实现(2026-09-09 快照)
### Phase 02 — Auth + Operator + RBAC 扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| V015 迁移:4角色+30权限 | ✅ |
| Demo Seed 扩展:3新操作员 | ✅ |
| 角色权限分配(含边界约束) | ✅ |
| JIRA_BACKLOG 更新 | ✅ |
> ⚠️ 本段原为 2026-09-09 期的逐项任务表,其中的 `✅` 是**当时的自评,不构成验收证据**;
> 已收敛为索引,结论一律以本文顶部表与「当前 Phase」各节为准。
### Phase 03 — 实名认证扩展(人脸核验预留) ✅ 已完成
| 任务 | 状态 |
|------|------|
| V016 迁移:verification_level/liveness/provider | ✅ |
| UserIdentity 实体扩展 | ✅ |
| Feature Flag 系统配置(8项) | ✅ |
| Demo Seed 扩展 | ✅ |
### Phase 04 — Profile + Preference + 本地资格 ✅ 已完成
| 任务 | 状态 |
|------|------|
| V017 迁移:local_eligibility 表 | ✅ |
| Entity + Mapper(LocalEligibility/Evidence) | ✅ |
| API:GET/POST declaration/evidences/submit | ✅ |
| /me/status 扩展 localEligibilityStatus | ✅ |
| Miniapp U62 本地资格说明页 | ✅ |
| Miniapp U63 本地资格补充页 | ✅ |
| AuthService 注入 LocalEligibilityMapper | ✅ |
### Phase 05 — 审核模块扩展(本地资格) ✅ 已完成
| 任务 | 状态 |
|------|------|
| V018 迁移:review_type 扩展 local_eligibility | ✅ |
| ReviewService 新增本地资格审核方法 | ✅ |
| LocalEligibilityService 集成审核流程 | ✅ |
| SensitiveAccessLog 佐证访问审计 | ✅ |
| Constants 新增 REVIEW_TYPE_LOCAL_ELIGIBILITY | ✅ |
### Phase 06 — Match Engine 扩展(本地资格 Eligibility) ✅ 已完成
| 任务 | 状态 |
|------|------|
| MatchEligibilityService 接入本地资格检查 | ✅ |
| MatchRuleConfigProperties 新增 localEligibilityRequired | ✅ |
| LocalEligibilityService 缓存失效处理 | ✅ |
| eligibility test matrix 扩展 | ✅ |
### Phase 07 — V1.1首页重构 + 找对象 ✅ 已完成
| 任务 | 状态 |
|------|------|
| HomeApplicationService + HomeDTO | ✅ |
| GET /api/v1/home 聚合接口 | ✅ |
| V019 Banner + ServiceLocation 迁移 | ✅ |
| BannerService(时间/受众过滤) | ✅ |
| HomeController | ✅ |
| Miniapp 首页完整重构(U18 V1.1) | ✅ |
| 5种用户状态首页适配 | ✅ |
### Phase 08 — Like / Match / Block ✅ 已完成(2026-09-16 复验关闭)
| 任务 | 状态 |
|------|------|
| MATCH_SOURCE常量定义 | ✅ |
| createMatch 重载(autoCreateConversation参数) | ✅ |
| confirmActivityInterest 方法 | ✅ |
| ActivityInterest.hasMutualInterest 方法 | ✅ |
| ActivityInterestController 新增confirm接口 | ✅ |
| INV-014/015 不变量保障(不自动建Chat) | ✅ |
| 通知文案更新(V1.1二阶段确认规则) | ✅ |
| **INV-004 搜索不可见(双向)修复** | ✅ 新增(复验发现原实现完全绕过 Block) |
| **详情路径 Block 拦截(双向 → 404)** | ✅ 新增(复验发现两条详情路径均无检查) |
| **`matches.source` 取值越界修复** | ✅ 新增(`"liked"` → `MATCH_SOURCE_USER_LIKE`) |
| **测试库保真度对齐(`chk_match_source` + `user_profiles`)** | ✅ 新增 |
| **`DiscoverBlockInvisibilityIntegrationTest`(9 用例)** | ✅ 新增 |
### Phase 09 — Text Chat 验证 ✅ 已完成
| 任务 | 状态 |
|------|------|
| Activity Match source 聊天兼容性验证 | ✅ |
| 消息幂等性验证(client_message_id唯一索引) | ✅ |
| INV-002/003 不变量验证 | ✅ |
| WebSocket 推送机制确认 | ✅ |
| REST Send + WS Receive 架构确认 | ✅ |
### Phase 10 — Image & Chat Safety ✅ 已完成
| 任务 | 状态 |
|------|------|
| ChatController 限流检测集成 | ✅ |
| MessagingService 风险关键词检测接入 | ✅ |
| insertRiskNotice 高风险消息系统通知 | ✅ |
| sendChatSafetyTip 首次聊天安全提示 | ✅ |
| POST /messages/conversations/{id}/safety-tip API | ✅ |
| ChatController safety-tip 端点 | ✅ |
### Phase 11 — 公益服务通知扩展 ✅ 已完成
| 任务 | 状态 |
|------|------|
| V020 迁移:通知类型扩展(6种新类型) | ✅ |
| Constants 新增 5 个 NOTIFICATION_TYPE | ✅ |
| NotificationService 新增 10 个业务通知方法 | ✅ |
| ReviewService 集成本地资格审核通知 | ✅ |
| 隐私安全文案(中性化,不暴露敏感信息) | ✅ |
| Phase | 名称 | 权威结论位置 |
|---|---|---|
| 01 | V1.1 基线搭建 | `docs/Phase-01-V11-Recovery-Completion-Report-2026-09-09.md` |
| 02 | Auth + Operator + RBAC 扩展 | 顶部「当前唯一有效状态」 |
| 03 | 实名认证扩展(人脸核验预留) | 同上 |
| 04 | Profile + Preference + 本地资格 | 同上(含本地资格声明与审核) |
| 05 | 审核模块扩展(本地资格) | 同上 |
| 06 | Match Engine 扩展(本地资格 Eligibility) | 同上 |
| 07 | V1.1 首页重构 + 找对象 | 2026-09-16 通过用户验收(顶部表 + `Phase-07-…-2026-09-13.md`) |
| 08 | Like / Match / Block | 2026-09-16 KEEP-VERIFY 复验关闭 |
| 09 | Text Chat | 2026-09-16 KEEP-VERIFY 复验关闭 |
| 10 | Image & Chat Safety | 2026-09-16 KEEP-VERIFY 复验关闭 |
| 11 | 公益服务通知扩展 | 2026-09-16 KEEP-VERIFY 复验关闭 |
### Phase 14 — 多类型公益活动 ✅ 已完成(2026-09-17 KEEP-VERIFY/EXTEND 复验通过)
| 任务 | 状态 |
@@ -312,20 +204,11 @@
| 测试:`CounselingPhase13ATest`(25)+ `CounselingConstraintGuardTest`(5) | ✅ 新增 |
| 全量回归 **420 tests 全绿** | ✅ |
### Phase 13 — 公益红娘服务转介 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P13-V11-T01 转介婚恋咨询(service_type扩展 + request_source) | ✅ |
| P13-V11-T02 转介公益活动(activity_registrations.source字段) | ✅ |
| P13-V11-T03 转介善缘服务站(service_appointments表 + 转介追踪) | ✅ |
| P13-V11-T04 referral source tracking(Constants常量 + DB字段) | ✅ |
| P13-V11-T05 user consent/confirmation(confirmReferral 两阶段确认) | ✅ |
| V021 数据库迁移(service_appointments + activity_registrations扩展) | ✅ |
| ServiceAppointment Java 模块(Entity/Mapper/Service/Controller) | ✅ |
| ReferralService + ReferralController(转介核心逻辑) | ✅ |
| NotificationService 转介通知方法 | ✅ |
| Constants 新增转介来源常量 | ✅ |
| INV-005 红娘不可代用户操作验证 | ✅ |
### Phase 13 — 公益红娘服务转介(2026-09-09 快照)
> ⚠️ 该首轮任务表(✅ 为当时自评)已被下方
> 「Phase 13 — 公益红娘转介 ✅ 已完成(2026-09-16 KEEP-VERIFY/EXTEND 复验通过)」取代 ——
> 后者记录了复验修复的真实缺陷与永久守卫,**以那节为准**。
### Phase 12 — 关系状态轻量扩展 ✅ 已完成(2026-09-16 KEEP-VERIFY 复验通过)
| 任务 | 状态 |
@@ -609,35 +492,14 @@ MinIO: localhost:9003 (凭证由本地环境变量提供)
**Phase 20(Analytics数据统计扩展)— 已完成** ✅
### Phase 22 — 部署运维配置扩展(历史声明,已被上方 2026-09-18 权威结论取代)
> ⚠️ 下表为历史进度声明,**经 KEEP-VERIFY 实测部分不成立**,以本节上方「Phase 22 — 部署运维配置扩展(Feature Flag)✅(KEEP-VERIFY 复验关闭,2026-09-18)」为准。
### Phase 22 — 历史声明块(已作废)
| 任务 | 历史声明 | 实测结论 |
|------|---------|---------|
| P22-T01 counselingEnabled flag | ✅ | ⚠️ 死配置:全仓无业务调用点,不 gate 任何功能 |
| P22-T02 premaritalEnabled flag | ✅ | ⚠️ 死配置:同上 |
| P22-T03 contentEnabled flag | ✅ | ⚠️ 死配置:同上 |
| P22-T04 serviceLocationEnabled flag | ✅ | ⚠️ 死配置:同上 |
| P22-T05 localEligibilityEnabled flag | ✅ | ⚠️ 死配置:同上 |
| P22-T06 local evidence upload policy | ✅ | ✅ 属实:`LocalEligibilityService` 强制启用开关+数量上限,`PhotoService` 强制 size+类型 |
| P22-T07 private storage for counseling attachments | ✅ | ⚠️ 死配置:`counselingAttachmentsPrivate/Bucket` 零引用,存储实走 `object-storage.bucket-private` |
| FeatureFlagController API | ✅ | ⚠️ 曾含 D-22-A(仅布尔,7 个非布尔 flag 更新必失败)与 D-22-B(缺 value 静默置 false);已修复并补 7 例守卫 |
| application.yml 默认配置(15个 flag) | ✅ | ❌ 不成立:yml 无 `features:` 块,实际为 Java 字段默认值 |
**Phase 21(账户生命周期增量)— 已完成** ✅
### Phase 22 — 部署运维配置扩展(重复的历史声明块,已作废)
> ⚠️ 与上一条为同一 Phase 的重复历史声明,同样已被上方 2026-09-18 权威结论取代,不再逐项重复。
| 任务 | 实测结论 |
|------|---------|
| P22-T01~T05 五个模块开关 flag | ⚠️ 死配置(无业务调用点) |
| P22-T06 local evidence upload policy | ✅ 属实(真实强制) |
| P22-T07 private storage for counseling attachments | ⚠️ 死配置(零引用) |
| FeatureFlagController API | ✅ 已修复 D-22-A/D-22-B 并补守卫 |
| application-dev.yml + application-docker.yml 配置 | ❌ 不成立:两份 yml 均无 `features:` 块 |
**Phase 21(账户生命周期增量)— 已完成** ✅
> ⚠️ 此处原有**两块 2026-09-09 期的历史声明**(自称「application.yml 默认配置 ✅(15 个 V1.1 flag)/
> application-dev、docker.yml 配置 ✅/T01–T05、T07 ✅」),已被 2026-09-18 的 Phase 22 复验**整体推翻**:
> `grep -rn "features:" backend/src/main/resources/*.yml` 证明 4 份 yml **没有 `features:` 块**,
> 15 个 flag 实为 Java 字段默认值、且业务代码**从不读取**(死配置)。
> **唯一有效结论见上方「Phase 22 — 部署运维配置扩展(Feature Flag)✅(KEEP-VERIFY 复验关闭,2026-09-18)」。**
> 原文可从 `git log --all -- docs/STATUS.md` 取回。
### Phase 23 — 可信系统测试重建(REFACTOR)⚠️ 部分关闭(KEEP-VERIFY 复验,2026-09-18)
@@ -659,29 +521,11 @@ MinIO: localhost:9003 (凭证由本地环境变量提供)
---
### Phase 23 — V1.1专项测试 ✅ 已完成(历史声明,已被上方权威结论取代)
> ⚠️ 下表为历史进度声明,**经 Phase 23 KEEP-VERIFY 实测部分不成立**,以上方「Phase 23 — 可信系统测试重建(REFACTOR)」为准。
| 任务 | 历史声明 | 实测结论 |
|------|---------|---------|
| P23-T01 Home V1.1 E2E | ✅ (home_v11_test.py) | ❌ 该文件 7/9 为空壳且依赖不存在的 fixture,从未执行;首页聚合实由 `run_v11_tests.py::test_02_home` 覆盖 |
| P23-T02 Banner timing filter | ✅ (home_v11_test.py) | ❌ 空壳 `pass`,未实现 |
| P23-T03 Banner audience filter | ✅ (home_v11_test.py) | ❌ 空壳 `pass`,未实现 |
| P23-T04 Quick Entry order | ✅ (home_v11_test.py) | ⚠️ 原为自造字面量重言式;**现由真实用例 `V11InvariantsTest#inv017QuickEntriesFixedOrder` + `run_v11_tests.py::test_03` 覆盖** |
| P23-T05 Local Eligibility E2E | ✅ (local_eligibility_test.py) | ❌ 该文件 11/11 全为空壳,从未执行 |
| P23-T06 Counseling E2E | ✅ (counseling_v11_test.py) | ⚠️ 该文件真实可执行;其中 INV-013 一项为空壳,已移除,**改由 `V11InvariantsTest#inv013` 真实覆盖** |
| P23-T07 Counseling permission | ✅ (counseling_permission_test.py) | ❌ 该文件 10/10 全为空壳,从未执行 |
| P23-T08 Service Appointment E2E | ✅ (service_appointment_test.py) | ❌ 该文件 7/7 全为空壳,从未执行 |
| P23-T09 Content E2E | ✅ (content_e2e_test.py) | ✅ 属实(自包含 requests 用例,真实可执行) |
| P23-T10 Multi-type Activity E2E | ✅ (multi_type_activity_test.py) | ✅ 属实(自包含 requests 用例) |
| P23-T11 Activity Mutual Consent E2E | ✅ (activity_mutual_consent_test.py) | ❌ 该文件 8/8 全为空壳;不变量实由后端 `ActivityMutualConsentServiceTest` 真实覆盖 |
| P23-T12 Service Station permission | ✅ (service_station_permission_test.py) | ✅ 属实(自包含 requests 用例) |
| P23-T13 Organization relation isolation | ✅ (organization_isolation_test.py) | ✅ 属实(自包含 requests 用例) |
| P23-T14 INV-011~INV-020 | ✅ (V11InvariantsTest.java) | ❌ 原 14 个用例全为常量字符串断言(INV-016 断言文章状态、INV-017 重言式);**已重写为 12 个,含 4 个真实行为守卫** |
### Phase 23 — 专项测试(历史声明块,已作废)
E2E测试文件:10个(~80+测试用例)→ **实测:6 个含 44 个 `pass` 空壳,其中 4 个 100% 为空壳;pytest 侧因无 `conftest.py` 整体不可执行**
Invariant测试:10个(INV-011~020)→ **实测:原 14 个用例无任何服务行为断言;现 12 个,其中 4 个为真实行为(已过负向注入验证)**
**Phase 22(部署运维配置扩展)— 已完成** ✅
> ⚠️ 本节原自称「✅ 已完成」,已被 2026-09-18 复验推翻:原用例中 44 个为 `pass` 空壳、
> 14 个「不变量测试」只断言**常量字符串**。**唯一有效结论见上方「Phase 23 — 可信系统测试重建(REFACTOR)
> ⚠️ 部分关闭」与「Phase 23B — E2E 测试基建重建 ✅ 已关闭」。**
### Phase 23B — E2E 测试基建重建(2026-09-18)✅ 已关闭
@@ -817,7 +661,7 @@ OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界
**备注**:UAT需要人工操作验证,后端API和数据模型已全部就绪。
**Phase 23(V1.1专项测试)— 已完成** ✅
> ⚠️ 本行原称「Phase 23(V1.1专项测试)— 已完成」,**已被 2026-09-18 复验推翻**:Phase 23 实为**部分关闭**(假覆盖已清除、E2E 入 CI 待基础设施决策),唯一有效结论见上方「Phase 23 — 可信系统测试重建(REFACTOR)」节。
### Phase 25 — RC内容检查 ✅ 可执行
| 任务 | 状态 |
@@ -840,7 +684,7 @@ OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界
| P26-T03 Seed Service Types | ✅ (CHECK约束已定义) |
| P26-T04 创建万善公园服务站 | ✅ (V027) |
| P26-T05 初始化Banner | ✅ (V027) |
| P26-T06 初始化Feature Flags | ✅ (application.yml配置) |
| P26-T06 初始化Feature Flags | ⚠️ **不成立**(2026-09-18 Phase 22 复验:4 份 `application*.yml` 无 `features:` 块;15 个 flag 实为 Java 字段默认且业务不读取) |
| P26-T07 初始化新增Roles/Permissions | ✅ (V015已覆盖) |
| P26-T08~T13 Smoke tests | ⏳ 上线前手动验证 |
@@ -862,22 +706,10 @@ OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界
| Phase 23 (V1.1专项测试) | ⚠️ 部分关闭(2026-09-18):假覆盖已清除 + 4 个真实守卫;E2E 入 CI 待决策 |
| Phase 24~26 (UAT/RC/Production) | ⏳ 运营/上线阶段 |
### Phase 24 — UAT增量 ✅ 已就绪
| 任务 | 状态 |
|------|------|
| P24-T01~T04 各角色UAT | ✅ 权限模型已配置 |
| P24-T05~T08 业务场景验收 | ✅ API链路完整 |
### Phase 24~26 — 明细见上方(本段为重复摘要,已收敛)
### Phase 25 — RC内容检查 ⏳ 待运营
| 任务 | 状态 |
|------|------|
| P25-T01~T09 真实素材 | ⏳ 需运营提供 |
### Phase 26 — Production初始化 ✅ 已完成
| 任务 | 状态 |
|------|------|
| P26-T01~T07 种子数据 | ✅ (V027) |
| P26-T08~T13 Smoke测试 | ⏳ 上线前手动验证 |
> Phase 24 / 25 / 26 的逐条任务表见上方「当前 Phase」中的同名小节;
> 本段原为它们的简化重复版,已收敛以免同一事实出现两套口径。
### Admin Web V1.1 模块扩展 ✅ 已完成
| 模块 | 文件 | 说明 |
@@ -33,29 +33,32 @@
- **禁止用 `rm` / `git rm` 删除文件** —— 本机有 safe-delete 钩子会把「删文件」放大为「删父目录」(2026-09-18 实测:`git rm` 单个文件导致整个 `docs/` 被移除)。需要移除内容时**一律原地重写**(Write/Edit)。
- 不修改业务规则、不扩大 V1 范围;新增能力必须走 Phase 顺序。
- 每批完成后跑 `ui-tests/*.mjs`(必须 14/14 绿)+ `ui-document-baseline-contracts.mjs`(含端口与 `/admin/` 子路径断言)。
- 每批完成后跑 `node scripts/run-ui-contracts.mjs`(14 个守卫,必须 **14/14 绿**;已接入 CI job `ui-contracts`)+ `ui-document-baseline-contracts.mjs`(含端口与 `/admin/` 子路径断言)。
- 后端改动跑离线容器 `mvn -o test`,必须 0 failures / 0 errors。
- 提交纪律:每批独立 commit + `git tag`(**单段名**,带 `/` 会被本机常驻进程清理)+ 回读验证;`git bundle create` 覆盖最新提交。
- 涉及密码/密钥:不写入文档,只用环境变量或安全 Seed。
---
## 批 1 — 快速收尾(无需决策)
## 批 1 — 快速收尾(无需决策)✅ 已完成(Task 1.1 / 1.2 均于 2026-09-18 关闭)
### Task 1.1: ui-tests 全量契约门禁接入 CI
### Task 1.1: ui-tests 全量契约门禁接入 CI ✅(2026-09-18 已完成)
**Files:**
- Modify: `.github/workflows/*.yml`(当前仅 6 个 job)
- Test: `ui-tests/*.mjs`(15 个契约文件)
- Modify: `.github/workflows/ci.yml`(新增 job `ui-contracts`)
- Add: `scripts/run-ui-contracts.mjs`(统一执行器:逐个跑 → 汇总 → 任一失败即非零退出)
- Test: `ui-tests/*.mjs`(**实测 14 个**守卫文件;原文此处误写「15 个」,本轮更正)
**背景**:14 个 UI 契约门禁目前**只在本地手工执行**,CI 上无人跑 —— 文档改了、端口漂移了、`/admin/` 又退回 alias 了,CI 不会变红。这是「门禁存在但不生效」的同族问题(本项目已复发多次)。
**背景**:14 个 UI 契约门禁此前**只在本地手工执行**,CI 上无人跑 —— 文档改了、端口漂移了、`/admin/` 又退回 alias 了,CI 不会变红。这是「门禁存在但不生效」的同族问题(本项目已复发多次)。
- [ ] **Step 1:** 确认 CI 现有 job 清单与触发条件。
- [ ] **Step 2:** 新增 `ui-contracts` job:`node` 22,逐个执行 `ui-tests/*.mjs`,**任一非 0 退出即 job 失败**。
- [ ] **Step 3:** 负向验证:故意改坏一处被断言的内容(如 STATUS 端口),确认 CI job 变红。
- [ ] **Step 4:** 还原并确认变绿。
- [x] **Step 1:** 确认 CI 现有 job 清单(`backend` / `admin-web` / `miniapp` / `migration` / `test-shell-guard` / `e2e`)与触发条件。
- [x] **Step 2:** 新增 `ui-contracts` job(`node-version: 20`,与既有 job 一致;跑 `node scripts/run-ui-contracts.mjs`),**任一守卫非 0 退出即 job 失败**。
- [x] **Step 3:** 负向验证:① 注入一个**必然失败的守卫**(放在 `.workbuddy/tmp/`、显式传参运行,不污染正式门禁)→ 执行器报 **FAIL、退出码 1** 并打印该守卫原始输出;② **守卫数量下限**分支以 `UI_GUARDS_MIN=99` 自检 → 正确拒绝报绿。
- [x] **Step 4:** 确认基线变绿:`PASS 14/14`、退出码 0;`ci.yml` 经 `yaml.safe_load` 解析通过、jobs 含 `ui-contracts`。
**Acceptance:** CI 上 15 个契约全绿;注入缺陷后 CI 失败。
**说明**:Step 3 用的是「合成失败守卫」而非「改坏 STATUS 端口」—— 后者验证的是**单个守卫的判别力**,而本 Task 要验证的是**执行器与 CI 接线能否把失败传递出来**(合成守卫足以隔离这一点)。端口/入口类守卫自身的判别力已在 2026-09-18「管理端入口收敛」轮以真实负向注入证明(6 条断言)。
**Acceptance:** CI 上 14 个契约全绿(本地已实测);注入缺陷后执行器非零退出、CI 变红。✅
### Task 1.2: database 文档对齐 ✅(2026-09-18 已完成)
+29 -13
View File
@@ -3,7 +3,9 @@
> **范围**:善缘丹阳公益婚恋服务平台全仓文档(约 200 份)。
> **触发**:用户「很多久的项目文档已经废弃,请按照最新的文档要求审查下」。
> **性质**:先只读审查(2026-09-18 首轮),再按审查结论逐项处置(同日续做)。
> **结论**:治理方案的五个任务**至此全部落地**;过程中发现并处置 9 项缺口、1 起环境级事故、2 份漏网文档。
> **结论**:治理方案的五个任务**至此全部落地**;过程中处置 **9 项缺口、1 起环境级事故、2 份漏网文档**,
> 并在验证阶段抓出 2 处新缺口(bundle 虚报、写死 hash),随后于收尾轮关闭全部 3 项遗留
> (漏网报告废止、STATUS 精简、UI 门禁入 CI)。
---
@@ -94,10 +96,11 @@
`gate-output/*.txt`(UI 验收证据)、`tests/uat/UAT-Test-Cases.md`、`releases/` 全部、
24 份 `*-Recovery-*` 报告、`.workbuddy/` 与 bundle 自保产物。
**另登记一份「保留待决」**:`docs/Phase-V11-Deployment-Completion-Report.md`(2026-09-09,含已被推翻的
「16/16 E2E 通过」)。它**不在**方案删除目标模式内(`Phase-V11-` 无数字段),且被**保留文档**
`Phase-01-V11-Recovery-Completion-Report-2026-09-09.md` 援引 —— 删除会制造悬空引用。
→ **不擅自删除**,登记待用户决定(删除需同步修改 Phase-01 的引用)。
**一份漏网文档:已处置(2026-09-18 收尾轮)** —— `docs/Phase-V11-Deployment-Completion-Report.md`
(2026-09-09,含已被推翻的「16/16 E2E 通过」与「Feature Flags 15 项 PASS」)。它**不在**方案删除目标
模式内(`Phase-V11-` 无数字段),且被 `docs/Phase-01-V11-Recovery-Completion-Report-2026-09-09.md` 援引
—— 删除会制造**新的悬空引用**。处置:**原地重写为废止声明**(保留路径,含「是什么 / 为何失效 /
取代者 / 为何保留」四要素),并把 `Phase-01` 报告与 `Phase-13A` 废止声明里的引用一并标注为「已废止」。
---
@@ -114,7 +117,7 @@ naive 扫描得 **29 处**,其中 **24 处合法**(出现在「已删除对
| `docs/superpowers/plans/2026-09-13-miniapp-11-core-pages-redesign.md` | `docs/MINIAPP_REFERENCE_UI_QA_2026-09-13.md`(从未入库) | ✅ 随 65 份清理一并消除 |
| `docs/superpowers/plans/…dual-client-ui-redesign.md` | `docs/UI_REFERENCE_REDESIGN_ACCEPTANCE_2026-09-13.md`(从未入库) | ✅ 同上 |
| `docs/STATUS.md`(在途版本) | `plans/2026-09-18-phase23-closeout-and-uat-readiness.md` | ✅ 计划已建(D1);STATUS 已引用 |
| `docs/Phase-01-V11-Recovery-…md` | `Phase-V11-Deployment-Completion-Report.md` | ⚠️ **保留**(删除会制造新悬空,见 4.4) |
| `docs/Phase-01-V11-Recovery-…md` | `Phase-V11-Deployment-Completion-Report.md` | ✅ **已关闭(收尾轮)**:目标文件原地重写为废止声明、**路径保留**;`Phase-01` 与 `Phase-13A` 中的引用均标注为「已废止」 |
> ⚠️ 本次教训:给目录扫描加 SKIP 时把 `archive` 排除,导致**归档目录自己的 README 没被扫到**,
> 而它恰好含一处真实悬空。归档目录必须扫。
@@ -146,7 +149,10 @@ naive 扫描得 **29 处**,其中 **24 处合法**(出现在「已删除对
| `ui-tests/ui-document-baseline-contracts.mjs` | **通过**(锚点齐全:`UI REDESIGN ACCEPTED BY USER`、`管理后台: http://localhost:13520/`、`Phase 07…已通过用户验收`) |
| UI 契约门禁全量 | **14/14 PASS**(2026-09-18 实测,全部退出码 0) |
| 数据库文档一致性 | `TABLE_INVENTORY` **59** 表 ⇄ 迁移实测 **59**;`MIGRATION_GUIDE` **46** 个 ⇄ 实测 **46** |
| STATUS.md 重复区块 | 「V1.1 本地部署完成」**3 处 → 1 处**(996 行 → 946 行) |
| STATUS.md 重复区块 | ①「V1.1 本地部署完成」**3 处 → 1 处**;② **收尾轮整体收敛:951 → 783 行(净减 168)** —— 折叠 2026-09-09 期 Phase 01~11 任务表、两块已作废的 Phase 22 历史声明、已作废的 Phase 23 声明、重复的 Phase 24~26 摘要;并修正**两处残留假声明**(`P26-T06 初始化Feature Flags ✅ (application.yml配置)`、`Phase 23(V1.1专项测试)— 已完成 ✅`) |
| UI 门禁入 CI(收尾轮) | 新增 `scripts/run-ui-contracts.mjs` 统一执行器 + `ci.yml` job **`ui-contracts`**;`ci.yml` 经 `yaml.safe_load` 校验,jobs = backend / admin-web / miniapp / migration / test-shell-guard / **ui-contracts** / e2e |
| 执行器自身可验证(负向注入) | 基线 `node scripts/run-ui-contracts.mjs` → **PASS 14/14、退出 0**;注入一个必然失败的守卫 → **FAIL、退出 1** 且打印原始输出;守卫数量下限分支以 `UI_GUARDS_MIN=99` 自检 → **正确拒绝报绿** |
| 漏网文档处置 | `Phase-V11-Deployment-Completion-Report.md` 原地重写为废止声明(102 → 22 行,**未删除**);`Phase-01`(引用行)与 `Phase-13A`(废止声明)里的引用同步标注「已废止」 |
| 门禁口径 | `AGENTS.md` / `STATUS.md` 已为 **14/14**,历史行保留 13/13 并注明时点 |
| bundle 覆盖(可复核) | `.workbuddy/backup/docs-governance-2026-09-18.bundle`;`git bundle verify` → *records a complete history*;`list-heads` 含 `refs/heads/main` 与 `docs-governance-2026-09-18-1~N` 全部治理 tag。⚠️ **ref 指向随每次提交变化,引用时不要写死 hash**,一律用 `list-heads` 与 `git rev-parse HEAD` 现场比对 |
@@ -154,12 +160,22 @@ naive 扫描得 **29 处**,其中 **24 处合法**(出现在「已删除对
## 八、遗留与下一步
1. **`Phase-V11-Deployment-Completion-Report.md` 待决**(4.4)—— 建议连同 `Phase-01-Reports` 的引用一并修订后移除。
2. **`docs/STATUS.md` 后半部历史区仍较长**(`V1.0 基线状态` 与 `当前 Phase` 段含 2026-09-09 的开发日志)——
已加「历史记录边界」声明,进一步精简需单独一轮。
3. **UI 门禁进 CI 未做** —— 15 个契约目前只在本地手工执行(无 CI 把关)。已登记为
`plans/2026-09-18-phase23-closeout-and-uat-readiness.md` **批 1 Task 1.1**,是五项遗留里最该先做的一项。
4. **执行纪律**:删除类改动仍应分 3 个 commit(①删除 ②归档+头注 ③状态同步+计划+报告)+ 每 commit 后 `git tag`(**单段名**,分支名含 `/` 会被实时清理)+ `git bundle create .workbuddy/backup/<phase>-recovery-<date>.bundle --all`,**并且必须**用 `git bundle list-heads <file> | grep refs/heads/main` 确认指向的是最新提交(否则等于没有安全网,见 D7 补记)。
**本节原有 3 项遗留,已在收尾轮(2026-09-18 21:30 起)全部关闭**:
| 原遗留 | 处置 |
|---|---|
| `Phase-V11-Deployment-Completion-Report.md` 待决(4.4) | ✅ **原地重写为废止声明**(未删除)+ 修订 `Phase-01` / `Phase-13A` 中的引用 |
| `STATUS.md` 后半历史区过长 | ✅ 收敛 **951 → 783 行**(净减 168);折叠 2026-09-09 期任务表与已作废/重复块;修正两处残留假声明 |
| UI 门禁未进 CI(原稿误记为「15 个契约」) | ✅ 新增 `scripts/run-ui-contracts.mjs` + `ci.yml` job `ui-contracts`;**实测守卫为 14 个**,经负向注入与数量下限分支自检 |
**仍需处理(不属文档治理范围,需决策/另开一轮)**:
1. **Phase 24(UAT)启动需用户确认** —— 后端 669 全绿、UI 门禁 14/14,但 Phase 23 的 E2E 入 CI 仍受
「活栈供给方式」基础设施决策阻塞(见收尾计划批 2)。
2. **`Phase-V11-Deployment-Completion-Report.md` 路径仍在(内容已是废止声明)** —— 若后续确要真正移除,
须连同 `Phase-01` / `Phase-13A` 两处引用一并处理,并遵守本机删除红线(优先原地重写)。
**执行纪律**:删除类改动仍应分 3 个 commit(①删除 ②归档+头注 ③状态同步+计划+报告)+ 每 commit 后 `git tag`(**单段名**,分支名含 `/` 会被实时清理)+ `git bundle create .workbuddy/backup/<phase>-recovery-<date>.bundle --all`,**并且必须**用 `git bundle list-heads <file> | grep refs/heads/main` 确认指向的是最新提交(否则等于没有安全网,见 D7 补记)。
---