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
@@ -30,7 +30,8 @@ STATUS 遗留区「Phase 22 部署运维配置扩展 ✅ 已完成」逐条声
| D-22-A | High | `FeatureFlagController.updateFlag` 用反射 `getMethod("set"+cap, boolean.class)` 只支持布尔 flag。7 个非布尔 flag(`livenessProvider`、`localEvidenceAllowedTypes`、`counselingAttachmentsBucket`、`localEvidenceMaxFiles`、`localEvidenceMaxFileSizeMB`、`localEvidenceRetentionDays`)经 API 更新必抛 `NoSuchMethodException` → 返回错误,运维无法经接口修改这些配置。 | 改为按字段类型分派:`boolean` → `setXxx(boolean)`、`int` → `setXxx(int)`、`String` → `setXxx(String)`;未知类型返回明确错误。 |
| D-22-B | Medium | `updateFlag` 用 `body.getOrDefault("value", false)`:缺 `value` 时静默置 `false`(可能误关功能);非布尔值转型 `((Boolean) value)` 直接崩。 | 改为:缺 `value` → 400;`value` 按字段类型校验后转型;类型不匹配返回 400 且**不**改变原值。 |
| D-22-C | Doc/Accuracy | STATUS 将 T01–T05、T07 标 ✅,但对应 flag 从未被业务读取(死配置)。 | 不静默扩权改写各模块;在报告中如实降级为「配置暴露但未强制」,列为遗留项交各模块 Phase 处理。 |
| D-22-D | Doc/Accuracy | STATUS 称「application.yml 默认配置(15 个 flag)」,但 yml 无 `features:` 块。 | 在报告/STATUS 中纠正:默认值来自 `FeatureFlagConfig` 的 Java 字段默认值,非 yml。功能不受影响。 |
| D-22-D | Doc/Accuracy | STATUS 称「application.yml 默认配置(15 个 flag)」,**来源**表述错误:features 不在基础 `application.yml`。⚠️ **本行原判据「`*.yml` 无 `features:` 块」于 2026-09-18 二次修正中被证伪** —— `application-dev.yml` 与 `application-docker.yml` 均含该块且实际生效,原「默认值仅来自 Java 字段默认」的纠正本身不成立。 | 二次纠正为:features 由 **profile yml(dev / docker)**提供并实际生效;基础 `application.yml` 不提供。功能不受影响。 |
| D-22-E | Doc/Accuracy(新发现,2026-09-18 二次修正) | `AppController#getConfig`(`GET /app/config`)返回一份**硬编码**的 `features` map(`activityEnabled` / `matchmakerEnabled` / `imageChatEnabled` / `appealEnabled` / `checkinEnabled` 恒为 `true`),与 `FeatureFlagConfig` **构成双源**;且键名 `imageChatEnabled` 与后端 `chatImageEnabled` **不一致**,值也可能与实际配置相反(如 `appealEnabled` 实际默认 `false`)。 | 不静默改契约(小程序端依赖此响应)。如实登记为遗留,交小程序契约/PWA 模块统一为单一来源(建议改读 `FeatureFlagConfig#getAllFlags()`)。 |
> 注:T06 上传策略经实测已真强制(`LocalEligibilityService` + `PhotoService`),保留 ✅,无需修复。