新增: 批次工作落地(推进链/评估闭环/事件总线/并发/加固) + 技术债清理 + 文档整理

后端:
- 工作流推进链(D-03):advance_task/状态机/闸门走 df-nodes Node trait,conditions 条件引擎扩展
- 想法评估闭环:启发式评分+对抗评估,df-ideas/scoring + df-storage/idea_eval_repo + idea 前端打通
- 全局事件数据总线:df-ai/context+context_helpers+augmentation 跨模块解耦
- AI planner/plan_hint/intent:aichat B 路线并行多轮基础
- patch_file 加固(TD-03/04):读改写整体锁防 lost update,expected_hash 合约闭环
- 压缩超时兜底(F-15 卡死根治)
- F-09 多会话并发:LlmConcurrency per-conv + streamingGuard 前端守护 + verify 脚本
- 知识注入 DRY/skills/audit 扩展

清理:
- aichat 技术债(误报 allow/死导入/过时注释 30 项)
- URGENT.md 删除(11 项加急全解决/迁 todo)
- 文档整理(todo/待决策/待审查/ARCHITECTURE/INDEX + 总线/技术债审查新文档)
This commit is contained in:
2026-06-21 20:51:26 +08:00
parent 330bb7f505
commit bd6a41fe6e
111 changed files with 11932 additions and 1034 deletions

View File

@@ -376,7 +376,9 @@ mod tests {
//
// workflow.rs 的 spawn 闭包回调依赖三段纯计算:
// 1. template_for(target) 选模板(已由 task_workflow_templates.rs 测试覆盖)
// 2. regression_target(target) 推失败退回态(workflow.rs 私有,此处镜像锁定契约)
// 2. regression_target(target) 推失败退回态(已收敛到 task_state_machine::regression_target
// pub 契约,workflow.rs 与本测试均从此导入,单一可信源;映射表由 task_state_machine
// 测试模块锁定)
// 3. advance_task_atomic(repo, tid, to) 落库(本模块核心,下方覆盖各回调 to)
//
// workflow.rs spawn 闭包集成测试需 mock AppState/AppHandle/EventBus,df-nodes crate
@@ -384,60 +386,23 @@ mod tests {
// 唯一未覆盖的是「闭包组装 + tracing」胶水代码(非业务逻辑)。
// ============================================================
/// 镜像 workflow.rs::regression_target(workflow.rs L44-54 私有函数)的失败退回映射。
///
/// 此处是契约镜像(非导入):若 workflow.rs 改映射而忘同步,这里会红,提醒两处一致。
/// 映射:testing→in_review / in_review→in_progress / in_progress→None / 其他→None。
///
/// 为什么 in_progress → None? 状态机禁止 in_progress→todo
/// (task_state_machine.rs backward_to_todo_rejected),失败退回 todo 会被
/// advance_task_atomic 的 InvalidState 拦截;改为 None 则回调跳过推进,
/// 留 in_progress 等人介入(决策 CR-13-O1-b)。
///
/// 为什么不 pub regression_target 复用? 它是 workflow.rs(app crate)的私有函数,
/// df-nodes 不依赖 app crate(单向依赖:app → df-nodes)。把退回映射当 df-nodes 的
/// 业务契约之一镜像锁定,符合「推进链业务逻辑落 df-nodes」(D-260616-03)定位。
fn regression_target(target: &str) -> Option<&'static str> {
match target {
"testing" => Some("in_review"),
"in_review" => Some("in_progress"),
// in_progress 失败不自动退回(状态机不允许→todo),留 in_progress 等人介入
"in_progress" => None,
_ => None,
}
}
/// 镜像 workflow.rs spawn 闭包的回调决策(completed→target / failed→regression_target)。
/// 抽出纯函数便于直接断言,与 workflow.rs L267-273 的 match 逻辑一一对应。
/// 抽出纯函数便于直接断言,与 workflow.rs 闭包内 match 逻辑一一对应。
///
/// regression_target 现已收敛为 df-nodes::task_state_machine::regression_target 的
/// pub 契约(单一可信源),此处直接复用,不再镜像副本(防 DRY 漂移)。
///
/// 返回 Option<String>(非 &str):completed 分支回传入的 target_status(非 'static),
/// failed 分支回 regression_target 的常量。统一 String 避免生命周期冲突。
/// failed 分支回 regression_target 的 &'static str 常量。统一 String 避免生命周期冲突。
fn callback_advance_target(status: &str, target_status: &str) -> Option<String> {
match status {
"completed" => Some(target_status.to_string()),
"failed" => regression_target(target_status).map(String::from),
"failed" => crate::task_state_machine::regression_target(target_status)
.map(String::from),
_ => None,
}
}
#[test]
fn regression_target_mapping_matches_contract() {
// 锁定 workflow.rs ②-4 失败退回映射表(逐项)。
assert_eq!(regression_target("testing"), Some("in_review"));
assert_eq!(regression_target("in_review"), Some("in_progress"));
// CR-13-O1-b: in_progress 失败不退回(状态机禁止→todo),留 in_progress 等人介入
assert_eq!(regression_target("in_progress"), None);
// done 是终态前向目标,失败无可退态(workflow.rs 注释:done→None)
assert_eq!(regression_target("done"), None);
// todo 是起点态无可退;blocked/cancelled 非推进链目标 → None
assert_eq!(regression_target("todo"), None);
assert_eq!(regression_target("blocked"), None);
assert_eq!(regression_target("cancelled"), None);
// 未知态防御性 → None
assert_eq!(regression_target("merged"), None);
assert_eq!(regression_target(""), None);
}
#[test]
fn callback_completed_advances_to_target() {
// ②-3:工作流 completed → 推进到 target_status(无论 target 是哪个)