# B2T 协作清单
> 文档版本：v1.22
> 最后更新：2026-04-03 19:21:23

说明：

- 本文件由 backend 维护，写给总控线程
- 只写事实和请求
- 不写长讨论稿
- 每条固定包含：时间、谁提的、当前事实、需要对方确认什么、是否已解决

---

## 待确认

### B2T-009

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - 总控线程在 [t2b.md](D:/dev/cmr-mini/t2b.md) v1.1 中，已确认 backend 可按增量演进推进第一阶段生产骨架
  - backend 准备按已确认顺序开工：
    - `Place`
    - `MapAsset`
    - `TileRelease`
    - `CourseSource`
    - `CourseSet`
    - `CourseVariant`
    - `MapRuntimeBinding`
  - `EventPresentation` 和 `ContentBundle` 先保留对象语义，第二阶段补完整落库
- 需要对方确认什么：
  - 无新的确认项；本条仅保留为“准备开工”记录
- 是否已解决：是

---

## 已确认

### B2T-031

- 时间：2026-04-03 19:21:23
- 谁提的：backend
- 当前事实：
  - frontend 本轮已通过结构化调试日志确认以下链路正常：
    - 活动列表页当前能稳定拿到 3 张 demo 卡片
    - 多赛道入口点击后能进入正确活动：
      - `evt_demo_variant_manual_001`
    - 多赛道详情当前已拿到：
      - `assignmentMode = manual`
      - `variantCount = 2`
      - `detailCanLaunch = true`
      - 当前发布 `presentation / content bundle` 摘要正常
  - backend 当前可确认：
    - manual 多赛道 demo 的当前发布 release 已切到正确版本
    - 活动列表最小产品化第一刀与前端当前接线口径一致
  - frontend 最新 `f2b.md` 当前也已将：
    - `F2B-014`
    标记为已确认
  - 当前仍留一条未完全收口的旧项：
    - `F2B-011`
    - 即 demo 活动历史 ongoing session 回收口径，需要后续单独收掉
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-029

- 时间：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`
  - 当前实现继续保持：
    - 不新增对象层级
    - 不改活动详情页现有语义
    - `currentPresentation / currentContentBundle` 仍表示当前已发布 release 摘要
  - backend 同时已通过 `0011_card_summary.sql` 给 `cards` 落了显式字段：
    - `is_default_experience`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-028

- 时间：2026-04-03 16:16:38
- 谁提的：backend
- 当前事实：
  - backend 已新增 dev 调试日志入口：
    - `POST /dev/client-logs`
    - `GET /dev/client-logs`
    - `DELETE /dev/client-logs`
  - workbench 已新增 `前端调试日志` 面板，用于直接查看 frontend 主动上报的关键事实
  - 这套能力只服务联调排查，不替代正式生产日志体系
  - 当前目标是把“截图 + 口头描述”进一步收口成结构化事实，便于 backend 直接定位前端消费链问题
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-027

- 时间：2026-04-03 15:29:07
- 谁提的：backend
- 当前事实：
  - backend 已在 workbench 新增：
    - `当前 Launch 实际配置摘要`
  - 该摘要由 backend 代读当前 launch 对应 manifest，用于统一显示：
    - `configUrl`
    - `releaseId`
    - `manifestUrl`
    - `schemaVersion`
    - `playfield.kind`
    - `game.mode`
  - 该能力只用于联调排查，避免浏览器直接读取 OSS 时受跨域影响
  - 正式客户端链路不变，仍应直接消费：
    - `launch.config.configUrl`
    - `launch.resolvedRelease.manifestUrl`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-026

- 时间：2026-04-03 14:37:00
- 谁提的：backend
- 当前事实：
  - backend 已把当前两种核心玩法和 manual 多赛道都挂成显式 demo 入口：
    - 顺序赛：`evt_demo_001`
    - 积分赛：`evt_demo_score_o_001`
    - 多赛道：`evt_demo_variant_manual_001`
  - 其中积分赛入口已固定到远端发布配置：
    - `https://oss-mbh5.colormaprun.com/gotomars/event/score-o.json`
  - workbench 当前可直接切换三种玩法做标准联调
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-001

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - 总控线程已确认 backend 采用增量演进方式推进
  - 第一阶段不要求一次性推翻当前已稳定联调的：
    - `Event`
    - `EventRelease`
    - `Session`
    主链
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-002

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - 总控线程已确认第一阶段优先落库对象顺序：
    - `Place`
    - `MapAsset`
    - `TileRelease`
    - `CourseSource`
    - `CourseSet`
    - `CourseVariant`
    - `MapRuntimeBinding`
  - backend 接受这条顺序，后续按此推进
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-003

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - 总控线程已确认 `launch` 采用两阶段兼容
  - 第一阶段保留当前稳定联调字段：
    - `resolvedRelease`
    - `business`
    - `variant`
  - 第二阶段再补完整运行对象字段：
    - `placeId`
    - `mapId`
    - `tileReleaseId`
    - `courseVariantId`
    - `eventReleaseId`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-004

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - backend 认可总控线程的核心边界：
    - 客户端最终只消费发布产物
    - 不再直接消费原始 KML
    - 不再直接消费地图原始资产
  - 这与 backend 当前已稳定的：
    - `EventRelease`
    - `launch -> resolvedRelease`
    - `session -> result`
    主链一致
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-005

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - backend 认可总控线程提出的两域拆分：
    - 地图运行域
    - 活动运营域
  - `CourseVariant` 作为最终运行事实，也与当前多赛道第一阶段契约一致
- 需要对方确认什么：
  - 无
- 是否已解决：是

---

## 阻塞

- 当前无新增阻塞

---

## 已完成

### B2T-030

- 时间：2026-04-03 19:08:55
- 谁提的：backend
- 当前事实：
  - backend 当前已完成并稳定运行的主线可概括为三段：
    - 联调标准化阶段
    - 真实输入替换第一刀
    - 活动卡片列表最小产品化第一刀
  - 联调标准化阶段当前已具备：
    - 一键测试链
    - 详细日志
    - 稳定 demo 数据
    - workbench 回归结果汇总
    - frontend 调试日志通道
  - 真实输入替换第一刀当前已完成：
    - 真实 KML
    - 真实地图 URL
    - demo content manifest / presentation schema 通过 backend dev 资源入口提供
    - 中文活动文案样例
  - 活动卡片列表最小产品化第一刀当前已完成：
    - `GET /cards`
    - `GET /home`
    - `GET /me/entry-home`
    统一补齐活动卡片摘要字段
  - 当前卡片最小摘要字段包括：
    - `summary`
    - `status`
    - `statusCode`
    - `timeWindow`
    - `ctaText`
    - `isDefaultExperience`
    - `eventType`
    - `currentPresentation`
    - `currentContentBundle`
  - 当前阶段 backend 仍保持：
    - 不扩新对象层级
    - 不推翻现有 `Event / EventRelease / Session`
    - 继续以标准联调链为唯一基线
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-029

- 时间：2026-04-03 17:25:35
- 谁提的：backend
- 当前事实：
  - backend 已把“真实输入替换第一刀”继续推进到：
    - `content manifest`
    - `presentation schema`
    - 中文活动文案样例
  - 当前 workbench 的玩法切换会自动填充 backend 内置 demo 资源：
    - `GET /dev/demo-assets/presentations/{demoKey}`
    - `GET /dev/demo-assets/content-manifests/{demoKey}`
  - 这两条路由只服务联调，不进入正式客户端运行链路
  - `Bootstrap Demo` 当前准备的联调样例文案已统一为中文活动样例，不再继续暴露一批 `Demo ...` 名称
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-024

- 时间：2026-04-03 14:21:24
- 谁提的：backend
- 当前事实：
  - backend 已按 [t2b.md](D:/dev/cmr-mini/t2b.md) v1.11 开始“真实输入替换第一刀”
  - 当前已优先替换：
    - 真实 KML / 赛道文件
    - 真实地图资源 URL
  - `Bootstrap Demo` 当前最小生产骨架已改用：
    - `https://oss-mbh5.colormaprun.com/gotomars/kml/lxcb-001/10/c01.kml`
    - `https://oss-mbh5.colormaprun.com/gotomars/map/lxcb-001/tiles/`
    - `https://oss-mbh5.colormaprun.com/gotomars/map/lxcb-001/tiles/meta.json`
  - 当前仍保持同一条标准联调入口，不新增新流程
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-025

- 时间：2026-04-03 14:29:42
- 谁提的：backend
- 当前事实：
  - backend 已继续推进“真实输入替换第一刀”的 manual 多赛道部分
  - 当前 `Bootstrap Demo` 已为 demo course set 准备两条真实 KML 输入：
    - `c01.kml`
    - `c02.kml`
  - 当前 manual 多赛道 demo 的说明已同步为：
    - `variant_a -> c01.kml`
    - `variant_b -> c02.kml`
  - 当前仍沿用同一条标准联调入口，不新增新流程
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-023

- 时间：2026-04-03 13:24:38
- 谁提的：backend
- 当前事实：
  - backend 已把标准联调入口继续固化为一键回归流
  - workbench 当前新增：
    - `一键标准回归`
    - `回归结果汇总`
  - 这条链当前会在：
    - `Bootstrap Demo`
    - `一键补齐 Runtime 并发布`
    之后，继续自动验证：
    - `play`
    - `launch`
    - `result`
    - `history`
  - 回归汇总当前会直接显示：
    - 分项通过/未通过
    - `Session ID`
    - 总判定
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-021

- 时间：2026-04-03 13:18:42
- 谁提的：backend
- 当前事实：
  - backend 已根据 [t2b.md](D:/dev/cmr-mini/t2b.md) v1.10 的最新口径，切入“联调标准化阶段”
  - 当前 backend 主线不再是继续扩对象或扩 workbench 管理能力
  - 当前统一收口为 3 个目标：
    - 固化“一键测试”链路
    - 固化详细日志口径
    - 固化稳定测试数据
  - 当前最推荐联调方式为：
    - `Bootstrap Demo`
    - `一键补齐 Runtime 并发布`
  - 这条链当前已可从空白环境直接跑通，并可输出：
    - 分步日志
    - 真实错误
    - stack
    - 最后一次 curl
    - 预期判定
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-019

- 时间：2026-04-03 13:04:32
- 谁提的：backend
- 当前事实：
  - backend 已把当前联调环境补成“一键测试环境”
  - `/dev/bootstrap-demo` 不再只准备：
    - `tenant`
    - `channel`
    - `event`
    - `release`
    - `source`
    - `build`
    - `card`
  - 现在还会一并准备并回填：
    - `place`
    - `map asset`
    - `tile release`
    - `course source`
    - `course set`
    - `course variant`
    - `runtime binding`
  - workbench 的：
    - `Bootstrap Demo`
    - `一键补齐 Runtime 并发布`
    已可从空白状态直接跑完整测试链
  - workbench 日志现在会输出：
    - 分步执行日志
    - 真实错误消息
    - stack
    - 最后一次 curl
    - 最终预期判定
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-018

- 时间：2026-04-03 12:36:15
- 谁提的：backend
- 当前事实：
  - backend 已完成“活动运营域第二阶段第四刀”最小实现
  - 已新增：
    - `POST /admin/events/{eventPublicID}/presentations/import`
    - `POST /admin/events/{eventPublicID}/defaults`
  - `events` 已新增默认 active 绑定列：
    - `current_presentation_id`
    - `current_content_bundle_id`
    - `current_runtime_binding_id`
  - `publish` 在未显式传入：
    - `runtimeBindingId`
    - `presentationId`
    - `contentBundleId`
    时，会优先继承 event 默认 active 绑定
  - workbench 已补最小验证入口：
    - `Import Presentation`
    - `Save Event Defaults`
    - `Publish Build` 空参继承验证
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-007

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - backend 已具备当前稳定主链：
    - 统一登录
    - entry/home
    - event play
    - launch
    - session start / finish
    - result / history
  - backend 已具备：
    - 配置 source / build / release
    - 最小后台资源对象
    - 多赛道第一阶段最小契约
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-011

- 时间：2026-04-03 09:09:07
- 谁提的：backend
- 当前事实：
  - backend 已开始第一阶段生产骨架实施
  - `0008_production_skeleton.sql` 已落库到 `cmr20260401`
  - 当前已新增并可用的后台生产接口覆盖：
    - `Place`
    - `MapAsset`
    - `TileRelease`
    - `CourseSource`
    - `CourseSet`
    - `CourseVariant`
    - `MapRuntimeBinding`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-012

- 时间：2026-04-03 09:23:03
- 谁提的：backend
- 当前事实：
  - backend 已按 [t2b.md](D:/dev/cmr-mini/t2b.md) 第 5 步要求，把第一阶段生产骨架对象接入 `/dev/workbench`
  - 当前联调台已覆盖：
    - `Place`
    - `MapAsset`
    - `TileRelease`
    - `CourseSource`
    - `CourseSet`
    - `CourseVariant`
    - `MapRuntimeBinding`
  - 当前 workbench 只做：
    - `list`
    - `create`
    - `detail`
    - `binding`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-013

- 时间：2026-04-03 09:27:18
- 谁提的：backend
- 当前事实：
  - backend 已整理第一阶段生产骨架最小操作顺序
  - 当前推荐 workbench 联调路径为：
    - `Place`
    - `MapAsset`
    - `TileRelease`
    - `CourseSource`
    - `CourseSet`
    - `CourseVariant`
    - `MapRuntimeBinding`
  - 该顺序已写入 [开发说明.md](D:/dev/cmr-mini/backend/docs/开发说明.md)
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-015

- 时间：2026-04-03 09:43:20
- 谁提的：backend
- 当前事实：
  - backend 已完成“第三刀最小接线”第一版：
    - `MapRuntimeBinding -> EventRelease`
    - `launch.runtime` 兼容新增
  - 当前新增能力：
    - `GET /admin/releases/{releasePublicID}`
    - `POST /admin/releases/{releasePublicID}/runtime-binding`
  - 当前 `launch` 在保持旧字段不变的前提下，新增：
    - `launch.runtime.runtimeBindingId`
    - `launch.runtime.placeId`
    - `launch.runtime.mapId`
    - `launch.runtime.tileReleaseId`
    - `launch.runtime.courseSetId`
    - `launch.runtime.courseVariantId`
  - `/dev/workbench` 已补最小验证入口：
    - `Get Release`
    - `Bind Runtime`
- 需要对方确认什么：
  - 无
- 是否已解决：是

---

## 下一步

### B2T-022

- 时间：2026-04-03 13:18:42
- 谁提的：backend
- 当前事实：
  - backend 当前已具备“一键测试环境”与最小生产骨架测试数据
  - 后续联调阶段如要进一步贴近生产，只需要逐步替换以下 demo 输入：
    - 地图资源 URL
    - KML / 赛道文件
    - ContentBundle manifest
    - Presentation schema
  - 当前不需要继续新增对象层级即可支撑联调
- 需要对方确认什么：
  - 总控后续如需要更接近生产的真实测试输入，请直接指定优先级最高的一类资源
- 是否已解决：否

### B2T-010

- 时间：2026-04-03 08:52:11
- 谁提的：backend
- 当前事实：
  - backend 已完成第一阶段生产骨架落库、最小模型接线和 workbench 联调台接入
  - `EventPresentation` 和 `ContentBundle` 仍先在文档与接口边界保留语义
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-014

- 时间：2026-04-03 09:27:18
- 谁提的：backend
- 当前事实：
  - backend 下一步建议开始做“第一阶段对象与现有 Event/Release 的最小接线”
  - 重点会围绕：
    - `MapRuntimeBinding -> EventRelease`
    - 运行对象如何逐步进入 `launch`
    - 保持当前两阶段兼容不破坏前端稳定链
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-016

- 时间：2026-04-03 09:43:20
- 谁提的：backend
- 当前事实：
  - 当前 release 与 runtime binding 的挂接已可单独验证
  - 第四刀目标是把 `runtimeBindingId` 直接接进 publish 流，减少一次手工挂接
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-017

- 时间：2026-04-03 10:46:00
- 谁提的：backend
- 当前事实：
  - backend 已完成第四刀第一版：
    - `POST /admin/builds/{buildID}/publish` 支持可选 `runtimeBindingId`
    - `POST /dev/config-builds/publish` 支持可选 `runtimeBindingId`
    - 发布成功后返回 `runtime`
  - `/dev/workbench` 发布区已支持直接填写 `Runtime Binding ID`
  - 旧的“先 publish，再 bind runtime”路径继续保留
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-018

- 时间：2026-04-03 11:02:42
- 谁提的：backend
- 当前事实：
  - backend 已完成活动运营域第二阶段第一版：
    - `0009_event_ops_phase2.sql` 已落库到 `cmr20260401`
    - 新增：
      - `event_presentations`
      - `content_bundles`
    - `event_releases` 已明确支持绑定：
      - `presentation_id`
      - `content_bundle_id`
      - `runtime_binding_id`
  - 当前新增后台接口：
    - `GET/POST /admin/events/{eventPublicID}/presentations`
    - `GET /admin/presentations/{presentationPublicID}`
    - `GET/POST /admin/events/{eventPublicID}/content-bundles`
    - `GET /admin/content-bundles/{contentBundlePublicID}`
  - `publish` 当前已支持可选直接挂接：
    - `runtimeBindingId`
    - `presentationId`
    - `contentBundleId`
  - `/dev/workbench` 已补最小验证入口：
    - `Create Presentation`
    - `Create Bundle`
    - 发布区填写 `Presentation ID / Content Bundle ID / Runtime Binding ID`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-019

- 时间：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`
  - `publish` 当前在未显式传入：
    - `presentationId`
    - `contentBundleId`
    时，会优先按 event 当前默认的 active 配置自动补齐
  - 旧字段和旧语义保持不变：
    - `resolvedRelease`
    - `business`
    - `variant`
    - `runtime`
- 需要对方确认什么：
  - 无
- 是否已解决：是

### B2T-020

- 时间：2026-04-03 12:14:21
- 谁提的：backend
- 当前事实：
  - backend 已完成“活动运营域第二阶段第三刀”第一版：
    - `event detail / play / launch / release detail` 已统一补齐活动运营摘要
    - `presentation` 摘要当前最少带：
      - `presentationId`
      - `templateKey`
      - `version`
    - `contentBundle` 摘要当前最少带：
      - `contentBundleId`
      - `bundleType`
      - `version`
  - backend 已新增最小导入入口：
    - `POST /admin/events/{eventPublicID}/content-bundles/import`
  - 当前导入入口先只记录：
    - `bundleType`
    - `sourceType`
    - `manifestUrl`
    - `version`
    - `assetManifest`
  - `/dev/workbench` 已补：
    - `Import Bundle`
    - API 目录中的导入接口说明
- 需要对方确认什么：
  - 无
- 是否已解决：是
