feat(channelbridge): 冷避期唯一的放行口——高价值关键词穿透(不解除冷却)

塔 2026-10-15 例外口径定稿落地。M18 主体(冷避优先于「@她必回」)保持不动,
本提交只补冷却期内的例外与它的守卫。

- engage.go:`coldShoulderLocked` 在冷却期内放行**高价值关键词**这一条
  (真故障不该被「让她少闲聊」一并压掉),且**不解除冷却**(不动 state / cooldownUntil);
  同句既有负面态度又有高价值关键词时**负面态度优先**(仍进冷却、仍静默);
  例外与顺序写进函数注释,并写明 owner 车道为什么不需要单独写例外(它在
  shouldRespond 第一步就分岔,写在这里是死代码)。文档面 design/18 §5/§9 由塔同步。
- light.go:shouldRespond 的判定顺序与冷避闸注释同步该口径。
- 测试:新增 engage_coldshoulder_exception_test.go(冷却期例外矩阵:真故障放行、
  @她/闲聊不穿透、穿透不解除冷却、同句负面态度优先;以及「冷却之外行为与基线一致」
  的护栏),并按文件 ≤500 行拆出该文件;engage_coldshoulder_test.go 增共享夹具。

红前绿证据(参照 = 本提交的父 M18 提交):例外矩阵两条「真故障放行」行在我的改动
之前为红(冷避闸会把它们静默),其余三行与基线护栏在父提交上已绿,已如实标注为护栏;
「同句负面态度优先」一条另做变异自证(把例外插到负面态度判定之前 ⇒ 该行立刻变红)。

验收:go build ./... + go vet ./... + go test -count=1 ./... 全绿;
channelbridge / channel / cmd/cyrene 单独跑绿;darwin/arm64 交叉编译通过。
This commit is contained in:
AskaEth committed 2026-10-15 19:01:02 +08:00
1 parent fe53e029ea
commit 13a0519115
4 files changed
+177 -2

No files matched your search

+9 -1
View File
@@ -182,7 +182,9 @@ func isStrangerPrivate(sess session.Session) bool {
// ② 平台/系统噪声 → 只登记。
// ③ 陌生人私聊 → 正常聊天(唯一闸门是流控)。
// ④ **非主人群聊:冷避闸**(design/18 §5,M18 新增位次)——负面态度 → COOLDOWN、
// 冷却期内一律静默;**优先于第 ⑤ 步的「@她必回」**,与是否装配参与度引擎无关。
// 冷却期内静默;**优先于第 ⑤ 步的「@她必回」**,与是否装配参与度引擎无关。
// 冷却期内唯一放行口是**高价值关键词穿透**(真故障不漏,且不解除冷却);
// 同句负面态度优先于该例外(塔 2026-10-15 定稿)。
// ⑤ 廉价规则:指向她本人 / 提及主人显示名 / 高价值关键词 → 必回。
// ⑥ 规则无结论 → 参与度引擎(design/18)或旧轻量判定车道(design/12 §6)。
//
@@ -233,6 +235,12 @@ func (b *Bridge) shouldRespond(ctx context.Context, msg adapter.UnifiedMessage,
// 规则判定**之前**,否则 @她 / 高价值关键词会在规则层直接 return true,
// 群成员刚说的「少说点」被随后的任何一次 @ 立刻作废(2026-10-14 报障病灶)。
//
// 冷却期内的**唯一**放行口是「高价值关键词穿透」(塔 2026-10-15 定稿):
// 该条由冷避闸自己返回「不拦」,随后落到下面的 ruleLightJudge 按高价值关键词
// 正常回复;@她 / @全体 **不穿透**(那正是「给」的实质),且穿透**不解除冷却**。
// 同句既有负面态度又有高价值关键词时,**负面态度优先**(仍静默)。
// 口径细节见 engage.go 的 coldShoulderLocked(design/18 §5/§9 由塔同步)。
//
// 闸的适用面在冷避闸自己身上写死:只对群聊(私聊与 owner 车道在更早处已分岔)
// 且与是否装配参与度引擎无关 —— 旧轻量判定车道的部署同样得到这个顺序。
if sess.IsGroup {