feat(flow): toolCalls 覆盖率追到全部编排回合(L3)—— 图带权威回合标识

- 新增 StartRoundWithTurnID(ctx, owner, text):从 ctx 取权威回合标识(与 chat_messages.turn_id
  同值);Run 的唯一生产建图入口切到它;原 StartRound 语义逐字不变(1 行包装)
- 归属桶(并行按路分图)保持不变;落盘查询键 lane_turn_id 对单路也有值 ⇒ 消息面按等值查得到图
- 无权威标识时**保持缺席**(不拿桶里的路标识顶上:不许臆造)
- 不需要迁移 0024(0023 的列+索引已在位;老单路行标识根本没存过,回填=编造)

形状变化(已登记契约):graph.id 对单路也追加 #{回合标识}(web-7 → web-7#turn-…),
顺带修掉「重启后单路轮次 upsert 掉旧行」的隐患。3 个变异自检(退回老入口/无视 ctx/臆造回退)。
This commit is contained in:
AskaEth committed 2026-10-06 14:12:25 +08:00
1 parent 6475eb875d
commit 4a937bd269
6 files changed
+353 -21

No files matched your search

+8 -4
View File
@@ -125,16 +125,20 @@ func TestFlowPublisher_RoundsShareRoundNumberButNeverID(t *testing.T) {
}
}
// TestFlowPublisher_SingleLegUnchanged 钉住**单路逐字不变**:归属桶就是会话 id,
// 图 id 仍是 `{会话}-{轮次}`(没有路后缀),帧上 `turnId` 键缺席。既有回归
// (flow_snapshot_test.go 的 web-1/web-2)与本条是同一口径的两侧。
// TestFlowPublisher_SingleLegUnchanged 钉住**老入口(无 ctx 通道)的单路逐字不变**:
// 归属桶就是会话 id,图 id 仍是 `{会话}-{轮次}`(没有后缀),帧上 `turnId` 键缺席。
// 既有回归(flow_snapshot_test.go 的 web-1/web-2)与本条是同一口径的两侧。
//
// 单路在**有 ctx 通道**时的形状(覆盖全部编排回合的那条路)见 flow_turnid_test.go:
// 那里 `turnId` 是**在场**的(权威回合标识),因为「单路没有权威标识」这件事本身
// 已经随 CODE-TC-2 消失 —— 本入口的缺席只说明**它没有 ctx 可读**。
func TestFlowPublisher_SingleLegUnchanged(t *testing.T) {
p := NewFlowPublisher(nil, func(string) bool { return true })
p.StartRound("web", "你好")
p.EndRound("web", "你也好")
g := p.LastGraph("web")
if g == nil || g.ID != "web-1" || g.TurnID != "" {
t.Fatalf("单路图 = %+v,want id=web-1 且无 turnId(逐字不变)", g)
t.Fatalf("单路图 = %+v,want id=web-1 且无 turnId(老入口逐字不变)", g)
}
}