优化: 弱模型治理收尾(AC-2探索预算:单轮上限+目录去重+禁绕行 + AC-5失败画像:合法目标回灌+相近锚点提示)

This commit is contained in:
lxy
2026-08-08 19:38:53 +08:00
parent 02c8d8e5ea
commit fe780c0084
8 changed files with 648 additions and 12 deletions
+14 -2
View File
@@ -35,6 +35,7 @@ use crate::task_state_machine::{can_transition, is_regression, is_valid_state, A
/// 3. 状态机(三类拒绝,错误区分供前端分辨):
/// - 同态拒绝(from==to):Validation「相同状态,无需推进」(非状态机违例,是空操作)
/// - 非法转换(跳态/终态后继等):InvalidState「非法状态转换 X→Y」(含 from/to 上下文)
/// - 两类拒绝均附 legal_targets(from) 合法目标列表,供 LLM 下次选对目标态(AC-5)
/// - can_transition 闸门矩阵判否即此分支
/// 4. 原子写:advance_status_atomic CAS,to 是退回转换时 bump_rounds=true
/// 5. CAS 失败(affected==0):状态已被并发改动 → InvalidState 错误(防 TOCTOU 静默成功)
@@ -63,15 +64,26 @@ pub async fn advance_task_atomic(
// 3. 状态机校验(三类拒绝,错误类型区分供前端分辨):
// - 同态(from==to):Validation「相同状态,无需推进」(空操作,非状态机违例)
// - 非法转换(跳态/终态无后继等):InvalidState「非法状态转换 X→Y」
// - 两类错误均附加 legal_targets(from) 合法目标列表(当前态→可去态),
// 让 LLM 下次直接选对目标态,降低状态机拒绝的往返次数(AC-5 机制降失败)。
let from = current.status.as_str();
let legal_hint = |from: &str| -> String {
let legal = crate::task_state_machine::legal_targets(from);
if legal.is_empty() {
format!("{from} 是终态, 无合法后继")
} else {
format!("{from} 的合法目标: {}", legal.join("/"))
}
};
if from == target_status {
return Err(df_types::error::Error::Validation(format!(
"相同状态 {from:?},无需推进"
"相同状态 {from:?},无需推进,{}",
legal_hint(from)
)));
}
if !can_transition(from, target_status) {
return Err(df_types::error::Error::InvalidState {
current: format!("{from}→{target_status}(非法状态转换)"),
current: format!("{from}→{target_status}(非法状态转换), {}", legal_hint(from)),
expected: target_status.to_string(),
});
}