# F2B 协作清单
> 文档版本：v2.5
> 最后更新：2026-04-07 21:24:00
> 历史归档： [f2b.archive.md](D:/dev/cmr-mini/f2b.archive.md)

说明：

- 本文件由前端维护，写给后端
- 主文件只保留当前仍有意义的信息
- 已完成的大段历史已转入归档

---

## 待确认

### F2B-019

- 时间：2026-04-07 21:24:00
- 提出方：前端
- 当前事实：
  - 游客模式第一刀前端已接到：
    - 地图列表
    - 地图详情
    - 公共活动详情
    - 公共准备页
    - 公共 launch
  - 前端直接实测 backend 公共接口结果如下：
    - `GET /public/experience-maps` -> `200`
    - `GET /public/events/evt_demo_001/play` -> `200`
    - `POST /public/events/evt_demo_001/launch` -> `500 internal_error`
  - 这说明游客模式“看地图/看活动/看准备页”已经通，但“真正进入地图”当前被 backend 公共 launch 卡住。
  - 当前 guest mode 只有默认体验活动可进：
    - `evt_demo_score_o_001` -> `403 event_not_public`
    - `evt_demo_variant_manual_001` -> `403 event_not_public`
- 需要对方确认什么：
  - 请 backend 优先检查 `POST /public/events/{eventPublicID}/launch` 的服务端错误原因。
  - 建议先用 `evt_demo_001` 作为游客模式第一刀的联调基线，修通后再扩别的 demo。
- 状态：待确认

### F2B-018

- 时间：2026-04-07 16:25:00
- 提出方：前端
- 当前事实：
  - 地图体验第一刀前端已完成：
    - 首页 `地图体验` 入口
    - 地图列表页
    - 地图详情页
    - 默认体验活动卡片跳活动详情页
  - 当前这条链仍依赖登录态，因为 backend 现有接口：
    - `GET /experience-maps`
    - `GET /experience-maps/{mapAssetPublicID}`
    - `GET /events/{eventPublicID}`
    - `GET /events/{eventPublicID}/play`
    - `POST /events/{eventPublicID}/launch`
    都走登录态 access token
  - backend 当前已经补齐这组接口。
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-017

- 时间：2026-04-07 14:40:00
- 提出方：前端
- 当前事实：
  - 前端已新增产品方案文档：
    - [地图列表与默认体验活动方案](D:/dev/cmr-mini/doc/gameplay/地图列表与默认体验活动方案.md)
  - 当前建议方向是：
    - 增加 `地图列表` 作为默认体验活动入口层
    - 默认体验活动继续复用现有 `Event / Release / Launch / Session`
    - 默认体验活动可挂可不挂
    - 默认体验活动可以不出现在正式活动列表
  - 当前前端并不需要 backend 先做完整地图后台，只需要最小关系和最小摘要支持。
- 需要对方确认什么：
  - 请 backend 先评估并支持以下最小配合项：
    1. 地图/地点与默认体验活动的挂接关系
       - 能回答：某张地图下挂了哪些默认体验活动
    2. 活动摘要补两个稳定字段：
       - `isDefaultExperience`
       - `showInEventList`
    3. 地图列表最小字段建议：
       - `placeId`
       - `placeName`
       - `mapId`
       - `mapName`
       - `coverUrl`
       - `summary`
       - `defaultExperienceCount`
       - `defaultExperienceEventIds[]`
    4. 地图详情最小字段建议：
       - 地点名称
       - 地图名称
       - 地图预览图
       - 默认体验活动列表（最少 `eventId / title / subtitle / eventType / status / ctaText`）
  - 如 backend 对对象关系或字段命名有不同建议，请直接回：
    - 字段名
    - 所属接口
    - 是否建议第一阶段落地
- 状态：待确认

### F2B-016

- 时间：2026-04-07 14:25:00
- 提出方：前端
- 当前事实：
  - 前端已新增一份用于 backend 对齐的配置裁剪文档：
    - [最大配置模板后台落地裁剪表](D:/dev/cmr-mini/doc/config/最大配置模板后台落地裁剪表.md)
  - 该文档的目的不是让 backend 1:1 支持最大配置模板，而是把当前配置能力裁成三类：
    - 第一阶段必做
    - 第二阶段可做
    - 暂不进后台，继续留在程序默认值层
  - 该文档建议配合以下文档一起看：
    - [后端总体架构与当前执行清单](D:/dev/cmr-mini/doc/backend/后端总体架构与当前执行清单.md)
    - [后端第一阶段执行清单](D:/dev/cmr-mini/doc/backend/后端第一阶段执行清单.md)
- 需要对方确认什么：
  - 请 backend 以这三份文档为基线，对齐：
    - 第一阶段后台对象范围
    - 第一阶段应进入后台的配置字段
    - 暂不进后台、继续保留在程序默认值层的字段
  - 如 backend 对某块裁剪有异议，请直接指出：
    - 字段名
    - 希望调整到哪一阶段
    - 原因
- 状态：待确认

### F2B-015

- 时间：2026-04-07 13:46:00
- 提出方：前端
- 当前事实：
  - 准备页地图预览当前已改成：
    - 优先消费 `GET /events/{eventPublicID}/play` 返回的 `preview`
    - 按当前所选 `variantId` 生成预览点位
    - 底图优先仍使用 manifest 对应的正式瓦片源
  - 当前小程序侧现象是：准备页预览仍为空白
  - 前端已补结构化日志，当前会向 backend `client-logs` 上报：
    - `category=event-prepare`
    - `details.phase=prepare-preview`
    - `source`
    - `selectedVariantId`
    - `backendPreviewVariantCount`
    - `tileCount`
    - `controlCount`
    - `overlayAvailable`
    - `previewMode`
    - 失败时 `errorMessage`
- 需要对方确认什么：
  - 请 backend 拉取这批 `prepare-preview` 日志，并核对：
    - 当前 `play.preview.variants` 是否真的返回了多条 variant 预览数据
    - 当前所选 `selectedVariantId` 是否能在 `preview.variants[]` 中命中
    - 当前 preview viewport / baseTiles 是否与正式发布对象一致
  - 如果 backend 已确认日志中 `backendPreviewVariantCount > 0` 但前端仍空白，请回传对应日志片段与当前 demo 的 `eventId / releaseId`
- 状态：待确认

---

## 已确认

### F2B-C011

- 时间：2026-04-03 22:20:00
- 提出方：前端
- 当前事实：
  - backend 已通过 `B2F-035` 收紧 `play.canLaunch` 与 `launch`
  - 当前规则为：缺 `runtime / presentation / content bundle / manifest / 当前发布 release` 任一项时，均不可进入游戏
  - 前端已复测通过，当前按 `play.canLaunch` 作为正式阻断口径
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C012

- 时间：2026-04-03 23:52:00
- 提出方：前端
- 当前事实：
  - manual 多赛道准备页不显示选择区的根因已确认是发布 release 缺少：
    - `play.assignmentMode`
    - `play.courseVariants`
  - backend 已修复 demo/build/publish 链
  - 前端保留了多赛道空态兜底，但主因不在前端
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C013

- 时间：2026-04-03 23:52:00
- 提出方：前端
- 当前事实：
  - 活动卡片列表第一刀所需字段当前已足够
  - 前端已补齐列表与详情页联调日志：
    - `cardEventIds`
    - `clickedEventId`
    - `detailStatus`
    - `detailCanLaunch`
    - `detailCurrentPresentation`
    - `detailCurrentContentBundle`
- 需要对方确认什么：
  - 无
- 状态：已确认

---

## 阻塞

- 当前无

---

## 已完成

### F2B-D010

- 时间：2026-04-03 22:12:00
- 提出方：前端
- 当前事实：
  - 活动页与准备页已统一使用：
    - `当前发布展示版本`
    - `当前发布内容包版本`
  - 当两项为空时，前端统一解释为：
    - 当前发布 release 未绑定
    - 或当前尚未发布
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D011

- 时间：2026-04-07 12:06:00
- 提出方：前端
- 当前事实：
  - 首页 `ongoingSession` 已收成正式交互
  - 当前首页仅在 backend 返回 `ongoingSession` 时显示“进行中的游戏”
  - 支持：
    - `恢复`
    - `放弃`
  - `放弃` 会调用 `finish(cancelled)`，然后清理本地恢复快照并刷新首页
- 需要对方确认什么：
  - 无
- 状态：已完成

---

## 尾项

### F2B-011

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - demo 历史 `ongoing session` 的回收口径仍是独立尾项
  - 当前不阻塞主线：多赛道、活动列表、运营摘要、runtime 主链均可继续联调
- 需要对方确认什么：
  - 后续请单独收口 demo 环境下 `launched / running` session 清理与 ongoing 判定规则
- 状态：待后续单独处理

---

## 下一步

- 当前前后端继续按 backend 一键测试环境联调
- 当前前端侧会优先关注：
  - 活动列表第一刀回归
  - 活动详情页/准备页用户化小修
  - 准备页地图预览 V1 稳定性
- 如后端语义或字段发生变化，再通过 `b2f.md` / `f2b.md` 做增量同步
