Files
Cyrene_v2/internal/services/backthink/event_dedup.go
T
AskaEth 94da6bcd6d
CI / Backend (build / vet / test / cross-compile) (push) Has been cancelled
CI / Frontend (tsc + vite build) (push) Has been cancelled
feat(backthink): 静默期自排 C 的判定侧(C1-1,切片三之一)
- 追加 TriggerSelfWake(不动既有编号)+ SelfWakeRequest(走既有 urgency 声明通道,不新造第二条)
- escalateImport 折算收成唯一 foldDeclared(事件轮与自排轮共用、只上抬取较高档)
- DecisionInput.Heartbeat bool → Kind TriggerKind;心跳仍免检、**自排不享心跳豁免**(要求声明 ≥ warning)
- push 与档位分离:push.go 零改动即自动正确(eventDriven 对 self_wake 为 false ⇒ 照旧过 PushGate)
- 4 个变异自检(折算空操作/删自排分支/常量传心跳/非事件一律豁免)
⚠️ 本片只是判定侧:WakeNow/worker/闸属 C1-2,工具面与提示词属 C1-3 ⇒ **不得写『C 已完成』**
⚠️ 遗留 G-A(建议登记进 design/12 C.4):TriggerKind 零值=TriggerHeartbeat ⇒ 漏填=最宽豁免(fail-open);
   本片已在字段注释与单测里显式化,但规格侧应补一句或引入 TriggerUnknown
2026-10-06 18:46:27 +08:00

35 lines
1.4 KiB
Go

package backthink
// eventRedundant 报告 tr 是否与前一次事件驱动的推送重复
// (同源 + 同摘要),因此重复的设备/提醒事件
// 不会刷屏主人(防刷)。当 PushGate 对事件本身被绕过时,
// 它是仅剩的一道仍适用于事件驱动推送的
// 门(主人要求:"该发就发"——真正的事件照发,只扣下真正的重复)。
//
// 推送进行时它原子地把 tr 记为最新事件键,并在任何非事件推送
// (非事件轮:心跳 / 启动轮 / 她自己排起的一轮)时清除该键,以免更早事件的再次
// 重复被中间一次反思错误地抑制。
//
// 自排轮与心跳同分支(清链、不去重):它既不是外部事件、就不该参与事件链,
// 因此真实事件的重复链不会被自排轮错误抑制;自排轮的推送仍由 PushGate 兜。
//
// 调用方把它跑在把推送交给 Pusher 之前;真正的重复
// 会被记为已抑制(RouteNone),而不是投递出去。
func (b *Backthink) eventRedundant(tr Trigger) bool {
if tr.Kind != TriggerEvent {
// 非事件轮(心跳 / 启动轮 / 自我唤醒轮)会打断同一事件链。
b.eventMu.Lock()
b.lastEventKey = ""
b.eventMu.Unlock()
return false
}
key := tr.Source + "\x00" + tr.Summary
b.eventMu.Lock()
defer b.eventMu.Unlock()
if b.lastEventKey == key {
return true
}
b.lastEventKey = key
return false
}