# 14: 前端执行票 —— real 生命周期接线 + 状态筛选/自动加载/饼图 Type: task Status: resolved Label: ready-for-agent Blocked by: 02, 04 Category: frontend-execution Assignee: agent ## 来源 - 决策:[04 real 生命周期与 mock 同构启动契约](04-real-lifecycle-contract.md)、[02 地图摘要状态筛选与未关联设备语义](02-map-status-filter-and-unassociated-devices.md) - 规格:[09 real 生命周期规格](09-real-lifecycle-spec.md)、[07 地图摘要状态筛选规格](07-map-status-filter-spec.md) ## 状态 **前端执行票已完成(resolved)**。本次已在当前工作树的 `http://localhost:8001` 完成 t08 浏览器 15/15、t18 浏览器 40/40、t14 补充浏览器 7/7;逻辑回归 t08 44/44、t18 76/76。多选 OR、全局计数、饼图高亮、另有 N 台、自动分批、real 自动启动/401 分区隔离/NO_BASE_URL 不回退已验证。real transport 的受控 HTTP 响应验证不是正式后端业务联调;真实接口联调仍归票 18。 ## 进度:100% 本票范围实施与规定验收完成。未运行 build;用户明确授权本次 dev 与浏览器走查。 ## 范围(做什么) 1. **real 生命周期接线**:外壳 real 分支照搬 mock 全部自动初始化(地图第 1 页、四模式面板、WS 直订、新鲜度 tick 全套);失败同套分区语义、严格不回退 mock、未配 baseUrl 如实报不可用;刷新调度以 #04 为唯一权威。 2. **状态筛选与自动加载**:顶部状态栏=全局组合筛选入口(八桶多选 OR、全局未筛计数、选中高亮、行常驻可点);`pointStatus` 多值契约;移除"加载下一页/刷新快照"按钮,右上角留 🔄 手动刷新;自动分批加载到完成;坐标汇总筛选后口径。 3. **饼图**:监测分布面板状态统计改饼图,消费全局未筛分布并高亮当前选中;面板不再自带筛选入口。 4. **展开点位命中设备子集**:只显示命中设备 + 「另有 N 台」可展开;总数/已上图口径如实。 ## 非目标 - 不实现后端契约(多值 pointStatus、命中设备子集、八桶计数)——这些是后端执行票(12 及后续)的工作;前端先按规格接好消费侧并如实降级。 - 不实现真实联调(归联调基线流程)。 ## 验收(后续执行) 零依赖逻辑闸门 +浏览器走查(`data-*`:状态栏多选、🔄 刷新、饼图、另有 N 台、自动分批加载完成态、失败分区 UNAVAILABLE)。 ## 关联 - 上游:规格 07/09、决策 02/04 - 下游:可与 15/16 并行 ## Comments ### 2026-10-08 认领与阶段判定 - 已认领(agent 会话执行,`Assignee: agent`)。本票无 `needs-triage` 标签、`ready-for-agent`、前置决策 02/04 已 resolved、规格 07/09 已发布,判定处于「可实施」阶段,直接进入实施。 - 实施范围=票面「范围」四条:① real 生命周期接线(外壳 real 分支照搬 mock 自动初始化);② 状态筛选与自动加载(顶部状态栏全局组合筛选、`pointStatus` 多值、移除加载下一页/刷新快照、🔄 手动刷新、自动分批加载、坐标汇总筛选后口径);③ 监测分布饼图(消费全局未筛分布、高亮选中、面板去筛选入口);④ 展开点位命中设备子集(「另有 N 台」、总数/已上图口径)。 - 非目标遵守:不实现后端契约(多值 pointStatus、命中设备子集、八桶计数归后端执行票 12+);真实联调归票 18。 - 遵循仓库 AGENTS.md:实施后不运行 build/dev/浏览器走查,只做零依赖逻辑闸门的静态核验。 ### 执行核验(接续会话) - 阶段判断:无 `needs-triage`;`ready-for-agent`;依赖 02/04 已关闭 → 实施阶段。认领沿正文 `Assignee: agent` 与 2026-10-08 评论(deck 写认领被文件沙箱拒绝,以正文为准)。 - 现状核验(对抗式,按票面四条范围逐条对照代码事实): ① real 同构启动:`domain/startupPlan.js` 纯函数 + 外壳按清单执行;real 不注册 mock,失败分区 `UNAVAILABLE` / `NO_BASE_URL`,无回退 mock 路径(t04/t08 断言覆盖)。 ② 状态筛选与自动加载:`filterStore` 多值八桶(空=全部、白名单、toggle);`mapStore` 装载链 refresh 自动分批到完成(纪元号丢弃迟到链);`MapCanvas` 顶部状态栏八桶多选、全局未筛计数、行常驻可点;「加载下一页/刷新快照」按钮已移除,右上角 🔄 手动刷新保留(`data-map-refresh`)。 ③ 饼图:`domain/statusPie.js` + `PanelBlocks` pie 块(`data-pie-*`),消费 `mapStore.statusDistribution` 全局未筛分布、高亮当前选中、面板无筛选入口;分布未发布时如实说明(不伪造全零饼图)。 ④ 命中设备子集:`domain/deviceLayer.js` `UNMATCHED` 归类 + `PointDetailCard`「另有 N 台」展开(`data-device-more-*`),总数/已上图口径按快照 `deviceCodes` 与命中子集分列。 - 本轮修复:① 外壳 `LOAD_SHARED_SECTIONS` 显式下发 config(`loadSharedSections` 对 mapStore 的合并式 setup 中 `config: undefined` 会覆盖已注入配置);② t04 硬编码地址守卫改为对代码正则(契约路径写在注释里被误判,沿 t18 `code()` 纪律);③ t08 G5 / t18 F3 断言对齐决策 02 的自动分批契约(旧断言停在「第 1 页等手动翻页」)。 - 闸门:t04 通过、t08 44/44、t16 43/43、t18 76/76 全绿;未触及的 t05/t09/t15/t42/t46 等未重跑。浏览器走查按仓库 AGENTS.md 规则跳过(未获本对话明确要求)。 - 结论:代码实施与静态闸门完成;**本票暂不关闭**——票面验收含浏览器走查,留待明确要求后收口;真实联调与阶段收口归票 18。 ### 最终验收与 Resolution - 用户授权开启 8001 服务并优先完成本票;当前工作树 t08 浏览器 15/15、t18 浏览器 40/40 全通过,补齐旧服务证据缺口。 - 新增 [t14 补充走查](../verify/t14-final-walkthrough.mjs),7/7:ALARM+WARNING 多选 OR、全局计数不变、饼图两个选中扇区及未选扇区变暗、有限几何、取消单桶保留另一桶、real transport 自动请求四模式与地图且 401 只使监测概览 UNAVAILABLE、缺 baseUrl 的地图/设备分区 UNAVAILABLE 且不回退 mock。 - 补充 real 场景使用受控 HTTP 响应证明生命周期与分区隔离,不冒称真实后端业务联调;后者归票 18。 - 对抗式走查发现并修复两处遗漏:monitoring/distribution mock 对多状态整串作单值比较,改复用 matchesStatusFilter;mapSnapshot 分区翻译 FAILED 时丢失 NO_BASE_URL 语义,改复用 sectionStateFromReason。 - 启动时另被并行资产工作中的 manifest 相对路径错误阻断,最小修复退四级后页面恢复。public 导入警告属于资产工作独立事项,本票不冒称构建通过。 - 回归:t08 逻辑 44/44、t18 逻辑 76/76。遵循 AGENTS.md 跳过 build;dev/浏览器因用户明确要求执行。 - Resolution:本票前端实施与规定验收通过,关闭。后续按地图推进前端票 15/16,真实接口联调与总收口归票 18。