收口P4并关闭旧版策划入口
Project CI / Repository checks (pull_request) Has been cancelled
Project CI / Frontend tests (pull_request) Has been cancelled
Project CI / Backend tests (pull_request) Has been cancelled
Project CI / Native shell tests (pull_request) Has been cancelled

旧 project-supervisor-plan 来源统一返回退役错误

避免旧入口启动 Runtime 或 Provider

同步收口 P4 验收状态与最简 P5 方案

记录 V1 不迁移且历史文件只读保留
This commit is contained in:
2026-09-05 08:10:26 +00:00
parent ae700de1dd
commit 27246fbc5e
5 changed files with 29 additions and 11 deletions
@@ -112,6 +112,7 @@ pub(crate) const AGENT_RUNTIME_ISOLATED_JOIN_SOURCE: &str = "agent-isolated-join
pub(crate) const AGENT_RUNTIME_SUPERVISOR_GUI_SOURCE: &str = "project-supervisor-gui"; pub(crate) const AGENT_RUNTIME_SUPERVISOR_GUI_SOURCE: &str = "project-supervisor-gui";
pub(crate) const AGENT_RUNTIME_SUPERVISOR_CLI_SOURCE: &str = "project-supervisor-cli"; pub(crate) const AGENT_RUNTIME_SUPERVISOR_CLI_SOURCE: &str = "project-supervisor-cli";
pub(crate) const AGENT_RUNTIME_SUPERVISOR_PLAN_SOURCE: &str = "project-supervisor-plan"; pub(crate) const AGENT_RUNTIME_SUPERVISOR_PLAN_SOURCE: &str = "project-supervisor-plan";
pub(crate) const LEGACY_PLANNING_RETIRED_ERROR: &str = "旧版策划链路已退役,请重新创建 V2 策划会话";
pub(super) const AUTONOMOUS_GAME_BUILD_FIXED_TASK_GRAPH_STALLED_ERROR: &str = pub(super) const AUTONOMOUS_GAME_BUILD_FIXED_TASK_GRAPH_STALLED_ERROR: &str =
"自主构建任务图无法继续推进"; "自主构建任务图无法继续推进";
pub(crate) const AGENT_RUNTIME_PLAN_AUTONOMOUS_PROFILE_UNSUPPORTED_KIND: &str = pub(crate) const AGENT_RUNTIME_PLAN_AUTONOMOUS_PROFILE_UNSUPPORTED_KIND: &str =
@@ -234,6 +235,13 @@ pub(crate) fn agent_runtime_supervisor_source_is_plan(source: &str) -> bool {
source.trim() == AGENT_RUNTIME_SUPERVISOR_PLAN_SOURCE source.trim() == AGENT_RUNTIME_SUPERVISOR_PLAN_SOURCE
} }
pub(crate) fn reject_legacy_planning_source(source: &str) -> Result<(), String> {
if agent_runtime_supervisor_source_is_plan(source) {
return Err(LEGACY_PLANNING_RETIRED_ERROR.to_string());
}
Ok(())
}
pub(crate) fn reject_supervisor_plan_autonomous_profile( pub(crate) fn reject_supervisor_plan_autonomous_profile(
source: &str, source: &str,
run_profile: &str, run_profile: &str,
@@ -126,6 +126,7 @@ pub(crate) fn start_game_creator_supervisor_background_task_for_session_at(
if !agent_runtime_supervisor_source_is_trusted(source) { if !agent_runtime_supervisor_source_is_trusted(source) {
return Err("Project Supervisor 提交 source 不受信任".to_string()); return Err("Project Supervisor 提交 source 不受信任".to_string());
} }
reject_legacy_planning_source(source)?;
let run_profile = normalize_agent_runtime_run_profile(Some(run_profile))?; let run_profile = normalize_agent_runtime_run_profile(Some(run_profile))?;
reject_supervisor_plan_autonomous_profile(source, &run_profile)?; reject_supervisor_plan_autonomous_profile(source, &run_profile)?;
if agent_runtime_supervisor_source_is_plan(source) if agent_runtime_supervisor_source_is_plan(source)
@@ -1390,6 +1390,7 @@ pub(crate) fn start_game_creator_supervisor_runtime_task(
if !agent_runtime_supervisor_source_is_trusted(source) { if !agent_runtime_supervisor_source_is_trusted(source) {
return Err("Project Supervisor 提交 source 不受信任".to_string()); return Err("Project Supervisor 提交 source 不受信任".to_string());
} }
reject_legacy_planning_source(source)?;
reject_supervisor_plan_autonomous_profile(source, run_profile)?; reject_supervisor_plan_autonomous_profile(source, run_profile)?;
if agent_runtime_supervisor_source_is_plan(source) if agent_runtime_supervisor_source_is_plan(source)
&& !crate::config::game_creator_planning_capability_enabled()? && !crate::config::game_creator_planning_capability_enabled()?
@@ -8065,3 +8065,9 @@ CI 上 `background_agent_runtime_recovers_stale_running_before_pending_task` 在
- 前端以适配层复用现有聊天区、澄清输入卡、GDD 审批卡和阶段进度条;V2 hydrate 返回 `conversation` 消息,用于页面刷新和重启后恢复可见历史。 - 前端以适配层复用现有聊天区、澄清输入卡、GDD 审批卡和阶段进度条;V2 hydrate 返回 `conversation` 消息,用于页面刷新和重启后恢复可见历史。
- V2 会话使用独立 `planning-session-v2-stream` 事件,旧 Supervisor Runtime 轮询、专业 Agent 轮询和旧 Runtime 事件不会介入 V2 会话。 - V2 会话使用独立 `planning-session-v2-stream` 事件,旧 Supervisor Runtime 轮询、专业 Agent 轮询和旧 Runtime 事件不会介入 V2 会话。
- 没有 V2 authority 的项目仍按旧读取路径打开;旧链路封存、未完成旧会话强制失败和旧入口彻底关闭仍留在 P5。 - 没有 V2 authority 的项目仍按旧读取路径打开;旧链路封存、未完成旧会话强制失败和旧入口彻底关闭仍留在 P5。
## 2026-09-05 策划会话 Runtime V2 P4 收口
- Planning V2 的 P4 灰度与回归验收已通过人工校验:正常提问/回答/GDD/批准链路、GDD 修改后再次批准链路、Provider 失败恢复、非法输出失败边界、重启恢复、前端工作台展示以及编码/差异门禁均完成验证。
- P4 收口不代表旧链路退役;旧 `project-supervisor-plan` / `project-planning` 源码和入口仍保留,旧活跃会话封存、迟到结果隔离、旧入口关闭和只读历史展示统一留在后续 P5。
- P5 收缩为最小退役:旧 `project-supervisor-plan` caller 统一立即返回退役错误,不启动旧 Runtime/Provider;不扩展 V1 `PlanSessionV1` schema,不做旧数据迁移,旧文件继续保留只读,V2 只读取 `.agent/planning-v2`
@@ -1,7 +1,7 @@
# 策划会话 Runtime V2 接入与旧链路退役方案 # 策划会话 Runtime V2 接入与旧链路退役方案
- 日期:2026-09-03 - 日期:2026-09-03
- 状态:P0 合同冻结、P1 内核、P2 产物闭环P3 入口/UI 接入已完成;P4P5 待实施;本文是新生产实现的目标方案与阶段验收合同 - 状态:P0 合同冻结、P1 内核、P2 产物闭环P3 入口/UI 接入和 P4 灰度回归验收已完成;P5 待实施;本文是新生产实现的目标方案与阶段验收合同
- 适用范围:AGC 桌面 App 的“做方案”入口、策划会话、GDD 产物与审批 - 适用范围:AGC 桌面 App 的“做方案”入口、策划会话、GDD 产物与审批
> 本文规定新策划 Agent 的生产接入和旧链路退役方式。P3 开始修改正式 AGC 入口与工作台,但旧 `project-supervisor-plan` / `project-planning` 源码仍保留,直到 P5 完成退役;V2 切换时旧链路直接封存,所有未完成旧会话强制失败,旧 Fast GDD 文档之后只作为历史记录依据。 > 本文规定新策划 Agent 的生产接入和旧链路退役方式。P3 开始修改正式 AGC 入口与工作台,但旧 `project-supervisor-plan` / `project-planning` 源码仍保留,直到 P5 完成退役;V2 切换时旧链路直接封存,所有未完成旧会话强制失败,旧 Fast GDD 文档之后只作为历史记录依据。
@@ -735,11 +735,11 @@ hydrate_planning_session_v2
- 前端通过 V2 适配层复用现有聊天区、澄清卡、GDD 审批卡和阶段进度条;V2 Session 的 hydrate 结果额外携带 `conversation`,用于刷新/重启恢复历史消息。 - 前端通过 V2 适配层复用现有聊天区、澄清卡、GDD 审批卡和阶段进度条;V2 Session 的 hydrate 结果额外携带 `conversation`,用于刷新/重启恢复历史消息。
- 监听 `planning-session-v2-stream`,将 Provider 回合的增量投影到现有实时回复区域;旧 Runtime 轮询、专业 Agent 轮询和旧 Runtime 事件在 V2 策划会话中关闭。 - 监听 `planning-session-v2-stream`,将 Provider 回合的增量投影到现有实时回复区域;旧 Runtime 轮询、专业 Agent 轮询和旧 Runtime 事件在 V2 策划会话中关闭。
- 对已存在 V2 Session 的项目,打开项目时先 hydrate V2;没有 V2 authority 的旧项目继续走旧读取路径,避免误把旧项目数据当成 V2。 - 对已存在 V2 Session 的项目,打开项目时先 hydrate V2;没有 V2 authority 的旧项目继续走旧读取路径,避免误把旧项目数据当成 V2。
- P3 已完成;旧会话 `legacy_retired` 封存入口彻底关闭和真实 Provider/UI 全链路回归仍属于 P4/P5。 - P3 已完成;P4 的真实 Provider、前端工作台、失败恢复和安全门禁验收已通过。旧会话 `legacy_retired` 封存与旧入口彻底关闭仍属于 P5。
P3 之后的协议修正:V2 不再用正文 JSON 输出问询/GDDProvider 请求挂 `plan_ask_question` / `plan_submit_gdd``tool_choice=auto`,形状由工具 schema 承担。system prompt 只保留三项核心闭环等策略和当前问询进度;数量和字数由既有校验器在失败时回灌。`plan_submit_gdd` 的工具参数只包含决定和原型验证内容,不包含任何 Runtime 分配的 ID;Runtime 在落盘前为决定分配首项 `initial-request`、后续 `decision-{序号}`,并按 `prototype_pending` 顺序绑定原型验证项。入参不必回声 `schemaVersion`,落盘 GDD 仍写 `plan-gdd.v2`。失败结果不重复渲染,严格解析和失败不落盘成功产物的规则保持不变。历史 V2 数据不做兼容转换,按现有恢复/失败策略处理。 P3 之后的协议修正:V2 不再用正文 JSON 输出问询/GDDProvider 请求挂 `plan_ask_question` / `plan_submit_gdd``tool_choice=auto`,形状由工具 schema 承担。system prompt 只保留三项核心闭环等策略和当前问询进度;数量和字数由既有校验器在失败时回灌。`plan_submit_gdd` 的工具参数只包含决定和原型验证内容,不包含任何 Runtime 分配的 ID;Runtime 在落盘前为决定分配首项 `initial-request`、后续 `decision-{序号}`,并按 `prototype_pending` 顺序绑定原型验证项。入参不必回声 `schemaVersion`,落盘 GDD 仍写 `plan-gdd.v2`。失败结果不重复渲染,严格解析和失败不落盘成功产物的规则保持不变。历史 V2 数据不做兼容转换,按现有恢复/失败策略处理。
### P4:灰度、真实 Provider 与回归验收 ### P4:灰度、真实 Provider 与回归验收(已完成)
目标:证明 V2 的正常路径和关键失败路径可用,再关闭旧入口新建能力。 目标:证明 V2 的正常路径和关键失败路径可用,再关闭旧入口新建能力。
@@ -761,9 +761,11 @@ P3 之后的协议修正:V2 不再用正文 JSON 输出问询/GDDProvider
- 证实同一项目不存在两个活跃策划权威;旧活跃会话在切换后不可继续。 - 证实同一项目不存在两个活跃策划权威;旧活跃会话在切换后不可继续。
- 所有失败均保留可操作状态,不以成功文案掩盖 Provider/持久化错误。 - 所有失败均保留可操作状态,不以成功文案掩盖 Provider/持久化错误。
阶段结果:已完成人工灰度验收,包含正常提问/回答/GDD/批准链路、GDD 修改与再次批准链路、Provider 失败恢复、非法输出失败边界、重启恢复、前端展示和编码/差异门禁。P4 不包含旧链路退役;旧链路封存和入口关闭在 P5 执行。
依赖:P3。 依赖:P3。
### P5:旧链路退役 ### P5:旧链路退役(最简方案)
目标:停止新业务进入旧 Supervisor,并将所有未完成旧会话一次性封存为失败。 目标:停止新业务进入旧 Supervisor,并将所有未完成旧会话一次性封存为失败。
@@ -771,18 +773,18 @@ P3 之后的协议修正:V2 不再用正文 JSON 输出问询/GDDProvider
| ID | 任务 | 产出 | | ID | 任务 | 产出 |
| ---- | ---------------------------------------------------- | -------------------------------- | | ---- | ---------------------------------------------------- | -------------------------------- |
| P5-1 | 关闭新建和继续`project-supervisor-plan` 的 caller | 入口门禁/路由变更 | | P5-1 | 关闭旧 `project-supervisor-plan` 新建/继续入口 | 入口统一返回退役错误 |
| P5-2 | 执行旧 session 一次性封存 | `legacy-cutover.json` 与失败投影 | | P5-2 | 旧活跃会话自动失败 | 入口拒绝后不启动旧 Runtime/Provider |
| P5-3 | 保留旧产物只读展示,禁止旧交互继续推进 | 历史查看能力 | | P5-3 | 保留旧产物只读 | 不迁移、不修复、不删除旧文件 |
| P5-4 | 更新生产文档和运维说明 | 旧链路退役状态、回滚边界 | | P5-4 | 更新生产文档和最小回归测试 | 旧入口拒绝、V2 目录隔离 |
阶段验收: 阶段验收:
- 代码搜索和运行时审计均证明新“做方案”不再调用 `start_game_creator_supervisor_runtime_task` - 代码搜索和运行时审计均证明新“做方案”不再调用 `start_game_creator_supervisor_runtime_task`
- 新项目不会创建旧 Supervisor root、child Run、delivery 或 acceptance evidence。 - 新项目不会创建旧 Supervisor root、child Run、delivery 或 acceptance evidence。
- 已存在的旧活跃会话全部投影为 `legacy_retired` 失败;已终态旧产物仍可查看 - 旧入口或旧 continuation 若被直接调用,返回稳定的“旧链路已退役”错误,不启动旧 Runtime 或 Provider
-入口或旧 continuation 若被直接调用,返回稳定的“旧链路已退役”错误,不删除旧数据 -文件和已终态旧产物保持原样,继续只读查看;不引入旧 Session schema 迁移
- 切换前已在途的旧 Provider 迟到结果不会写入 GDD、审批或 `game/fast_gdd.md` - V2 hydrate 和审批只读取 `.agent/planning-v2`,不读取旧目录
- 做游戏 DirectProject 和其它现役 Agent Runtime 不受影响。 - 做游戏 DirectProject 和其它现役 Agent Runtime 不受影响。
依赖:P4 通过;确认切换窗口并完成一次性封存。 依赖:P4 通过;确认切换窗口并完成一次性封存。