fix(channel): 静默登记同源第三方标注 —— 无昵称非主人不再被读成主人

review p1:回帖路径已改用 thirdPartySenderName(非主人恒有标注:昵称 → actor
uid → 「未署名发送者」),但 registerSilenced 仍用 senderDisplayName,非主人
无昵称时写出空串;静默行会被 transcript 读回她的上下文,而受限会话里空标注就是
「主人本人」⇒ 在 senderName 可选且无兜底的渠道(webhook)上,一条没昵称的陌生人
消息被渲染成「[发言归属] 以下发言来自主人(管理员账户)本人」。

- light.go:270:senderDisplayName → thirdPartySenderName,与回帖路径同源。
  senderDisplayName 未成死代码:仍被 light.go:223(LightJudge 输入)、
  engage.go:284、flowgate.go:183 使用。
- 新增 TestSilencedNamelessMemberIsNotReadAsTheOwner:走真链路(静默登记 → 落库
  → 下一回合播种转录 → loop 归属渲染 → provider 请求),钉住「无昵称的非主人经
  静默登记后,读回上下文时不得出现主人标注」。修前必红(写入口径与模型侧两条
  断言同时报,含被读成主人的原样请求),修后绿。

验证:go build ./... / go vet ./... / go test -count=1 ./...(全树)全绿。
This commit is contained in:
AskaEth committed 2026-10-13 20:34:04 +08:00
1 parent 8ab241f627
commit 91e4dd2fe1
2 files changed
+75 -1

No files matched your search

+7 -1
View File
@@ -261,7 +261,13 @@ func (b *Bridge) registerSilenced(ctx context.Context, msg adapter.UnifiedMessag
// 绝不写一条指向不存在文件的引用,也绝不写一张没进过上下文的图片。
// turn_id 同样传 "":这条消息**根本不会被回答**,不存在「它属于哪一路回合」,
// 给它编一个标识就是把不属于任何回合的行说成有回合(见 turnid.go 的口径)。
b.persistIsolated(ctx, history.RoleUser, msg.Content, "", "", deviceIDFor(msg), sess, msg.Platform, senderDisplayName(msg, actor), adapterName(a), "")
//
// 发送者标注与回帖路径**同源**(thirdPartySenderName):非主人恒有标注
// (昵称 → actor uid → 「未署名发送者」),主人恒空。静默行会被读回她的
// 上下文(transcript.go),而受限会话里空标注就是「主人本人」——用
// senderDisplayName 会在无昵称时写出空串,把一条陌生人消息渲染成
// 「来自主人(管理员账户)本人」(review p1:本次修掉的 bug 的镜像)。
b.persistIsolated(ctx, history.RoleUser, msg.Content, "", "", deviceIDFor(msg), sess, msg.Platform, thirdPartySenderName(msg, actor), adapterName(a), "")
b.log.Debug("non-owner message silenced, registered only",
"platform", msg.Platform, "channel", msg.ChannelID, "session", sess.SessionID)
}