feat(events): 渠道事件桥接接线 + 组合根(design/26 E3+E4)
- E3:channelbridge/events.go 唯一插入点 recordEvent(两轴映射 Category→Tier、摘要恒过 SanitizeNoticeText、角色/账号只认白名单)+ Options.EventStore 注入 - 未接线 store=nil ⇒ 内存计数 + 首次 DEBUG,绝不中断入站(变异实测:改成直接调 Record ⇒ panic,测试红) - 普通聊天消息零副作用(变异:去掉 Applicable 早退 ⇒ rows=1 红) - T1 遥测只计数不落行(变异:心跳误判 T2 ⇒ 「逐条落行 1 行,want 0」红) - E4:wire_channel_events.go(启动期清扫 + 双 ticker + 退出 flush,逐字对齐 wire_document_gc 的三条取舍)、wire_channels 注入、main.go 加一行 startChannelEvents - internal/config/duration_env.go:新 env 键的读取口径(进程环境 > .env > 默认;「没写」与「写了空」都当没配;非法值回落 + 报错)——避免「只写在 .env 里被静默忽略」 - 三个新 env 键:CHANNEL_EVENT_RETENTION / GC_INTERVAL / COUNTER_FLUSH(模板同批更新,测试钉住键名一致) - 插入点比设计示意图晚一步(放 preEntryReview 之后,只归一化一次且 NoticeClass 已有结论),「留存无条件、在任何早退之前」这条性质不变
This commit is contained in:
1 parent
7aaf7731dc
commit
afe9afb1b5
12 files changed
+1689
-2
No files matched your search
@@ -144,6 +144,14 @@ func (b *Bridge) processFrom(ctx context.Context, msg adapter.UnifiedMessage, a
|
||||
// 事件只登记、绝不驱动 loop;被放行的事件已就地换成**剥离后的安全文本**,
|
||||
// 继续走常规流水线(限定注入 / 升级真会话)。
|
||||
notice := b.preEntryReview(ctx, &msg, a)
|
||||
// design/26 §4/§5(切片 E3):**渠道事件留存**的唯一插入点。
|
||||
//
|
||||
// 位置说明(与 §5.1 示意图的一行之差):preEntryReview **就是**那一步归一化
|
||||
// (它调用适配器的 SystemNoticeNormalizer 并净化 SafeText),把 recordEvent 放在
|
||||
// 它之后一行可以**只归一化一次**,并且 §9.2 第 2 条要求把 NoticeClass 的裁决结果
|
||||
// 记进日志 —— 那只有这一行之后才有结论。关键性质不变:留存**无条件**,在任何
|
||||
// 早退分支(仅登记 / 静默 / 升级)之前,且**绝不**决定 loop 走不走。
|
||||
b.recordEvent(ctx, msg, a, notice)
|
||||
if notice.Applicable && !notice.Proceed {
|
||||
b.registerNoticeOnly(ctx, msg, a, notice)
|
||||
return
|
||||
|
||||
Reference in new issue
Block a user