fix creation agent session sync and publish gate alignment
This commit is contained in:
@@ -0,0 +1,70 @@
|
||||
# 创作 Agent 发布门槛字段对齐修复
|
||||
|
||||
日期:`2026-04-23`
|
||||
|
||||
## 1. 问题现象
|
||||
|
||||
RPG 创作结果页已经能看到完整草稿内容,但页面底部仍然持续显示旧的发布阻断项,例如:
|
||||
|
||||
1. 缺少 `world hook`
|
||||
2. 缺少 `player premise`
|
||||
3. 缺少主线章节草稿
|
||||
4. 缺少主线第一幕
|
||||
|
||||
同时“发布并进入世界”按钮保持禁用,无法实际发布。
|
||||
|
||||
## 2. 根因
|
||||
|
||||
这不是单纯的前端提示未刷新,而是 Rust `publish gate` 仍在按旧 schema 校验 `draft_profile_json`。
|
||||
|
||||
当前前端结果页、自动保存和 session preview 主链的真实结构已经演进为:
|
||||
|
||||
1. 世界一句话与玩家切入信息优先存放在 `anchorContent` 与 `creatorIntent`
|
||||
2. 场景章节主链字段为 `sceneChapterBlueprints`
|
||||
3. `settingText` 也会承载世界总体一句话设定
|
||||
|
||||
但 `server-rs/crates/spacetime-module/src/custom_world/mod.rs` 中的 `summarize_publish_gate_from_json(...)` 仍只检查旧字段:
|
||||
|
||||
1. `worldHook`
|
||||
2. `playerPremise`
|
||||
3. `chapters`
|
||||
4. `sceneChapters`
|
||||
|
||||
结果导致:
|
||||
|
||||
1. 结果页展示的是新 preview
|
||||
2. 发布门槛检查读的是旧字段
|
||||
3. 同一个草稿在 UI 看起来“已经有内容”,但 gate 仍然误判为缺失
|
||||
|
||||
此外,正式发布编译在把 session draft 编译成发布 profile 时,也只把 `sceneChapters` 映射为 `sceneChapterBlueprints`,没有兼容当前更常见的 `sceneChapterBlueprints` 输入。
|
||||
|
||||
## 3. 修复策略
|
||||
|
||||
本轮统一把发布门槛与发布编译对齐到当前前端主链 schema:
|
||||
|
||||
1. `world hook` 检查同时兼容:
|
||||
- `worldHook`
|
||||
- `creatorIntent.worldHook`
|
||||
- `anchorContent.worldPromise.hook`
|
||||
- `settingText`
|
||||
2. `player premise` 检查同时兼容:
|
||||
- `playerPremise`
|
||||
- `creatorIntent.playerPremise`
|
||||
- `anchorContent.playerEntryPoint.openingIdentity`
|
||||
- `anchorContent.playerEntryPoint.openingProblem`
|
||||
- `anchorContent.playerEntryPoint.entryMotivation`
|
||||
3. 主线章节检查同时兼容:
|
||||
- `chapters`
|
||||
- `sceneChapterBlueprints`
|
||||
- `sceneChapters`
|
||||
4. 主线第一幕检查优先读取:
|
||||
- `sceneChapterBlueprints[*].acts`
|
||||
- `sceneChapters[*].acts`
|
||||
5. 发布编译时,`sceneChapterBlueprints` 与旧 `sceneChapters` 都能写入最终 profile。
|
||||
|
||||
## 4. 验收标准
|
||||
|
||||
1. 结果页已包含 `anchorContent / creatorIntent / sceneChapterBlueprints` 的草稿,不再被旧 blocker 误判。
|
||||
2. `publishReady` 会随当前 session 最新 preview 正确刷新。
|
||||
3. “发布并进入世界”在 blocker 清空后恢复可点击。
|
||||
4. 正式发布后的 compiled profile 仍保留 `sceneChapterBlueprints`。
|
||||
@@ -0,0 +1,45 @@
|
||||
# 创作 Agent Session 同步渲染环修复
|
||||
|
||||
日期:`2026-04-23`
|
||||
|
||||
## 1. 问题现象
|
||||
|
||||
本地联调时,前端在打开 RPG 创作 Agent 工作区后,会持续高频请求:
|
||||
|
||||
- `GET /api/runtime/custom-world/agent/sessions/:sessionId`
|
||||
|
||||
从 `api-server.log` 可以看到,同一个 `sessionId` 会在几毫秒到几十毫秒间隔内被重复读取很多次,明显高于正常 operation 轮询的 `1200ms` 周期。
|
||||
|
||||
## 2. 根因
|
||||
|
||||
这不是后端主动重试,也不是 session client 自带重试,而是前端 `useEffect` 被不稳定依赖反复触发。
|
||||
|
||||
触发链如下:
|
||||
|
||||
1. `PlatformEntryFlowShellImpl.tsx` 内部把 `enterCreateTab` 定义为:
|
||||
- 依赖整个 `platformBootstrap` 对象。
|
||||
2. `usePlatformEntryBootstrap()` 虽然内部的 `setPlatformTab` 是稳定回调,但返回值是一个新的对象字面量。
|
||||
3. 组件每次 render 时,`platformBootstrap` 引用都会变化,导致 `enterCreateTab` 也变成新的函数引用。
|
||||
4. `useRpgCreationSessionController.ts` 中“同步当前 Agent session 快照”的 `useEffect` 依赖了 `enterCreateTab`。
|
||||
5. 该 effect 每次重跑都会调用 `syncAgentSessionSnapshot(activeAgentSessionId)`,进而触发一次新的 `GET /agent/sessions/:sessionId`。
|
||||
6. `syncAgentSessionSnapshot(...)` 成功后会 `setAgentSession(...)`,又导致页面 render,从而形成新的 render -> 新 `enterCreateTab` -> effect 重跑 -> 再次 GET 的闭环。
|
||||
|
||||
因此,真正的根因是:
|
||||
|
||||
- `session 同步 effect` 被一个与业务无关、且每次 render 都变化的函数依赖错误地牵连进了渲染环。
|
||||
|
||||
## 3. 修复策略
|
||||
|
||||
本轮不改后端语义,只收紧前端依赖稳定性:
|
||||
|
||||
1. `PlatformEntryFlowShellImpl.tsx` 不再让 `enterCreateTab` 依赖整个 `platformBootstrap` 对象。
|
||||
2. 先解构稳定的 `setPlatformTab`,再用它生成 `enterCreateTab`。
|
||||
3. 保持 `useRpgCreationSessionController.ts` 现有 effect 逻辑不变,只让它接收到稳定的 `enterCreateTab` 引用。
|
||||
4. 增加前端回归测试,确保打开 RPG Agent 工作区后,session 快照不会因为 render 抖动而被重复拉取。
|
||||
|
||||
## 4. 验收标准
|
||||
|
||||
1. 打开 RPG 创作工作区后,允许出现首轮必要的 session 同步请求,但不能进入高频重复 GET。
|
||||
2. 未启动 operation 轮询时,不应出现毫秒级连续读取同一 `sessionId` 的现象。
|
||||
3. 存在 `activeAgentOperationId` 时,只保留原有 `1200ms` 轮询与完成态后的单次 session 刷新。
|
||||
4. 创作工作区、草稿结果页、作品详情等原有导航语义保持不变。
|
||||
@@ -8,6 +8,8 @@
|
||||
- [RUST_LOCAL_DEV_SPACETIMEDB_PUBLISH_GUARD_AND_AGENT_LLM_FAILURE_POLICY_2026-04-23.md](./RUST_LOCAL_DEV_SPACETIMEDB_PUBLISH_GUARD_AND_AGENT_LLM_FAILURE_POLICY_2026-04-23.md):冻结 Rust 本地联调启动前必须 publish/generate 最新 `spacetime-module` 的守卫,以及 Custom World Agent 在 LLM 失败时禁止写固定 assistant 回复的 finalize 与 HTTP/SSE 错误策略。
|
||||
- [CREATION_AGENT_CHAT_SCROLL_FOLLOW_POLICY_FIX_2026-04-23.md](./CREATION_AGENT_CHAT_SCROLL_FOLLOW_POLICY_FIX_2026-04-23.md):记录统一创作聊天工作区从“每次更新都强制滚到底”改为“仅在用户仍停留在底部附近时跟随”的滚动策略修复,避免流式回复持续抢走阅读位置。
|
||||
- [CREATION_AGENT_STREAMING_MESSAGE_STABILITY_FIX_2026-04-23.md](./CREATION_AGENT_STREAMING_MESSAGE_STABILITY_FIX_2026-04-23.md):记录创作 Agent 聊天流式文本、玩家乐观消息、最终 session 回写和草稿切换的展示稳定性修复,避免乱码、闪消、插队和旧草稿闪烁。
|
||||
- [CREATION_AGENT_SESSION_SYNC_RENDER_LOOP_FIX_2026-04-23.md](./CREATION_AGENT_SESSION_SYNC_RENDER_LOOP_FIX_2026-04-23.md):记录 RPG 创作 Agent 工作区打开后重复 `GET /agent/sessions/:sessionId` 的前端渲染环根因,以及通过稳定 `enterCreateTab` 依赖收紧 session 同步 effect 的修复口径。
|
||||
- [CREATION_AGENT_PUBLISH_GATE_SCHEMA_ALIGNMENT_FIX_2026-04-23.md](./CREATION_AGENT_PUBLISH_GATE_SCHEMA_ALIGNMENT_FIX_2026-04-23.md):记录发布阻断项仍按旧 `worldHook / playerPremise / sceneChapters` schema 校验的问题,以及将 Rust `publish gate` 对齐到 `anchorContent / creatorIntent / sceneChapterBlueprints` 当前主链结构的修复口径。
|
||||
- [CREATION_HUB_CARD_ACTIONS_2026-04-22.md](./CREATION_HUB_CARD_ACTIONS_2026-04-22.md):冻结创作中心作品卡“体验 / 删除”入口的最小落地语义,明确 RPG 已发布作品软删除、卡片直达运行时,以及暂不扩草稿 / 拼图删除契约。
|
||||
- [CREATION_CATEGORY_OPENING_TIMEOUT_GUARD_FIX_2026-04-22.md](./CREATION_CATEGORY_OPENING_TIMEOUT_GUARD_FIX_2026-04-22.md):记录创作中心点击类别后长时间停留在“正在开启”的根因与修复口径,收口前端创建会话启动超时、中文错误提示以及 Big Fish / 拼图代理上游超时兜底。
|
||||
- [JENKINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md](./JENKINS_RUST_BUILD_DEPLOY_PIPELINES_2026-04-23.md):冻结 Jenkins `构建 / 部署 / 构建并部署` 三条流水线的职责、版本号传递、上游触发门禁、本地目录部署脚本与 `/home/ubuntu/Genarrative-deploy/` 覆盖策略。
|
||||
|
||||
Reference in New Issue
Block a user