Files
AskaEth ed5005307a feat(backthink): 自排 C1-2 本体 + TriggerUnknown 修 fail-open(V1)
- selfwake.go:WakeNow + 待跑槽容量 1(先探槽合并不过闸、槽空才过闸、同锁)+ 闸 4 轮/小时
  ($DATA_DIR/config/backthink.json,零新 env 键)+ 审计四条 what + 启动日志两键 + 组合根接线
- G-A(主人已批):TriggerUnknown 作零值、既有两值编号后移(语义不动),未知触发走**最紧分支**
- 5 个变异自检(拆闸/≤0 未回落/过闸挪到探槽前=G1 失效形态/槽无界/零值挪走)
⚠️ 服务侧已就绪但**她仍调不到**(自排工具面属 C1-3)⇒ 不得写「C 已完成」
2026-10-06 20:25:04 +08:00

38 lines
1.6 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package backthink
// eventRedundant 报告 tr 是否与前一次事件驱动的推送重复
// (同源 + 同摘要),因此重复的设备/提醒事件
// 不会刷屏主人(防刷)。当 PushGate 对事件本身被绕过时,
// 它是仅剩的一道仍适用于事件驱动推送的
// 门(主人要求:"该发就发"——真正的事件照发,只扣下真正的重复)。
//
// 推送进行时它原子地把 tr 记为最新事件键,并在任何非事件推送
// (非事件轮:心跳 / 启动轮 / 她自己排起的一轮)时清除该键,以免更早事件的再次
// 重复被中间一次反思错误地抑制。
//
// 自排轮与心跳同分支(清链、不去重):它既不是外部事件、就不该参与事件链,
// 因此真实事件的重复链不会被自排轮错误抑制;自排轮的推送仍由 PushGate 兜。
//
// 未知触发(TriggerUnknown)也走这一支:它**不是**事件,故不去重;它同样不绕
// PushGate(push.go 只对 TriggerEvent 放行),因此重复投递的上限仍由频次门兜住。
//
// 调用方把它跑在把推送交给 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
}