重构:终态判定不再为控制流留兜底分支

- turn_completion.rs 的 turn_terminal 两处 ShouldContinue 分支由 debug_assert + 回落账本终态 / host_dropped 改为 unreachable:控制流在返修循环与终态投影处已被过滤
- 同步收紧 turn_terminal 的文档说明,明确控制流不该也不能进入终态判定
This commit is contained in:
2026-10-03 14:47:28 +08:00
parent 84cbe9b1a6
commit 47da90ab84
@@ -71,8 +71,9 @@ impl TurnCompletion {
/// 阶段的账本读不出来时只有它可用。
///
/// 错误由 [`TurnError::classify`] 分成两层:`ShouldStop` 的载荷直接成失败终态;`ShouldContinue`
/// (返修 / 复核要求继续)说明这一轮还没结束,正常不该走到这里(调用方在写终态之前就拦下了),
/// 真漏进来也不伪造失败——落到账本给出的正常终态。
/// (返修 / 复核要求继续)说明这一轮还没结束,在产生 / 消费它的那一层就被消化,
/// `codex_app_server` 的终态投影也把它过滤成了 `None`。它不该、也不能进入终态判定:
/// 漏进来就是上游缺陷,直接 `unreachable!`,不落任何终态。
///
/// 载荷在这一个出口从 typed 错误投影([`TurnError::classify`]):脱敏与截断也在那一处完成,
/// Rust 侧没有第二个地方再拼它、也没有任何地方再解析它。
@@ -98,10 +99,10 @@ pub(crate) fn turn_terminal(
if let Some(error) = error {
match error.classify(history_root) {
TurnErrorClassified::ShouldStop(payload) => return TurnCompletion::Failed(payload),
// 控制流:这一轮还没结束。写终态是调用方的事,正常在调用方那一层就被拦下;这里显式
// 认账,不把"继续跑"重新压回静默失败。
// 控制流:这一轮还没结束,不该走到终态判定。上游的返修循环与 `direct_turn_terminal_write`
// 都已把它挡在外面;漏进来就是缺陷,直接炸出来,不落任何终态。
TurnErrorClassified::ShouldContinue { detail } => {
debug_assert!(false, "控制流错误不应进入终态判定:{detail}");
unreachable!("控制流错误不应进入终态判定:{detail}")
}
}
}
@@ -114,7 +115,9 @@ pub(crate) fn turn_terminal(
match error.classify(history_root) {
TurnErrorClassified::ShouldStop(payload) => TurnCompletion::Failed(payload),
// `Unclassified` 恒为真失败;这一臂写全只是把"分类层不允许静默"补齐。
TurnErrorClassified::ShouldContinue { .. } => TurnCompletion::host_dropped(),
TurnErrorClassified::ShouldContinue { .. } => {
unreachable!("Unclassified 只可能是回合失败,不该分类成控制流")
}
}
})
}