b2f.md 32 KB

b2f

文档版本:v1.26 最后更新:2026-04-03 19:18:34

说明:

  • 只写事实和请求
  • 每条固定包含:时间、谁提的、当前事实、需要对方确认什么、是否已解决

待确认

B2F-038

  • 时间:2026-04-03 19:13:57
  • 谁提的:backend
  • 当前事实:
    • backend 已按“活动卡片列表最小产品化第一刀”补齐以下返回中的活动卡片最小摘要字段:
    • GET /cards
    • GET /home
    • GET /me/entry-home
    • 当前最小摘要字段为:
    • summary
    • status
    • statusCode
    • timeWindow
    • ctaText
    • isDefaultExperience
    • eventType
    • currentPresentation
    • currentContentBundle
    • backend 当前希望 frontend 这轮优先做的是:
    • 活动列表页按这组字段完成最小接线
    • 详情页继续沿用:
      • play.canLaunch
      • currentPresentation
      • currentContentBundle 这组已发布 release 语义
    • 联调时继续通过 frontend 调试日志回传以下事实:
      • 列表页实际拿到的 cardEventIds
      • 点击卡片后的 eventId
      • 详情页实际显示的 status / canLaunch / currentPresentation / currentContentBundle
  • 需要对方确认什么:
    • frontend 请按这组字段完成活动卡片列表最小实现,并回写:
    • 当前字段是否足够
    • 列表页是否还缺必需字段
    • 最新日志里是否已能稳定看到:
      • cardEventIds
      • clickedEventId
      • detail.status
      • detail.canLaunch
  • 是否已解决:否

B2F-037

  • 时间:2026-04-03 22:52:10
  • 谁提的:backend
  • 当前事实:
    • backend 已根据 frontend 在 F2B-013 的结构化日志,确认 manual 多赛道当前不显示赛道选择区的根因不在 frontend 展示层
    • 当前 frontend 日志事实为:
    • event-play.pageEventId = evt_demo_variant_manual_001
    • event-play.variantCount = 0
    • event-prepare.variantCount = 0
    • event-prepare.selectableVariantCount = 0
    • event-prepare.showVariantSelector = false
    • backend 进一步核对当前数据库里的该活动当前发布 release:
    • eventPublicID = evt_demo_variant_manual_001
    • releaseId = rel_69d4778bdbb398b4
    • 该 release 的 payload_jsonb 当前缺少:
      • play.assignmentMode
      • play.courseVariants
    • 根因是:
    • manual demo 的 source/build 数据此前仍按单赛道顺序赛模板生成
    • 导致后续 publish 出来的新 release 没把多赛道配置带进去
    • backend 已修复:
    • Bootstrap Demo 准备 manual demo source/build 时,会显式写入:
      • play.assignmentMode = manual
      • play.courseVariants = [variant_a, variant_b]
  • 需要对方确认什么:
    • 无,当前这条已通过本轮联调日志确认
  • 是否已解决:是

B2F-036

  • 时间:2026-04-03 22:34:08
  • 谁提的:backend
  • 当前事实:
    • backend 已按活动卡片列表最小产品化第一刀,统一补齐以下返回里的卡片摘要字段:
    • GET /cards
    • GET /home
    • GET /me/entry-home
    • 当前新增/补齐字段为:
    • summary
    • status
    • statusCode
    • timeWindow
    • ctaText
    • isDefaultExperience
    • eventType
    • currentPresentation
    • currentContentBundle
    • 当前口径固定如下:
    • summary 缺失时回退:当前暂无活动摘要
    • timeWindow 缺失时回退:时间待公布
    • ctaText 当前由 backend 派生:
      • 默认体验活动:进入体验
      • 进行中:进入活动
      • 已结束:查看回顾
      • 其余:查看详情
    • currentPresentation / currentContentBundle 继续表示当前已发布 release 摘要,不是 event 草稿默认值
    • backend 已给 cards 落显式字段:
    • is_default_experience
    • 当前 demo 数据已标记:
    • 顺序赛为默认体验活动
    • 积分赛、多赛道为普通活动
  • 需要对方确认什么:
    • frontend 可按以上字段和降级规则开始活动卡片列表最小产品化第一刀
    • frontend 请回写:
    • 当前字段是否足够启动列表页最小实现
    • 是否还缺列表页必需名称摘要
  • 是否已解决:否

B2F-035

  • 时间:2026-04-03 18:16:19
  • 谁提的:backend
  • 当前事实:
    • backend 已根据 frontend 在 F2B-012 的反馈,正式收紧 play.canLaunchPOST /events/{eventPublicID}/launch 的前置条件
    • 当前规则已改为:
    • 仅当当前 event 满足以下条件时,play.canLaunch = true
      • event status = active
      • 已存在当前发布 release
      • 当前发布 release 有 manifest
      • 当前发布 release 已绑定 runtime
      • 当前发布 release 已绑定 presentation
      • 当前发布 release 已绑定 content bundle
    • 当前若缺任一项,backend 会返回更明确原因,例如:
    • current published release is missing runtime binding
    • current published release is missing presentation binding
    • current published release is missing content bundle binding
    • launch 当前也已按同一套规则阻断,避免出现:
    • play.canLaunch = false
    • 但直接调用 launch 仍能进局
  • 需要对方确认什么:
    • frontend 请在 backend 重启后复验:
    • currentPresentation / currentContentBundle / runtime 任意缺失时,play.canLaunch 是否已变为 false
    • play.reason 是否已返回更具体缺失原因
    • frontend 页面当前可继续沿用:
    • canLaunch=false 时禁用进入动作
    • 同时展示 backend 返回的 reason
  • 是否已解决:否

B2F-034

  • 时间:2026-04-03 18:05:19
  • 谁提的:backend
  • 当前事实:
    • backend 当前已确认一个需要 frontend 明确区分的语义:
    • currentPresentation
    • currentContentBundle 当前表示的是“当前已发布 release 上实际绑定的展示版本 / 内容包版本摘要”
    • 它们当前不是:
    • 活动草稿默认值
    • event 默认绑定草稿态
    • 这也解释了为什么:
    • 后台未完成导入 + 默认绑定 + publish 之前,这两项可能为空
    • 一旦跑过后台发布链,它们就会开始显示
    • backend 当前正式规则也已明确:
    • 玩家进入游戏必须基于“已发布 release”
    • 不能基于未发布默认配置直接放行
  • 需要对方确认什么:
    • frontend 请按以下口径调整页面语义:
    • 文案优先改成:
      • 当前发布展示版本
      • 当前发布内容包版本
    • 玩家能否继续进入,优先只看:
      • play.canLaunch
    • 当这两项为空时,优先解释为:
      • 当前发布 release 未绑定
      • 或当前尚未发布
    • 不要把它们展示成“活动默认配置已存在,只是未显示”
  • 是否已解决:否

B2F-032

  • 时间:2026-04-03 16:43:25
  • 谁提的:backend
  • 当前事实:
    • backend 已收到 frontend 最新一轮结构化调试日志,并确认积分赛主链已打通
    • 当前日志事实一致指向:
    • entry-home.cardEventIds 已包含 evt_demo_score_o_001
    • event-play.pageEventId = evt_demo_score_o_001
    • event-prepare.pageEventId = evt_demo_score_o_001
    • launch.response.releaseId = rel_74bb47a0d0d3d252
    • runtime-compiler.details.game.mode = score-o
    • runtime-compiler.details.playfield.kind = control-set
    • 当前 backend 没再看到“明明选积分赛却实际跑成顺序赛”的问题
    • 当前日志链还有 3 个口径优化项:
    • 非多赛道玩法时,assignmentMode 现在是空字符串 \"\"
    • variantId 为空时,runtimeCourseVariantId 仍可能有值,前端展示层不要把两者混为“用户选了赛道”
    • occurredAtreceivedAt 会有轻微时钟漂移,排查顺序时建议增加前端本地递增序号
  • 需要对方确认什么:
    • frontend 后续日志上报请优化为:
    • 非多赛道玩法时:
      • assignmentMode = null 或不传
      • variantId = null 或不传
    • 新增:
      • details.seq
    • 如需展示赛道来源,请区分:
      • launchVariantId
      • runtimeCourseVariantId
  • 是否已解决:否

B2F-031

  • 时间:2026-04-03 16:37:41
  • 谁提的:backend
  • 当前事实:
    • backend 已收到 frontend 新增的结构化调试日志
    • 这批日志已经明确说明:本轮前端实际进入的是经典顺序赛,不是积分赛
    • 关键事实如下:
    • entry-home.cardEventIds = [evt_demo_001, evt_demo_variant_manual_001]
    • event-play.pageEventId = evt_demo_001
    • event-prepare.pageEventId = evt_demo_001
    • launch.response.releaseId = rel_demo_001
    • runtime-compiler.details.game.mode = classic-sequential
    • backend 已确认根因不是积分赛 release 缺失,而是 demo 首页卡片入口配置错误:
    • 当前首页卡片查询只取 home_primary
    • score-o demo 卡此前被种到了 home_secondary
    • 所以前端首页根本拿不到积分赛入口
    • backend 已修复:
    • card_demo_score_o_001 改为 home_primary
    • 同时把优先级调高到 98
  • 需要对方确认什么:
    • frontend 请在 backend 重启后重新执行:
    • Bootstrap Demo
    • 进入首页再看 cardEventIds
    • 并确认首页卡片中是否已经出现:
    • evt_demo_score_o_001
  • 是否已解决:否

B2F-030

  • 时间:2026-04-03 16:16:38
  • 谁提的:backend
  • 当前事实:
    • backend 已新增 dev 调试接口:
    • POST /dev/client-logs
    • GET /dev/client-logs
    • DELETE /dev/client-logs
    • workbench 已新增:
    • 前端调试日志
    • 拉取前端日志
    • 清空前端日志
    • 这套能力只用于联调,不参与正式生产日志链路
    • backend 当前建议 frontend 在关键阶段主动上报日志,至少覆盖:
    • launch 返回后
    • 地图页拿到最终 manifest 后
    • 运行时编译完成后
    • 发现缓存命中 / 恢复 session / 模式不符时
  • 需要对方确认什么:
    • frontend 请按最小字段约定接入并回传一轮:
    • source
    • level
    • category
    • message
    • eventId
    • releaseId
    • sessionId
    • manifestUrl
    • route
    • details.schemaVersion
    • details.playfield.kind
    • details.game.mode
    • details.phase
  • 是否已解决:否

B2F-029

  • 时间:2026-04-03 15:44:32
  • 谁提的:backend
  • 当前事实:
    • backend 已确认一个具体问题:
    • 所有“带 Bootstrap Demo 的一键按钮”,此前都会先把默认 demo 数据重新写回表单
    • 这会把前面已经选好的积分赛入口再次冲回顺序赛默认链
    • 受影响的不只是:
    • 整条链一键验收
    • 还包括:
    • 看首页是否正常
    • 快速进一局
    • 发布活动配置(自动补 Runtime)
    • backend 已修复为:
    • 这些一键流在调用 Bootstrap Demo 后,会按当前已选中的 event 回填对应的 source / build / release / runtime
    • 不再无条件回退到 evt_demo_001
  • 需要对方确认什么:
    • frontend 请重启 backend 后复验:
    • Use Score-O Demo
    • 整条链一键验收
    • 并确认地图信息面板里是否已切到:
    • eventPublicID = evt_demo_score_o_001
    • game.mode = score-o
    • playfield.kind = control-set
  • 是否已解决:否

B2F-028

  • 时间:2026-04-03 15:29:07
  • 谁提的:backend
  • 当前事实:
    • backend 已核对积分赛 demo 当前发布链,以下 3 层结果一致:
    • 本地源配置 score-o.json
    • OSS 配置 score-o.json
    • 当前 event evt_demo_score_o_001 的正式 release manifest
    • 当前后端确认值为:
    • schemaVersion = 1
    • playfield.kind = control-set
    • game.mode = score-o
    • 当前积分赛正式 release 为:
    • eventPublicID = evt_demo_score_o_001
    • releaseId = rel_1c7601964d7f3d00
    • manifestUrl = https://oss-mbh5.colormaprun.com/gotomars/event/releases/evt_demo_score_o_001/rel_1c7601964d7f3d00/manifest.json
    • 如果 frontend 当前跑出来仍是顺序赛,优先怀疑“实际消费的不是当前 launch 返回的 manifest”,或“运行时仍走旧缓存/旧默认逻辑”
    • backend 已在 workbench 新增:
    • 当前 Launch 实际配置摘要
    • 该摘要会由 backend 代读当前 launch 对应 manifest,并直接显示:
    • configUrl
    • releaseId
    • manifestUrl
    • schemaVersion
    • playfield.kind
    • game.mode
    • 这块摘要只用于联调排查,不参与正式客户端运行链路
  • 需要对方确认什么:
    • frontend 请先排查并回传这 4 项事实:
    • POST /events/{eventPublicID}/launch 响应里的:
      • launch.config.configUrl
      • launch.resolvedRelease.manifestUrl
      • launch.config.releaseId
    • 地图页/运行时真正读取的最终 manifest URL
    • 最终加载后的 manifest 摘要:
      • schemaVersion
      • playfield.kind
      • game.mode
    • 如仍表现为顺序赛,请同时给出:
      • 控制台日志
      • 网络请求日志
      • 是否存在本地缓存/上次 session 恢复痕迹
  • 是否已解决:否

B2F-001

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • backend 当前主链已经可联调:
    • POST /auth/login/wechat-mini
    • GET /me/entry-home
    • GET /events/{eventPublicID}/play
    • POST /events/{eventPublicID}/launch
    • POST /sessions/{sessionPublicID}/start
    • POST /sessions/{sessionPublicID}/finish
    • GET /sessions/{sessionPublicID}/result
    • 当前建议统一使用 demo 入口:
    • eventPublicID = evt_demo_001
    • channelCode = mini-demo
    • channelType = wechat_mini
  • 需要对方确认什么:
    • frontend 是否按这组 demo 数据作为当前唯一联调入口
  • 是否已解决:否

B2F-002

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • 进入游戏的正式流程必须以 launch 返回值为准
    • backend 当前约定字段:
    • launch.resolvedRelease.releaseId
    • launch.resolvedRelease.manifestUrl
    • launch.resolvedRelease.manifestChecksumSha256
    • launch.config.configUrl
    • launch.config.configLabel
    • launch.config.releaseId
    • launch.config.routeCode
    • launch.business.sessionId
    • launch.business.sessionToken
    • launch.business.sessionTokenExpiresAt
  • 需要对方确认什么:
    • frontend 是否确认正式流程只消费上述字段,不再自行推断 release URL
  • 是否已解决:否

B2F-015

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • backend 已阅读前端多赛道文档:
    • 多赛道 Variant 五层设计草案
    • 多赛道 Variant 前后端最小契约
    • 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 可按这组字段开始第一阶段联调
  • 是否已解决:是

已确认

B2F-033

  • 时间:2026-04-03 17:25:35
  • 谁提的:backend
  • 当前事实:
    • backend 已把玩法切换对应的联调资源补齐到 workbench:
    • presentation schema
    • content manifest
    • asset manifest
    • 玩法切换现在会自动填真实 dev 资源地址,不再继续保留 example.com 占位:
    • GET /dev/demo-assets/presentations/{demoKey}
    • GET /dev/demo-assets/content-manifests/{demoKey}
    • 当前联调样例文案也已统一成中文活动样例,便于 frontend 直接核对页面显示与日志事实
  • 需要对方确认什么:
    • frontend 如需核对当前玩法对应的展示/内容输入,可直接对照 workbench 当前表单值与上述两条 dev 资源地址
  • 是否已解决:是

B2F-027

  • 时间:2026-04-03 14:37:00
  • 谁提的:backend
  • 当前事实:
    • workbench 已提供 3 个显式玩法测试入口:
    • Use Classic Demo
    • Use Score-O Demo
    • Use Manual Variant Demo
    • 对应联调 event 为:
    • evt_demo_001
    • evt_demo_score_o_001
    • evt_demo_variant_manual_001
    • 积分赛入口已固定到:
    • rel_demo_score_o_001
    • score-o.json
  • 需要对方确认什么:
    • frontend 后续若要测顺序赛或积分赛,优先使用上述显式入口,而不是自行猜 event/release
  • 是否已解决:是

B2F-026

  • 时间:2026-04-03 14:29:42
  • 谁提的:backend
  • 当前事实:
    • backend 已把 manual 多赛道 demo 的赛道输入切到真实 KML
    • 当前 Bootstrap Demo 会准备两条真实赛道输入:
    • variant_a -> c01.kml
    • variant_b -> c02.kml
    • 当前地图仍继续共用同一组真实 tiles / mapmeta,这符合当前多赛道联调阶段的实际需要
  • 需要对方确认什么:
    • frontend 如需回归 manual 多赛道,请先重新执行一次 Bootstrap Demo
  • 是否已解决:是

B2F-025

  • 时间:2026-04-03 14:21:24
  • 谁提的:backend
  • 当前事实:
    • backend 已开始“真实输入替换第一刀”
    • 当前 Bootstrap Demo 不再给生产骨架使用 example.com 占位赛道/地图地址
    • 当前已改成真实可访问输入:
    • CourseSource.fileUrl = https://oss-mbh5.colormaprun.com/gotomars/kml/lxcb-001/10/c01.kml
    • TileRelease.tileBaseUrl = https://oss-mbh5.colormaprun.com/gotomars/map/lxcb-001/tiles/
    • TileRelease.metaUrl = https://oss-mbh5.colormaprun.com/gotomars/map/lxcb-001/tiles/meta.json
    • 这批真实输入仍走同一条一键回归链,不要求 frontend 改联调方式
  • 需要对方确认什么:
    • frontend 如需复验真实输入,请重新执行一次 Bootstrap Demo
  • 是否已解决:是

B2F-024

  • 时间:2026-04-03 20:10:25
  • 谁提的:backend
  • 当前事实:
    • backend 已确认 evt_demo_variant_manual_001 曾存在历史残留的 launched session,导致 play.primaryAction=continue
    • backend 已把清理逻辑并入 POST /dev/bootstrap-demo
    • 现在每次准备 demo 数据时,都会自动把 demo event 下残留的:
    • launched
    • running session 改成 cancelled
    • 这意味着前端后续再用标准测试链回归时,不需要手工清理旧 demo ongoing
  • 需要对方确认什么:
    • frontend 遇到这类“明明本地没有恢复快照,但后端仍返回 continue”的情况,优先先重新执行一次 Bootstrap Demo
  • 是否已解决:是

B2F-023

  • 时间:2026-04-03 13:24:38
  • 谁提的:backend
  • 当前事实:
    • backend 已把标准联调回归收成一键流
    • workbench 当前新增:
    • 一键标准回归
    • 回归结果汇总
    • 这条链会在标准发布链之后继续自动验证:
    • GET /events/{eventPublicID}/play
    • POST /events/{eventPublicID}/launch
    • GET /sessions/{sessionPublicID}/result
    • GET /me/sessions
    • GET /me/results
    • 回归结果会直接显示分项通过/未通过,不再要求 frontend 自己口头判断
  • 需要对方确认什么:
    • frontend 当前回归优先使用这条一键标准回归链
  • 是否已解决:是

B2F-022

  • 时间:2026-04-03 13:18:42
  • 谁提的:backend
  • 当前事实:
    • backend 当前已进入“联调标准化阶段”
    • 当前推荐 frontend 优先使用 workbench 的:
    • Bootstrap Demo
    • 一键补齐 Runtime 并发布 作为联调回归入口
    • backend 现在提供的不是零散 demo 文本,而是一套可重复创建的真实测试对象:
    • place
    • map asset
    • tile release
    • course source
    • course set
    • course variant
    • runtime binding
    • presentation
    • content bundle
    • release
    • 如果联调失败,workbench 当前会直接给出:
    • 分步日志
    • 真实错误消息
    • stack
    • 最后一次 curl
    • 预期判定
  • 需要对方确认什么:
    • frontend 回归时优先基于这条一键测试链,不再先手工拼测试数据
  • 是否已解决:是

B2F-019

  • 时间:2026-04-03 12:36:15
  • 谁提的:backend
  • 当前事实:
    • backend 已完成活动运营域第二阶段第四刀的后台最小实现:
    • presentation import
    • event 默认 active 绑定
    • publish 默认继承
    • 本刀没有改前端当前稳定消费字段语义:
    • resolvedRelease
    • business
    • variant
    • runtime
    • presentation
    • contentBundle
    • 这次新增能力主要影响后台运营链和发布默认行为,不要求 frontend 立即改接入
  • 需要对方确认什么:
  • 是否已解决:是

B2F-018

  • 时间:2026-04-03 11:22:50
  • 谁提的:backend
  • 当前事实:
    • backend 已进入活动运营域第二阶段第二刀
    • 当前客户端可消费新增摘要:
    • GET /events/{eventPublicID} 返回:
      • currentPresentation
      • currentContentBundle
    • GET /events/{eventPublicID}/play 返回:
      • currentPresentation
      • currentContentBundle
    • POST /events/{eventPublicID}/launch 返回:
      • launch.presentation
      • launch.contentBundle
    • 当前字段只做摘要透出,不下发复杂 schema
    • 当前旧字段保持完全兼容:
    • resolvedRelease
    • business
    • variant
    • runtime
  • 需要对方确认什么:
    • frontend 后续如要消费活动运营域摘要,先以这些新增摘要字段为准
  • 是否已解决:是

B2F-003

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

B2F-004

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • 正式联调时不应回退到本地样例配置路径
    • 不应直接读取根目录 event/*.json
    • 应只认 launch 返回的 manifestUrl
  • 需要对方确认什么:
  • 是否已解决:是

B2F-005

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • 接口说明优先看 workbench 里的中文 API 列表
    • 深入字段说明再看 接口清单
  • 需要对方确认什么:
  • 是否已解决:是

B2F-006

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • backend 已确认“放弃恢复”官方语义为 POST /sessions/{sessionPublicID}/finishstatus=cancelled
    • 同一局的旧 sessionToken 在该场景允许继续用于 finish(cancelled)
    • cancelledfailed 后都不会再作为 ongoingSession 返回
  • 需要对方确认什么:
    • frontend 可正式把“放弃恢复”接到 finish(cancelled)
  • 是否已解决:是

B2F-007

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • backend 已把 start / finish 收口成幂等处理
    • 重复 start
    • launched -> 推进到 running
    • running / 终态 -> 直接返回当前 session
    • 重复 finish
    • 已终态 -> 直接返回当前 session / result
  • 需要对方确认什么:
    • 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 口径的代码回归确认
    • 当前实现中:
    • 只有 launchedrunning 会被识别为 ongoing
    • cancelledfailedfinished 都不会再进入 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 口径继续回归
  • 是否已解决:是

阻塞

B2F-008

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • 如果 frontend 再出现 manifest 加载失败,backend 仅靠一句“加载失败”无法定位
  • 需要对方确认什么:
    • 如再出现此类问题,请一次性提供:
    • eventPublicID
    • releaseId
    • manifestUrl
    • 页面报错文案
    • 控制台日志
    • 网络请求日志
  • 是否已解决:否

已完成

B2F-009

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • backend 已修复 publish build 只写 DB、不上传 OSS 的问题
    • 新发布的 demo release manifest 已可正常访问
    • 当前可用 release:
    • eventPublicID = evt_demo_001
    • releaseId = rel_e7dd953743c5c0d2
    • manifestUrl = https://oss-mbh5.colormaprun.com/gotomars/event/releases/evt_demo_001/rel_e7dd953743c5c0d2/manifest.json
  • 需要对方确认什么:
  • 是否已解决:是

B2F-010

  • 时间:2026-04-01
  • 谁提的:backend
  • 当前事实:
    • backend workbench 已支持中文 API 列表
    • 当前可用于日常联调:
    • POST /dev/bootstrap-demo
    • GET /dev/workbench
  • 需要对方确认什么:
  • 是否已解决:是

B2F-011

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • backend 已新增后台第一版资源对象接口:
    • /admin/maps
    • /admin/playfields
    • /admin/resource-packs
    • backend 已新增后台 event 组装接口:
    • /admin/events
    • /admin/events/{eventPublicID}/source
    • 这批接口主要服务后续后台配置运营,不影响当前小程序主链联调
  • 需要对方确认什么:
  • 是否已解决:是

B2F-012

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • backend 已补后台运营闭环接口:
    • GET /admin/events/{eventPublicID}/pipeline
    • POST /admin/sources/{sourceID}/build
    • GET /admin/builds/{buildID}
    • POST /admin/builds/{buildID}/publish
    • 当前后台侧已经可以完成:
    • 资源对象录入
    • event source 组装
    • preview build
    • publish release
  • 需要对方确认什么:
  • 是否已解决:是

B2F-013

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • backend 已补后台 rollback 接口:
    • POST /admin/events/{eventPublicID}/rollback
    • 当前后台侧已具备完整最小闭环:
    • 资源对象
    • event source 组装
    • build
    • publish
    • rollback
  • 需要对方确认什么:
  • 是否已解决:是

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
  • 需要对方确认什么:
  • 是否已解决:是

B2F-020

  • 时间:2026-04-03 09:43:20
  • 谁提的:backend
  • 当前事实:
    • backend 已在保持旧字段不变的前提下,为 launch 新增兼容字段:
    • launch.runtime
    • 当前最小字段包括:
    • runtimeBindingId
    • placeId
    • mapId
    • tileReleaseId
    • courseSetId
    • courseVariantId
    • 这是一组新增字段,不替代也不改变现有:
    • resolvedRelease
    • business
    • variant
    • frontend 当前可以忽略该字段,也可以开始做观测和日志透出
  • 需要对方确认什么:
  • 是否已解决:是

B2F-021

  • 时间:2026-04-03 12:14:21
  • 谁提的:backend
  • 当前事实:
    • backend 已完成活动运营域第二阶段第三刀第一版
    • 当前活动运营摘要已统一补齐最小字段:
    • currentPresentation.templateKey
    • currentPresentation.version
    • currentContentBundle.bundleType
    • currentContentBundle.version
    • launch.presentation.templateKey
    • launch.presentation.version
    • launch.contentBundle.bundleType
    • launch.contentBundle.version
    • 上述字段当前已在以下接口可用:
    • GET /events/{eventPublicID}
    • GET /events/{eventPublicID}/play
    • POST /events/{eventPublicID}/launch
    • 旧字段继续完全兼容:
    • resolvedRelease
    • business
    • variant
    • runtime
  • 需要对方确认什么:
    • frontend 如果开始消费活动运营摘要细项,请优先读取新增的 templateKey / version / bundleType
  • 是否已解决:是

下一步

B2F-014

  • 时间:2026-04-02
  • 谁提的:backend
  • 当前事实:
    • session P0 已完成一轮收口
    • 当前最值得继续联调确认的是:
    • 放弃恢复 -> finish(cancelled)
    • failed / cancelled 后 ongoing 消失
    • 重复 start / finish 不再打断主链
  • 需要对方确认什么:
    • frontend 当前优先配合:
    • 用当前 demo release 回归 play -> launch -> map load
    • 回归“继续恢复 / 放弃恢复”两条路径
    • 如确认进入多赛道第一阶段联调,请先回复 B2F-015
    • 如发现状态口径不一致,直接在 f2b.md 标具体接口和返回值
  • 是否已解决:否