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
@@ -21,6 +21,13 @@ const (
|
||||
// 系统事件)。它的推送绕过 PushGate——"该发就发"——只受
|
||||
// 同一事件去重约束。
|
||||
TriggerEvent
|
||||
// TriggerSelfWake 是她自己排起的一轮思考(design/12 §N C)。它既不是外部
|
||||
// 事件、也不是周期性心跳:推送既不绕 PushGate,也不享长期静默段的豁免——
|
||||
// 要求只是她说得出理由(见 decide.go 的 activityHeld)。
|
||||
//
|
||||
// 它是**追加**的第三个值:既有两个值的编号与标签逐字不变(改编号会
|
||||
// 静默改写已落库记录与在途请求的含义)。
|
||||
TriggerSelfWake
|
||||
)
|
||||
|
||||
// String 返回用于日志与记录的稳定标签。
|
||||
@@ -28,6 +35,8 @@ func (k TriggerKind) String() string {
|
||||
switch k {
|
||||
case TriggerEvent:
|
||||
return "event"
|
||||
case TriggerSelfWake:
|
||||
return "self_wake"
|
||||
case TriggerHeartbeat:
|
||||
return "heartbeat"
|
||||
default:
|
||||
@@ -45,6 +54,17 @@ const (
|
||||
SubjectSystemEvent = "system.event"
|
||||
)
|
||||
|
||||
// SelfWakeSource 是她自我唤醒(自排一次思考)的稳定来源标签。它同时是
|
||||
// Trigger.Source、Record.Trigger、面板标签与审计前缀的**唯一**真源——
|
||||
// 各处都不许再写这个字面量(另写一份就会与落库值静默漂移)。
|
||||
const SelfWakeSource = "self_wake"
|
||||
|
||||
// SelfWakeSummaryPrefix 是自排轮触发摘要的稳定前缀(`self_wake: <她写的理由>`)。
|
||||
// context.go 靠它认出「这一轮是她自己排起的」并切到专属引导提示词,
|
||||
// 与 StartupSummary 是同一族的稳定标识。它由 SelfWakeSource 派生,
|
||||
// 因此标签改一处即两处同改。
|
||||
const SelfWakeSummaryPrefix = SelfWakeSource + ": "
|
||||
|
||||
// SystemEvent 是调用方可发布到 SubjectSystemEvent 以传达
|
||||
// 系统通知的可选类型化负载。Import 默认为 Normal。在
|
||||
// design/12 §6 策略一之下,低价值的系统通知(加入/退出 ping、泛化的
|
||||
@@ -60,6 +80,23 @@ type SystemEvent struct {
|
||||
Import Importance
|
||||
}
|
||||
|
||||
// SelfWakeRequest 是她自己发起的一次唤醒请求(design/12 §N C.1)。它实现
|
||||
// urgency.Declarer,因此她的声明与 IoT 设备跃迁走**同一条**折算通道
|
||||
// (foldDeclared → escalateImport),判定侧不为它加任何分支。
|
||||
type SelfWakeRequest struct {
|
||||
// Reason 是她写给「下一轮自己」的理由。它是有界的:截断在工具面完成
|
||||
// (design/12 §C.3),这里只承载。
|
||||
Reason string
|
||||
// Declared 是她声明的紧急度;零值 = LevelRoutine = 不上抬。
|
||||
Declared urgency.Level
|
||||
}
|
||||
|
||||
// Urgency 让 SelfWakeRequest 满足 urgency.Declarer(与 SystemEvent 的
|
||||
// 载荷自带重要度并列,不新造第二条通道)。
|
||||
func (r SelfWakeRequest) Urgency() urgency.Level { return r.Declared }
|
||||
|
||||
var _ urgency.Declarer = SelfWakeRequest{}
|
||||
|
||||
// Trigger 描述唤醒一轮思考的原因:来源子系统、
|
||||
// 可读摘要与事件的估计重要度。
|
||||
type Trigger struct {
|
||||
@@ -90,19 +127,37 @@ func startupTrigger() Trigger {
|
||||
}
|
||||
|
||||
// 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 {
|
||||
// 随后**通用通道**(foldDeclared)统一解出重要度 —— 任何事件载荷只要实现
|
||||
// urgency.Declarer(IoT 的 DeviceUpdate 是第一个使用者),它声明的紧急度就被承认;
|
||||
// 泛化系统事件沿用它既有的 SystemEvent.Import 口径。两条形式最终都落在同一个
|
||||
// Trigger.Import 字段上,判定侧(decide.go)因此只认档位、不认生产者。
|
||||
// 每个事件都打上 TriggerEvent,因此其主动推送绕过心跳的 PushGate。
|
||||
func triggerForEvent(e bus.Event) Trigger { return foldDeclared(triggerForSubject(e), e.Payload) }
|
||||
|
||||
// foldDeclared 是「生产者声明的档位」叠到「主题级重要度」上的**唯一**折算点,
|
||||
// 也是 escalateImport 的唯一调用入口;触发者是谁(总线事件 / 她自己)不影响形状。
|
||||
// 自排请求经 selfWakeTrigger 走这里,因此两个声明点(工具参数与结论尾段)
|
||||
// 落在同一个 Trigger.Import 上、且都只上抬。
|
||||
func foldDeclared(tr Trigger, payload any) Trigger {
|
||||
if d, ok := payload.(urgency.Declarer); ok {
|
||||
tr.Import = escalateImport(tr.Import, d.Urgency())
|
||||
}
|
||||
return tr
|
||||
}
|
||||
|
||||
// selfWakeTrigger 把一次自我唤醒请求折算成 Trigger(与事件同一条链)。
|
||||
// 主题级默认是 ImportanceNormal(不是 Low):未声明档位时,安静时段与长期静默段
|
||||
// 照常扣下;Low 会自造出一档「比例行还低」的新语义,没有必要。
|
||||
func selfWakeTrigger(req SelfWakeRequest) Trigger {
|
||||
return foldDeclared(Trigger{
|
||||
Source: SelfWakeSource, Summary: selfWakeSummary(req.Reason),
|
||||
Import: ImportanceNormal, Kind: TriggerSelfWake,
|
||||
}, req)
|
||||
}
|
||||
|
||||
// selfWakeSummary 用稳定前缀承载她写的理由(前缀见 SelfWakeSummaryPrefix)。
|
||||
func selfWakeSummary(reason string) string { return SelfWakeSummaryPrefix + reason }
|
||||
|
||||
// triggerForSubject 给出各主题的可读摘要与主题级默认重要度(未声明紧急度的事件就
|
||||
// 停在这一档)。它刻意不对任何生产者做专有判定:重要度已由通用通道统一解出。
|
||||
func triggerForSubject(e bus.Event) Trigger {
|
||||
@@ -174,8 +229,11 @@ func urgencyForImportance(i Importance) urgency.Level {
|
||||
// 主题级默认(如提醒的 High)与安全域事件既得的档位不会被一句 routine 抹掉;
|
||||
// 未声明(零值 LevelRoutine)时原样返回 base,没标紧急度的事件行为逐字不变。
|
||||
//
|
||||
// 两个调用方共用它:总线事件的载荷声明(triggerForEvent),以及她自己在主动思考轮
|
||||
// 结论里声明「我认为这条紧急」(backthink.go 的 escalatedImport)。
|
||||
// 两条来源共用它:① foldDeclared —— 生产者声明的档位,它是唯一折算点,服务总线事件
|
||||
// (triggerForEvent)与她自排的一轮(selfWakeTrigger)两种触发;② backthink.go 的
|
||||
// escalatedImport —— 她自己在主动思考轮结论里声明「我认为这条紧急」。因此「工具参数
|
||||
// urgency」与「结论尾段 [紧急:…]」两个声明点落在同一个 Trigger.Import 上,
|
||||
// 该轮生效值取两者的较高档。
|
||||
func escalateImport(base Importance, declared urgency.Level) Importance {
|
||||
if declared == urgency.LevelRoutine {
|
||||
return base
|
||||
|
||||
Reference in new issue
Block a user