根治三类工程治理问题(技术默认值≠产品规则、配置存在但未闭环、文档代码漂移): - PROFILE-001:profile.photo.maxCount(默认6未确认)+ ProfilePolicy + 服务器端 FOR UPDATE 并发强校验(PHOTO_LIMIT_EXCEEDED,拒绝先于 S3 不留孤儿)+ 前端 mergeAppConfig 嵌套键修复 - CFG-001/IDENTITY-001:IdentityPolicy + GET /verification/liveness-status 真实判定点 (默认关不阻断,开则 enhancedVerified 变化,消除假开关)+ 删死 seed livenessVerification.enabled - MATCH-001:阈值60定为技术默认(消解 PENDING 矛盾)+ V050 recommendation_records.threshold_snapshot 规则版本化 + 删死重复配置类 MatchConfig - DOC-001:新增 docs/governance/(config-register/open-questions/decision-register/ hardcoded-rule-audit/config-drift-audit) - TEST-001:新增守卫 PhotoLimitGuardTest(8)/IdentityLivenessGuardTest(5)/ RecommendationThresholdSnapshotGuardTest(4),均经负向注入可红 全量回归 733/0/0/3(基线717+17新增-1删死测试);UI 契约门禁 18/18;STATUS 升 rc.21
3.8 KiB
3.8 KiB
硬编码规则审计 — hardcoded-rule-audit.md
版本:V1.0.1 配置与规则纠偏 · 日期:2026-09-20 · 扫描:业务代码数值/常量 +
MAX_/LIMIT_/THRESHOLD_/COOLDOWN_/TIMEOUT_/COUNT_/SCORE_定级:LOCKED(产品确认)/ DEFAULT(技术默认)/ CONFIG(应配置化)/ TBD(未确认)/ FUTURE(非 V1 范围) 判定原则:未确认数量参数不得作为固定业务常量写死(AGENTS.md #12);必须存在运行初值时,定义为DEFAULT + CONFIG并登记config-register.md。
一、已配置化且被真实读取(本轮/历史已合规)
| 规则 | 载体 | 值 | 定级 |
|---|---|---|---|
| 每日推荐上限 | MatchRuleConfigProperties.defaultDailyLimit(yml match.default-daily-limit) |
6 | LOCKED(已确认每日 6 人) |
| Pass 冷却天数 | match.default-cooldown-days |
180 | LOCKED(已确认) |
| 推荐最低阈值 | match.default-score-threshold → MatchingPolicy |
60 | CONFIG / TBD(技术默认,未确认,OQ-MATCH-001) |
| 匹配规则版本 | match.rule-version |
1 | CONFIG |
| 10 维推荐权重 | match.*-weight |
age15/region15/… | CONFIG / TBD(yml 未覆盖,全用类内默认) |
| 照片上限 | profile.photo.max-count → ProfilePolicy |
6 | CONFIG / TBD(技术默认,未确认,OQ-PROFILE-001;服务器端强校验) |
| 注销保留期 | account.data-retention-months |
36 | LOCKED(2026-09-19 产品确认) |
| 本地资格佐证参数 | features.localEvidence*(保留 365 天/5 文件/10MB/jpg,png) |
见左 | CONFIG(保留期 LEGAL_VERIFY,OQ-LOCAL-ELIG-001) |
| 活体开关 | features.livenessEnabled/livenessProvider → IdentityPolicy |
false / none | CONFIG / TBD(OQ-IDENTITY-001) |
| 幂等 TTL | idempotency_records(默认 86400s) |
86400s | CONFIG / LEGAL_VERIFY(第三方分级待定) |
二、仍为硬编码 —— 本轮未纳入,登记为「待统一」未来项
本轮按约束 12 只纠偏文档点名的 3 项(活体键 / 照片上限 / 推荐阈值)。以下为同族但未动,避免越界:
| 位置 | 硬编码 | 建议 |
|---|---|---|
AppController /app/config |
dailyRecommendationLimit=6、maxInterestTags=8、selfIntroMaxLength=500、recommendationCooldownDays=180、reviewConfig{autoApproveAfterDays=7,maxResubmitCount=3}、features 全 true |
统一改读 MatchRuleConfigProperties / 对应配置,前端经 /app/config 下发;值确认后转 LOCKED |
RecommendationEngineService / MatchEligibilityService |
互选公式系数 0.6*min + 0.4*avg(:230/:122)、level 分档 >=80 high / >=60 medium(:392-396/:262-266)、calculateScore 恒返回 50.0(V1 占位) |
打分是 V1 占位,公式/分档/系数尚未产品化;正式化时一并配置化 + 记入规则版本 |
PhotoService |
图片大小上限 10MB、签名 URL 24h、上传凭证 1h(SIGNED_URL_EXPIRE_HOURS) |
属对象存储/S3 参数,非业务规则;如需可调再配置化(低优先级) |
三、常量类扫描(非业务数值,多为校验/分页,合规)
| 常量 | 说明 |
|---|---|
MAX_LENGTH(42 处) |
字段长度校验上限,属校验约束,非「未确认业务数量」 |
MAX_PAGE_SIZE / MAX_VALUE / MAX_PER_MINUTE* / MAX_LOGIN_ATTEMPTS |
分页/速率/登录防爆破,合理技术上限 |
PHOTO_LIMIT_EXCEEDED(本轮新增业务码) |
照片超限业务错误码,非数值 |
结论:本轮已将文档点名的 3 项(活体键、照片上限、推荐阈值)落实为「配置源唯一 + 真实读取 + 默认值受控」。 上表第二节为同族未动项,建议在后续 Phase 按同一纪律统一(勿一次性扩大重构)。