fix(loop): keep cross-batch voice success and gate speak without dispatcher (M57)
两处 review 必修(review-m57 r1): P2-1 跨批覆盖:applyBatchVoice 原先无条件用后一批的语音结论覆盖 前一批,于是「先成功合成 abc.wav、下一批换个参数再试却失败」会把 Result.Voice 退化成 tts_failed —— 音频已落盘,退回文本既无收益也 违背那次表达。改为守 captureVoice 的同一条优先级:已落盘的音频不被 后续批次的失败抹掉;先降级后成功仍然覆盖(后到的成功即最终语音)。 P2-2 nil-dispatcher 安全门:speak 由循环自己承载、无 dispatcher 也 能执行(invokeOne 短路),但 applyToolAdmissions 在 dispatcher 缺席 时整段跳过安全门,使「没配 dispatcher」成为绕过 design/11 §3 的 旁路。新增 applyDispatcherlessVoiceGate:与策略引擎对未登记工具的 口径一致(默认关闭、只有 owner 放行),拒绝走同一条 not_allowed 软结果与 tool.reject.not_allowed 审计通道;并改正该处过时注释。 两条回归测试都做过改前红/改后绿: - TestApplyBatchVoice_KeepsCrossBatchSuccess:注释掉守卫即报 「voice = ... FallbackReason:tts_failed, want abc.wav」 - TestApplyToolAdmissions_DispatcherlessSpeakGate:去掉 else 分支即报 「env group_member run = true, want false」 验收:go build ./... / go vet ./... / go test ./... 全绿。
This commit is contained in:
1 parent
c9da488749
commit
a0b4c941e4
5 files changed
+159
-4
No files matched your search
@@ -236,11 +236,19 @@ func classifyToolBatch(st *toolLoopState, calls []agent.ToolCall) ([]toolCallAct
|
||||
// 不被允许的调用绝不执行,以 not_allowed 软结果回灌并记录审计;
|
||||
// 它是该批的最终权威,后续钩子可以收紧但绝不重新放行。②
|
||||
// BatchAdmit 批次钩子(审计 / 政治审查)拦截整批。③ CallAdmit
|
||||
// 逐调用否决。dispatcher 缺席时安全门跳过(runToolCalls 已保证
|
||||
// 此时整批以错误回灌)。
|
||||
// 逐调用否决。
|
||||
//
|
||||
// dispatcher 缺席时安全门走不了(它需要 dispatcher 的策略引擎),
|
||||
// 其余工具由 runToolCalls 保证以「没有 dispatcher」错误回灌;但
|
||||
// speak 由循环自己承载、无 dispatcher 也能执行(见 invokeOne 的
|
||||
// 短路),因此这条退化配置下必须由 applyDispatcherlessVoiceGate
|
||||
// 补上同一道硬门 —— 否则「没配 dispatcher」就成了绕过 design/11 §3
|
||||
// 的旁路。
|
||||
func (l *Loop) applyToolAdmissions(ctx context.Context, d *tool.Dispatcher, calls []agent.ToolCall, actions []toolCallAction) {
|
||||
if d != nil {
|
||||
l.applyToolSecurityGate(ctx, d, calls, actions)
|
||||
} else {
|
||||
l.applyDispatcherlessVoiceGate(ctx, calls, actions)
|
||||
}
|
||||
if l.hooks.BatchAdmit != nil {
|
||||
if ok, reason := l.hooks.BatchAdmit(ctx, calls); !ok {
|
||||
|
||||
Reference in new issue
Block a user