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
This commit is contained in:
1 parent
ea43f07bce
commit
94da6bcd6d
8 files changed
+353
-26
No files matched your search
@@ -63,6 +63,54 @@ func TestTriggerForEvent_GenericProducerChannel(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestFoldDeclared_SharesOneChannelWithSelfWake 是 design/12 §C.2 的结构断言:这条
|
||||
// 通用通道**只有一处**折算点(foldDeclared),总线事件载荷与她自排的一轮都经它叠档
|
||||
// ——同一个声明档位必须给出同一个 Import。它同时钉住「声明只上抬」(routine 不压低
|
||||
// 主题自带档)与自排轮的形状(Source / Summary 前缀 / Kind)。
|
||||
//
|
||||
// 变异:把 foldDeclared 改成空操作(直接 return tr)、或让自排另写一条「档位 → 重要度」
|
||||
// switch ⇒ warning / critical 两条用例变红。
|
||||
func TestFoldDeclared_SharesOneChannelWithSelfWake(t *testing.T) {
|
||||
t.Parallel()
|
||||
cases := []struct {
|
||||
name string
|
||||
declared urgency.Level
|
||||
want Importance
|
||||
}{
|
||||
{name: "未声明_不上抬", declared: urgency.LevelRoutine, want: ImportanceNormal},
|
||||
{name: "warning_抬到High", declared: urgency.LevelWarning, want: ImportanceHigh},
|
||||
{name: "critical_抬到Critical", declared: urgency.LevelCritical, want: ImportanceCritical},
|
||||
}
|
||||
for _, tc := range cases {
|
||||
tc := tc
|
||||
t.Run(tc.name, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
ev := triggerForEvent(bus.Event{Subject: SubjectSystemEvent, Payload: stubProducer{Level: tc.declared}})
|
||||
if ev.Import != tc.want {
|
||||
t.Fatalf("event Import = %v, want %v", ev.Import, tc.want)
|
||||
}
|
||||
sw := selfWakeTrigger(SelfWakeRequest{Reason: "复盘一下今天的对话", Declared: tc.declared})
|
||||
if sw.Import != tc.want {
|
||||
t.Fatalf("self wake Import = %v, want %v (与事件同一条通道)", sw.Import, tc.want)
|
||||
}
|
||||
if sw.Kind != TriggerSelfWake {
|
||||
t.Fatalf("self wake Kind = %v, want %v", sw.Kind, TriggerSelfWake)
|
||||
}
|
||||
if sw.Source != SelfWakeSource {
|
||||
t.Fatalf("self wake Source = %q, want %q", sw.Source, SelfWakeSource)
|
||||
}
|
||||
if !strings.HasPrefix(sw.Summary, SelfWakeSummaryPrefix) {
|
||||
t.Fatalf("self wake Summary = %q, want the stable prefix %q", sw.Summary, SelfWakeSummaryPrefix)
|
||||
}
|
||||
})
|
||||
}
|
||||
// 声明只上抬,绝不压低主题自带的档:提醒的 High 不会被一句 routine 抹掉。
|
||||
reminder := triggerForEvent(bus.Event{Subject: SubjectReminderTrigger, Payload: stubProducer{Level: urgency.LevelRoutine}})
|
||||
if reminder.Import != ImportanceHigh {
|
||||
t.Fatalf("reminder Import = %v, want %v (routine 不得压低主题档位)", reminder.Import, ImportanceHigh)
|
||||
}
|
||||
}
|
||||
|
||||
// TestDecide_GenericProducerQuietHours 断言非 IoT 生产者的声明在安静时段同样生效:
|
||||
// critical 穿透,未声明照常扣下。判定侧不改,穿透靠的是事件真的走到了那一档。
|
||||
func TestDecide_GenericProducerQuietHours(t *testing.T) {
|
||||
|
||||
Reference in new issue
Block a user