小怡 2026-10-30 二轮裁定 5 条全落: 1. ExtractTools 移除'命令式标识'兜底(hash/uuid/目录/文件名碎片的进入路径),成员=knownTools 白名单唯一来源 2. genericTools 黑名单(git/go/curl/grep/bot-chat/mcp/api 等)即使形态合格也拒 3. isValidTool 新增 isHashFragment/isNumericUnitFragment/isNumberedDirName 形态闸 4. UpsertPatterns conf<0.5 一律不写(MinWriteConfidence) 5. tool_combo 需≥2成员(组合语义);IsValidPatternName 同步收紧 单测:junk 类别逐项回归 + 写入门槛 + 幂等/门限值钉死
43 lines
1.5 KiB
Go
43 lines
1.5 KiB
Go
package pattern
|
||
|
||
import "testing"
|
||
|
||
// TestStore_WriteConfidenceGate —— 二轮裁定 #5:conf<MinWriteConfidence(0.5) 一律不落库。
|
||
// 命名键合法(白名单、≥2 成员)也不行——弱信号只出现在 dry-run 观测里。
|
||
func TestStore_WriteConfidenceGate(t *testing.T) {
|
||
s := newTestStore(t)
|
||
low := Pattern{
|
||
ID: "pat_tool_combo:jq+rsync", Type: "tool_combo",
|
||
Name: "tool_combo:jq+rsync", Data: "jq+rsync",
|
||
Confidence: 0.2, // freq=2 ⇒ 0.2,正是被点名的弱信号档
|
||
Tools: []string{"jq", "rsync"},
|
||
SourceTasks: []string{"m_1", "m_2"},
|
||
}
|
||
created, updated, err := s.UpsertPatterns([]Pattern{low})
|
||
if err != nil {
|
||
t.Fatalf("upsert 报错: %v", err)
|
||
}
|
||
if created != 0 || updated != 0 {
|
||
t.Fatalf("conf=0.2 < 门槛 0.5 应拒写,实际 created=%d updated=%d", created, updated)
|
||
}
|
||
ok := low
|
||
ok.Name = "tool_combo:jq+sqlite3"
|
||
ok.ID = "pat_tool_combo:jq+sqlite3"
|
||
ok.Data = "jq+sqlite3"
|
||
ok.Confidence = 0.5 // 恰好达门槛:允许写
|
||
created, _, err = s.UpsertPatterns([]Pattern{ok})
|
||
if err != nil {
|
||
t.Fatalf("upsert 报错: %v", err)
|
||
}
|
||
if created != 1 {
|
||
t.Fatalf("conf=0.5 恰达门槛应写入 1 条,实际 created=%d", created)
|
||
}
|
||
}
|
||
|
||
// TestMinWriteConfidenceValue —— 门槛值与卡面(小怡裁定 ≥0.5)钉死,防手滑改低。
|
||
func TestMinWriteConfidenceValue(t *testing.T) {
|
||
if MinWriteConfidence != 0.5 {
|
||
t.Fatalf("MinWriteConfidence 应为 0.5(小怡 2026-10-30 裁定 #5),实际 %v", MinWriteConfidence)
|
||
}
|
||
}
|