# F2B 协作清单
> 文档版本：v1.16
> 最后更新：2026-04-03 23:58:00


说明：

- 本文件由前端维护，写给后端
- 只写“事实”和“请求”
- 不写长讨论稿
- 每条尽量包含：时间、提出方、当前事实、需要对方确认什么、状态

---

## 待确认

### F2B-014

- 时间：2026-04-03 23:18:00
- 提出方：前端
- 当前事实：
  - backend 在 `B2F-037` 中已确认，本次“准备页没有赛道选择区”的直接原因不是前端显示条件，而是当前发布 release 的 `payload_jsonb` 缺少：
    - `play.assignmentMode`
    - `play.courseVariants`
  - backend 已说明修复方式为重新跑：
    - `Bootstrap Demo`
    - `Use Manual Variant Demo`
    - `发布活动配置（自动补 Runtime）` 或 `整条链一键验收`
  - 前端当前逻辑已经兼容：
    - 明确 `assignmentMode=manual` 时显示赛道选择区
    - 即使 `assignmentMode` 缺失，只要 `courseVariants` 中存在 2 条以上可选赛道，也会显示赛道选择区
  - 因此前端现在是否显示赛道选择区，取决于 backend 新发布的 release 是否真的回出了多赛道字段
- 需要对方确认什么：
  - 该问题已由 backend 在 `B2F-037` 中确认修复完成，当前不再需要继续追问
  - 后续多赛道联调以修复后的 demo/publish 链为准
- 状态：已确认

### F2B-013

- 时间：2026-04-03 22:28:00
- 提出方：前端
- 当前事实：
  - 手动多赛道活动当前已能进入准备页，但准备页仍未出现赛道选择区
  - 这次前端已排除“仅仅是 `assignmentMode` 没回 manual”这一种情况：
    - 当前前端兼容逻辑已放宽为：只要 `courseVariants` 中存在 2 条以上可选赛道，即使 `assignmentMode` 缺失，也会显示赛道选择区
  - 但当前实际页面仍显示：
    - `赛道模式：默认单赛道`
    - `赛道摘要：当前未声明额外赛道版本，启动时按默认赛道进入`
  - 这说明前端当前实际拿到的更像是：
    - `play.courseVariants = []` 或未返回
  - 前端已追加准备页诊断日志字段，后端可从 `event-prepare` 日志直接核对：
    - `details.variantCount`
    - `details.selectableVariantCount`
    - `details.showVariantSelector`
- 需要对方确认什么：
  - 该问题根因已由 backend 在 `B2F-037` 中定位完成，当前不再需要继续从前端显示层排查
  - 后续请转看 `F2B-014`
- 状态：已解决

### F2B-011

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - 使用 backend 一键测试环境联调 `evt_demo_variant_manual_001` 时，活动页 / 准备页返回：
    - `primaryAction = continue`
    - `reason = user has an ongoing session for this event`
  - 但前端本地当前没有可恢复快照，且本轮联调主观确认“已经没有需要恢复的游戏”
  - 当前看起来像是 backend 仍认定该用户在该活动下存在 ongoing session
- 需要对方确认什么：
  - 请 backend 核对该用户在 `evt_demo_variant_manual_001` 下是否仍有 `launched / running` session 未清掉
  - 如这是预期行为，请说明推荐的标准清理路径；如不是预期，请修正 ongoing 判定或测试环境回收逻辑
- 状态：待后续单独收口（当前不阻塞主线）

---

## 已确认

### F2B-C001

- 时间：2026-04-01
- 提出方：前端
- 当前事实：
  - 正式联调时，前端以 backend `launch` 下发的 release/manifest 为准
  - 不再回退到本地 `event/*.json`
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C002

- 时间：2026-04-01
- 提出方：前端
- 当前事实：
  - 前后端协作文档改为双文件：
    - `f2b.md` 由前端维护
    - `b2f.md` 由后端维护
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C003

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认 session 三态正式语义：
    - 正常完成 -> `finished`
    - 超时或规则失败 -> `failed`
    - 主动退出 / 放弃恢复 -> `cancelled`
  - 前端已按这套语义继续联调
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C004

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认“放弃恢复”官方语义为 `finish(cancelled)`
  - 旧 `sessionToken` 在该场景下允许继续调用
  - 前端当前已正式启用该链路
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C005

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认 `start / finish` 按幂等处理
  - 前端可继续按当前补报 / 重试逻辑联调
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C006

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认多赛道第一阶段最小契约，且相关字段已可从以下接口返回：
    - `/events/{eventPublicID}/play`
    - `/events/{eventPublicID}/launch`
    - `/me/entry-home`
    - `/sessions/{sessionPublicID}`
    - `/sessions/{sessionPublicID}/result`
    - `/me/results`
    - `/me/sessions`
  - 正式口径为：
    - `play.assignmentMode`
    - `play.courseVariants[]`
    - `launch.variant.id/name/routeCode/assignmentMode`
    - `session / ongoing / recent / result` 摘要中带 `variantId/variantName/routeCode`
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C007

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认 launch 关键字段为正式契约：
    - `resolvedRelease.manifestUrl`
    - `resolvedRelease.releaseId`
    - `business.sessionId`
    - `business.sessionToken`
    - `business.sessionTokenExpiresAt`
  - 如后续字段名或层级需调整，backend 将先在 `b2f.md` 通知
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C008

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认 ongoing / recent / result 摘要口径：
    - `launched`、`running` 作为 ongoing
    - `finished`、`failed`、`cancelled` 不再作为 ongoing
    - `/me/results` 只返回终态对局
  - 前端后续按这套摘要口径做显示与回归
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C009

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - backend 已提供可联调的 `manual` 多赛道 demo 活动：
    - `evt_demo_variant_manual_001`
  - backend 已确认 `launch` 选定的 `variantId` 会稳定回流到：
    - `/me/entry-home`
    - `/sessions/{sessionPublicID}/result`
    - `/me/results`
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C010

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - backend 已透出活动运营域第二阶段摘要字段：
    - `currentPresentation`
    - `currentContentBundle`
    - `launch.presentation`
    - `launch.contentBundle`
  - 前端当前按总控口径，仅做类型 / adapter / 活动页与准备页轻摘要接线，不扩新页面链
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C011

- 时间：2026-04-03 22:20:00
- 提出方：前端
- 当前事实：
  - backend 已通过 `B2F-035` 正式收紧 `play.canLaunch` 与 `launch` 的前置条件
  - 当前规则为：缺 `runtime / presentation / content bundle / manifest / 当前发布 release` 任一项时，均不可进入游戏
  - 前端已按该契约复测，当前结果正常：
    - `canLaunch=false` 时页面会禁用进入动作
    - `play.reason` 会给出更具体的缺失原因
    - backend 也不会再允许直接 `launch` 绕过阻断
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C012

- 时间：2026-04-03 23:52:00
- 提出方：前端
- 当前事实：
  - backend 已在 `B2F-037` 中确认：manual 多赛道准备页不显示选择区的根因是发布 release 缺少：
    - `play.assignmentMode`
    - `play.courseVariants`
  - backend 已修复 `Bootstrap Demo` 与发布链，当前问题已通过联调日志确认收口
  - frontend 当前已保留多赛道兜底展示逻辑，但该问题主因不在前端显示层
- 需要对方确认什么：
  - 无
- 状态：已确认

### F2B-C013

- 时间：2026-04-03 23:52:00
- 提出方：前端
- 当前事实：
  - backend 在 `B2F-038` 中要求的活动卡片列表第一刀字段，frontend 当前已按最小方案接入：
    - `summary`
    - `status`
    - `statusCode`
    - `timeWindow`
    - `ctaText`
    - `isDefaultExperience`
    - `eventType`
    - `currentPresentation`
    - `currentContentBundle`
  - frontend 当前列表页和详情页日志也已补齐：
    - `cardEventIds`
    - `clickedEventId`
    - `detailStatus`
    - `detailCanLaunch`
    - `detailCurrentPresentation`
    - `detailCurrentContentBundle`
- 需要对方确认什么：
  - 当前字段已足够支撑活动卡片列表最小实现
  - 当前没有发现必须新增的列表页名称摘要字段
- 状态：已确认

---

## 阻塞

### F2B-B001

- 时间：2026-04-01
- 提出方：前端
- 当前事实：
  - 当前前端主链已基本可联调
  - 目前没有新的 backend 阻塞项
- 需要对方确认什么：
  - 无
- 状态：已解决

---

## 已完成

### F2B-D001

- 时间：2026-04-01
- 提出方：前端
- 当前事实：
  - 小程序已接通：
    - 登录
    - 首页聚合
    - 活动页 `play`
    - `launch -> 地图页`
    - `session start`
    - `session finish`
    - `session result`
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D002

- 时间：2026-04-01
- 提出方：前端
- 当前事实：
  - 小程序已接入故障恢复：
    - 检测未正常结束对局
    - 弹“继续恢复 / 放弃”
    - 继续恢复时恢复本地运行时快照
    - 放弃时清本地恢复，并上报 `finish(cancelled)`
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D003

- 时间：2026-04-01
- 提出方：前端
- 当前事实：
  - `evt_demo_001` 当前 release manifest 已恢复可用
  - 前端已能正常进入地图
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D004

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - 前端已完成多赛道第一阶段接入：
    - `backendApi / launchAdapter / GameLaunchEnvelope` 已接入 `variant` 字段
    - 故障恢复会随 `launchEnvelope` 保留 `variant` 信息
    - 活动页、准备页、首页、单局结果页、历史结果页开始展示赛道版本信息
    - `manual` 模式下准备页已支持选择赛道并把 `variantId` 带入 launch
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D005

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - 前端已完成活动运营域摘要第一刀的轻接线：
    - 活动页开始展示 `currentPresentation / currentContentBundle`
    - 准备页开始展示活动运营摘要
    - `launch.presentation / launch.contentBundle` 已进入 `GameLaunchEnvelope`
    - 会话快照会随 `launchEnvelope` 一起保留这批摘要
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D006

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - 已按 backend `B2F-028` 的排查口径补充前端诊断链，当前地图信息面板/赛后结果里可直接查看：
    - `launch.config.configUrl`
    - `launch.resolvedRelease.manifestUrl`
    - `launch.config.releaseId`
    - `launch.resolvedRelease.releaseId`
    - 最终加载后的：
      - `Schema版本`
      - `场地类型(playfield.kind)`
      - `模式编码(game.mode)`
  - 当前只补了诊断与观测，没有改动正式 launch 主链
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D007

- 时间：2026-04-03 16:26:37
- 提出方：前端
- 当前事实：
  - 已按 `B2F-030` 接入 backend `POST /dev/client-logs`
  - 当前关键阶段会主动上报最小调试日志：
    - `entry-home`
    - `event-play`
    - `event-prepare`
    - `launch-diagnostic`
    - `runtime-compiler`
    - `session-recovery`
  - 当前主日志字段已按 backend 建议最小口径回传：
    - `source`
    - `level`
    - `category`
    - `message`
    - `eventId`
    - `releaseId`
    - `sessionId`
    - `manifestUrl`
    - `route`
    - `details.phase`
    - `details.schemaVersion`
    - `details.playfield.kind`
    - `details.game.mode`
  - 模拟器日志不再作为当前联调主诊断口，保留地图内调试面板作为本地辅助能力
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D008

- 时间：2026-04-03 16:45:26
- 提出方：前端
- 当前事实：
  - backend 已通过 `B2F-031` 明确确认：积分赛误进顺序赛的根因不是前端解析，而是首页卡片入口配置错误
  - 具体根因为：
    - 首页卡片查询此前只取 `home_primary`
    - 积分赛 demo 卡此前被种到 `home_secondary`
    - 前端首页因此根本拿不到 `evt_demo_score_o_001`
  - backend 已修复积分赛卡片入口配置
  - 前端当前无需再为该问题修改玩法解析或 manifest 消费逻辑
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D009

- 时间：2026-04-03 16:45:26
- 提出方：前端
- 当前事实：
  - 已按 `B2F-032` 优化前端结构化调试日志口径：
    - 非多赛道玩法时，不再上报空字符串形式的 `assignmentMode`
    - 非手选赛道时，不再把空 `variantId` 伪装成已选赛道
    - 所有 client log 现在都会附带前端本地递增 `details.seq`
    - `launchVariantId` 与 `runtimeCourseVariantId` 已明确区分
- 需要对方确认什么：
  - 无
- 状态：已完成

### F2B-D010

- 时间：2026-04-03 22:12:00
- 提出方：前端
- 当前事实：
  - 已按 `B2F-034` 对活动页和准备页做语义收口：
    - `展示版本` 改成 `当前发布展示版本`
    - `内容包版本` 改成 `当前发布内容包版本`
  - 当 `currentPresentation / currentContentBundle` 为空时，前端当前统一解释为：
    - `当前发布 release 未绑定展示版本，或当前尚未发布`
    - `当前发布 release 未绑定内容包版本，或当前尚未发布`
  - 活动页与准备页当前进入动作都已优先受 `play.canLaunch` 控制：
    - `canLaunch=false` 时按钮禁用
    - 同时阻止继续进入准备页或地图
- 需要对方确认什么：
  - 无
- 状态：已完成

---

## 下一步

### F2B-N001

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - session 生命周期关键语义已由 backend 确认
  - 当前前端下一轮重点应转向主链回归与结果展示对齐
- 需要对方确认什么：
  - 无
- 状态：前端执行中

### F2B-N002

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - 心率 / 卡路里个体化能力已在前端预留
- 需要对方确认什么：
  - 后续是否提供用户身体数据接口
- 状态：后续事项

### F2B-N003

- 时间：2026-04-02
- 提出方：前端
- 当前事实：
  - backend 已确认多赛道第一阶段最小契约
  - 前端已完成第一阶段基础接入，下一步将转入多赛道专项联调与展示补强
- 需要对方确认什么：
  - 无
- 状态：前端执行中

### F2B-N004

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - 当前主链已进入“稳住 + 联调修复”阶段
  - 活动运营域摘要第一刀已接通，但前端不会主动扩复杂运营样式
- 需要对方确认什么：
  - 无
- 状态：前端执行中

### F2B-N005

- 时间：2026-04-03
- 提出方：前端
- 当前事实：
  - 当前已具备积分赛 demo 发布链诊断信息，下一步将按 backend 一键测试环境回归 `evt_demo_score_o_001`
  - 如仍表现为顺序赛，前端将回传 launch/config/runtime 三段事实，不再只报“现象”
- 需要对方确认什么：
  - 无
- 状态：前端执行中


