04-real-lifecycle-contract.md 3.9 KB

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 承接联调基线登记。