- 追加 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
35 lines
1.4 KiB
Go
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
|
|
}
|