feat(urgency): 通用紧急度通道(Declarer/Level + 只抬不压折算)+ IoT 首个生产者 + 她自己的结论走结构化标记穿透安静时段
This commit is contained in:
1 parent
4a2d276881
commit
f91a83ff81
14 files changed
+917
-15
No files matched your search
@@ -5,6 +5,7 @@ import (
|
||||
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/bus"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/iot"
|
||||
"git.yeij.top/AskaEth/Cyrene_v2/internal/urgency"
|
||||
)
|
||||
|
||||
// TriggerKind 归类唤醒一轮思考的原因,好让推送路径套用
|
||||
@@ -50,6 +51,10 @@ const (
|
||||
// 平台噪声)被降级为仅登记一条记录,不唤醒
|
||||
// 一整轮思考;只有高重要度(与主人相关)的系统事件才思考,
|
||||
// 因此繁忙的公开平台无法触发昂贵反思的洪流。
|
||||
//
|
||||
// 它是「载荷自带重要度」这条通用通道的既有形式;生产者的紧急度若以
|
||||
// urgency.Declarer 声明(IoT 的设备跃迁即如此),由 triggerForEvent 折算到
|
||||
// 同一个 Trigger.Import 字段上,两条形式因此落到同一套判定。
|
||||
type SystemEvent struct {
|
||||
Summary string
|
||||
Import Importance
|
||||
@@ -84,11 +89,23 @@ func startupTrigger() Trigger {
|
||||
return Trigger{Source: "startup", Summary: StartupSummary, Import: ImportanceLow, Kind: TriggerHeartbeat}
|
||||
}
|
||||
|
||||
// triggerForEvent 把总线事件映射为 Trigger。IoT 设备变化按
|
||||
// 普通重要度处理,提醒触发按高重要度,泛化的
|
||||
// 系统事件按普通重要度。每个事件都打上 TriggerEvent,因此其
|
||||
// 主动推送绕过心跳的 PushGate。
|
||||
// triggerForEvent 把总线事件映射为 Trigger:主题给出可读摘要与主题级默认重要度,
|
||||
// 随后**通用通道**统一解出重要度 —— 任何事件载荷只要实现 urgency.Declarer
|
||||
// (IoT 的 DeviceUpdate 是第一个使用者),它声明的紧急度就被承认;泛化系统事件沿用
|
||||
// 它既有的 SystemEvent.Import 口径。两条形式最终都落在同一个 Trigger.Import 字段上,
|
||||
// 判定侧(decide.go)因此只认档位、不认生产者。每个事件都打上 TriggerEvent,
|
||||
// 因此其主动推送绕过心跳的 PushGate。
|
||||
func triggerForEvent(e bus.Event) Trigger {
|
||||
tr := triggerForSubject(e)
|
||||
if d, ok := e.Payload.(urgency.Declarer); ok {
|
||||
tr.Import = escalateImport(tr.Import, d.Urgency())
|
||||
}
|
||||
return tr
|
||||
}
|
||||
|
||||
// triggerForSubject 给出各主题的可读摘要与主题级默认重要度(未声明紧急度的事件就
|
||||
// 停在这一档)。它刻意不对任何生产者做专有判定:重要度已由通用通道统一解出。
|
||||
func triggerForSubject(e bus.Event) Trigger {
|
||||
switch e.Subject {
|
||||
case iot.DeviceUpdateSubject:
|
||||
if d, ok := e.Payload.(iot.DeviceUpdate); ok {
|
||||
@@ -115,3 +132,34 @@ func triggerForEvent(e bus.Event) Trigger {
|
||||
return Trigger{Source: e.Subject, Summary: e.Subject, Import: ImportanceNormal, Kind: TriggerEvent}
|
||||
}
|
||||
}
|
||||
|
||||
// importanceForUrgency 把生产者声明的紧急度折算为思考轮的重要度。它是通用通道与
|
||||
// 判定侧之间**唯一**的换算点(design/12 §6 安全域豁免,裁决 1.8 / 07.4.2):零值
|
||||
// Routine 折算 Normal —— 默认档永不获得穿透安静时段的资格;只有生产者显式声明
|
||||
// critical 的安全域事件拿到 ImportanceCritical,从而穿透安静时段与工作 / 忙碌。
|
||||
func importanceForUrgency(l urgency.Level) Importance {
|
||||
switch l {
|
||||
case urgency.LevelCritical:
|
||||
return ImportanceCritical
|
||||
case urgency.LevelWarning:
|
||||
return ImportanceHigh
|
||||
default:
|
||||
return ImportanceNormal
|
||||
}
|
||||
}
|
||||
|
||||
// escalateImport 把声明的紧急度叠到基础重要度上。声明只能**上抬**、绝不压低,因此
|
||||
// 主题级默认(如提醒的 High)与安全域事件既得的档位不会被一句 routine 抹掉;
|
||||
// 未声明(零值 LevelRoutine)时原样返回 base,没标紧急度的事件行为逐字不变。
|
||||
//
|
||||
// 两个调用方共用它:总线事件的载荷声明(triggerForEvent),以及她自己在主动思考轮
|
||||
// 结论里声明「我认为这条紧急」(backthink.go 的 escalatedImport)。
|
||||
func escalateImport(base Importance, declared urgency.Level) Importance {
|
||||
if declared == urgency.LevelRoutine {
|
||||
return base
|
||||
}
|
||||
if up := importanceForUrgency(declared); up > base {
|
||||
return up
|
||||
}
|
||||
return base
|
||||
}
|
||||
Reference in new issue
Block a user