fix(dispatcher): Branch else 兜底 + 选路留痕(T4.E)
- branchNode 识别 default/else 边:主选择(true/false 或边序)未命中任何下游时, 走显式 default 边而非悄悄落 END - trace 明确区分「走 default / 未匹配收口结束(END) / 正常选路」, 杜绝静默 fall-through 被误当 bug - compose 层原有 len(chosen)==0 → END 收口保留(无 default 时的安全兜底) - 3 断言单测:default 命中 / 条件真走 true / 无 default 未命中仍返回空 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -242,7 +242,7 @@ func (o *Orchestrator) branchNode(n dsl.Node, b *board, outs []dsl.Edge, byID ma
|
||||
cond := cstr(n.Config, "condition")
|
||||
res := evalCondition(cond, b)
|
||||
|
||||
var truthy, falsy []string
|
||||
var truthy, falsy, deflt []string
|
||||
labeled := false
|
||||
for _, e := range outs {
|
||||
switch e.SourceHandle {
|
||||
@@ -252,6 +252,8 @@ func (o *Orchestrator) branchNode(n dsl.Node, b *board, outs []dsl.Edge, byID ma
|
||||
case "false":
|
||||
falsy = append(falsy, e.Target)
|
||||
labeled = true
|
||||
case "default", "else": // 显式兜底边:主选择落空时走它
|
||||
deflt = append(deflt, e.Target)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -280,13 +282,28 @@ func (o *Orchestrator) branchNode(n dsl.Node, b *board, outs []dsl.Edge, byID ma
|
||||
}
|
||||
}
|
||||
|
||||
// else 兜底:主选择未命中任何下游时,走显式 default/else 边(若配了),避免悄悄落 END。
|
||||
usedDefault := false
|
||||
if len(chosen) == 0 && len(deflt) > 0 {
|
||||
chosen = deflt
|
||||
usedDefault = true
|
||||
}
|
||||
|
||||
names := make([]string, 0, len(chosen))
|
||||
for _, id := range chosen {
|
||||
names = append(names, labelOf(byID[id], id))
|
||||
}
|
||||
// 明确记录选路:走 default / 未匹配收口结束 / 正常选路,杜绝"静默落 END"被误当 bug。
|
||||
dest := "[" + strings.Join(names, ", ") + "]"
|
||||
switch {
|
||||
case usedDefault:
|
||||
dest = "default → " + dest
|
||||
case len(chosen) == 0:
|
||||
dest = "未匹配任何下游 → 收口结束(END)"
|
||||
}
|
||||
tr.info("branch:"+n.ID, "system", labelOf(n, "分支"),
|
||||
fmt.Sprintf("条件「%s」→ %v ⇒ 走 [%s](%s)",
|
||||
firstNonEmpty(cond, "(空=真)"), res, strings.Join(names, ", "), mode))
|
||||
fmt.Sprintf("条件「%s」→ %v ⇒ 走 %s(%s)",
|
||||
firstNonEmpty(cond, "(空=真)"), res, dest, mode))
|
||||
return chosen
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user