收窄策划会话状态判断
Project CI / Frontend tests (pull_request) Failing after 3m14s
Project CI / Repository checks (pull_request) Failing after 4m18s
Project CI / Native shell tests (pull_request) Failing after 5m59s
Project CI / Backend tests (pull_request) Successful in 7m3s

移除 submit 与 replay 路径中不可达的 revision_requested 分支

简化 successor binding fingerprint 的 active child 校验

删除 receipt 收口后的冗余 recovery_required 检查
This commit is contained in:
2026-08-31 13:05:40 +00:00
parent a81520799a
commit 5bdccf1191
3 changed files with 3 additions and 23 deletions
@@ -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
}
@@ -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",
@@ -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 {