完善多赛道联调与全局产品架构

This commit is contained in:
2026-04-02 18:11:43 +08:00
parent 6964e26ec9
commit 0e28f70bad
45 changed files with 4819 additions and 282 deletions

139
b2f.md
View File

@@ -1,6 +1,6 @@
# b2f
> 文档版本v1.0
> 最后更新2026-04-02 09:01:17
> 文档版本v1.3
> 最后更新2026-04-02 15:25:40
说明:
@@ -54,6 +54,51 @@
- frontend 是否确认正式流程只消费上述字段,不再自行推断 release URL
- 是否已解决:否
### B2F-015
- 时间2026-04-02
- 谁提的backend
- 当前事实:
- backend 已阅读前端多赛道文档:
- [多赛道 Variant 五层设计草案](D:/dev/cmr-mini/doc/gameplay/多赛道Variant五层设计草案.md)
- [多赛道 Variant 前后端最小契约](D:/dev/cmr-mini/doc/gameplay/多赛道Variant前后端最小契约.md)
- backend 认可第一阶段先做“最小契约”,不先做完整后台模型
- backend 当前建议的第一阶段正式口径为:
- `play.assignmentMode`
- `play.courseVariants[]`
- `id`
- `name`
- `description`
- `routeCode`
- `selectable`
- `launch.variant.id`
- `launch.variant.name`
- `launch.variant.routeCode`
- `launch.variant.assignmentMode`
- `session / ongoing / recent / result` 摘要中补:
- `variantId`
- `variantName`
- `routeCode`
- backend 第一阶段实现目标仍然保持保守:
- 一个 session 只绑定一个最终 `variantId`
- `launch` 返回最终绑定结果
- 恢复链不重新分配 variant
- 当前兼容性约束:
- 如果 `assignmentMode=manual` 且前端暂时未传 `variantId`
- backend 当前会先回退到首个可选 variant避免旧主链直接被打断
- backend 当前已完成第一阶段最小实现:
- `GET /events/{eventPublicID}/play`
- `POST /events/{eventPublicID}/launch`
- `GET /me/entry-home`
- `GET /sessions/{sessionPublicID}`
- `GET /sessions/{sessionPublicID}/result`
- `GET /me/results`
- `GET /me/sessions`
- 上述链路已能携带第一阶段 variant 摘要字段
- 需要对方确认什么:
- frontend 可按这组字段开始第一阶段联调
- 是否已解决:是
---
## 已确认
@@ -121,6 +166,49 @@
- frontend 继续按当前补报 / 重试逻辑联调
- 是否已解决:是
### B2F-016
- 时间2026-04-02
- 谁提的backend
- 当前事实:
- backend 已确认 `launch` 当前关键字段为前端正式联调契约:
- `resolvedRelease.manifestUrl`
- `resolvedRelease.releaseId`
- `business.sessionId`
- `business.sessionToken`
- `business.sessionTokenExpiresAt`
- 当前阶段 backend 不会单边调整这些字段名或层级
- 如后续确需调整backend 会先在 `b2f.md` 明确通知,再安排联调变更
- 需要对方确认什么:
- frontend 继续按当前字段接入,不做额外推断
- 是否已解决:是
### B2F-017
- 时间2026-04-02
- 谁提的backend
- 当前事实:
- backend 已完成对 ongoing 口径的代码回归确认
- 当前实现中:
- 只有 `launched``running` 会被识别为 ongoing
- `cancelled``failed``finished` 都不会再进入 ongoing
- `/me/entry-home``/events/{eventPublicID}/play` 当前都复用同一 ongoing 判定逻辑
- `/me/results` 当前只返回终态 session
- `finished`
- `failed`
- `cancelled`
- 当前首页摘要、play 摘要、result 详情都会复用同一组 session 基础摘要字段:
- `id`
- `status`
- `eventId`
- `eventName`
- `releaseId`
- `configLabel`
- `routeCode`
- 需要对方确认什么:
- frontend 可以按这套 ongoing / result 口径继续回归
- 是否已解决:是
---
## 阻塞
@@ -226,6 +314,52 @@
-
- 是否已解决:是
### B2F-018
- 时间2026-04-02
- 谁提的backend
- 当前事实:
- backend 已补一条可联调的 `manual` 多赛道 demo 活动:
- `eventPublicID = evt_demo_variant_manual_001`
- `releaseId = rel_demo_variant_manual_001`
- `channelCode = mini-demo`
- `channelType = wechat_mini`
- 当前 demo 配置为:
- `assignmentMode = manual`
- `courseVariants = [variant_a, variant_b]`
- 当前两条可选赛道:
- `variant_a`
- `name = A 线`
- `routeCode = route-variant-a`
- `variant_b`
- `name = B 线`
- `routeCode = route-variant-b`
- 该活动已由 `POST /dev/bootstrap-demo` 自动准备
- 需要对方确认什么:
-
- 是否已解决:是
### B2F-019
- 时间2026-04-02
- 谁提的backend
- 当前事实:
- backend 已完成 `variant_b` 的 service 层回归验证
- 已确认从 `launch` 选定的 `variantId` 会稳定回流到:
- `GET /me/entry-home`
- `GET /sessions/{sessionPublicID}/result`
- `GET /me/results`
- 实测链路为:
- `play.assignmentMode=manual`
- `play.courseVariants=2`
- `launch.variant.id=variant_b`
- `entry-home recent.variantId=variant_b`
- `result.session.variantId=variant_b`
- `results[0].session.variantId=variant_b`
- 需要对方确认什么:
-
- 是否已解决:是
---
## 下一步
@@ -244,6 +378,7 @@
- frontend 当前优先配合:
- 用当前 demo release 回归 `play -> launch -> map load`
- 回归“继续恢复 / 放弃恢复”两条路径
- 如确认进入多赛道第一阶段联调,请先回复 `B2F-015`
- 如发现状态口径不一致,直接在 `f2b.md` 标具体接口和返回值
- 是否已解决:否