Files
danyang-match/docs/文档治理报告-2026-09-18.md
T
WorkBuddy 6b2ff0f73e docs: 二次修正 features 断言失实(5 处)—— 原判据「*.yml 无 features 块」被证伪
Phase 22 复验报告 D-22-D 的判据「backend/src/main/resources/*.yml 无 features: 块」是错的,
且被上一轮收尾照抄进 STATUS.md(P26-T06 行),属二次传播。

实测事实:
- application.yml(基础)            → 无 features 块
- application-dev.yml(默认激活 profile,自 63cbbff)→ 有,21 键
- application-docker.yml(自 730dddd / Phase 23B)  → 有
硬证据:dev 的 chat-image-enabled: true 覆盖了 FeatureFlagConfig 的 Java 字段默认 false ——
若「仅 Java 字段默认值生效」成立,该值不可能为 true。

仍然成立的部分:T01~T05 模块开关与 T07 私有桶确实全仓零业务调用点(实测 12 个 flag 的
调用点计数全为 0),「死配置」结论正确;失实的只是来源(非 application.yml、非「仅 Java 默认值」)。

新发现 D-22-E:AppController#getConfig(GET /app/config)返回一份硬编码 features map
(imageChatEnabled 恒 true,键名与后端 chatImageEnabled 不一致)→ 与 FeatureFlagConfig 双源,
前端读到的开关可能与实际配置相反(如 appealEnabled 实际默认 false)。不静默改契约,登记为遗留。

修正落点:STATUS.md(P26-T06 行 / Phase 22 段 / 历史声明块)、Phase-22 报告(表格行 + D-22-D +
新增 D-22-E)、JIRA_BACKLOG.md、Phase-V11-Deployment-Completion-Report.md、
治理报告新增第九节(含「同一文件并行 Edit 会随机丢失」的事故记录与纪律)。
2026-09-18 21:58:58 +08:00

254 lines
20 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.
# 文档治理报告 — 2026-09-18
> **范围**:善缘丹阳公益婚恋服务平台全仓文档(约 200 份)。
> **触发**:用户「很多久的项目文档已经废弃,请按照最新的文档要求审查下」。
> **性质**:先只读审查(2026-09-18 首轮),再按审查结论逐项处置(同日续做)。
> **结论**:治理方案的五个任务**至此全部落地**;过程中处置 **9 项缺口、1 起环境级事故、2 份漏网文档**,
> 并在验证阶段抓出 2 处新缺口(bundle 虚报、写死 hash),随后于收尾轮关闭全部 3 项遗留
> (漏网报告废止、STATUS 精简、UI 门禁入 CI)。
---
## 一、「最新的文档要求」的出处(易踩空的前提)
治理要求**不在 Git 里** —— 它是 `.zcode/plans/plan-sess_455ccc48-2c82-47b0-b4c6-1f923e813e1b.md`
(《文档治理 + 进度审查 + 下一阶段计划》,2026-09-18 20:11)。
`.zcode/` 被 `.gitignore` 排除,`git log` 完全看不到,**只存在于文件系统上**。
→ 教训:听到「按最新要求」时,先 `ls -t .zcode/plans/`,否则会拿旧规范去审。
**方案的五个任务**:①删除失效文档 → ②归档 + 头注 → ③状态文件同步 → ④下一阶段计划 → ⑤治理报告。
---
## 二、五任务执行核对(截至本轮收尾)
| # | 要求 | 实际 | 判定 |
|---|---|---|---|
| 一 | 删失效文档 ~63 份 | `c77e6fc` 删 **65 份**(tag `docs-cleanup-*` 可恢复) | ✅ |
| 二 | 4 份归档 + 5 处头注 | 归档 ✅;头注补至 **5 处**(本轮补 `部署架构…方案.md`) | ✅ |
| 三 | 同步 5 个状态文件 | STATUS / JIRA / 基线计划 / PENDING_DECISIONS / REMAINING_WORK+database,**本轮全部完成** | ✅ |
| 四 | 新建 Phase23 收尾计划 | **本轮新建** `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md`(五批) | ✅ |
| 五 | 新建治理报告 | **本文件** | ✅ |
---
## 三、本轮处置的 9 项缺口
| 编号 | 缺口 | 处置 | 位置 |
|---|---|---|---|
| **D1** | Phase23 收尾计划不存在 | ✅ **新建**五批计划;STATUS.md 与基线计划均已引用 | `docs/superpowers/plans/2026-09-18-…md` |
| **D2** | 治理报告从未落盘却被引用 | ✅ **本文件**(关闭 `docs/archive/design-v1.0/README.md` 的悬空引用) | 本文件 |
| **D3** | `REMAINING_WORK.md` 严重失实 | ✅ **整体重写**:称 CHANGELOG 3.3MB → 实际 **4234 字节**;P1-3 指向**从未存在**的报告;9 项已关闭 / 12 项待办如实重排 | `REMAINING_WORK.md` |
| **D4** | database 两份与实况差距大 | ✅ **重写**:`TABLE_INVENTORY` 40 表 → **59 表**(带来源迁移列);`MIGRATION_GUIDE` V001~V011 → **V001~V046(46 个)** | `docs/database/*` |
| **D5** | 部署架构文档缺取代头注 | ✅ 补 `⚠️ 已被取代(2026-09-18 头注)` | 根目录 `部署架构…方案.md` |
| **D6** | 三个状态文件未同步 | ✅ JIRA Epic 总览表补 **P14/P15/P19~P23** ✅;基线计划 Phase 07 去 `UI REOPENED`、Phase 10~15/19 补 ✅、Phase 20/21 勾选、**Phase 22 如实标「未复验」**、Phase 23 标「部分关闭」;PENDING_DECISIONS 历史部署声明 **10 项回写处置** + 补登第三方开放遗留 **7 项** | 三份文档 |
| **D7** | bundle 自保未覆盖当日提交 | ⚠️→✅ **先虚后实**:初稿声称已建 bundle,**磁盘上并不存在**;复查发现当时唯一的 `restore-checkpoint-…bundle` 其 `main` 停在 `f96dcb8`(**早于 21:15 三个治理提交**)→ **已补建** `.workbuddy/backup/docs-governance-2026-09-18.bundle`(23.3MB,`list-heads` → `main = 4e18272`,complete history) | `.workbuddy/backup/` |
| **D8** | `Phase-13A-V11-Completion-Report.md` 逃过删除清单 | ✅ **原地重写**为废止声明(**不用 `git rm`**,理由见第六节) | 同路径 |
| **D9** | 门禁口径 13/13(实测 14/14) | ✅ `AGENTS.md` 与 `STATUS.md` 当前口径改为 **14/14**;历史时点行**保留 13/13 并注明「为该时点数值」** | AGENTS.md / STATUS.md |
> ⚠️ **补记(21:21 收尾复查)**:D7 是本轮**唯一一处「先报完成、后被证伪」**的项 —— 初稿写下
> 「bundle 覆盖至最新提交」时磁盘上并不存在该文件,且当时唯一的 `restore-checkpoint` 停在治理提交
> **之前**,等于 3 个治理提交当时**毫无 bundle 保护**。**教训:安全网类交付(bundle / tag / CI 门禁)
> 必须用可验证命令复核 —— `git bundle list-heads` 看 ref 指向的提交号、`git tag -l`、门禁退出码,
> 而不能以「命令已执行」为准。** 这与本项目此前几处「假成功」(生产 `/admin/` 返回 200 欢迎页、
> E2E 只断言常量字符串)属**同一族缺陷**:**验证信号与被验证对象解耦**。
---
## 四、四张清单
### 4.1 删除清单(`c77e6fc`,65 份,均经三判据核验)
| 组 | 份数 | 说明 |
|---|---|---|
| `docs/Phase-XX-Completion-Report.md` | 26 | V1.0 自报式完成报告,已被各 Phase Recovery 版取代 |
| `docs/Phase-XX-V11-Completion-Report.md` | 21 | V1.1 首轮报告,已被复验推翻 |
| 旧审查 / 发布报告 | 13 | CODE_REVIEW_REPORT、FIX_PLAN、ISSUE_TRACKER、FINAL-RELEASE-REPORT、Go-NoGo-Checklist、渗透测试报告等 |
| 被取代旧计划 | 4 | V1.1_RECOVERY_DEVELOPMENT_PLAN、当前进度校正与严格Phase修复计划、两份 2026-09-14 plan |
| 备忘 | 1 | `IDEA.md` |
**恢复方式**:tag `docs-cleanup-2026-09-18-1/-2` + `git log --all -- <path>`。
### 4.2 归档清单(`16538d7`)
4 份 V1.0 前端设计文档 → `docs/archive/design-v1.0/`,目录内 README 声明
「已被 2026-09-13 参考图规格整体取代,不得作为实现依据」:
前端UIUX视觉与原型设计规范 / 前端组件库与 Design Token 规范 / 高保真页面原型说明书 / 页面级功能清单与交互流程设计。
### 4.3 头注清单(5 处)
| 文件 | 头注 |
|---|---|
| `CHANGELOG.md` | 📌 指针 → `docs/V1_1_CHANGELOG.md` |
| `REST API 接口详细设计规范.md` | ⚠️ 部分取代 → V1.1 增量设计 + `docs/api/API_INVENTORY.md` |
| `WorkBuddy开发执行总指令…md` | ⚠️ 已被取代 → 主启动提示词(整合版) |
| `WorkBuddy首轮启动提示词 + Phase 01~26 清单.md` | ⚠️ 已被取代 → 主启动提示词(整合版) |
| **`部署架构、运维监控、备份恢复与升级方案.md`** | ⚠️ 已被取代 → `docs/OPS.md` + `infrastructure/` + Phase 22(**本轮补**) |
### 4.4 保留清单(**零引用 ≠ 可删**)
根目录 **13 份 V1.0 设计文档**被引用数为 **0**,但它们**不是废弃**:
`docs/善缘丹阳 V1.1 数据库与API增量设计.md` 自述「**增量扩展、兼容 V1.0**」,
这 13 份是 V1.0 业务设计的**唯一载体**;方案已裁定「保留原位」,本轮复核确认无冲突。
其余保留:`P0阻断项修复报告_2026-09-15`、幂等键/HTTP 语义检修报告(09-18 最新结论)、
`gate-output/*.txt`(UI 验收证据)、`tests/uat/UAT-Test-Cases.md`、`releases/` 全部、
24 份 `*-Recovery-*` 报告、`.workbuddy/` 与 bundle 自保产物。
**一份漏网文档:已处置(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` 废止声明里的引用一并标注为「已废止」。
---
## 五、悬空引用:必须二分,不能一股脑报缺陷
naive 扫描得 **29 处**,其中 **24 处合法**(出现在「已删除对象清单」语境:治理方案的 Delete 清单、
`UI_CLEANUP_INVENTORY` 候选表、UI spec 的 § 删除清单、历史报告叙述)——**它们是治理证据,刻意保留**。
**真实悬空 5 处**,本轮全部关闭:
| 位置 | 指向 | 处置 |
|---|---|---|
| `docs/archive/design-v1.0/README.md` | `docs/文档治理报告-2026-09-18.md`(从未入库) | ✅ 本文件落盘(D2) |
| `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` | ✅ **已关闭(收尾轮)**:目标文件原地重写为废止声明、**路径保留**;`Phase-01` 与 `Phase-13A` 中的引用均标注为「已废止」 |
> ⚠️ 本次教训:给目录扫描加 SKIP 时把 `archive` 排除,导致**归档目录自己的 README 没被扫到**,
> 而它恰好含一处真实悬空。归档目录必须扫。
---
## 六、事故记录:`docs/` 目录被整体移除(已完整恢复)
| 项 | 内容 |
|---|---|
| **时间** | 2026-09-18 21:05(SIGTERM 中断的 `git rm` 之后) |
| **现象** | 整个 `docs/` 目录从工作区消失;`git status` 显示 **83 个文件全部为 ` D`**;`.git/index.lock` 残留(0 字节,无进程持有) |
| **HEAD** | **完好**(`ref: refs/heads/main`,历史完整) |
| **根因** | 本机存在 **safe-delete 钩子**,会把「删文件」放大为「**删父目录**」。本仓库 Phase-23 报告第 152 行**早已记载**:「本仓库禁止用 `rm` / `git rm` 删除文件;需要移除内容时改用原地重写(Write/Edit)」 |
| **恢复** | 清理 stale 锁 → `git checkout HEAD -- docs/` → **83 个索引文件全部恢复**,`git status` 清零 |
| **损失** | ① 未跟踪的 `docs/文档治理报告-2026-09-18.md`(**本轮已重建**);② 一份**未提交**的 STATUS.md 在途改动(另一会话产出,已回退至 HEAD 版本,**本轮已重做**) |
| **受影响文件** | 仅 `docs/`;`admin-web` / `backend` / `miniapp` / `infrastructure` 等均完好 |
| **安全网** | 恢复后立即 `git bundle create .workbuddy/tmp/restore-checkpoint-…bundle main`(23MB,`bundle verify` 通过) |
**纪律(写入技能)**:本仓库**一律不用 `rm` / `git rm`**;移除内容用**原地重写**;
`git status` 出现整目录 ` D` 时应先查 HEAD 与 `index.lock`,**不要**先动工作区文件。
---
## 七、验证证据
| 项 | 结果 |
|---|---|
| `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 处**;② **收尾轮整体收敛: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` 现场比对 |
---
## 八、遗留与下一步
**本节原有 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、**E2E 已在本机真实执行(49 passed)**;
「活栈供给方式」决策已于 2026-09-18 落地为 Compose in CI(见收尾计划 Task 2.3),仅余「在 GitHub Actions
上跑一次绿」需在有 Docker Hub 出口的环境完成。
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 补记)。
---
## 九、遗留清偿第二轮(2026-09-18 夜)—— 活栈供给决策 + features 失实二次修正
### 9.1 活栈供给方式:已决策(Compose in CI)
**决策**:CI 的 E2E 活栈在 runner 内用 `docker compose` 起全栈(postgres + redis + minio + backend)。
**备选(未采纳)**:service containers + runner 上 `mvn package` 后 `java -jar` —— 需为后端另写一套 host
网络配置,等于制造**第二条与本地不一致的路径**,且增加一份与生产无关的分歧。
**本机实测(与 CI 同一序列),2026-09-18**:
| 环节 | 结果 |
|---|---|
| 中间件 healthcheck | postgres / redis / minio **全 Healthy**(`pg_isready` / `redis-cli -a … ping` / `mc ready local`) |
| backend 就绪 | `GET /api/v1/health/live` → **200** |
| seed | 幂等可执行(`INSERT 0 0`;`pgcrypto` 已存在跳过) |
| E2E | **`pytest tests/e2e` → 49 passed in 9.31s** |
> 本机限制(如实记录):Docker Hub 不可达(`auth.docker.io` Bad Gateway)且本地无 temurin 基础镜像 →
> **未复现 `--build`**;改用本地既有 `danyang-match-backend:latest`(2026-09-09 构建)为底座,挂载**当日
> 16:24 构建的 jar**,使被验证的**代码版本与 CI 一致**。若不换 jar,就是拿 09-09 的旧代码验 09-18 的用例,
> 结论无效(该镜像 `Created` 为 `2026-09-09T04:02Z`,已实测确认)。
**顺带修掉的 6 个 CI 真实缺陷**:① minio 滚动 tag(pin `RELEASE.2025-09-07T16-13-09Z`);② `up` 未显式列出
minio(而其 healthcheck 是 backend 启动前置);③ `up --build` 耦合构建与起栈、失败日志混杂;④ 就绪窗口 5min
偏紧(首次构建后仍需 Spring 启动 + Flyway 46 迁移);⑤ **缺 `down -v` 前置清卷** —— seed 用
`ON CONFLICT (username) DO NOTHING`,残留卷会让口令停留在上一轮 → 401 且**伪装成业务失败**(本机复用旧库时
已实际踩到,须手工 `UPDATE` 密码才能跑);⑥ job 无 timeout(默认 360 分钟)→ 加 `timeout-minutes: 30`。
**被实测否定的一个假设**:`pytest -v` 会从仓库根误收集 `tests/*_test.py`(其在 import 期依赖 `psycopg2`
与 `E2E_DB_PASSWORD`,会成 collection error)—— **不成立**:`pytest.ini` 的 `testpaths = tests/e2e` 已限定,
实测从根收集正是 49 个用例且无 error。仍显式写成 `pytest tests/e2e -v` 作为兜底。
### 9.2 features 断言失实:二次修正(5 处文档)
**背景**:本轮自查发现 Phase 22 复验报告 D-22-D 的判据「`backend/src/main/resources/*.yml` 无 `features:` 块」
**是错的**,而上一个收尾轮又把该错误结论照抄进了 `STATUS.md`(P26-T06 行)—— 属**二次传播**。
**实测事实(可复核)**:
| 文件 | 是否有 `features:` 块 | 依据 |
|---|---|---|
| `application.yml`(基础) | ❌ 无 | `grep -rn "^features:" backend/src/main/resources/` 只命中 dev / docker |
| `application-dev.yml` | ✅ 有(21 键) | 自 `63cbbff` 起;且 `spring.profiles.active: dev` → 它是**默认激活**的 profile |
| `application-docker.yml` | ✅ 有 | 自 `730dddd`(Phase 23B)起;compose 设 `SPRING_PROFILES_ACTIVE: docker` |
**硬证据**:`application-dev.yml` 的 `chat-image-enabled: true` **覆盖**了 `FeatureFlagConfig` 的 Java 字段
默认 `false` —— 若真如原判据所称「仅 Java 字段默认值生效」,该值不可能为 `true`。
**修正落点(5 处)**:`STATUS.md`(P26-T06 行 + Phase 22 段 + 历史声明块)、`Phase-22-…-Report.md`(表格行 + D-22-D)、
`JIRA_BACKLOG.md`、`Phase-V11-Deployment-Completion-Report.md`。
**仍然成立的部分**:T01–T05 模块开关与 T07 私有桶**确实**全仓零业务调用点(实测 12 个 flag 的调用点计数全为 0)
→ 「死配置」结论正确;原文失实的只是**来源**(非 `application.yml`、非「仅 Java 默认值」)。
**本轮新发现 D-22-E**:`AppController#getConfig`(`GET /app/config`)返回一份**硬编码** features map
(`imageChatEnabled` 恒 `true`,键名与后端 `chatImageEnabled` **不一致**)→ 与 `FeatureFlagConfig` **双源**,
前端读到的开关可能与实际配置相反(如 `appealEnabled` 实际默认 `false`)。不静默改契约,如实登记遗留。
### 9.3 操作事故:同一文件并行 Edit 会丢失改动
**现象**:对同一文件在一条消息里发起多个 Edit,**会随机丢失**其中若干处(读-改-写竞争)。
本轮实测:`STATUS.md` 3 处**丢 1 处**、`ci.yml` 3 处**丢 2 处**、`Phase-22-…-Report.md` 2 处**侥幸全中**。
每处都回报「Successfully edited」—— **成功回执不可作为落盘证据**。
**纪律**:① 同一文件的多处改动**必须串行**(一次一个 Edit,等结果返回);
② 任何批量改动后**必须回读确认每一处都在**(本轮即靠回读发现 `timeout-minutes` 与 `pytest tests/e2e -v` 丢失)。
---
*报告生成: 2026-09-18 — 对应方案任务五;处置明细见 `docs/superpowers/plans/2026-09-18-phase23-closeout-and-uat-readiness.md`*