V1.0.1 纠偏 DoD 补齐:canonical key 字面化(V051+KEY_ALIASES)+ 照片并发突破实测(锁用户行+锁后计数)+ AGENTS 规则27 + known-risks

按文档 DoD/约束逐条复查后补齐的差距(承接 438b38d 主体纠偏):
- CFG-001 字面化:FeatureFlagConfig.KEY_ALIASES(identity.liveness.enabled / 遗留
  livenessVerification.enabled → 实现字段 livenessEnabled,读兼容)+ Controller PUT/DELETE
  落库归一到 canonical 键 + V051 迁移(删遗留键、写入 identity.liveness.enabled=false);
  MigrationValidationTest 基线 50→51。
- PHOTO-004 真实并发突破:新增 PhotoLimitConcurrencyGuardTest(3 线程 H2 并发冲顶)——
  实测咬住「锁照片行+读时计数」在 H2 MVCC 快照漏读、3/3 全成功突破上限的缺陷;
  并发控制改为锁用户行(UserMapper.lockUserRow FOR UPDATE)+ 锁后新语句 COUNT,
  0 张照片亦有锁可加(补首张并发缺口);UserPhotoMapper 计数方法同步替换。
- FF-LIVENESS-003 + canonical 持久化:FeatureFlagPersistenceGuardTest +4
  (canonical 加载 / 遗留别名读兼容 / PUT 落 canonical 键 / 切换即生效无旧缓存)、
  FeatureFlagControllerTest +3(canonical/legacy/reset)。
- 文档同步:AGENTS.md 规则 27(配置治理纪律);docs/governance/known-risks.md
  (7 项含本机 WSL/Docker 故障 KR-07);config-register / open-questions 更新 canonical 口径;
  STATUS rc.21 行补 ⑥⑦⑧。

全量回归 741/0/0/3(基线 717 + 25 新增 − 1 删死测试,宿主机 JDK21+Maven 3.9.9 实测,
本机 WSL/Docker 引擎故障期间);UI 契约门禁 18/18
This commit is contained in:
WorkBuddy
2026-09-21 11:13:14 +08:00
parent 438b38d121
commit 60c591fc68
18 changed files with 380 additions and 71 deletions
@@ -0,0 +1,24 @@
-- V051: 活体核验配置键归一(CFG-001,V1.0.1 配置与规则纠偏)
--
-- 背景:活体开关此前存在「同一业务含义多套 key」的漂移 ——
-- * seed(demo-seed-final.sql)写过 livenessVerification.enabled(system_configs,死表);
-- * FeatureFlagConfig 实现键为 livenessEnabled(feature_flag_overrides 可用键);
-- * 治理文档 canonical 名为 identity.liveness.enabled。
-- 本迁移把 feature_flag_overrides 收敛为「只写 canonical 键」:
-- 1) 删除遗留键(livenessVerification.enabled / livenessEnabled)的覆盖行;
-- 2) 写入 canonical 键 identity.liveness.enabled = false(默认关闭,fail-safe,
-- 与 Java 字段默认值一致;运行期开启仍走 PUT /operator/feature-flags/{flagName},
-- 其落库键已由 FeatureFlagController 归一为 canonical 名)。
--
-- 说明:identity.liveness.enabled 与实现字段 livenessEnabled 的映射由
-- FeatureFlagConfig.KEY_ALIASES 承担(读兼容),文档见 docs/governance/config-register.md。
-- 语法刻意避免 PG 专有 ON CONFLICT(H2 兼容约定,同 V048 取舍)。
DELETE FROM feature_flag_overrides
WHERE flag_key IN ('livenessVerification.enabled', 'livenessEnabled');
INSERT INTO feature_flag_overrides (flag_key, flag_value, value_type, updated_by, updated_at)
SELECT 'identity.liveness.enabled', 'false', 'boolean', NULL, NOW()
WHERE NOT EXISTS (
SELECT 1 FROM feature_flag_overrides WHERE flag_key = 'identity.liveness.enabled'
);