Files
Genarrative/docs/technical/BACKEND_REWRITE_CROSS_CUTTING_GOVERNANCE_2026-04-22.md
kdletters cbc27bad4a
Some checks failed
CI / verify (push) Has been cancelled
init with react+axum+spacetimedb
2026-04-26 18:06:23 +08:00

7.5 KiB
Raw Blame History

后端重写横向治理规则2026-04-22

更新时间:2026-04-22

1. 文档目标

本文件冻结 SpacetimeDB + Axum + OSS 后端重写收口阶段的横向规则,覆盖:

  1. 前端 TypeScript contract 与 Rust DTO 的映射策略。
  2. SpacetimeDB table / reducer / procedure 的演进规则。
  3. 大对象、manifest、workflow cache 的存储边界。
  4. 阶段文档与 API 索引的维护规则。

这些规则用于减少 M4/M5/M6/M7 后续并行推进时的 contract 漂移。

2. Contract 与前端兼容

2.1 映射原则

  1. packages/shared/src/contracts/* 是前端消费 contract 的现有事实来源。
  2. server-rs/crates/shared-contracts/src/*.rs 是 Rust api-server 返回 DTO 的事实来源。
  3. 两侧字段名必须继续使用当前前端已消费的 JSON 命名,不因 Rust 字段命名风格改变外部 shape。
  4. Rust DTO 必须通过 serde(rename_all = "camelCase")、显式 rename 或兼容枚举值保持旧 contract。
  5. 临时兼容字段只能标记为 optional不能在没有迁移说明和测试前直接删除。

2.2 当前映射面

前端 contract Rust DTO 模块 当前用途
packages/shared/src/contracts/auth.ts shared-contracts::auth 登录方式、用户信息、会话、审计、验证码与微信登录
packages/shared/src/contracts/runtime.ts shared-contracts::runtime profile dashboard、play stats、wallet ledger、browse history、settings、inventory
packages/shared/src/contracts/rpgRuntimeStoryAction.ts shared-contracts::runtime_story runtime story action request / response、state resolve、view model
packages/shared/src/contracts/rpgRuntimeStoryState.ts shared-contracts::runtime_story runtime story state / presentation 兼容
packages/shared/src/contracts/rpgAgent*.ts shared-contracts::runtimecustom_world 相关 DTO custom world agent session、message、operation、action
packages/shared/src/contracts/rpgCreation*.ts shared-contracts::runtimecustom_world 相关 DTO result preview、works、library、published profile
packages/shared/src/contracts/common.ts shared-contracts::api 统一 success / error envelope

2.3 变更流程

  1. 扩字段:先加 Rust optional 字段和 contract test再接前端消费。
  2. 改字段语义:必须新增技术方案说明旧语义、新语义、迁移期兼容逻辑和回退方式。
  3. 删字段或删枚举必须先证明前端调用、Node 兼容层、历史 fixture 和测试都不再消费。
  4. breaking change 必须在任务清单和设计文档中显式标注,不允许只靠 PR diff 表达。
  5. 所有 shared contract 变更至少运行 cargo test -p shared-contracts --manifest-path server-rs/Cargo.toml

3. SpacetimeDB Schema 演进治理

本节按 SpacetimeDB 约束执行:

  1. reducer 是事务性写入口,不依赖 reducer 返回值读取数据。
  2. reducer 必须确定性执行,不做网络、文件系统、外部随机数或时间副作用。
  3. 客户端读取依赖 table / subscription / procedure 返回的显式 DTO不把 Axum 进程内缓存当真相。
  4. 用户身份以后续接入 SpacetimeDB 直连时的 ctx.sender() 为准,不信任客户端传入 owner 字段。

3.1 命名规则

  1. table 使用稳定单数 snake_case 名称,例如 story_sessionasset_objectcustom_world_agent_session
  2. reducer 使用动作动词 + 领域对象,例如 upsert_runtime_snapshotconfirm_asset_objectturn_in_quest
  3. 需要同步返回 DTO 的 procedure 统一使用 _and_returnget_ / list_ / compile_ 语义。
  4. public table 只暴露客户端确实需要订阅或查询的状态内部审计、token、风控等默认不 public。
  5. event table 只用于事件广播,不替代持久状态表。

3.2 列演进规则

  1. 优先追加 optional 字段,不直接改名、改类型或删除列。
  2. 必须删除语义时,先软废弃字段并让读模型停止依赖,再在独立迁移窗口清理。
  3. 状态类枚举新增值时,前端必须有 unknown / fallback 处理。
  4. 需要唯一约束或索引时,先补设计文档说明查询路径,再改 schema。
  5. 大规模重排表结构必须拆成新表 + 双写 / 读模型迁移,不在原表上做破坏性变更。

3.3 软删除规则

  1. 用户可见业务实体优先使用 statusdeleted_atarchived_at 表达生命周期。
  2. 会话、作品、资产绑定、审计和任务记录默认不物理删除。
  3. 物理删除只用于临时草稿、过期验证码、过期 OAuth state 等明确可丢弃数据。
  4. 删除 reducer 必须写清是否幂等,重复调用不能造成不可恢复错误。

4. 大对象与缓存治理

4.1 OSS 存储边界

必须进入 OSS

  1. 图片、视频、动作帧、封面图、场景图。
  2. 大型 JSON manifest。
  3. 角色工作流缓存 JSON。
  4. 导入视频和生成过程草稿资源。

只进入 SpacetimeDB 元数据:

  1. bucketobject_keyasset_kindcontent_typecontent_lengthcontent_hashversion
  2. asset_entity_binding 的业务实体、槽位、owner 和 profile 绑定关系。
  3. AI task、asset task、publish gate 等状态字段。
  4. 可用于列表和权限判断的轻量 summary。

4.2 本地缓存边界

  1. 生产主链不得把仓库 public/generated-* 作为资产真相。
  2. /generated-* 仅作为同源代理兼容路径,读取私有 OSS 对象。
  3. 测试环境允许使用 #[cfg(test)] 内存兜底,但必须在文档中注明不进入生产链。
  4. workflow cache 当前真相是 OSS JSON 草稿对象,不落本地文件。
  5. 临时生成文件如需存在,必须限制在进程临时目录,并在任务完成后清理。

4.3 Manifest 与版本

  1. 多文件资产集合使用 OSS manifest 表达,不重复新增结构化表,除非已证明查询需求需要。
  2. asset_object.version 当前默认 1,版本升级必须说明兼容读取规则。
  3. content_hash 可为空,但一旦用于去重,必须先补冲突处理和重算策略。
  4. 强业务资产表只有在需要领域查询、审核、回滚或权限策略时再新增。

5. 文档维护规则

  1. 工程修改必须同步对应阶段任务清单。
  2. 新增或改变接口时,同步更新 RUST_API_SERVER_ROUTE_INDEX_2026-04-22.md
  3. 仍存在旧能力差异时,同步更新 CURRENT_BACKEND_IMPLEMENTATION_BASELINE_2026-04-25.md 或新增 Rust 侧补充索引。
  4. M4 结构变更同步维护 RPG runtime 链路文档。
  5. M5 结构变更同步维护 creation flow 链路文档。
  6. M6 资产链路变更同步维护 OSS / asset_object / generated path 文档。
  7. M7 切流相关变更同步维护部署、预检、smoke 与回滚文档。

6. 验收门禁

横向治理完成不等价于真实切流完成。当前可本地验收的门禁是:

  1. cargo check -p api-server --manifest-path server-rs/Cargo.toml
  2. cargo check -p spacetime-module --manifest-path server-rs/Cargo.toml
  3. cargo test -p shared-contracts --manifest-path server-rs/Cargo.toml
  4. cargo test -p api-server --manifest-path server-rs/Cargo.toml --no-run
  5. node scripts/check-encoding.mjs ...

真实切流前仍必须单独完成:

  1. OSS 真实读写 smoke。
  2. LLM / DashScope 真实生成 smoke。
  3. 关键 SSE 接口联调。
  4. SpacetimeDB publish / rollback 演练。
  5. 灰度环境双跑对比。