fix(gateway): 配置事实↔模板的守卫改为「在模板里 / 显式豁免带理由」
由来:主人 2026-10-06 红线把 `.env` 冻结为「只保证最小化功能可跑」的引导面 ⇒ 调优旋钮不再进模板(我已把 MEMORY_TIDY_COMPARE_LIMIT 撤出),但既有测试仍要求 「每个事实键必须逐字出现在 .env.example」⇒ HEAD 上红一条。 改法(收窄不是放弃守卫):新增**封闭**的 envExampleExemptKeys(键→理由), 每个事实键满足「在模板里」或「在清单里且理由非空」;并加**反向断言**: 清单里不许有非事实键、也不许有其实已在模板里的键(防清单变垃圾桶)。 我的变异:往清单塞 NOT_A_FACT_KEY ⇒ TestAdminConfigFacts_KeysMatchEnvExample FAIL; 还原后复绿。
This commit is contained in:
1 parent
180128c207
commit
b7fb4dd1c7
1 file changed
+37
-5
@@ -309,9 +309,23 @@ func TestAdminConfigFacts_NeverLeaksSecretValues(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestAdminConfigFacts_KeysMatchEnvExample 是判据 ④:键名单的权威来源是
|
||||
// `.env.example` —— 13 个键必须逐字出现在模板里(键名写错一个字母,用户照面板
|
||||
// 抄去改就是静默不生效,AGENTS §10 的 E6 固定动作)。
|
||||
// envExampleExemptKeys 是**允许不出现在 `.env.example`** 的配置事实键,值 = 豁免理由。
|
||||
//
|
||||
// 依据(主人 2026-10-06 红线):`.env` 冻结为「只保证最小化功能可跑」的**引导面**,
|
||||
// **不再当作配置面** —— 调优/门槛/上限类旋钮**不进模板**(只有代码默认值;将来由
|
||||
// `$DATA_DIR/config/**` + 面板提供,见 `design/13 §2.1`)。因此「键必须在模板里」
|
||||
// 这条旧口径收窄为:「**在模板里,或在这里带理由显式豁免**」。
|
||||
//
|
||||
// 🔴 这份清单是**封闭的**:新键要么进模板(确属最小化引导必需、且经主人批准),
|
||||
// 要么必须在这里显式登记并写清理由 —— 否则本用例红。它守的东西没变:
|
||||
// **不许有键悄悄漂移出去**(写错一个字母 ⇒ 用户照面板改就是静默不生效)。
|
||||
var envExampleExemptKeys = map[string]string{
|
||||
"MEMORY_TIDY_COMPARE_LIMIT": "调优旋钮(每分区两两比对上限);按冻结口径走 config/ 而不进 .env(design/13 §2.1)",
|
||||
}
|
||||
|
||||
// TestAdminConfigFacts_KeysMatchEnvExample 是判据 ④:键名单的权威来源是 `.env.example`。
|
||||
// 每个配置事实键必须**逐字出现在模板里**,或**在 envExampleExemptKeys 里带理由登记豁免**
|
||||
// (口径 2026-10-06 由「必须在模板里」收窄为「在模板里 / 显式豁免」,原因见上)。
|
||||
func TestAdminConfigFacts_KeysMatchEnvExample(t *testing.T) {
|
||||
t.Parallel()
|
||||
raw, err := os.ReadFile(filepath.Join("..", "..", "..", ".env.example"))
|
||||
@@ -320,8 +334,26 @@ func TestAdminConfigFacts_KeysMatchEnvExample(t *testing.T) {
|
||||
}
|
||||
template := string(raw)
|
||||
for _, spec := range configFactSpecs() {
|
||||
if !strings.Contains(template, spec.key+"=") {
|
||||
t.Fatalf(".env.example 里没有 %s= —— 事实表与模板漂移", spec.key)
|
||||
if strings.Contains(template, spec.key+"=") {
|
||||
continue
|
||||
}
|
||||
if why, ok := envExampleExemptKeys[spec.key]; ok && strings.TrimSpace(why) != "" {
|
||||
continue
|
||||
}
|
||||
t.Fatalf(".env.example 里没有 %s= 且未登记豁免 —— 事实表与模板漂移", spec.key)
|
||||
}
|
||||
// 反向:豁免清单里不许留着「其实模板里有」或「根本不是事实键」的条目
|
||||
// (否则清单会变成垃圾桶,守卫随之失效)。
|
||||
keys := map[string]bool{}
|
||||
for _, spec := range configFactSpecs() {
|
||||
keys[spec.key] = true
|
||||
}
|
||||
for key := range envExampleExemptKeys {
|
||||
if !keys[key] {
|
||||
t.Fatalf("豁免清单里的 %q 不是配置事实键 —— 请删掉(清单只放事实键)", key)
|
||||
}
|
||||
if strings.Contains(template, key+"=") {
|
||||
t.Fatalf("豁免清单里的 %q 其实已经在 .env.example 里 —— 请把它从清单删掉", key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user