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
@@ -103,6 +103,12 @@ func (a *app) wireChannels() error {
|
||||
Meta: documents.MetadataWriterFor(a.dbPath, a.log),
|
||||
Log: a.log,
|
||||
},
|
||||
// EventStore 是渠道事件留存面(design/26 §4/§5;切片 E3+E4):非消息事件
|
||||
// (含未知类型与解析失败)由桥接层**无条件**写进它 —— T2/T3/unknown 逐条落行、
|
||||
// T1 只累加计数;「进不进上下文」另由传入前审查决定,两者互不决定。
|
||||
// 通道由 channelEventStore() 归一:未接线时交出**真 nil 接口**,桥接层据此走
|
||||
// 内存计数降级(绝不因为缺存储而中断入站)。
|
||||
EventStore: a.channelEventStore(),
|
||||
// 可选的复审模型在接近单适配器上限时剔除低价值排队消息
|
||||
// (design/12 §6 策略四)。适配器为 nil 时,闸门回落到 FIFO 驱逐。
|
||||
Review: reviewFor(a.modelAdapter, logger.WithSource(a.log, "services/channelbridge/review")),
|
||||
|
||||
Reference in new issue
Block a user