docs: initialize rewrite plan and freeze backend surfaces

This commit is contained in:
2026-04-20 23:52:49 +08:00
parent adc57ba49b
commit 7c844854c0
13 changed files with 1633 additions and 0 deletions

View File

@@ -0,0 +1,151 @@
# SpacetimeDB + Axum + 阿里云 OSS 后端重写任务总纲
日期:`2026-04-20`
关联设计文档:
- [../docs/technical/SPACETIMEDB_AXUM_OSS_BACKEND_REWRITE_DESIGN_2026-04-20.md](../docs/technical/SPACETIMEDB_AXUM_OSS_BACKEND_REWRITE_DESIGN_2026-04-20.md)
- [../docs/technical/NODE_BACKEND_MODULE_AND_API_INDEX.md](../docs/technical/NODE_BACKEND_MODULE_AND_API_INDEX.md)
关联拆分任务:
- [01_M0_M2_FOUNDATION_AND_AUTH.md](./01_M0_M2_FOUNDATION_AND_AUTH.md)
- [02_M3_RUNTIME_PROFILE.md](./02_M3_RUNTIME_PROFILE.md)
- [03_M4_STORY_AND_GAMEPLAY.md](./03_M4_STORY_AND_GAMEPLAY.md)
- [04_M5_CUSTOM_WORLD_AND_AGENT.md](./04_M5_CUSTOM_WORLD_AND_AGENT.md)
- [05_M6_ASSETS_OSS_EDITOR.md](./05_M6_ASSETS_OSS_EDITOR.md)
- [06_M7_TEST_DEPLOY_CUTOVER.md](./06_M7_TEST_DEPLOY_CUTOVER.md)
- [07_CROSS_CUTTING_AND_ACCEPTANCE.md](./07_CROSS_CUTTING_AND_ACCEPTANCE.md)
## 0. 使用说明
这份总纲用于把控整体重写节奏,拆分文件用于落地执行。
执行原则:
1. 第一阶段优先兼容当前 `/api/*``/healthz``/generated-*` 访问习惯。
2. 不允许先删旧能力再补新能力,必须按能力面平移。
3. 以当前 Node 后端 `96` 条路由、`6` 个挂载面、`12` 个模块为最低覆盖基线。
4. 每个阶段完成后,都要形成可运行、可回归、可继续迭代的中间态。
## 1. 总体里程碑
- [ ] `M0`:冻结当前后端能力清单与迁移边界
- [ ] `M1`:搭建 Rust 工作区、Axum 主入口与基础中间件
- [ ] `M2`完成鉴权、会话、JWT、refresh cookie 主链迁移
- [ ] `M3`:完成 runtime snapshot / settings / profile 迁移
- [ ] `M4`:完成 story action 主循环与核心 gameplay reducer 迁移
- [ ] `M5`:完成 custom world / agent 主链迁移
- [ ] `M6`:完成 assets / OSS / editor 主链迁移
- [ ] `M7`:完成联调、回归、部署与切流准备
## 2. 阶段导航
### `M0 ~ M2`
重点:
1. 冻结能力清单
2. 搭建 Rust workspace
3. 搭建 Axum 基础设施
4. 迁移鉴权、会话、JWT、refresh cookie
详见:
- [01_M0_M2_FOUNDATION_AND_AUTH.md](./01_M0_M2_FOUNDATION_AND_AUTH.md)
### `M3`
重点:
1. 迁移 runtime snapshot
2. 迁移 settings
3. 迁移 profile dashboard / browse history / save archive
详见:
- [02_M3_RUNTIME_PROFILE.md](./02_M3_RUNTIME_PROFILE.md)
### `M4`
重点:
1. 迁移 story action 主循环
2. 迁移 gameplay reducer
3. 兼容当前 story view model 与 state 恢复接口
详见:
- [03_M4_STORY_AND_GAMEPLAY.md](./03_M4_STORY_AND_GAMEPLAY.md)
### `M5`
重点:
1. 迁移传统 custom world 问答流
2. 迁移 custom world library / gallery
3. 迁移 custom world agent 会话、消息、卡片、操作
详见:
- [04_M5_CUSTOM_WORLD_AND_AGENT.md](./04_M5_CUSTOM_WORLD_AND_AGENT.md)
### `M6`
重点:
1. 迁移 assets
2. 接入阿里云 OSS
3. 迁移 editor 读写能力
4. 做旧静态资源路径兼容
详见:
- [05_M6_ASSETS_OSS_EDITOR.md](./05_M6_ASSETS_OSS_EDITOR.md)
### `M7`
重点:
1. 联调
2. 回归
3. 部署
4. 观测
5. 灰度切流
详见:
- [06_M7_TEST_DEPLOY_CUTOVER.md](./06_M7_TEST_DEPLOY_CUTOVER.md)
## 3. 横向专项
以下专项贯穿整个迁移期:
1. contract 与前端兼容
2. SpacetimeDB schema 演进治理
3. 大对象与缓存治理
4. 文档持续维护
详见:
- [07_CROSS_CUTTING_AND_ACCEPTANCE.md](./07_CROSS_CUTTING_AND_ACCEPTANCE.md)
## 4. 第一优先级建议执行顺序
1. 先做 `M0`,冻结基线,避免迁移过程中口径漂移。
2. 再做 `M1 + M2`,先把 Axum 壳与鉴权打稳。
3. 再做 `M3`优先跑通快照、设置、profile。
4. 再做 `M4`,把 story action 主循环真正迁走。
5. 然后做 `M5`,迁 custom world 与 agent。
6. 最后做 `M6 + M7`,收口 assets、editor、部署与切流。
## 5. 最终验收清单
- [ ] 当前 `96` 条后端接口已全部迁移或有兼容替代
- [ ] 当前 `6` 个挂载面已全部迁移
- [ ] 当前 `12` 个内部模块已完成新架构落位
- [ ] Axum 已成为唯一 HTTP / SSE / 副作用边界
- [ ] SpacetimeDB 已成为唯一运行时状态真相源
- [ ] 阿里云 OSS 已成为唯一资产对象仓
- [ ] 前端主流程在不大改 UI 的前提下可跑通
- [ ] 能完成灰度切流,并保留可回退能力

View File

@@ -0,0 +1,152 @@
# M0 ~ M2基础设施与鉴权任务清单
## M0冻结能力与重写边界
### 能力冻结
- [x] 整理当前后端 6 个挂载面并锁定为重写验收基线
交付物:[M0_CAPABILITY_SURFACE_BASELINE_2026-04-20.md](./M0_CAPABILITY_SURFACE_BASELINE_2026-04-20.md)
- [ ] 整理当前后端 96 条路由并生成一份“旧接口 -> 新实现”映射表
- [ ] 整理当前 12 个内部模块并锁定迁移归属
- [ ] 整理当前所有 SSE 接口与事件格式
- [ ] 整理当前所有 `/generated-*` 静态资源前缀
- [ ] 整理当前前端直接依赖的响应头、envelope、错误格式
### 仓库边界
- [ ] 确认 Rust 后端新目录名与根目录落位方案
- [ ] 确认旧 `server-node/` 在迁移期继续保留,不提前删除
- [ ] 确认前端第一阶段仍然只访问 Axum不直连 SpacetimeDB
- [ ] 确认外部副作用统一收口在 Axum不放进 SpacetimeDB 模块
### 交付物
- [ ] 新增“接口映射表”文档
- [ ] 新增“模块迁移清单”文档
- [ ] 新增“阶段验收矩阵”文档
## M1Rust 工作区与 Axum 基础设施
### 工作区搭建
- [ ] 在根目录新增 `server-rs/`
- [ ] 创建 workspace `Cargo.toml`
- [ ] 创建 `crates/api-server`
- [ ] 创建 `crates/spacetime-module`
- [ ] 创建 `crates/application`
- [ ] 创建 `crates/domain`
- [ ] 创建 `crates/contracts`
- [ ] 创建 `crates/auth-service`
- [ ] 创建 `crates/oss-service`
- [ ] 创建 `crates/llm-service`
- [ ] 创建 `crates/spacetime-client`
- [ ] 创建 `crates/tests`
### Axum 基础能力
- [ ] 搭建 `main.rs` / `Router` / `with_state`
- [ ] 接入统一配置加载
- [ ] 接入统一日志与 tracing
- [ ] 接入 `request_id` 中间件
- [ ] 接入统一错误处理中间件
- [ ] 接入当前项目兼容的 response envelope
- [ ] 接入 `x-request-id`
- [ ] 接入 `x-api-version`
- [ ] 接入 `x-route-version`
- [ ] 接入 `x-response-time-ms`
- [ ] 实现 `/healthz`
### 基础工程脚本
- [ ] 新增本地开发脚本
- [ ] 新增测试脚本
- [ ] 新增 lint / fmt / clippy / check 脚本
- [ ] 新增 smoke 脚本
- [ ] 新增 SpacetimeDB 本地开发脚本
### 阶段验收
- [ ] Axum 服务可独立启动
- [ ] `/healthz` 返回与当前工程兼容
- [ ] 基础 response envelope 与 request id 行为稳定
- [ ] Rust workspace 能完整编译通过
## M2鉴权、会话、JWT 与 refresh cookie
### SpacetimeDB 身份表
- [ ] 设计 `user_account`
- [ ] 设计 `auth_identity`
- [ ] 设计 `refresh_session`
- [ ] 设计 `auth_audit_log`
- [ ] 设计 `auth_risk_block`
- [ ] 设计 `sms_auth_event`
- [ ] 设计 `wechat_auth_state`
### Axum 鉴权服务
- [ ] 实现密码登录
- [ ] 实现账号自动创建 / 幂等登录兼容策略
- [ ] 实现 Bearer JWT 校验
- [ ] 实现 refresh cookie 读取
- [ ] 实现 refresh token 轮换
- [ ] 实现会话吊销
- [ ] 实现全端登出
- [ ] 实现 `me` 查询
### 手机验证码登录
- [ ] 接入阿里云短信发送 adapter
- [ ] 实现发送验证码接口
- [ ] 实现验证码校验接口
- [ ] 实现手机号绑定
- [ ] 实现手机号换绑
- [ ] 实现发送频率限制
- [ ] 实现验证码失败次数限制
- [ ] 实现 captcha 触发逻辑
- [ ] 实现风控封禁与解除
### 微信登录
- [ ] 接入微信 OAuth adapter
- [ ] 实现 `wechat/start`
- [ ] 实现 `wechat/callback`
- [ ] 实现微信身份绑定
- [ ] 实现微信账号补绑手机号
- [ ] 实现桌面端 / 微信内打开场景区分
### OIDC 与 SpacetimeDB 身份透传
- [ ] 设计 JWT claims
- [ ] 确认 `iss/sub/sid/provider/roles` 字段
- [ ] 让 Axum 自身可校验 JWT
- [ ] 让 SpacetimeDB 可识别 Axum 签发的身份令牌
- [ ] 验证 reducer / view 可读取用户身份上下文
### 当前接口兼容
- [ ] 兼容 `/api/auth/login-options`
- [ ] 兼容 `/api/auth/entry`
- [ ] 兼容 `/api/auth/me`
- [ ] 兼容 `/api/auth/logout`
- [ ] 兼容 `/api/auth/logout-all`
- [ ] 兼容 `/api/auth/refresh`
- [ ] 兼容 `/api/auth/sessions`
- [ ] 兼容 `/api/auth/sessions/:sessionId/revoke`
- [ ] 兼容 `/api/auth/audit-logs`
- [ ] 兼容 `/api/auth/risk-blocks`
- [ ] 兼容 `/api/auth/risk-blocks/:scopeType/lift`
- [ ] 兼容 `/api/auth/phone/send-code`
- [ ] 兼容 `/api/auth/phone/login`
- [ ] 兼容 `/api/auth/phone/change`
- [ ] 兼容 `/api/auth/wechat/start`
- [ ] 兼容 `/api/auth/wechat/callback`
- [ ] 兼容 `/api/auth/wechat/bind-phone`
### 阶段验收
- [ ] 密码登录主链可用
- [ ] refresh cookie 主链可用
- [ ] 手机验证码主链可用
- [ ] 微信登录主链可用
- [ ] 所有旧鉴权接口可通过 contract 回归

View File

@@ -0,0 +1,50 @@
# M3runtime snapshot / settings / profile 任务清单
## 1. SpacetimeDB 运行时主表
- [ ] 设计 `runtime_snapshot`
- [ ] 设计 `runtime_setting`
- [ ] 设计 `profile_dashboard_state`
- [ ] 设计 `profile_wallet_ledger`
- [ ] 设计 `profile_played_world`
- [ ] 设计 `profile_save_archive`
- [ ] 设计 `user_browse_history`
## 2. 兼容快照策略
- [ ] 设计“领域表真相 + 兼容聚合快照”策略
- [ ] 设计 snapshot projection 刷新机制
- [ ] 迁移当前 snapshot hydration / normalize 规则
- [ ] 迁移当前 save archive 聚合逻辑
- [ ] 迁移当前 browse history 去重与排序逻辑
## 3. Axum facade
- [ ] 兼容 `GET /api/runtime/save/snapshot`
- [ ] 兼容 `PUT /api/runtime/save/snapshot`
- [ ] 兼容 `DELETE /api/runtime/save/snapshot`
- [ ] 兼容 `GET /api/runtime/settings`
- [ ] 兼容 `PUT /api/runtime/settings`
- [ ] 兼容 `GET /api/runtime/profile/dashboard`
- [ ] 兼容 `GET /api/profile/dashboard`
- [ ] 兼容 `GET /api/runtime/profile/wallet-ledger`
- [ ] 兼容 `GET /api/profile/wallet-ledger`
- [ ] 兼容 `GET /api/runtime/profile/play-stats`
- [ ] 兼容 `GET /api/profile/play-stats`
- [ ] 兼容 `GET /api/runtime/profile/save-archives`
- [ ] 兼容 `GET /api/profile/save-archives`
- [ ] 兼容 `POST /api/runtime/profile/save-archives/:worldKey`
- [ ] 兼容 `POST /api/profile/save-archives/:worldKey`
- [ ] 兼容 `GET /api/runtime/profile/browse-history`
- [ ] 兼容 `POST /api/runtime/profile/browse-history`
- [ ] 兼容 `DELETE /api/runtime/profile/browse-history`
- [ ] 兼容 `GET /api/profile/browse-history`
- [ ] 兼容 `POST /api/profile/browse-history`
- [ ] 兼容 `DELETE /api/profile/browse-history`
## 4. 阶段验收
- [ ] 登录用户可正常保存、读取、删除存档
- [ ] 兼容路径与主路径返回一致
- [ ] profile dashboard / browse history / save archive 行为一致
- [ ] 前端当前恢复流程可在不改 UI 的前提下跑通

View File

@@ -0,0 +1,59 @@
# M4story action 与 gameplay reducer 任务清单
## 1. SpacetimeDB gameplay 表
- [ ] 设计 `story_session`
- [ ] 设计 `story_event`
- [ ] 设计 `npc_state`
- [ ] 设计 `quest_record`
- [ ] 设计 `inventory_slot`
- [ ] 设计 `treasure_record`
- [ ] 设计 `battle_state`
- [ ] 设计 `player_progression`
- [ ] 设计 `chapter_progression`
## 2. 核心 reducer
- [ ] 设计 `resolve_story_action`
- [ ] 设计 `continue_story`
- [ ] 设计 `begin_story_session`
- [ ] 设计 `sync_runtime_snapshot_projection`
- [ ] 设计 `apply_quest_signal`
- [ ] 设计 `apply_inventory_mutation`
- [ ] 设计 `resolve_npc_interaction`
- [ ] 设计 `resolve_treasure_interaction`
- [ ] 设计 `resolve_combat_action`
- [ ] 设计 `update_progression_state`
## 3. 迁移模块规则
- [ ] 迁移 `story`
- [ ] 迁移 `combat`
- [ ] 迁移 `inventory`
- [ ] 迁移 `npc`
- [ ] 迁移 `progression`
- [ ] 迁移 `quest`
- [ ] 迁移 `runtime-item`
- [ ] 迁移 `runtime` 的状态归一化规则
## 4. 兼容接口
- [ ] 兼容 `POST /api/runtime/story/actions/resolve`
- [ ] 兼容 `GET /api/runtime/story/state/:sessionId`
- [ ] 兼容 `POST /api/runtime/story/initial`
- [ ] 兼容 `POST /api/runtime/story/continue`
## 5. ViewModel 兼容
- [ ] 兼容当前 `RuntimeStoryActionResponse`
- [ ] 兼容当前 `RuntimeStoryOptionView`
- [ ] 兼容当前 `interaction` 元数据
- [ ] 兼容当前 battle / toast / patch 响应结构
- [ ] 兼容当前 `currentStory` 回填逻辑
## 6. 阶段验收
- [ ] 当前前端 story 选项点击后可走新后端闭环
- [ ] NPC / quest / treasure / combat 主循环行为不回退
- [ ] `story state` 恢复链可用
- [ ] 旧 Node 版 story route 回归用例完成平移

View File

@@ -0,0 +1,80 @@
# M5custom world / gallery / agent 任务清单
## 1. SpacetimeDB custom world 表
- [ ] 设计 `custom_world_profile`
- [ ] 设计 `custom_world_session`
- [ ] 设计 `custom_world_agent_session`
- [ ] 设计 `custom_world_agent_message`
- [ ] 设计 `custom_world_agent_operation`
- [ ] 设计 `custom_world_draft_card`
- [ ] 设计 `custom_world_asset_link`
- [ ] 设计 `custom_world_gallery_entry`
## 2. 传统 custom world 问答流
- [ ] 迁移 `create session`
- [ ] 迁移 `answer question`
- [ ] 迁移 `generate stream`
- [ ] 迁移 profile compile
- [ ] 迁移 library 存储与删除
- [ ] 迁移 publish / unpublish
- [ ] 迁移 gallery 列表与详情
## 3. custom world agent 主链
- [ ] 迁移 session create
- [ ] 迁移 session snapshot
- [ ] 迁移 message submit
- [ ] 迁移 message stream
- [ ] 迁移 operation query
- [ ] 迁移 card detail
- [ ] 迁移 card update
- [ ] 迁移 draft foundation
- [ ] 迁移 entity generation
- [ ] 迁移 role asset sync
## 4. Axum 编排层
- [ ] 接入 LLM 编排
- [ ] 接入世界草稿编译
- [ ] 接入角色 / 地点 / 场景 NPC 生成
- [ ] 接入封面图生成
- [ ] 接入场景图生成
- [ ] 接入 OSS 对象写入与绑定
- [ ] 接入 SSE 事件分发
## 5. 兼容接口
- [ ] 兼容 `/api/runtime/custom-world/sessions`
- [ ] 兼容 `/api/runtime/custom-world/sessions/:sessionId`
- [ ] 兼容 `/api/runtime/custom-world/sessions/:sessionId/answers`
- [ ] 兼容 `/api/runtime/custom-world/sessions/:sessionId/generate/stream`
- [ ] 兼容 `/api/runtime/custom-world-library`
- [ ] 兼容 `/api/runtime/custom-world-library/:profileId`
- [ ] 兼容 `/api/runtime/custom-world-library/:profileId/publish`
- [ ] 兼容 `/api/runtime/custom-world-library/:profileId/unpublish`
- [ ] 兼容 `/api/runtime/custom-world-gallery`
- [ ] 兼容 `/api/runtime/custom-world-gallery/:ownerUserId/:profileId`
- [ ] 兼容 `/api/runtime/custom-world/works`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions/:sessionId`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions/:sessionId/messages`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions/:sessionId/messages/stream`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions/:sessionId/actions`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions/:sessionId/operations/:operationId`
- [ ] 兼容 `/api/runtime/custom-world/agent/sessions/:sessionId/cards/:cardId`
- [ ] 兼容 `/api/custom-world/entity`
- [ ] 兼容 `/api/runtime/custom-world/entity`
- [ ] 兼容 `/api/custom-world/scene-npc`
- [ ] 兼容 `/api/runtime/custom-world/scene-npc`
- [ ] 兼容 `/api/custom-world/scene-image`
- [ ] 兼容 `/api/custom-world/cover-image`
- [ ] 兼容 `/api/custom-world/cover-upload`
## 6. 阶段验收
- [ ] 传统 custom world 主链可用
- [ ] custom world library / gallery 主链可用
- [ ] custom world agent 主链可用
- [ ] agent 会话、消息、卡片、操作不再依赖单大 JSON 会话体

View File

@@ -0,0 +1,84 @@
# M6assets / 阿里云 OSS / editor 任务清单
## 1. OSS 基础设施
- [ ] 创建 OSS bucket 方案
- [ ] 设计对象键前缀
- [ ] 设计 `object_key -> cdn_url` 解析策略
- [ ] 设计 public / private 对象访问策略
- [ ] 设计签名 URL 输出策略
- [ ] 设计 `x-oss-meta-*` 元数据规范
- [ ] 设计内容 hash / 版本字段规范
## 2. 上传与对象确认
- [ ] 实现浏览器 `PostObject` 直传签名接口
- [ ] 实现 STS 临时授权接口
- [ ] 实现服务端上传 helper
- [ ] 实现上传完成后的对象确认接口
- [ ] 实现对象绑定业务实体 reducer
## 3. 资产任务系统
- [ ] 设计 `asset_job`
- [ ] 设计 `asset_object`
- [ ] 设计 `asset_manifest`
- [ ] 设计 `character_visual_asset`
- [ ] 设计 `character_animation_asset`
- [ ] 设计 `scene_image_asset`
- [ ] 设计 `sprite_sheet_asset`
## 4. 资产生成链路
- [ ] 迁移角色主形象生成
- [ ] 迁移角色动作生成
- [ ] 迁移动作模板查询
- [ ] 迁移视频导入
- [ ] 迁移工作流缓存
- [ ] 迁移 Qwen 主图生成
- [ ] 迁移 Qwen 整表生成
- [ ] 迁移 Qwen 修帧
- [ ] 迁移 Qwen 保存
- [ ] 迁移场景图生成
- [ ] 迁移封面图上传
## 5. 编辑器能力
- [ ] 迁移编辑器 JSON 读取
- [ ] 迁移编辑器 JSON 保存
- [ ] 迁移图标目录枚举
- [ ] 开发态保留本地文件适配
- [ ] 线上态评估对象化替代方案
## 6. 路径兼容
- [ ] 兼容 `/generated-character-drafts/*`
- [ ] 兼容 `/generated-characters/*`
- [ ] 兼容 `/generated-custom-world-scenes/*`
- [ ] 兼容 `/generated-qwen-sprites/*`
## 7. 兼容接口
- [ ] 兼容 `/api/assets/character-visual/generate`
- [ ] 兼容 `/api/assets/character-visual/jobs/:taskId`
- [ ] 兼容 `/api/assets/character-visual/publish`
- [ ] 兼容 `/api/assets/character-animation/generate`
- [ ] 兼容 `/api/assets/character-animation/jobs/:taskId`
- [ ] 兼容 `/api/assets/character-animation/publish`
- [ ] 兼容 `/api/assets/character-animation/import-video`
- [ ] 兼容 `/api/assets/character-animation/templates`
- [ ] 兼容 `/api/assets/character-workflow-cache`
- [ ] 兼容 `/api/assets/character-workflow-cache/:characterId`
- [ ] 兼容 `/api/assets/qwen-sprite/master`
- [ ] 兼容 `/api/assets/qwen-sprite/sheet`
- [ ] 兼容 `/api/assets/qwen-sprite/frame-repair`
- [ ] 兼容 `/api/assets/qwen-sprite/save`
- [ ] 兼容 `/api/editor/catalog/items`
- [ ] 兼容 `/api/editor/json/:resourceId`
## 8. 阶段验收
- [ ] 所有新生成资产都写入 OSS
- [ ] 前端仍能通过旧路径习惯访问资源
- [ ] 资产任务状态可查询
- [ ] 编辑器主链不依赖旧 Node 后端

View File

@@ -0,0 +1,46 @@
# M7联调、回归、部署与切流任务清单
## 1. 测试体系
- [ ] 为 Axum handler 补接口测试
- [ ] 为 SpacetimeDB reducer 补规则测试
- [ ] 为 view / projection 补数据一致性测试
- [ ] 为 auth 主链补集成测试
- [ ] 为 runtime snapshot 主链补集成测试
- [ ] 为 story action 主链补集成测试
- [ ] 为 custom world / agent 主链补集成测试
- [ ] 为 assets / OSS 主链补集成测试
- [ ] 为兼容 contract 补回归测试
## 2. 部署准备
- [ ] 设计 Axum 部署方式
- [ ] 设计 SpacetimeDB 发布方式
- [ ] 设计 OSS bucket / CDN / 域名方案
- [ ] 设计环境变量清单
- [ ] 设计灰度环境
- [ ] 设计数据迁移脚本
- [ ] 设计回滚策略
## 3. 观测能力
- [ ] 接入 tracing / request id / structured logs
- [ ] 接入慢请求追踪
- [ ] 接入上游 LLM / OSS / 短信 / 微信失败日志
- [ ] 接入关键 reducer 执行日志
- [ ] 接入资产任务状态日志
## 4. 切流准备
- [ ] 准备旧 Node 与新 Rust 双跑窗口
- [ ] 准备 API 对比脚本
- [ ] 准备主流程 smoke 清单
- [ ] 准备前端切换开关
- [ ] 准备回退开关
## 5. 阶段验收
- [ ] 全链路 smoke 通过
- [ ] 主流程回归通过
- [ ] 关键 SSE 接口联调通过
- [ ] 可在灰度环境完成切流

View File

@@ -0,0 +1,51 @@
# 横向专项、执行顺序与最终验收
## 1. 横向专项任务
### Contract 与前端兼容
- [ ] 梳理当前 `packages/shared/src/contracts/*` 到 Rust DTO 的映射
- [ ] 设计 Rust 侧 contract 生成或手写策略
- [ ] 保持当前字段名、枚举值、响应结构稳定
- [ ] 为 breaking change 建立显式变更流程
### SpacetimeDB schema 演进治理
- [ ] 约定 stable reducer 命名规则
- [ ] 约定 stable table 命名规则
- [ ] 约定列追加式演进规则
- [ ] 约定软删除而不是直接删表删列的场景
- [ ] 约定事件表与投影表拆分规则
### 大对象与缓存治理
- [ ] 明确哪些内容入 OSS
- [ ] 明确哪些内容只存 SpacetimeDB 元数据
- [ ] 明确哪些内容允许短期本地缓存
- [ ] 明确 workflow cache 生命周期
### 文档维护
- [ ] 每个阶段完成后同步更新设计文档
- [ ] 每个阶段完成后补一份落地记录
- [ ] 完成接口迁移后更新新的模块与 API 索引文档
## 2. 第一优先级建议执行顺序
1. 先做 `M0`,冻结基线,避免迁移过程中口径漂移。
2. 再做 `M1 + M2`,先把 Axum 壳与鉴权打稳。
3. 再做 `M3`优先跑通快照、设置、profile。
4. 再做 `M4`,把 story action 主循环真正迁走。
5. 然后做 `M5`,迁 custom world 与 agent。
6. 最后做 `M6 + M7`,收口 assets、editor、部署与切流。
## 3. 最终验收清单
- [ ] 当前 `96` 条后端接口已全部迁移或有兼容替代
- [ ] 当前 `6` 个挂载面已全部迁移
- [ ] 当前 `12` 个内部模块已完成新架构落位
- [ ] Axum 已成为唯一 HTTP / SSE / 副作用边界
- [ ] SpacetimeDB 已成为唯一运行时状态真相源
- [ ] 阿里云 OSS 已成为唯一资产对象仓
- [ ] 前端主流程在不大改 UI 的前提下可跑通
- [ ] 能完成灰度切流,并保留可回退能力

View File

@@ -0,0 +1,179 @@
# M0后端挂载面冻结基线
日期:`2026-04-20`
依据来源:
- [../docs/technical/NODE_BACKEND_MODULE_AND_API_INDEX.md](../docs/technical/NODE_BACKEND_MODULE_AND_API_INDEX.md)
- [../server-node/manifests/backend-capability-index.json](../server-node/manifests/backend-capability-index.json)
## 1. 文档目的
这份文档用于完成 `M0` 的第一条任务:
- 整理当前后端 `6` 个挂载面并锁定为重写验收基线
这里的“冻结”不是要求新后端永远维持原实现,而是要求:
1. 新后端第一阶段必须完整覆盖这 `6` 个挂载面。
2. 每个挂载面的入口职责、路径空间、权限模式、主要边界不能丢。
3. 允许内部实现从 `Express + PostgreSQL + 本地 public/generated-*` 重写为 `Axum + SpacetimeDB + 阿里云 OSS`,但不允许把挂载面职责打散到无法对照验收。
## 2. 冻结结论
当前 Node 后端的正式挂载面固定为以下 `6` 个:
| 挂载面 ID | 中文名称 | 当前路由数 | 当前入口 | 必须保留的顶层路径 |
| --- | --- | --- | --- | --- |
| `assets` | 资产生成工具面 | `14` | `server-node/src/app.ts -> /api/assets` | `/api/assets/*` |
| `auth` | 鉴权与会话面 | `17` | `server-node/src/app.ts -> /api/auth` | `/api/auth/*` |
| `editor` | 编辑器工具面 | `3` | `server-node/src/app.ts -> /api/editor` | `/api/editor/*` |
| `health` | 基础健康检查 | `1` | `server-node/src/app.ts -> /healthz` | `/healthz` |
| `runtime-main` | 运行时主能力面 | `59` | `server-node/src/app.ts -> /api` | `/api/runtime/*``/api/profile/*``/api/custom-world/*``/api/llm/*``/api/ws/*` |
| `runtime-story-action` | 运行时 Story Action 面 | `2` | `server-node/src/app.ts -> /api/runtime/story` | `/api/runtime/story/*` |
冻结总数:
1. 对外挂载面:`6`
2. 已登记路由:`96`
3. 公开接口:`10`
4. JWT 接口:`69`
5. 开关控制接口:`17`
6. 流式接口:`6`
## 3. 各挂载面冻结要求
### 3.1 `assets`
当前定位:
1. 角色主形象生成
2. 角色动作生成
3. Qwen 精灵表生成与保存
4. 工作流缓存
5. 产物发布到 `public/generated-*`
重写后的冻结要求:
1. 仍保留独立的 `/api/assets/*` 命名空间。
2. 仍保留“生成任务、任务状态查询、发布/保存”三类操作语义。
3. 当前基于本地 `public/generated-*` 的产物落地,可改为 `OSS + 元数据表`,但前端一阶段必须继续通过原有路径习惯访问资源。
4. 当前 `ASSETS_API_ENABLED` 门禁能力必须保留。
### 3.2 `auth`
当前定位:
1. 本地账号登录
2. 手机验证码登录
3. 微信登录
4. refresh session
5. 会话吊销
6. 审计与风控
重写后的冻结要求:
1. 仍保留独立的 `/api/auth/*` 命名空间。
2. 仍保留当前 `JWT + refresh cookie` 双令牌模型。
3. 仍保留 `password / phone / wechat` 三类登录能力面。
4. 仍保留审计日志、风控封禁、会话列表与会话吊销能力。
### 3.3 `editor`
当前定位:
1. 编辑器 JSON 读取
2. 编辑器 JSON 回写
3. 图标目录枚举
重写后的冻结要求:
1. 仍保留独立的 `/api/editor/*` 命名空间。
2. 仍保留 `EDITOR_API_ENABLED` 开关门禁。
3. 开发态允许继续对本地工作区做读写适配,生产态可重构为对象化资源方案,但接口职责不能消失。
### 3.4 `health`
当前定位:
1. 提供后端进程健康探针
2. 为代理层与 smoke 提供最小可用确认
重写后的冻结要求:
1. 仍保留 `/healthz`
2. 仍返回简单、无鉴权、无数据库强耦合的健康状态。
3. 仍可作为 smoke 与部署探针的第一检查点。
### 3.5 `runtime-main`
当前定位:
1. 运行时存档、设置、个人档案
2. 聊天、剧情、任务、运行时物品意图
3. custom world library / gallery / sessions
4. custom world agent 会话、消息、操作
重写后的冻结要求:
1. 仍保留运行时主入口作为最大能力面,不把这些能力拆散到前端无法感知的新命名空间。
2. 仍兼容当前:
- `/api/runtime/*`
- `/api/profile/*`
- `/api/custom-world/*`
- `/api/llm/*`
- `/api/ws/*`
3. 除公开画廊与少量公开接口外,仍以登录态为默认访问前提。
4. 当前大量业务逻辑虽然会迁到 `SpacetimeDB reducer/view + Axum facade`,但对前端看起来仍应是一个统一运行时能力面。
### 3.6 `runtime-story-action`
当前定位:
1. story choice 动作解析
2. story session 状态恢复
重写后的冻结要求:
1. 仍保留 `/api/runtime/story/*` 作为独立挂载面。
2. 仍保持“前端动作输入 -> 后端统一结算 -> 返回新状态”的接口职责。
3. 当前 `storyActionService` 里跨 `quest / inventory / runtime-item / npc / progression / combat / runtime` 的协作,迁移后必须继续存在,只是实现位置改到 `SpacetimeDB + Axum`
## 4. 挂载面与新架构映射
| 当前挂载面 | 新架构主归属 | 说明 |
| --- | --- | --- |
| `assets` | `Axum + OSS + SpacetimeDB asset metadata` | 外部副作用在 Axum二进制在 OSS任务与引用状态在 SpacetimeDB。 |
| `auth` | `Axum auth-service + SpacetimeDB auth tables` | 登录副作用与 cookie/JWT 在 Axum身份与会话状态在 SpacetimeDB。 |
| `editor` | `Axum editor facade` | 开发态保留本地文件适配,后续再逐步对象化。 |
| `health` | `Axum health route` | 维持最小化健康检查面。 |
| `runtime-main` | `Axum runtime facade + SpacetimeDB runtime/custom-world tables` | Axum 维持兼容 REST/SSESpacetimeDB 负责状态真相。 |
| `runtime-story-action` | `Axum story facade + SpacetimeDB gameplay reducers/views` | Story Action 入口继续独立存在,但结算内核迁到新状态层。 |
## 5. 本轮冻结后的硬约束
后续迁移中,不允许出现以下情况:
1.`6` 个挂载面减少成更少但无法一一对照的“超级入口”。
2. 把当前 `/api/auth/*``/api/assets/*``/api/editor/*``/api/runtime/story/*` 顶层命名空间直接改掉。
3. 在未完成路径兼容前,直接移除 `/healthz``/generated-*` 的既有访问习惯。
4. 在未完成契约回归前,把 `runtime-main``runtime-story-action` 的职责重新混成一个难以验收的大入口。
## 6. 本任务完成定义
当以下条件成立时,这条任务视为完成:
1. 当前 `6` 个挂载面已经有正式书面冻结清单。
2. 每个挂载面都有:
- 当前入口
- 当前路由数
- 顶层路径空间
- 重写后必须保留的职责边界
3. 后续任务可以直接以这份文档作为验收引用,不再靠聊天记录记忆。
## 7. 后续直接依赖这份基线的任务
1. 整理当前后端 `96` 条路由并生成“旧接口 -> 新实现”映射表
2. 整理当前 `12` 个内部模块并锁定迁移归属
3. 设计 Axum 路由树
4. 设计 SpacetimeDB 表 / reducer / view 分层

View File

@@ -0,0 +1,23 @@
# 后端重写任务清单目录
日期:`2026-04-20`
本目录用于集中存放 `SpacetimeDB + Axum + 阿里云 OSS` 后端重写相关任务清单。
## 文件结构
- [00_MASTER_TASKLIST.md](./00_MASTER_TASKLIST.md):总纲主清单,保留完整阶段结构与最终验收项。
- [01_M0_M2_FOUNDATION_AND_AUTH.md](./01_M0_M2_FOUNDATION_AND_AUTH.md)能力冻结、Rust 工作区、Axum 基础设施、鉴权与会话迁移任务。
- [02_M3_RUNTIME_PROFILE.md](./02_M3_RUNTIME_PROFILE.md)runtime snapshot / settings / profile 迁移任务。
- [03_M4_STORY_AND_GAMEPLAY.md](./03_M4_STORY_AND_GAMEPLAY.md)story action 主循环与 gameplay reducer 迁移任务。
- [04_M5_CUSTOM_WORLD_AND_AGENT.md](./04_M5_CUSTOM_WORLD_AND_AGENT.md)custom world / gallery / agent 主链迁移任务。
- [05_M6_ASSETS_OSS_EDITOR.md](./05_M6_ASSETS_OSS_EDITOR.md)assets / 阿里云 OSS / editor 迁移任务。
- [06_M7_TEST_DEPLOY_CUTOVER.md](./06_M7_TEST_DEPLOY_CUTOVER.md):联调、回归、部署、观测与切流任务。
- [07_CROSS_CUTTING_AND_ACCEPTANCE.md](./07_CROSS_CUTTING_AND_ACCEPTANCE.md):横向专项、执行顺序与最终验收清单。
- [M0_CAPABILITY_SURFACE_BASELINE_2026-04-20.md](./M0_CAPABILITY_SURFACE_BASELINE_2026-04-20.md):当前 Node 后端 `6` 个挂载面的冻结基线,用于后续接口映射、模块迁移与验收对照。
## 维护规则
1. 总纲与拆分文件都以本目录为唯一维护位置。
2. 总纲用于把控全局节奏,拆分文件用于实际逐项推进。
3. 如阶段任务发生明显变化,需要同步更新总纲与对应拆分文件。