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 会随机丢失」的事故记录与纪律)。
This commit is contained in:
WorkBuddy
2026-09-18 21:58:58 +08:00
parent f63e579a8d
commit 6b2ff0f73e
5 changed files with 87 additions and 10 deletions
+6 -4
View File
@@ -484,7 +484,7 @@ MinIO: localhost:9003 (凭证由本地环境变量提供)
| T01–T05 模块开关 | 复验发现 `isCounselingEnabled` / `isPremaritalEnabled` / `isContentEnabled` / `isServiceLocationEnabled` / `isLocalEligibilityEnabled`(模块级)全仓无业务调用点 → **死配置**(暴露但未 gate);不静默扩权,留交各模块 Phase 接线 |
| T06 上传策略 | 实测已在 `LocalEligibilityService`(启用开关 + 数量上限)+ `PhotoService`(大小 + 类型)**真强制** ✅ |
| T07 私有存储桶 | `counselingAttachmentsPrivate` / `Bucket` 全仓零引用 → **死配置**(存储本就走 `object-storage.bucket-private`);可选增强,遗留 |
| yml 声明夸大 | STATUS 称「application.yml 默认配置(15 flag)」,实际 yml 无 `features:` 块,默认值来自 Java 字段默认值;功能不受影响,文档纠正 |
| yml 声明夸大 | STATUS 称「application.yml 默认配置(15 flag)」——**来源表述错误**(features **不在**基础 `application.yml`),但**内容本身属实**:`application-dev.yml`(`spring.profiles.active: dev`,默认激活)与 `application-docker.yml`(compose 设 `SPRING_PROFILES_ACTIVE: docker`)**均有 `features:` 块且实际生效**(硬证据:dev 的 `chat-image-enabled: true` **覆盖**了 Java 字段默认 `false`)。原复验「4 份 yml 无 `features:` 块 / 默认值仅来自 Java 字段默认」为**误判**,已于 2026-09-18 二次修正;功能不受影响 |
| 守卫测试 | 新增 `FeatureFlagControllerTest`(7 用例:21 键全暴露 / 布尔·字符串·整数更新生效 / 未知 flag·缺 value·类型错→400);负向验证(仅布尔缺陷版)恰 2 用例精准变红,还原全绿 |
| 全量回归 | **657 tests / 0 failures / 0 errors / 3 skipped(起点 650,净 +7)** |
| 报告 | `docs/Phase-22-V11-Recovery-Completion-Report-2026-09-18.md` |
@@ -496,8 +496,10 @@ MinIO: localhost:9003 (凭证由本地环境变量提供)
> ⚠️ 此处原有**两块 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 字段默认值、且业务代码**从不读取**(死配置)。
> ① 原文所称 `features:` 块**确实存在且生效**,但**不在**基础 `application.yml`,而在 `application-dev.yml` /
> `application-docker.yml`(两 profile 均实际生效)—— 复验初判「4 份 yml 无 `features:` 块」**为误判**,
> 已于 2026-09-18 二次修正;② T01–T05 模块开关与 T07 私有桶**确实全仓零业务调用点**(死配置),此结论成立。
> ③ 另发现 `AppController#getConfig` 返回**硬编码** features(第二来源),见 Phase 22 报告 D-22-E。
> **唯一有效结论见上方「Phase 22 — 部署运维配置扩展(Feature Flag)✅(KEEP-VERIFY 复验关闭,2026-09-18)」。**
> 原文可从 `git log --all -- docs/STATUS.md` 取回。
@@ -684,7 +686,7 @@ OpenAPI 对外发布、调用审计与配额、分页幂等覆盖、脱敏边界
| P26-T03 Seed Service Types | ✅ (CHECK约束已定义) |
| P26-T04 创建万善公园服务站 | ✅ (V027) |
| P26-T05 初始化Banner | ✅ (V027) |
| P26-T06 初始化Feature Flags | ⚠️ **不成立**(2026-09-18 Phase 22 复验:4 份 `application*.yml` 无 `features:` 块;15 个 flag 实为 Java 字段默认且业务不读取) |
| P26-T06 初始化Feature Flags | ⚠️ **来源纠错 + 部分成立**(2026-09-18 二次修正):`features:` 块实际存在于 `application-dev.yml` / `application-docker.yml`(**不在**基础 `application.yml`)且实际生效(dev 的 `chat-image-enabled: true` 覆盖 Java 默认 `false`)—— 原「4 份 yml 无 features 块」为**误判**;但 10 个模块级 flag(T01–T05 及同类)全仓**零业务调用点**,运维**无法**经开关关闭对应模块(死配置) |
| P26-T07 初始化新增Roles/Permissions | ✅ (V015已覆盖) |
| P26-T08~T13 Smoke tests | ⏳ 上线前手动验证 |