04: real 生命周期与 mock 同构启动契约
Type: grilling
Status: resolved
Labels: wayfinder:grilling
Blocked by: None
Question
锁定前端 real 数据源的生命周期,使配置只替换 transport,不改变页面取数和状态机行为。
Answer
一、启动范围(Q2)
- real 与 mock 生命周期完全同构:外壳在 real 模式下照搬 mock 分支的全部自动初始化——地图摘要第 1 页、共享详情分区、四个模式面板(基础设施 / 运行监测 / 预警处置 / 总体概览)、WebSocket 直订、新鲜度 tick。
- 唯一差别是 transport(统一出口走真实 baseUrl、WS 连真实地址);real 不注册契约化 mock;其它代码路径不改。
- 启动顺序沿用既有纪律:先把筛选交给地图,再取第 1 页(避免「第一屏没筛上」)。
二、失败语义(Q3)
- real 失败与 mock 同一套分区状态语义:失败只标相关分区
UNAVAILABLE(或对应 REQUEST_REASON),保留成功分区与地图骨架;不回退 mock、不整页遮罩、不跳登录。
- 真实请求 400 里的业务失效态(如
SNAPSHOT_EXPIRED)照旧读响应载荷归类;未授权(401/403)只标分区不可用。
三、WebSocket(Q4 / F2)
- 连接生命周期与 mock 同构:real 用同一入口连真实地址,
cockpitSubscribe 直订(免鉴权已落地),断线按既有退避重连。
- #04 只定连接生命周期(连接 / 直订 / 重连 / 退避);报警—工单闭环的增量帧字段解析与合并归 #01 的执行票,不在本票定义字段语义。
四、新鲜度 tick(Q5 / F3)
- tick 扩展为全套:地图摘要
refresh() + 当前模式相关 store 的 loadPanels();成败统一交给新鲜度记账(连续两周期失败=过期/不可用,既有模型)。
- 刷新调度以 #04 为唯一权威:#02(自动分批与刷新时机)、#03(数据时间 refresh 时机)的执行票只提需求、引用本票,不各自另实现一套自动刷新。
五、竞态与重试(Q6)
- 沿用既有纪律:并发取、各自成败;请求序号(token)纪律丢弃迟到响应;失败不自动无限重试,靠新鲜度周期或手动刷新把分区救活。
六、mock↔real 边界(F1 / F6)
- 严格不回退:real 失败就是
UNAVAILABLE,不提供运行时切回 mock 的入口;要演示 mock 就改配置重启。
- real 但未配
api.baseUrl → 所有分区显示 UNAVAILABLE(原因 NO_BASE_URL),界面如实说明「real 模式未配置接口地址」;不静默回退 mock、不假装已连上。
七、DEV 走查钩子(F4)
- 复用既有全局键(WS 场景键、新鲜度强制失败键),它们只在 mock 分支生效;real 的失败路径用真实网络中断/后端临时下线模拟,不为 real 新增专属钩子。
八、首批验收(Q7)
- 端到端证据(不能只证明 service 能单独发请求):配置 real + 真实 baseUrl → 进入
/cockpit → 地图自动加载第 1 页、四个模式面板自动取数、WS 直订收到帧、新鲜度 tick 执行;至少一个分区返回真实非空数据;失败分区显示 UNAVAILABLE;走查断言 data-*。
- 与 #05 分工:#04 证明「生命周期确实在跑」,#05 登记「用什么基线/环境/数据快照」。
九、边界
- 增量帧业务解析(#01)、时间字段刷新时机(#03)、状态筛选自动刷新(#02)均引用本票结论,不重复决定。
- 后端接口是否就绪不在本票决定范围(#05 管联调基线与证据登记)。
状态
已解决。 real 与 mock 同构启动、失败语义、WS 连接生命周期、新鲜度 tick 范围、竞态纪律、不回退 mock 边界、DEV 钩子策略与端到端验收标准均已确认。前端执行票按本票结论接线;#05 承接联调基线登记。