diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_approval.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_approval.rs index bd7fac003..5a8e66b50 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_approval.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_approval.rs @@ -2340,13 +2340,6 @@ pub(crate) fn plan_gdd_typed_completion_blocker_at_locked( ), )); } - if session.phase == "recovery_required" { - return Some(plan_gdd_completion_blocker( - "needs-reconciliation", - "planning session 仍处于 recovery_required,不能收束任务", - format!("gddVersion={}", latest.version), - )); - } None } diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_storage.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_storage.rs index 5fd0646c6..889d85f06 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_storage.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_storage.rs @@ -2408,8 +2408,7 @@ pub(crate) fn validate_plan_session_successor( && next.active_run_id.is_some() && next.last_run_id == next.active_run_id.clone().unwrap_or_default(); if next.run_profile_binding_fingerprint != previous.run_profile_binding_fingerprint - && (!active_run_changed - || !matches!(next.phase.as_str(), "collecting" | "revision_requested")) + && !active_run_changed { return Err(conflict( "session 只有在绑定新的 active planning child 时才能更换 Run Profile binding fingerprint", diff --git a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_submit.rs b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_submit.rs index cfac42abc..94953a186 100644 --- a/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_submit.rs +++ b/apps/ai-game-creator-shell/src-tauri/src/agent/runtime_protocol/planning_submit.rs @@ -1166,15 +1166,7 @@ fn validate_current_session_cas( "plan.submit_gdd 必须绑定当前活跃策划子 Run", )); } - // 这条 phase 判据实际只可能看到 `collecting`:上面的 activeRunId 判据要求 - // session 绑着当前策划子 run,而 schema 不变量禁止 `awaiting_user_input`、 - // `awaiting_gdd_approval`、`revision_requested`、`approved`、`rejected`、 - // `recovery_required` 保留 activeRunId(planning_storage.rs 的 - // 「session 进入审批/终态/recovery_required 后不得保留 activeRunId」)。 - // 因此 revise/reject 之后能不能重做,不由这条门决定,而由 M1C-2b 的 continuation - // 起点 writer 决定——它必须以新 activeRunId 写 revision+1 successor,phase 只能落回 - // `collecting`。这里保留 `revision_requested` 作为既有冗余,不再新增更多不可达分支。 - if !matches!(session.phase.as_str(), "collecting" | "revision_requested") { + if session.phase != "collecting" { return Err(submit_error( "PLAN_PENDING_GDD_EXISTS", "当前 planning session 仍有未决 GDD", @@ -1641,11 +1633,7 @@ fn project_submit_successors_locked( let source_session_matches_gdd = session_identity_matches_gdd && previous_session.session_revision == gdd.source_session_revision && previous_session.session_fingerprint == gdd.source_session_fingerprint - && previous_session.active_run_id.as_deref() == Some(gdd.created_by_run_id.as_str()) - && matches!( - previous_session.phase.as_str(), - "collecting" | "revision_requested" - ); + && previous_session.active_run_id.as_deref() == Some(gdd.created_by_run_id.as_str()); if !session_identity_matches_gdd { recovery_pending = true; } else if same_ref {