map.md 115 KB

驾驶舱真实后端数据接线(决策地图)

Status: open Labels: wayfinder:map

本 effort 先产出跨前后端真实数据接线所需的决策,再为已收口的决策创建前端/后端执行票。地图不直接修改后端代码;后端执行票需在后端仓库、负责人和权限明确后开启。

Destination

为 /cockpit 四个只读一级模式建立一条可验收的真实数据接线路线:报警—工单闭环读模型 → 地图摘要 + 运行监测 → 基础设施 → 预警处置 → 总体概览。报警—工单阶段由外部业务系统执行工单流程,驾驶舱只读取并实时呈现真实报警、工单关系和状态,不提供任何写操作。

目的地达成的判据:后端契约与真实适配器已提交并通过测试,前端 real 生命周期与 mock 同构,真实联调基线(提交版本、环境、认证、只读数据源)已锁定,筛选/分页/快照/推送/空态/失败态语义通过验证,并完成真人团队的真实设备报警闭环验收;real 失败不回退 mock。

Notes

  • Domain:城市生命线 Web 驾驶舱。术语以 CONTEXT.md 为准;监测点、监测设备、地图摘要、快照、异常点不可混用。
  • 复用现有事实台账:后端契约缺口待办 及其 后端契约缺口交付包。后端 Gogs 真实数据接线(程序级)作为上位来源,但不作为唯一笼统执行票;后续按切片拆分粒度明确的后端票,并注明承接关系。
  • 已确认推进顺序:报警—工单闭环读模型 → 地图摘要 + 运行监测 → 基础设施 → 预警处置 → 总体概览。
  • 首阶段由外部业务系统完成工单流程,驾驶舱只读消费报警、工单、设备和监测点关系;后端拆为工单状态与处置率读模型、报警/工单回联读模型、实时同步三票,前端另建对应迁移/接线/实时消费票。
  • 已确认运行策略:默认 mock;real 必须由部署配置显式开启;真实请求失败只影响对应分区,不回退 mock,也不牵连其它分区。
  • 已确认业务口径:处置率 = 状态 5(已结案)工单数 / 状态 0–6 工单数,状态 7(取消)排除;数据库 create_time → Java createTime → API createdAt → 前端“数据时间”;maintainer、district、ownership_unit 各自保持字段语义,历史“责任区域”不属于本次目的地。
  • “异常”允许按监测点、监测设备/指标分别统计各自异常集合;预警处置地图的“异常点”仍只由设备 WARNING/ALARM 回联决定,不因统计总称扩大可见范围。
  • 驾驶舱鉴权范围已修订为只读 REST /api/cockpit/v1/** 与 WS /ws/deviceStatus 不鉴权;后端其他路径与未来写接口不受此变更影响。权威记录见旧鉴权决策与 ADR 0005,票 25 承接后端执行证据。
  • 技能:grilling、domain-modeling、research;决策票逐张处理,决策完成后再创建执行票。
  • 本地 tracker 仅支持 Markdown 的 Blocked by: 依赖表达,没有独立原生建边接口;本图按 tracker 规则落依赖并在建图后校验数量。

任务清单

tracker 重号已修(2026-10-12):坐标自动准入票原编号 32 与 32-32.md(管线构件 glTF 素材)重号,已改号为 34,全 effort 票号唯一性恢复。

Decisions so far

  • 批次二:点位摘要两级清单分页 — 已实施并关闭(2026-10-19,代码随本 commit 入库)。PointDetailCard.vue 三清单(设备卡片、关联设备图层清单、票 14「另有 N 台」展开子清单)接共享 PagerNav + pagedRows 单源,各自独立页码(稳定标量键),复位触发器收成 ${pointCode}|${deviceCode} 一个标量(票 43 教训:数组 getter 会让「同点位重进」假复位);票 42 口径逐条断言未动(store 仍全量、标题总数只认快照、互斥归类之和与图例合计不变);data-device-card 续全局下标(走查按第 N 台取数)。两条当次裁定:① 未命中子清单也 ≤10/页(「另有 N 台」的 N 仍报全量);② 本组件三处 pager 不画计数行——PagerNav 新增 show-count,默认 true ⇒ 批次一既有形态零变化(上方已有权威总数,并排再画「共 N 条」就是第二个总数口径)。t60 42/42(真实链路灌数 + 自定义渲染器跑真实 patch,成例同设备详情侧)+ 变异 10/10;t59/t46/t10/t41/t42/t43/t44 全绿且无需改写。真机走查归票 18/17。

  • 批次一:共享分页基建与设备详情三清单 — 已实施并关闭(2026-10-19,代码随本 commit 入库)。pagedRows 升格为单源 domain/pagination.js(PAGE_SIZE=10/pageWindow ≤7 全列、>7 收缩「1 … c−1 c c+1 … Y」/clampPage 跳页夹回不抛错;equipmentDetailView.js 原名兼容再导出=同一函数引用);共享 PagerNav.vue 落地页码直达 + 输入框跳页 + 计数行,受控组件、唯一 @page 出口携带绝对目标页码;设备详情三清单接入(预警/报警迁移 + 工单状态新分页)。t59 37/37 + 变异 13/13、t46 按成例改写后 54/54 + 变异 12/12、t41 SSR 9/9;t12 F11 箭头形参假红按成例修扫描器。真机走查归票 18 联调窗口。

  • 前端执行票 —— 运行概况顶部摘要折叠消息交互 — 三轮收口(2026-10-19,关闭并提交):① 一轮 hover/focus 展开被维护者裁定撤销,只留单一 summaryOpen + 原生 button click(Enter/Space/触屏同走,删掉会双触发的显式 keydown);② 折叠从运行概况推广到全部面板(用户点名总体概览-运行监测——其 gap=MONITORING_FAULT_GAP 原为头部外裸 <p>,一并收进);③ 第三轮按「故障口径也要进摘要」做完备性普查,发现折叠表本身不完备:真实注册表 15 面板的视图级说明字段并集 11 个而表内只有 8 个,漏掉的 note/linkNote/excludedNote 在渲染层从无消费点、界面上隐形(既有缺陷,非折叠引入;excludedNote 正是票 17/20「口径剔除要看得见」立场)。补齐三条并把完备性做成机制:t56 C 组=行为层双向普查(panelView() 真算 15 视图,domain 新增说明字段不进表判红、表内无声明判死接线;判据取真实视图对象而非正则,防票 43「守卫比要守的窄」),覆盖度哨兵钉 ≥12 面板与六类字段。每条保留原 data-*(v-show 折叠文本仍在 DOM,t17/t18/t20 零改动)、措辞全由 domain 单源、渲染层不认识 panelId;折叠态「有口径提示」判据扩到 gap||note||excludedNote。t56 32/32 + 变异 9/9(M8 改名绕表 / M9 新增不进表均被抓住)+ SFC 编译;t55/t20/t15/t27/t38/t39/t40/t43/t44/t50/t53/t54 回归全绿;t17/t18 导入期缺 export 与 t05 MapCanvas 为既有红、零交集。PanelBlocks.vue 与 map.md 均以 plumbing 限定提交只摘本票 hunks(工作树混有并行 57/59–68 在制品)。

  • 前端执行票 —— 监测分布口径块字号与共享行块视觉对齐 — rows renderer 统一 --fs-caption 与 line-height: 1.35,字段/数据口径不变;静态守卫 5/5,通过后关闭。

  • 后端执行票 —— 单设备业务优先级裁定落地(全部报警均有未结束工单时工单处置最高) — 已实施、验证并推送关闭(2026-10-17)。维护者 5 项裁定后落地:单设备「全部未处理报警(alarm_data.alarm_status=0)都已由未结束工单(work_order.order_status ∈ {0..4,6};5/7 为终态)承接」→ 判 WORK_ORDER(高于报警/预警),否则维持现行序;空集/读失败保守降级为 ALARM(「查不到承接」≠「已承接」)。只改单设备 deviceStatus() 单源,resolve() 聚合与枚举 priority 不动,前端零耦合。提交 3772220e(+ 既有编译阻塞修复 5d4d03c6)已推 origin/master;Cockpit*/BusinessCockpit* 512/512、变异闸 7/7(含两处事实透传接缝)、前端 t09 38/38。两点如实留档:① 票面「实测 21119740 应为工单处置」被真实数据证伪——该设备 2 条未处理报警均无工单承接,按裁定就该判 ALARM(票面把设备级 workOrderInProgress 误当成「未处理报警已逐条承接」);② 新规则在当前真实数据上不改变任何设备读数(今天不存在「未处理且已承接」的报警行),属正确行为而非未生效。zksy-system 全量另有 2 失败/1 错误为 HEAD 级既有(stash 对照逐条相同)。

  • 前端执行票 —— 场景监测点状态优先级、并行状态与告警特效 — 第二轮验收已通过:未关联设备同时计入业务状态轴与 UNASSOCIATED 附加轴,real 顶部统计为报警1/预警3/工单处置1/正常1/离线3/无设备6/状态未发布0/无关联设备8;监测点 ALARM 与未关联 WORK_ORDER 均可见 DOM pulse/spin 特效(4 层环、辉光/旋转环),默认开启且可显式关闭。单设备“全部报警均有未结束工单时工单最高”不由前端猜测,转交后端票 52(该票已于 2026-10-17 落地关闭)。

  • 40: 前端执行票 —— 运行概况与监测点台账卡片化 + 定位修复 — 已实施、闸门 + 变异 + real 走查闭环并关闭(2026-10-16,样式按维护者二轮反馈参考「当前预警」事件卡)。清单卡升级:.panel-item 虚线分隔行 → 独立卡框(--panel-line 边框 + 4px 圆角 + --inset 内衬底)+ 紧凑两列网格(标题横贯、meta 并排、原因/徽标/定位横贯),比事件卡再矮一档(「高度不需要那么高」);整卡可点 onCardClick:有 code(台账)→ open-card 同一出口,无 code 有定位点(异常设备)→ 既有 locate 接缝(infrastructureStore.locatePoint,三态反馈 + 票 38 宿主回联分流原样);卡内按钮 .stop + closest('button') 双保险;hover 三件套(--cyan-hi 边框 + 底色抬亮 + 左缘竖条)。不新造第二套卡片:异常清单与台账(监测点+未关联设备)同 listBlock,同时升级。验证:t40 16/16 + 变异 6/6(M1 教训:删 @click 绑定曾仍全绿——D1 只查函数体;修正为「绑定+行为」两半都验,卡片类交互断言必须钉住模板绑定与处理逻辑);13 组回归全绿;real 走查 DOM 取证双交互(异常设备整卡点击→设备级详情(返回点位两级流);台账整卡点击→点位摘要两级详情)、控制台零业务错误。顺带解锁:CockpitShell introVisible TDZ(并行新增的管线增强 watch 急切读 modeLayerPlan → 2 行声明上移至 893-894,机械修复不碰并行 hunk 语义);走查期间另遇并行在制品 reconcile 模块不同步(硬重载自愈,未改代码)——两起互作均留档票面。改动未提交(混有并行在制品,裁剪清单见票面)。

  • 50: 前端执行票 —— 撤下运行信息面板的定位按钮(pointCodes 已裁定为设施编码) — 已实施、零依赖闸门 + 变异闭环并关闭(2026-10-16,落地票 49 裁定)。operationPanel 产物 locate 恒空、指标行 points 恒空——「没有可定位对象就不画按钮」由构造保证(即应急保障三段的既有形态),不再靠渲染层过滤;locateNote 改为如实说明(关联编码是设施编码、不在一张图点位序列,管段/设施构件请在图上拾取走「重点对象局部增强」);planLocate/findMapObject/findDeviceOwner 判定逻辑零改动(t38 E5/F 组绿)、局部增强入口零交集未动;mock 九条样例改真实同形设施编码(TCRQ/CNRQ 燃气、TCGC/CNGC 供水、TCWS/TCYS 排水,恒单元素),应急保障样例保持 MP-* 并注记与真实恒空的出入(票 49 证据二、非目标)。闸门 t50 15/15(A 真实载荷四组:locate/points 恒空、入口总数 0、假阳性归零——A4 钉住供水载荷确带 PS001/PS002、A5 产物零 PS001/PS002 入口、A6 文案;B mock 同构:同一面板零入口 + mock 设施编码∩一张图对象序列=∅(撞名缺陷类结构性不存在)+ 恒单元素同形;C 渲染层:panel-locate 按钮模板唯一且只由 row.points 门控 ⇒ 本面板按钮 0)+ 变异 4/4 打红按字节还原(M1 locate 复活 / M2 行 points 复活 / M3 mock 退回 MP-* / M4 文案退回旧说法);既有闸门 t17 的 C2c 断言按裁定同步修订(该脚本本身 HEAD 级既有红:MANAGEMENT_REGION_GAP 导入失败,票 51 已记录)。回归 t38 67/67+13/13、t44 109、t51 20+3/3、票 37 的 t50 30、t05 283/283、t42 全绿;t49 前端后果闸门 F2/G1 钉修复前缺陷(载荷未入库不可复跑),判据由本票 A 组取代(同票 51 处理 H2/H3 的方式)。按 AGENTS.md 未跑 build/dev/走查(真实走查待维护者授权;改动未提交——工作树混有并行在制品,本票仅涉 infrastructurePanels.js、contractMocks.js、mapLocate.js 注释、t17 断言、两份新 verify 脚本)。

  • 51: 前端执行票 —— 运行信息面板只读 industries[0],全局行业筛选下显示空态 — 已实施、零依赖闸门 + 变异闸闭环并关闭(2026-10-16)。domain(infrastructurePanels.js)两处:toOperatingInformation 的 selectedIndustry 从「回显 label」改留回显 code({code,key,label} 里 code 是稳定锚;src 内原无消费点、闸门无形状断言);operationPanel 按回显 code 在 industries 里定位当前块,定位不到(契约外形状)时归因仍用回显自身(industryLabel 翻码),未筛行业保持既有「取第一块」口径 —— industryNote 与 metrics/locate 都由同一个 active 推出(票面范围第 3 条「两处真相不漂移」)。mock(contractMocks.js):handler 吃 context.query,operatingInformationPayload(scenario, query) 按 industry 把未命中块置空(EMPTY/NO_METRICS、零指标,照抄线上 EMPTY 块形状,不删块、不改变块序)、回显命中块 {code,key,label}、未答回 null(线上未筛载荷同款,替换原硬编码 GAS 回显)、mock 没有的行业(MANHOLE)也回显请求码;未带查询串行为不变(既有闸门零影响)。验证:真实载荷落盘 verify/artifacts/t51/(未筛那份即票 49 落盘载荷;2026-10-16 实测 192.168.110.96:8301)——供水 2497、排水 3576(票面写 3166 是诊断时点活数据,闸门按载荷自身块长断言)、燃气 699、未筛取第一块 699;t51 闸门 20/20(A/B/C/D 真实载荷四组 + E mock 同构六条)+ 变异 3/3 打红按字节还原(M1 块选择改回 industries[0]、M2 mock 撤查询串、M3 回显退回 label,全被当场抓住);回归 t38 67/67 + 变异 13/13、t44 109、t50 30、t05 283/283、t42 全绿。t17 报红为既有失败(导入期缺 MANAGEMENT_REGION_GAP 导出,HEAD 上即无、与本票 diff 零交集);t49 前端后果闸门的 H2/H3 钉的是修复前缺陷(rows===0/note 含燃气),其载荷目录本就未入库不可复跑,修复后判据由本票 A/B 取代。按 AGENTS.md 未跑 build/dev/浏览器走查(真实走查待维护者授权,同票 39/48 收口方式)。改动未提交(工作树混有并行在制品,本票仅涉 domain/infrastructurePanels.js 与 mocks/contractMocks.js 两文件)。

  • 48: 前端执行票 —— 一张图正下方居中持久显示管线颜色图例 — 已实施、离线闸门 + 浏览器走查双闭环(2026-10-16,三轮,resolved)。七桶图例落在一图正下方居中持久读数条(无 v-if/v-show、pointer-events:none 不挡地图、窄屏词条换行居中);第二轮(维护者反馈「离最底层还有这么长一段距离」):bottom: 40u 是抬离了地图段/两侧栏/面板的共底边(三者底边都等于 <main> 底边)→ 改 bottom: 0 贴底并排对齐,新增 --map-bottom-band 共享 token 让定位反馈浮层起算在图例带之上(两处共吃一个数,不再各写魔法数);词条裁定列全七桶(点名五桶 + DRAINAGE_UNKNOWN/UNKNOWN 两灰桶——pipeColorKey 对脏/缺 network_level 真会画出,按票面判据一并列入);色值/词条经 pipeLegendEntries() 引用 PIPE_PALETTE 本体同一对象(图例侧零 hex,A1/A2 行为级断言证明)、顺带撤下票 32 在折叠面板里的旧色行(两处图例必漂移);计数走 pipeColorCounts() 全量口径、缺失不补 0。闸门 t48 33/33(含贴底 D9/共享 token D10)+ 变异 7/7 打红按字节还原(M6 抬离底边、M7 浮层退回魔法数均被当场抓住)+ SFC 编译过;t38/t46/t43 回归绿,t25 报红经 HEAD 基线对照证实为既有失败(与本票零交集)。第三轮浏览器走查(维护者授权,real)五判据全过:出现居中/贴底并排对齐/色块与管线一致/持久五场景(模式·筛选·悬停·全球视角·整页刷新)/计数真实自洽(699+2489+1240+2334=6762 与面板自洽,切「供水」后不变化)。改动未提交(并行在制品混库,裁剪清单见票面)。

  • 39: 前端执行票 —— 运行监测面板图表化(监测概览读数 / 监测分布分节) — 已实施、闸门 + 变异 + real 走查闭环并关闭(2026-10-16)。概览「设备状态」rowsBlock 纯键值行 → donutBlock('设备状态分布(按设备数)')(复用票 43 已验收的既有渲染分支,零新分支;选型按仓库自己的图表选型表「类别占比、类别少→环形」):四态照实(在线/离线/数据滞后/未知缺失;服务逐行读过——判定链互斥穷尽、denominator=online+offline+stale 不含未知),「在线率分母」不再是独立读数行(画进图例就是第二个口径的数;分母摊在 KPI hint 上与在线率同源),缺值行整行不出(numberish 收口;donutBlock 内部 Number()||0,交出 null 就是假「0 台」——票 27 同类)。分布六块标题统一 「分节 · 维度(条长口径)」:覆盖三块带「按点位数」、状态两块带「状态分布 · …(全局未筛)」、口径成节;图形形态/排序/数据源/空态措辞零改动(非目标),决策 02 边界保持(面板无筛选入口,饼图只高亮)。渲染层仅一处:pie aria-label 绑定 block.label(无障碍名与屏上标题同源)。barTone 登记「未知/缺失」「数据滞后」两个语义词。验证:t39 24/24 + 变异 8/8 打红按字节还原;t44 普查的「表外判红 + 幽灵判红」在本次改名中如实报红、归类后转绿(完备性守卫有牙实证)109/109;12 组回归全绿(t18 两组维持 HEAD 级既有红,与本票 diff 零交集);real 走查四条正反证——窨井筛选真 0%(分母 1)与燃气筛选空态成对,证明占位符纪律没被改坏。二轮(同日维护者走查反馈第 1 条)已补:饼图图例与一张图状态栏同形态——statusPie rows 带回 legendVisuals() 的 icon(本层曾丢字段)、图例 StatusTag 走 icon-only 接缝(票 46 定稿同一条)、删 pieToneColor 第二份颜色映射(tone 类解析同一 token);t39 扩 G4a(icon 逐行同源)/G4b(接缝形态)+ 变异 M8,real 走查以状态栏活体标记为参照 + DOM 取证(li 直读受工具限制,票面如实记了证据层级)。改动未提交(混有票 45/46/47/50/51 并行在制品,裁剪清单在票面)。

  • 49: 后端契约诊断 —— operating-information 的 pointCodes 返回设施编码,运行信息定位永远不可达 — 已诊断并关闭(2026-10-16,维护者本会话裁定)。裁定:pointCodes 就是源设施编码,不是「本该回监测点而被写错」——后端适配器由 WaterPlantInfo/WaterPumpStation/PipeNetworkBase/EngineeringFacility 四类设施实体逐条生成指标,每条把该设施自身编码(plantCode/stationCode/networkCode/facility.id)填进该字段,恒单元素(6362 条无一例外);四类设施实体均没有指向 monitor_point 的关联(只有 equipment_base 经 equipment_point_rel 有点位关系),改回监测点等于凭空造关系、且会撞上 CONTEXT.md「设施不计入监测点统计」的硬边界。证据:6361 个不同编码中 6352 命中 /infrastructure/geometry 设施几何图层、仅 2 个与 map-snapshot 撞名、7 个两边都不在。票面两处前提被证伪:① 「应急保障 pointCodes 链路可用」不成立——三段 29 个对象全为空(适配器三处传 emptyList()),该面板根本不渲染定位按钮,反证「没有可定位对象就撤入口」是本仓既有正确形态;② 「无交集」不精确——有交集但是假阳性,PS001/PS002 在运行信息是供水泵站、在 map-snapshot 是排水监测点001,planLocate 实测 result:"ok" 会飞向不相干对象(比 MISSING 更危险)。管道补充裁定:管网是特殊设施、不存在对应的设施点,不走「凭编码定位设施点」,走既有局部管道增强交互(pipeEnhancementStore + planPipeEnhancement,在图上拾取 → 局部三维增强窗),覆盖占绝大多数的 6352 个管网编码。落地:前端撤按钮/改文案/ mock 同构 → 票 50;后端改名 facilityCodes 需另开后端执行票(本图 Notes:后端票须在仓库/负责人/权限明确后开启),契约测试不写票面那条基于错误前提的「必须能在 map-snapshot 找到对象」。顺带发现(同一路径、与本裁定无因果):运行信息面板只读 industries[0] 而后端块序恒以燃气打头 → 选供水/排水时面板说「燃气 · 没有运行指标」而 2497/3166 条数据就在同一响应里 → 票 51。闸门:t49 契约探针 8/8、t49 前端后果闸门 8/8。

  • 38: 前端执行票 —— 基础设施面板调整(基础档案同行 / 删除规模 / 运行信息定位修复 / 管理信息片区×行业图表) — 四条范围全部实施、离线闸门 + 变异闸 + real 走查闭环并关闭(2026-10-15)。删规模:toBaseArchives/toOverviewRegions/facilityTypes 三处不再解析或透传 scale(真实后端 totals.scale 恒 null、facilityTypes[].scale 是长度单位 "km"),两块面板 KPI 删规模、lengthKm 保留,mock 同真实形状(null/"km");CODE_TEXT 的 large/medium/small 翻译保留作防漏上屏的底。同行:删渲染层 lengthKm 的 --wide 整行特判,两项落回 auto-fit 网格自然并排。定位修复(两个真根因):① 失败反馈原挂在默认收起的状态详情里——「点了没反应」首先是「说了也看不见」,改为 <main> 底部可见浮层(8s 自收 + 手动关 + 卸载拆定时器);② 成功路径原走 setCameraFocus(只换中心保持 heading/range,行星球尺度几乎无感),监测点改走 locateMonitoringPoint 完整视角、下发结果 await 核对不假装成功。管理信息:新增 dimensionBarsBlock(两维度由 domain 预聚合、切换纯展示零往返、不进全局筛选),紧凑清单保留、退役字段零消费。验证:t38 57/57 + 变异 10/10 打红按字节还原;12 组回归与 HEAD 基线一致(t44 把 dimbars 收进普查归类,其 B7 存在性断言因 dimbars 复用同写法失去牙——变异当场暴露,升级为「每一处都走 EllipsisText」);real 走查三判据截图闭环。改动未提交(混有并行在制品,裁剪清单在票面)。走查暴露移交:真实 operating-information 的 pointCodes 返回设施编码(TCRQ/CNRQ),与 map-snapshot 编码空间无交集 → 运行信息定位结构性不可达,前端如实报 MISSING 正确但不可达不该是常态——另立票 49 裁定契约语义。

  • 执行票:地图标记 DOM overlay 渲染(billboard 发糊与底板生硬的结构性解决) — 已实施并浏览器走查关闭(2026-10-15,第四轮)。首版「已实施+走查通过」经对抗式核验证伪(六缺陷:母版路径残缺/投影原点写反/内层几何错/节点不刷新/unmount 未接线/点击派发无消费者)。维护者两轮裁定定调:① DOM 未完整复刻 billboard 功能前不替换(billboard 链路保留作拾取/聚合/特效底);② 渲染分工——外层母版自绘 SVG(水滴按 512 母版实测拟合:帽圆 r189 <1px + 收尖三次贝塞尔最大残差 4.75 源像素;「素材喂 DOM 变糊」根因是预下采样合成时机遇高 DPR 放大,非素材本身)**+ 内层行业图标用素材**(`renderInnerIconUrl` 与 billboard 同一 recolorInner、256px 原生分辨率向下采样);大小对齐 billboard 口径(`paint-order="stroke fill"` 白环纯外扩 28 同 withWhiteOutline、标签限宽取计划层 labelMaxWidth 单源);贴地定位同 CLAMP_TO_GROUND(groundHeightAt);点选显式触发器照搬 pickDeviceOrPointAt;节点池指纹重建 + unmount 接线。真实浏览器(real)走查:四类标记渲染、监测点/未关联设备点选联动(详情卡+镜头+引线)、标签截断+hover title、零业务报错全过。**改动未提交**(工作树混有并行票 45/46 在制品,入库须单独裁剪 markerOverlay/markerAssets/mapService hunks)。遗留:特效 DOM 化归票 45、聚合(K>1)DOM 化未立票(雾区)——两者是替换 billboard 的前置。

  • 前端执行票 —— 工单堆叠图语义间隔与饼图交互 — 四轮收口(2026-10-16,第四轮关闭)。诊断裁定:类别间小间隔=绘制缺陷(堆叠段 left/width 各自独立取整露出底色缝;mock 报警向量实测「待验收→已结案」边界 1 个百分点,露缝与否随计数变化——不是语义设计)→ stackedBlock 改单累加器接力取整(startPct/widthPct,每段起点=上一段终点、末段恒收 100),连续由构造保证;total/start/ratio 精确占比原样保留,统计口径零改动。饼/环交互三次被维护者驳回才定位到两级根因:第一轮把 tabindex/hover 挂在可见细环带上(46/25、42/26),真实鼠标落在圆心孔/环带外全部不触发(合成 hover 假绿);第二轮补整楔命中区(hitPath,内半径 0)修好触发后联动仍不生效——chartHover = ref(null) 存入 {owner: block} 被 Vue 深层代理,与模板原始 block === 恒 false → .is-hovered 永不生效;第三轮 shallowRef+toRaw、放大档 1.05/1.06→scale(1.1)+brightness(1.35)+白描边 后放大生效,但维护者发现 hover 停留数秒、鼠标未移出,高亮自灭——第四轮根因=外壳时钟每秒重渲染 + :view="panelViewOf(panelId)" 是模板方法调用,每帧重算出全新 block 对象,对象身份键在下一帧静默失效(浮层存标量所以还在,症状正是"详情还在、高亮掉了")。第四轮最终形态:联动键改 chartScope(index, block)=视图名|块序号|块类型|块标题的跨重算稳定标量串(16 个调用点统一);扇区⇄图例双向联动、外层 svg role=group、单一 aria-label 详情入口、图例数值紧跟标签成对(去 space-between / margin-left:auto / 标签只缩不涨)。验收判据两轮演进:先改"被联动元素自身状态"(class/视觉放大,不以浮层出现代判),第四轮再加"hover 跨多 tick 保持"——真实浏览器(用户授权,real)hover 持续 3.5s 跨 3+ 时钟 tick,饼图「报警」/环形图「排水」放大+图例联动+浮层全程不再自灭。闸门 t43 23/23、变异 8 处打红(M7 shallowRef→ref;M8 chartScope 退化回对象身份 → P8 红;P8b 运行时探针:对象身份键在新对象下查不回、scope 键查得回);11 组离线回归全绿。入库:第一轮 hunks 已随并行票 37 批次 a40aedc 推送 origin/master;第二/三/四轮 hunks(panelBlocks/statusPie/PanelBlocks/t43 脚本)已提交 7f71992 并推送 origin/master——工作树混有并行票 38/47 在制品,故用独立临时 index 的 plumbing 限定提交,只摘本票 hunks(PanelBlocks.vue 逐 hunk 复核归属,剔除票 38 的 6 处),未碰他人暂存区与工作树。教训留档:① 归因实验禁用 git stash push -- <文件>(本工作树会写坏文件),用票 42 的 HEAD worktree 对照法;② 带孔/细环 SVG 的 hover 断言必须打在用户视角位置(圆心、环带外);③ 联动类交互的验收判据必须是"被联动元素的状态本身",且状态类交互还要断言"随时间推移不失效";④ 跨响应式边界比身份:深层 ref 会被代理拆穿、模板方法调用每帧重建对象会漂移——用 shallowRef + 稳定标量键(视图名|序号|类型|标题),不要用对象引用;⑤ 批量替换按子串匹配时注意函数名前缀(setChartHover 命中不了 clearChartHover),替换后必须全量核对调用点。

  • 前端执行票 —— 类型分布降序与统计条视觉密度优化 — 已实施并关闭(2026-10-15,维护者确认收口)。排查结论:无遗漏块,但票 37 只测一块不构成完备性证据——新增 t44 普查闸门:乱序后端载荷灌真实适配层(14 面板视图 × 全部分布块),期望表双向锁定(表外新块必显式归类 RANK/FIXED 否则判红;表内块消失也判红),RANK 降序+并列保序、FIXED 固定语义序(状态/等级/年限/工单 0–7)不被强行降序且期望本身非单调才有牙;103/103 + 变异闸 6/6 打红按字节还原。视觉密度:条形行内间距 8u→4u、删 8px 越界辉光(条段糊邻行的直接成因)、轨道 6u+发丝内描边、填充 ::after 高光+端帽装饰层;读数密度与交互不变,EllipsisText/panel-action/data-bar-* 三接缝由守卫锁定。改动随并行合批提交 bd45f27 入库(本地未推送,推送归维护者统筹)。方法论:「补齐遗漏块」的正确形状不是排查一次清单,而是把完备性做成机制——普查表双向锁定后,任何新分布块漏归类即红。

  • 管线构件 glTF 素材与实例化渲染(样条/角/阀门/支管四类) — 2026-10-15按用户“基本没有问题,可以收口”确认关闭功能票:四类示意件/GPU实例化、地面近景保线、排水network_level分色和缺径默认DN交付(前端aa529db、后端7150d431);部署字段、4K FPS及浏览器故障画面的未验证边界留在票面最终状态,不声称全门槛通过。

  • 42: 前端执行票 —— 预警设置面板消费预警自身生命周期契约 — 已实施、守卫、mock 同构并关闭(2026-10-14,提交 0cd16ac 本地未推送)。前端适配后端 b047a60d 两族口径分叉:toOverviewWarningSettings 对预警族工单口径字段 null 保真(不再补 8 根假零条、numberish 不数 0),四组生命周期分布直读透传(sum(桶)==total 自洽);视图拆 warningFamilyBlocks(KPI=总数+已解除率,四分布块,零工单词汇)与 alarmFamilyBlocks(工单口径 + alarm_status 分布并存);态势总览处置率 KPI 改预警已解除率(hint 写明分子分母,判据复用票 20 单源)。mock 同构(含 UNKNOWN/UNASSIGNED 显式桶、空场景全铺计数 0)。守卫:新增 t42 契约脚本(基线卡片 §4.2 真实值过领域+视图两层);t20 守卫随契约更新(B3c→报警族、B3e/B3f/C4d 新增、M4 锚点重定位、M14 新增——已用领域层直证变异必被 B3e 抓住)。验证:t42 全绿;t20 60/66,6 条红经 HEAD 临时 worktree 基线对照证实为既有失败(57/63 同样 6 条,与本票 diff 零交集)。入库纪律:工作树混有票 37–40 孤儿在飞批次,经 git plumbing 只暂存本票 hunks,孤儿批次字节未动;提交版先在 HEAD worktree 过语法+t42 全量断言。未推送(本地领先远端 19 提交,多为并行在制品,不代推)。遗留:真实走查归票 17 部署窗口;预警族 KPI 行混用 alarm_status 与工单两种口径属后端契约语义问题,建议维护者裁定。

  • 36: 前端执行票 —— 调色后处理着色器编译失败使地图停止渲染 — 已修复、提交并关闭(2026-10-14,实施提交 850c6c6)。根因:调色后处理 GRADE_FRAGMENT_SHADER 用 GLSL1 的 varying,而 Cesium 1.145 在 WebGL2 下对全部 shader 前置 #version 300 es(GLSL ES 3.00 删除 varying)→ 编译失败即整帧 Rendering has stopped(黑屏);引入提交 e2529b5(同文件雾 shader 早在 8db64fc 已迁 in vec2,调色漏迁),触发条件=调色默认启用且部署 config 显式启用。修复(限定 2 文件 +12/−4):片元输入一行 in vec2(采用票 49 已验证修法——诊断期曾判重,维护者 /implement 指令后固化提交);t49 闸门从「把 bug 当规格」(原断言 varying 正确)反向锁定为 GLSL3 断言 + GLSL1 拒绝 + 截断哨兵(void main 存在性,防提取正则被杂散反引号静默截断 fail-open——变异注入反引号闸门转红、还原转绿,证明哨兵有牙)。验证三面:纯提交内容(临时 worktree)复跑 t49/t38 全绿 + GLSL1 零残留;真机 dev 实例连续渲染零 shader 错误;CDP 无头交互探针 9/9(verify/artifacts/t36/probe-acceptance.mjs:四模式切换/真实对象定位/跨 freshness 周期静置 35s+30s,引擎恒 ready、mapGrade=on、零 pageerror、帧形态无周期尖峰——绕开浏览器会话 5 上限,复用票 26/33 的 cdp-driver 模式)。未推送:前端分支 16 个未推送提交多为其他会话在制品,不代推;缺陷本不在 origin/master(无调色处理级),随分支统一推送上线。方法论:限定提交用「HEAD blob + 单行替换 → hash-object 写 index」精确暂存,不触碰工作树 229 行并行改动;提交自洽性用临时 worktree 在纯提交内容上复跑闸门证明,而非只信工作树绿。

  • 41: 后端执行票 —— 预警设置端点改为预警自身生命周期统计 — 已实施、测试、第二实例真实复验并关闭(2026-10-14)。口径裁定(维护者本会话):预警不走工单流程 → 预警族只给预警自身生命周期(WarningWorkflow 六态/等级/行业/片区分布 + 已解除÷总数,工单口径六字段一律显式 null 不用 0 冒充);报警族保留工单口径(报警靠工单闭环)并并存 alarm_status 自身生命周期。诊断修正:票面的 dispatch_user 故障已过期,复测为 dept_id(实体声明已删列),真实根因是运行构建落后库结构——上游 94bb7e4d 已删该列,故本票基于 origin/master 独立 worktree 实施,未动共享工作树的并行在制品。验证:契约 24/24、全量 Cockpit*Test 498/498(变基后复跑);第二实例(8399,同库同 Redis)实测 code=200 且预警族四组分布和恒等于 total(31)、报警族 66 自洽;对照共享实例 8301(上游构建)仍回旧契约,证明新契约出自本票。提交 b047a60d 已推 origin/master(05c23774..b047a60d)。前端消费侧(读新分布块 + mock 同步)另立票。基线卡片 06 预警设置生命周期。

  • 35: 后端执行票 —— 监测三端点 createdAt 真实契约缺失 — 已实施、测试、真实复验并关闭(2026-10-14),解除了票 18 阶段收口的最后一项技术阻断。根因:字段从未实现(cockpit 包 createdAt 零命中、git log -S createdAt 零提交),已排除「部署滞后」「Jackson NON_NULL 省略」「字段名/落点不同」(反证:同响应 district/reason/longitude 等 null 均显式序列化)。实现:新增单一口径来源 cockpit/foundation/CockpitCreatedAt——只做 create_time → createdAt 格式化与跨来源 max,不读时钟,故「拿响应时间冒充数据时间」在结构上不可达;按规格 08 补齐三端点信封级 + distribution 点位/未关联设备 marker + situation 异常设备逐对象。口径(维护者 2026-10-14 裁定 Q3):situation 信封取异常设备来源表 create_time max(与逐对象同源可复算),事件时间仍由趋势桶 bucketStart 承载。验证:Cockpit*Test 507/507(新增契约 18 项);真实只读三端点 createdAt 齐备、均 ≠ updatedAt,distribution 6/6 点位 + 9/9 设备、situation 8/8 异常设备逐对象齐备且信封 == 逐对象 max(自洽复算);权威审计 t18-real-audit 140/143 → 143/143;前端三面板「数据时间」由 — 变真实值。源表核对(Kingbase JDBC 直连,非只看响应自证):monitor_point 六点位 create_time 全 NULL、21119740 NULL 而另两台为 15:15:12/15:15:47——逐对象 null 属数据真实缺失,非映射缺口。提交 05c23774 已推 origin/master(5a821872..05c23774)。并行在制品纪律:只裁剪本票 20 个文件提交,变基推送时临时 stash 并行会话 #32 几何在制品并按字节还原(5 文件 git hash-object 逐一 IDENTICAL)、分支 tip 复位,未代表他人提交或推送。

  • 24: 前端执行票 —— 设施点位与管线真实几何图层接线 — 真实设施与管线几何已接上图并四条验收全过:权威读取路径定为后端驾驶舱自建几何读模型(复用业务 GIS 端点会撞 ADR 0005 免鉴权边界且只覆盖供水),渲染层定为 Cesium(实测栈内零 three/Tres,规模仅数千段);程序化建模按燃气出全套构件、其余行业如实降级(只有燃气有 point_type 构件属性,管段无共享端点拓扑故不推断角/支管)。真机实测真实 5268 条管线绘制、无地图位置清单与徽标自洽(5287/5281/6)、设施总数三端一致 5283。过程中逮到并修掉两个真缺陷:取数失败被显示成"没有管线"(失败交 null 而非空数组)、loaded.total 漏加不可图数。构件 glTF 素材另立票 32。

  • 34: 坐标自动准入(取消人工校核前置)与主场景区边界冲突 — 取消人工校核前置:coordinateVerified 不再参与判定,改「结构合法 + 落在 map.primaryArea.bounds 内」自动准入,新增原因码 OUTSIDE_PRIMARY_AREA,判定顺序「结构错误优先于区外」。根因是判据第一道 if (!coordinateVerified) 恒拦下全部真实数据,而全后端既无校核列也无校核入口(管理端 E:\city-life-line 零引用已复核)——前端「只认 renderable」是正确行为。真实接口闭环:map-snapshot 0/15 → 12/15、unverifiedCount 15 → 0;infrastructure/geometry 0/5272 → 5269/5272;5 端点扫描零 UNVERIFIED 残留;5272 条几何跨界 0 条。区外口径裁定 A(严格主场景区):接受框外不上图/不可定位,ADR 0009 的框外定位例外经产品路径已不可达(相机层实现保留),并写入「准入矩形后端是常量、限位侧是配置,改一处必须改两处」的同源警告。独立复核补记:修复提交曾只在本机未推送(从远端部署会静默回退),经核对已由并行会话变基推送至 origin/master(f33ef570/d81c977b,patch-id 与旧哈希逐位相同)。遗留:3 条脏几何(YL-YJ-001/002=1212,1212、GD-001=12,12)属业务侧订正。原编号 32 与 glTF 素材票重号,已改号 34。

  • 23: 前端执行票 —— 地图快照分页 token 与 pointStatus 八桶契约对齐 — 前端交付(缺 token 停住翻页、toStatusDistribution 八桶完整性校验——缺/重/非法/负/非整数桶一律 available:false 不补 0、statusFilterQuery 白名单丢弃 BOGUS 不发脏值)在 #29 关闭后完成两项真实验收收口:状态栏与饼图显示真实八桶(EMPTY=6、UNASSOCIATED=7 其余 0,同源),多选筛选使点数 13→1(ALARM)→2(+WARNING),全局计数不随筛选变化;BOGUS/ALARM,BOGUS 两端 400 INVALID_REQUEST,分页 token 跨页保留。前端源码本轮未改(仅既有 mapSummary.js 防护),重跑 t23-map-contract 11/11 过;真实浏览器验收证据取自 #29 同环境会话,本会话未重跑(构建/浏览器按项目规则未被要求)。

  • 25: 前端执行票 —— 去除 Cesium ion 署名与 Data attribution 控件 — 更正票面技术前提:creditContainer 是「放哪个容器」而非开关(两条路径都会建 CreditDisplay),按原文字面实施会无效;改用离屏容器才真正隐藏。本部署经核实零 ion 依赖(地形/影像/3D Tiles 全本地 URL),隐藏 ion 署名不违约,且该前提已固化为回归断言。地图上除顶部状态图例外的全部信息(图层、加载状态、降级说明、标记计数、坐标准入、引擎读数、数据源署名)并入外壳既有的那一个状态面板(维护者否掉了「另起面板」:会与图例和外壳面板互相占用容器);并修掉引擎读数被 ellipsis 截断、清单容器异常占空、长编码被右侧裁掉,以及展开后清单宽度不撑满容器(根因是内容块上的 justify-items: start 把所有子项收窄成 fit-content)四个问题。浏览器实测:署名与 Data attribution 均已消失,335 请求 0 报错、0 条 ion 请求,各图层正常。

  • 后端执行票 —— 工单关联标记口径统一(设备维度 vs 时间线) — 三端点关联已同源、一对一重复报错;维护者新真实样本正向及旧待接单工单负向均通过,428/428测试、修复894402a已推送,验收关闭。

  • 后端执行票 —— map-snapshot 与 monitoring distribution 的 pointStatus 八桶契约 — 两端多值状态、非法值400、统一回显与全局八桶已完成,提交7fb7c2c(已随合并60a0e9a推送);75/75针对性、429/429全量、45/45真实探针及浏览器13→1→2筛选通过,状态栏/饼图计数同源且不随筛选变化。

  • 22: 前端执行票 —— 真实响应信封消费与业务错误映射修复 — 真实 AjaxResult 信封已在适配层解包并按业务 code 分流(并行提交 ead39442);本轮补上同链路两处白名单继承键缺口(readBusinessReason、sectionStateFromBackend/sectionStateFromFreshness,提交 86db4d4)。真实复验三项 frontend-* 全通过(业务 code=500 → 分区 failed,档案适配值与真实一致),真机确认故障面板显示「数据加载失败」而非 success 或空白——故障不再被伪装成正常空态。

  • 前端执行票 —— 报警–工单闭环消费(事件/工单状态/时间线/处置率/异常点) — 真实响应消费与mock已对齐,处置率零工单分母不适用、异常桶分对象、0–7时间线与独立工单增量/报警重取已接入;契约和Pinia回归通过,8001 mock浏览器验收完成,真实联调归阶段收口票。

  • 15: 前端执行票 —— 数据时间展示 + 片区/行业维度 + 管理面板片区化 — 前端消费侧已切换 createdAt/sampledAt、district/districtFilter 与窨井词汇;管理面板改为片区×行业设施/设备计数;T15 契约闸门 11/11 通过,8001 mock 浏览器走查确认数据时间、未分区、窨井和管理计数。

  • 14: 前端执行票 —— real 生命周期接线 + 状态筛选/自动加载/饼图 — 前端实施与 8001 浏览器验收完成(t08 15/15、t18 40/40、补充 7/7);多选 OR、饼图高亮、命中子集与 real 分区不可用语义已验证,正式后端业务联调归票 18。

  • 01: 报警—工单闭环读模型与 Gogs 票拆分边界 — 首阶段只读消费外部业务系统的报警/工单真实关系与状态;后端拆为工单状态与处置率、报警/工单读模型回联、实时同步三票,前端另建三票;真人团队的真实设备报警闭环是阶段总收口。

  • 02: 地图摘要状态筛选与未关联设备语义 — 行业/范围/类型=设备级匹配、点位 OR 归并;状态筛选对监测点按聚合六态、对未关联设备按设备状态词表各自匹配;「无关联设备」桶=只看该类对象;pointStatus 多值(含 UNKNOWN/UNASSOCIATED);顶部状态栏=全局组合筛选入口(八桶 OR,计数为全局未筛全集);饼图共用同一份分布;坐标汇总按筛选后口径;移除加载下一页、自动分批加载,右上角留 🔄 手动刷新;刷新时机=筛选变化/新鲜度 tick/WS 增量。

  • 03: 监测数据时间字段与异构设备来源 — createdAt=记录创建时间(create_time,跨类型 max);三端点:overview 分区级、distribution 信封+台账逐对象、situation 信封+异常设备逐对象;sampledAt(采样/上报时刻)与 createdAt 并存分离;空态显式 null 不冒充;前端“数据时间/采样时间”两套标签;archive 不加 createTime;refresh 时机归 #04;更正:/overview/monitoring 的 metricFreshness 已真实接线(固定 CURRENT)。

  • 04: real 生命周期与 mock 同构启动契约 — dataSource 只换 transport:real 照搬 mock 全部自动初始化(地图第 1 页、四模式面板、WS 直订、新鲜度 tick);失败同套分区语义(UNAVAILABLE)、严格不回退 mock;未配 baseUrl 如实报 NO_BASE_URL;WS 只定连接生命周期(增量帧解析归 #01);刷新调度以本票为唯一权威(02/03 引用);失败不无限重试;验收为端到端证据。

  • 05: 真实联调基线与收口证据门槛 — 基线锚点=仓库提交(分支+哈希+已推送 Gogs);联调判定环境=本地 192.168.110.96:8301 可达,本地通过后再提交;目标部署移出本阶段;四态阶梯(接口 200 / 契约已接 / 真实数据联调完成 / 模式整体收口)+ 缺项即降级明写原因;卡片落 handoff/baselines/<切片名>.md(纯 Markdown + 可复制命令,追加不覆盖,只记角色与出处);第一张样板卡 地图摘要+运行监测 已产出(实测:免鉴权 200 达标,pointStatus 被忽略、三端点无 createdAt,状态至 ①)。

  • 06: 异常统计、工单处置率与管理字段词汇 — 异常统计:监测点桶 ALARM/WARNING/OFFLINE/EMPTY、设备/指标桶 WARNING/ALARM/EXPIRED/OFFLINE/UNKNOWN(按对象计数不相加、成功响应缺失桶显 0);异常点(预警处置地图)只认设备 WARNING/ALARM 回联(宽清单窄地图);处置率=状态5 ÷ 状态0–6(范围=当前筛选全部工单,分母 0 显示不适用,basis 改为工单分母语义、旧"事件总数"口径废止);本项目维度只有片区(district 0/1/2→城南/城北/太常,空/乱码=未分区,取代 organization 与 regionMap)与行业(供水/排水/燃气/窨井);管理信息面板改片区×行业视图、后端删 organizations/ownership/unmaintained;档案 ownershipUnit/maintainer 留作静态信息;「责任区域」=片区别名,历史票 17 验收文字作废;票 25 已回写 E1/处置率/异常口径。

  • 11: 后端执行票 —— 工单状态与处置率读模型对齐 — 处置率分母由事件总数改为状态 0–6 工单数(状态 7 排除;范围=当前筛选内全部工单,按 work_order.create_time 界定,不要求关联报警/事件),basis 改 CLOSED_WORK_ORDERS_OVER_ELIGIBLE_WORK_ORDERS,分母 0 → EMPTY+NO_ELIGIBLE_WORK_ORDERS;三处同族分母一并修订(handling-efficiency / history-analysis 仅汇总 / overview warning-settings 两 family 共用),状态分布同步改工单口径使 sum(0–6)==分母 可复算;口径单源收敛到 CockpitWorkOrderStateDictionary,三个 snapshot 新增 scopeWorkOrders(旧快照只带已关联事件工单,结构上给不出该分母)。工单字典 0–7 本已对齐、复用之。提交 3de679c 已推 origin/master,编译通过、Cockpit*Test 299/299。部署后真实环境复验已移交 票 17 滚动承载,本票按自身交付物收口。

  • 12: 后端执行票 —— 报警/工单读模型、设备–监测点回联 + district 片区契约 — 旧自由串 region(实测恒为「未分区」、适配器写死 null)被片区 district 取代:权威来源=equipment_base.district(0城南/1城北/2太常),点位按「经其上挂设备归纳」(不一致/无设备→未分区)、设施无来源一律未分区——不加 DDL、不用行业或管理单位冒充;响应形态=district(Integer,未分区 null)+districtName,筛选入参 district=0|1|2|UNASSIGNED(脏值 400),mapFilter 增 districtFilter(NONE/ASSIGNED/UNASSIGNED,区分「未筛」与「只看未分区」这两种编码同为 null 的情形);口径单源 cockpit/foundation/CockpitDistrict.java。六族统一改造(地图摘要、运行监测 distribution+situation、基础设施 base-archives、事件多维分析);管理信息按 #06 删字段 organizations/ownershipDistribution/unmaintainedCount 改 districtIndustry[](片区×行业)。工单读模型:设备维度返回已有全部工单并逐张加显式 associatedWithCurrentEvent + 顶层 unassociatedWorkOrderCount(满足「未关联当前报警明确提示」);关联键经真实库核实为 alarm_data.work_order_id = work_order.order_id(维护者原述 alarm_no = order_no 实测命中 0 条、两列均不存在)。提交 818a6d7 已推 origin/master,组合测试 372/372,部署后真实环境复验 8 项全通过(基线卡片 03 至 ③)。教训:复验中曾因控制台把 32 位十六进制串统一渲染成 0 而误判 alarm_data.id 为占位值并提交改动,经 count(DISTINCT)/直方图/base64 复核后撤回(18db910)——判「相同/为零」不可凭肉眼读控制台。前端消费侧必须同步(已通知 票 15)。

  • 13: 后端执行票 —— 报警/工单实时同步 — 工单状态增量从无到有:新增 cockpitWorkOrderStateDelta 帧(CockpitWorkOrderDeltaPushTask,定时扫描 work_order.order_status 逐单比对——状态流转不写 update_time,靠时间过滤会漏掉全部流转),变化才推给驾驶舱全量订阅会话(免鉴权、不按人过滤,与管理端 workOrderReminderPush 提醒语义隔离);首扫只建基线不推送(REST 才是初始快照);帧带 scanIntervalMs(默认 60s 可配)诚实标注延迟上限、不带会误导的 updateTime、不泄漏主键 orderId(对外键 workOrderCode,与 REST 读模型同口径);stateCode/stateName 出自票 11 字典单源,脏码名称显式 null。设备帧 cockpitDeviceStatusDelta 补 eventId 透传(缺省显式 null;zk-api-service 是否真发未证实,防御性透传不臆造)。REST 快照复用票 11/12 读模型无新端点;降级纪律(无订阅不查库、失效会话清理、断线重订)有测试锁定。提交 d8a6b03 已推 origin/master,针对性 21/21 + 全量 422/422,部署后复验 6 项全通过——含端到端正面证据(真人提交验收 284 工单 3→4,40 秒内帧到达、字段全对)与两项负向证据(无变化不推送;只改 update_time 不改状态码的「处置」不触发,证明检测由 orderStatus 驱动)。前端消费归 票 16(对未知帧静默忽略,不升级不会崩)。

  • 17: 部署后真实环境复验(后端切片 11–13,滚动复验票) — 按维护者裁定作为贯穿 11–13 的滚动复验票单独承载部署后证据:三切片全部复验通过(11:处置率新口径 num/den=2/3 自洽;12:district 契约 8 项;13:增量帧 6 项含真人触发端到端),三张基线卡片 02/03/04 均升至 ③ 真实数据联调完成;全量测试自基线 299 增至 422/422。滚动使命完成故收口;决策 01 的真人闭环演示归阶段总收口(票 18 上位阶段),上位回写(票 25/Gogs #63)已按决策 01 执行。复验方法论沉淀:负向观察必须闭环(说「没收到帧」须同时复查库证明「确实没变化」);临时探针一律放 %TEMP% 用完即删(不进 git 跟踪目录);控制台渲染不可作为「值是否相同」的证据。

  • 28: 后端执行票 —— 无关联设备监测点被静默丢弃(计数不对称) — 维护者裁定方案 A(2026-10-10):无关联设备的监测点是合法监测点,按其真实「无关联设备 / EMPTY」状态计入监测点总数与状态分布(EMPTY 桶),不得静默丢弃;方案 B(仅记入 excluded 新计数、界面仍显示 0)不采纳。配套澄清两条术语:无设备点位是合法点位,类型/片区无法经设备推导时如实显示未分区/未知,不伪造归属;坐标能否上图只决定呈现,不决定是否计入统计——坐标未校验的对象仍参与计数、分布与筛选。根因为 CockpitMonitoringDistributionService 点位循环按 devices.size() 累加排除计数,无设备点位计 0 而被抹除(设备侧同分支按自身计 1,口径不对称);连带 NO_RESOLVED_DEVICES 把「设备坐标未校验」误报为「无设备」。CONTEXT.md 的「点位状态」「无地图位置」两条已就地澄清。

  • 后端执行票 —— 管网编码 0/1 映射与设备边界设施类型命名空间 — 0/1/2 管网行业与设施命名空间已修正,五端点共同管网集合实测为燃气537/供水996/排水3735(合计5268);收尾审查的跨端点回归与展示字典单源两项已补齐(29d1ae2、0a6b108已推),管网专项29/29通过,最新远端报警旁路1项全量失败如实见审查报告;基线卡片05保留已部署740d896的③证据,人工核验步骤区分各对象域总数。

  • 后端执行票 —— 无关联设备监测点被静默丢弃(计数不对称) — 实施收口:合法空点与坐标独立统计已修复,真实overview=6、EMPTY=6、总对象13且排除0,契约423/423及真实12/12通过,提交ba0ce076已快进合入并推送origin/master,未混入八桶并行会话的未提交改动。

  • 后端执行票 —— 驾驶舱设施点位与管线几何读模型 — 免鉴权只读几何端点 GET /api/cockpit/v1/infrastructure/geometry 已实施、审查、测试、真实验收全链路收口:GeoJSON FeatureCollection 三源真实几何(管网两端点直线/燃气构件原样 pointType+networkId/窨井点),坐标纪律与 map-snapshot 同形(非法→null+reason;合法无校核→UNVERIFIED),coverage 9 条如实区分各行业覆盖缺口;真实免鉴权 GET 13/13 全绿(5272 feature、5270 UNVERIFIED + 2 INVALID、缺口如实标注)。提交 33ca0b6 已推 origin/master,全量 *Cockpit*Test 463/463。

  • 后端执行票 —— 设施总数三处口径不一致(5278 / 5276 / 5273) — 三套设施计数已收敛为单一口径:根因不是管网求和算法不同,而是三个适配器各选了不同的设施表集合(基础档案漏水源地/窨井、概览漏排水工程设施、管理信息漏水厂/泵站/排水工程设施)。新增唯一设施目录 CockpitFacilityCatalog(六类合法设施并集,维护者裁定取并集而非对齐到 5278),概览与管理信息改为投影同一目录;目录记录带稳定 sourceKey 防跨表同码误去重,未知/缺码记录显式进 excluded,并修正未来日期设施漏入片区分布。提交 96834794 已推 origin/master(a4a727dd..96834794);Cockpit*Test 469/469(变基后复跑 465/465)、新增跨端点契约 2/2;后端重启后现场三端 facilityCount 均 5283、行业拆分 GAS537/WATER_SUPPLY1006/DRAINAGE3737/MANHOLE3 三端一致、片区合计 5283、三端 excluded 全 0,旧 5278/5276/5273 矛盾消失。方法论:跨端点计数一致性须由贯通真实适配器与服务的契约测试锁定;zksy-admin 子目录单独构建会命中本地仓库旧 zksy-system JAR,须走完整 reactor。

  • 后端执行票 —— 管网编码 0/1 映射与设备边界设施类型命名空间 — 主修复740d896现场五端点管网集合一致为燃气537/供水996/排水3735(5268);审查补齐29d1ae2、合并0a6b108已推送,管网专项29/29通过;维护者已确认人工核验完成。审查报告保留最新报警旁路1项全量失败记录,人工核验步骤与基线卡片05已交付。

  • 27: 前端执行票 —— 监测点台账分母渲染 undefined — 已关闭:票 18 真机取证里那句「本端点序列共 undefined 条」的根因是两处合起来才成立的守卫类型错配——真实空态下 fetchMonitoringDistribution() 的 isEmpty 成立,sectionFromResult() 走空分支不带 data,视图拿到 null 后 pagination 为 {}、total 是 undefined,而守卫只写了 pagination.total === null,模板串把 undefined 直出(PanelBlocks.vue 的 pageNote 又画在 hasContent 之前,空态照画)。修复仅一处:分母先过仓库既有的 numberish() 收口再判空(+8/−2),缺失时整句不出是作者原意、不是新增文案。同类自查:16 块面板 × 5 载荷 × 4 态递归扫字符串,唯一命中就是本票这一处(其余读数位都走了占位符或 numberish)。证据:离线端到端回归 t27-ledger-undefined 8/8,把守卫改回缺陷原样则 3 项转红;真实 DATA_SOURCE.REAL 浏览器正证 + 反证成对取得(同一空态、只改守卫一处,undefined 出现↔消失)。方法论:「缺失值不直出」的守卫要按整个缺失域(undefined/''/NaN/字符串)收口,只判一种形态等于没判;离线绿必须配一次真机反证,否则证明不了「真实空态」就是缺陷的触发条件。

  • 19: 后端执行票 —— 预警/事件族故障根因(部署时序错位,非缺列) — 已按证据收口(验收四条全过):根因是部署时序错位(旧构建 d8a6b03 仍读已被 927fad2 删除的 early_warning.warning_name 列),无需新代码;票 30/31 现场复验的「后端重启」已把实例带过该提交——实测 PID 27208(2026-10-12 20:13:30 启动),HEAD=origin/master=d81c977b、927fad2 为其祖先。带参探测 10 个受影响端点全部 HTTP 200+业务 code=200,报警字段真实(eventName/level/阈值/坐标);warningName 随新契约整体移除(5 个事件族响应 0 次出现),事件名统一由 eventName 携带。t18 真实审计 140/143(票 22 时代 33 败),events-*/warning-* 失败清零,余 3 项均为基线卡已记的 monitoring-createdAt 后端缺口(不属本票);141 次请求零 5xx。新事实核对推翻了立票预判:预警事件并未失去坐标——6/6 经设备回联携带有效坐标(VALID/renderable=true),删的只是 early_warning 表自有经纬度列;「无坐标预警呈现」担忧未触发(前端无锚点纪律仍兜底将来真无坐标情形)。票 26 的最后一道阻塞(#19+#22)已全部解除,#26 成为通往阶段收口 #18 的唯一前沿票。

  • 26: 诊断票 —— 主场景等待后画面抽搐的根因定位 — 已诊断收口(修复归新票 33):「等待一段时间后整个画面抽搐」=每 30s 的 freshness tick(DEFAULT_REFRESH_SECONDS=30)触发 mapStore.refresh() 全量分页重载(8 批、auto-batch 120ms),每批到达都经 summary.objects watcher → applyMarkers() 做两件事——标记层 entities.removeAll() 整层重建 + 管线层 syncPipeLayer 名义 upsert 实为全量重赋值(existing.polyline = spec.polyline 等,Cesium 属性订阅 → 5000+ 贴地折线几何失效重 tessellate);modeLayerPlan 每次 pipelines.slice() 新数组引用使 deep:false watcher 也拦不住。证据:CDP 无头探针两轮复跑——静置 p50=16.7ms,30s/60s 窗口 p95 冲 400-666ms、长任务(~175ms)与 map-snapshot 响应 ±500ms 精确对齐;相机/雾/交接/区域状态机全程 0 翻转(排除票面候选四族)、WS 0 帧、0 报错。消融 A(15s 后拦 map-snapshot)周期性 stall 消失(p95 回 16.7ms);消融 B(缓存回放)因探针补丁干扰作废不采信(已如实记录)。修复建议四条(syncPipeLayer 真 diff / 计划层引用记忆或 debounce / 标记差量 / 不改刷新语义)与真机回归判据已写入票 33,33 已接入票 18 阻塞链。

  • 33: 前端执行票 —— 每 30s 刷新触发全管线重同步的画面抽搐修复 — 已实施并关闭(维护者目视终判「目前没有再见过抽搐问题了」)。按票 26 四条建议全做且未动刷新语义:syncPipeLayer 领域输入内容指纹先行比对(未变零属性写入、连 spec 构建都跳过,返回 added/updated/removed/unchanged 可观察计数);modeLayerPlan 去 slice() 原样引用;MapCanvas 批间 120ms 领先+落尾合并;syncPointMarkers 去 removeAll() 改 id+指纹增删改。证据三层:离线闸门 t33-jitter-diff 15/15(引用身份断言证零重赋值——还原旧写法必转红);真机 dev server + real 后端同环境修复前后对照(基线复现成簇 685–1080ms 纯 snapshot 长任务、tick 增量 +33ms;带修复 tick 增量 −0.1ms,刷新窗 p95 216.7 ≈ 静置 216.8ms,0 pageErrors);t47/t48 离线 6/6。方法论(本票最重要的一条):票面绝对阈值 (a)±500ms / (b)p95≤33ms 在当前无 GPU 软渲染 + 票 35 的 v8 白模持续流送环境物理不可达(静置底噪 p50≈200ms;票 26 的 16.7ms 基线属 v6 素材时代)——环境底噪污染绝对毫秒判据时,用同环境 A/B 对照 + 病灶专属口径(tick 增量/成簇形态/纯 snapshot 簇)定性,不拿绝对阈值假装通过也不因它否掉真修复;阈值本身维持原样供 GPU 真机复跑。⚠ 关闭≠已入库:改动仍在工作树(混有票 32/35 并行在制品,MapCanvas.vue/cesiumEngine.js 尤甚;cesiumPipeLayer.js 已确认与票 32 的 onModelChange/layerVersions 共存未互相覆盖),入库须单独裁剪 4 源文件 + verify/t33* + verify/artifacts/t33/。浏览器层 t47 走查需临时翻 mock 配置(归并行会话在用,本会话未动)未跑,归票 47 自己的 mock 窗口。

Not yet specified

  • 全局分页实施分批:先由规格票 —— 驾驶舱所有长列表统一分页(每页十条、页码与前后页)盘点当前列表来源与复用边界;规格收口后再毕业出事件清单、监测台账、设备关联列表等具体实施票。地图渐进加载与真正的页码分页边界尚未在实现票中决定。
  • 票 47 裁定「DOM 完整复刻 billboard 功能后才替换它」:替换时刻的收尾决策尚未锐化——聚合符号(K>1)DOM 化的呈现形态、billboard 视觉摘除的判据、以及 DOM 标记与设备/监测点特效(票 45)的叠放关系,都要等单标记 DOM 复刻走查通过后才能立票。
  • 首批真实接线完成后,基础设施四个面板各自需要哪些真实适配器、district/ownership_unit 的筛选与展示边界,以及井盖(MANHOLE)跨端是否已可用。
  • 预警处置的事件读模型、设备异常回联、时间线展示与处置率聚合在真实后端中的切片拆分和数据稀疏降级。
  • 总体概览缺失的前端面板实现、聚合端点与其对基础设施/运行监测/预警处置的复用关系。
  • 后端真实数据库快照中坐标校验、设备—监测点关联稀疏和空数据的最终演示样本。
  • 后端 operating-information 字段改名(pointCodes → facilityCodes)(票 49 裁定的落地):结论已定,但按本图 Notes「后端执行票需在后端仓库、负责人和权限明确后开启」,它还开不出来。等后端执行窗口明确时立票,契约测试口径为「该字段只承载设施编码,不承诺可被 map-snapshot 回联」——不要照抄票 49 原验收里那条基于错误前提的「必须能在 map-snapshot 找到对象」。

Out of scope

  • 登录、权限管理、工单处置等写操作。
  • 将历史“责任区域”验收文字复活为本次字段,或用 district、industry、maintainer 冒充责任区域。
  • 用前端本地过滤替代后端 map-snapshot 的状态筛选;不得把未加载分页的数据静默删掉。
  • 失败时静默回退 mock,或把 mock 走查结果当成真实后端联调证据。
  • 重写既有 mock 面板、模式词典、地图/相机决策和已关闭的前端实现票。
  • 移动端、写操作业务、UE5、Docker、国产化认证及非驾驶舱领域。

Current status

2026-10-17 票 52 已实施、验证并推送关闭(后端执行票 —— 单设备业务优先级裁定落地):52 单设备「全部报警均有未结束工单时工单处置最高」。本图第一条在后端仓库落地的执行票:后端仓库定位为 E:\pipe-ner-server(Gogs shaoy/pipe-ner-server),只读数据库 192.168.110.30:54321/pipi_ner 直连取证。维护者 5 项裁定后实施——只取未处理报警(alarm_data.alarm_status=0)、承接=work_order_id 非空且工单未结束(order_status ∈ {0..4,6};5/7 终态)、空集/读失败保守降级 ALARM、resolve() 与枚举 priority 不动(前端零耦合)、提交并推送。判定单源仍是 CockpitMonitoringPointStatusResolver.deviceStatus(),事实由 BusinessCockpitDeviceFactResolver 计算并经三处接缝透传(快照 / 分布适配器 / effectiveDevice 重建 / 点位详情归一化)。提交 3772220e + 既有编译阻塞修复 5d4d03c6 已推 origin/master(远端核实);Cockpit*/BusinessCockpit* 512/512、变异闸 7/7 打红并字节还原、前端 t09 38/38。两点如实留档:① 票面「实测 21119740 应为工单处置」被真实数据证伪——该设备 2 条未处理报警均无工单承接,按裁定就该判 ALARM(票面把设备级 workOrderInProgress 误当成「未处理报警已逐条承接」);② 新规则在当前真实数据上不改变任何设备读数,属正确行为而非未生效。顺带修复:zksy-system 在 HEAD 上根本编译不过(SseEmitterManager 需 spring-webmvc,而它只以 provided 传递),已显式补 provided 声明、未改运行语义。zksy-system 全量另有 2 失败/1 错误为既有(stash 对照逐条相同)。

2026-10-16 票 49 已诊断并关闭(后端契约诊断 —— pointCodes 是设施编码):49 operating-information 的 pointCodes 返回设施编码 复现现象、定位根因到后端适配器源码、证伪票面两处前提,并由维护者本会话裁定:pointCodes 就是源设施编码(四类设施实体逐条生成,恒单元素;设施的 plantCode/stationCode/networkCode/id),后端应改名 facilityCodes;前端该面板撤下定位按钮(不可达不该做成常态)。补充裁定:管网是特殊设施、无对应设施点,走既有局部管道增强交互。票面证伪:应急保障三段 pointCodes 全为空(「对照组链路可用」不成立);PS001/PS002 与 map-snapshot 撞名且系假阳性(供水泵站指标飞向排水监测点001)。落地:前端撤按钮/改文案 → 票 50;industries[0] 误选(顺带发现)→ 票 51;后端改名待后端执行窗口(见 Not yet specified)。闸门 t49 契约探针 8/8 + t49 前端后果闸门 8/8,证据载荷落盘于 verify/artifacts/t49/。本轮未改任何产品代码(诊断票只出结论)。

2026-10-14 票 42 已收口(前端消费票 41 的新契约):42 预警设置面板消费预警自身生命周期契约 实施、守卫、mock 同构并关闭(提交 0cd16ac 本地未推送——本地领先远端 19 提交多为并行在制品,不代推)。预警族工单口径 null 保真(不补假零条)+ 四组生命周期分布块;报警族工单口径与 alarm_status 分布并存;态势总览 KPI 改预警已解除率。新增 t42 契约守卫(基线卡片 §4.2 真实值过领域+视图两层);t20 守卫随契约更新(B3c→报警族、B3e/B3f/C4d 新增、M4 重定位、M14 新增)。t20 闸门 60/66:6 条红(B4/C2/D2b/D3/E2/F3)经 HEAD 基线对照证实为既有失败(与本票 diff 零交集);变异闸与 t50 因并行会话清空 node_modules/@babel/*(16:03)暂无法跑,恢复后建议复跑。真实走查前置=共享实例滚动部署 b047a60d + 维护者授权浏览器验收,归票 17。

2026-10-14 票 41 已收口并另立前端票 42:41 预警设置端点改为预警自身生命周期统计 按维护者本会话裁定实施 —— 预警族只给预警自身生命周期(WarningWorkflow 六态/等级/行业/片区分布 + 已解除÷总数,工单口径六字段显式 null 不用 0 冒充),报警族保留工单口径(报警靠工单闭环)并并存 alarm_status 生命周期;诊断修正了票面根因(dispatch_user → dept_id,实为构建落后库结构,上游 94bb7e4d 已修)。基于 origin/master 独立 worktree 实施,未动共享工作树的并行在制品;契约 24/24、全量 498/498、第二实例(8399,同库)实测 code=200 且分布四组和恒等于 total;提交 b047a60d 已推 origin/master。前端消费侧由 42 承接并已收口(见上条)。

2026-10-14 票 35 已关闭、票 36 已修复关闭(票 18 两项技术阻断均已处置):票 35(监测三端点 createdAt)实施并真实复验通过 —— 新增单一口径来源 CockpitCreatedAt(不读时钟,结构上无法用响应时间冒充数据时间),三端点信封级 + distribution/situation 逐对象 createdAt 齐备,map-snapshot 与 archive 未新增该字段;Cockpit*Test 507/507(新增契约 18 项),真实只读复验字段齐备、信封 == 逐对象 max(自洽复算)、均 ≠ updatedAt,t18-real-audit 140/143 → 143/143,前端三面板「数据时间」由 — 变真实值;提交 05c23774 已推 origin/master。票 36(调色 shader 编译失败)已修复收口:根因是自有调色 shader 用 GLSL1 varying 而 Cesium 1.145 在 WebGL2 下前置 #version 300 es(引入 e2529b5),限定提交 850c6c6 一行 in vec2 + t49 闸门反向锁定(含截断哨兵,变异验证),纯提交内容与真机/CDP 探针三面验证全绿——诊断期曾与票 49 判重,维护者指令后固化提交收口;未推送(分支 16 个未推送提交多为并行在制品,不代推)。票 18 保持 claimed/ready-for-human/open,是否收口仍取决于真人业务验收。

2026-10-13 新增维护者界面/语义反馈分批执行票 37–41(5 张):维护者就「总体概览-预警设置一直数据加载失败」等 9 条反馈定夺后,按「分批立执行票」拆为:

  • 37 共用长文本省略方法 + 监测概览设备类型分布筛选与降序 — 已收口(2026-10-15,closed):超长文本省略成 …、hover 显示完整的共用方法(domain/ellipsis.js + components/EllipsisText.vue)在共享渲染层所有可能溢出处统一使用;设备类型分布降序 + 可点筛选(复用 panel-action 接缝,deviceType 与 industry/district/pointStatus 同层全局条件)。离线闸门 t50 30/30 全绿(Pinia 依赖恢复后 store 级 toggle/归一/reset 断言全部实跑);浏览器四条正反证通过(点击筛选 9→2 台、再点取消恢复、切模式保持筛选、降序 2/2/1… 且 title 与完整原文同源)。38/39/40 依赖本票的省略方法,均已就位。维护者新增反馈拆为票 43–46(本票范围外)。
  • 38 基础设施面板调整(ready-for-agent)——基础档案设施总数与规模同行;删除「规模」读数(实测 totals.scale = null 无数据,facilityTypes[].scale 实为长度单位 "km",长度已由 lengthKm 承载);运行信息定位修复(三种「点不动」必须给可见反馈,「没反应」是缺陷);管理信息片区×行业改分类柱状图 + 紧凑卡片。
  • 39 运行监测面板图表化(ready-for-agent)——监测概览纯文字读数改卡片/图表块(四态照实呈现、不合成「故障」);监测分布加明确子标题分节(图与数据指代对象不清)。
  • 40 运行概况与监测点台账卡片化 + 定位修复(ready-for-agent)——异常设备清单与台账设备改卡片形态;两处定位修复(复用 domain/mapLocate.js 既有接缝)。
  • 41 后端执行票 —— 预警设置端点改为预警自身生命周期统计 — 已收口(2026-10-14,见 Decisions so far 与下方 2026-10-14 条目);其前端消费侧由 42 预警设置面板消费预警自身生命周期契约(ready-for-agent,Blocked by: 41 已满足)承接。

关于「预警设置数据加载失败」的根因(已实测定位;2026-10-14 票 41 诊断修正):不是前端缺陷。/overview/warning-settings 实测 HTTP 200 + body code=500。票 41 收口时复测:报错列已从 dispatch_user 漂移为 dept_id(实体声明了库中已删列),真实根因是运行构建落后库结构(上游 94bb7e4d 已删该列,共享实例重启后 8301 的 500 已随之消除);工单依赖的故障面也比「单点」大(events/handling-efficiency、/work-orders/{code}/timeline 同因 500)。语义层面的修复(预警族自身生命周期)即票 41,已交付;前端消费归票 42。

2026-10-12 后端执行票 31 已关闭(设施总数三处口径不一致):31 设施总数三处口径不一致(5278/5276/5273) 根因是三个适配器各选不同设施表集合(非管网求和算法差异);新增唯一设施目录 CockpitFacilityCatalog(六类合法设施并集),概览与管理信息改为投影同一目录,未知/缺码显式进 excluded,并修正未来日期设施漏入片区分布。提交 96834794 已推 origin/master;Cockpit*Test 469/469(变基后复跑 465/465)、新增跨端点契约 2/2;后端重启后现场三端 facilityCount 均 5283、行业拆分 GAS537/WATER_SUPPLY1006/DRAINAGE3737/MANHOLE3 三端一致、片区合计 5283、三端 excluded 全 0。

6/6 决策票已解决 + 4 张规格子票 + 后端执行票 11/12/13 全部收口并复验通过(滚动复验票 17 亦收口)+ 后端票 20 已收口并完成现场复验与审查补齐 + 前端票 14/15/16 已收口。 决策 01–06 收口;规格 07/08/09/10 为 ready-for-agent;执行票 11/12/13 已 resolved 且真实环境复验全部通过(基线卡片 02/03/04 均至 ③)、17 已 resolved(三切片滚动复验完成)、20 已 resolved(主修复740d896现场管网总量5268;补齐29d1ae2、合并0a6b108已推,管网专项29/29;基线卡片05至③,报警旁路失败单独记录)、14/15/16 已收口,18(前端真实接口联调与阶段收口)进行中——票 18 真实数据口径核对暴露的设施总数缺口已拆为后端票 20。

2026-09-28 追加(免鉴权已落地,未提交):免鉴权范围已按 ADR 0005 修订实现——后端(E:\pipe-ner-server 工作树):SecurityConfig 放行 GET /api/cockpit/v1/**、24 个 cockpit 控制器移除方法级认证、WS 协议注释与手册对齐"cockpitSubscribe 直订无需 authenticate"(authenticate 帧保留给管理端工单推送);新增 CockpitAnonymousAccessSecurityConfigTest 等回归。前端(本仓库):cockpitApi 不再发送 Authorization,runtimeSocket open 后直接 cockpitSubscribe(无 authenticate 帧)、token 链路下线,mock/文档/验证脚本同步。验证:前端 t15 43/43、t04、t08 通过;后端改动未跑 Maven,且前后端均未提交——票 05 的联调基线只需补提交哈希/环境/数据快照,但免鉴权的真实 HTTP/WS 复验(无凭据 200、WS 直订)须在部署后进行。落地明细见 票 25 第十五轮。

后端最新基线(2026-10-09 票 12 复验后更新):E:\pipe-ner-server 的 origin/master=818a6d7(工作区干净,已推送;含本图 3de679c、票 12 的 ee2e1b6+18db910 与上游 7df9a87);联调环境 http://192.168.110.96:8301(= 本机,IDE 内运行的 Spring Boot 进程)实测可达、免鉴权只读接口全部 HTTP 200,且已加载新构建(进程 PID 15244)。目标部署 192.168.110.30:8301 已按决策票 05 移出本阶段,不再作为收口条件。

票 25 已同步为本图入口和历史契约台账,最新事实见 25: 后端契约缺口待办 与 交接包。执行票 11–13(后端)与 14–16(前端)已发布;后端票待负责人、Gogs 提交基线与联调环境确认后认领,前端票可认领。联调基线卡片的格式与第一张样板卡已就绪,后续切片按模板追加。不把未提交工作树或 mock 走查当成真实联调证据。

2026-10-08 执行票 11 已收口(resolved);复验抽为票 17:11 工单状态与处置率读模型对齐 诊断 + 口径修订 + 契约测试 + 提交推送全部完成——工单字典 0–7 本已对齐(新增逐码锁死测试);处置率分母由事件总数改为状态 0–6 工单数(状态 7 排除,范围=当前筛选内全部工单、按 work_order.create_time 界定),basis 改为 CLOSED_WORK_ORDERS_OVER_ELIGIBLE_WORK_ORDERS,分母 0 → NO_ELIGIBLE_WORK_ORDERS,并在维护者裁定下同口径修订三处(handling-efficiency / history-analysis 汇总 / overview warning-settings 两 family 共用);关键结构性事实:旧 snapshot 只携带已关联报警的工单,给不出该分母,故三个 snapshot 新增 scopeWorkOrders。后端 E:\pipe-ner-server 14 个源文件改动,编译通过、Cockpit*Test 299/299 通过(提交后复跑一致)。提交与推送:3de679c(本票口径修订)+ 9380c1b(非本票:修复 HEAD 中 CockpitFreshnessSemanticsControllerTest.java 未闭合语句导致 zksy-admin 测试模块无法编译,单独成提交)→ origin/master 5b53a6d..9380c1b;基线卡片 02 工单状态与处置率读模型 已产出。

为解阻塞而做的收口拆分:「新契约在部署环境生效」需要一次真实部署才会发生,把它留在票 11 会让「已完成的实现」绑住「尚未发生的部署」,无谓阻塞票 12/13。故抽为独立票 17 部署后真实环境复验(ready-for-human,Blocked by: 11),票 11 按其自身交付物 close;票 12 阻塞随之解除。票 17 不阻塞 12/13,且票 12/13 落地后的复验并入票 17 同一部署窗口。

勘误(2026-10-08):早先写入本图与两处票面的复验预期「ALARM 组 denominator=2、value=0.5000」错误。该 2 由旧响应 stateCounts(0=1, 5=1)反推,而旧 stateCounts 只累积已关联报警的工单(未关联者直接 continue 跳过)且按事件累加(同一工单多事件重复计);新口径分母取自 scopeWorkOrders(范围内全部工单,含未关联报警者),两者基数不同、不可互推。复验判据已改为自洽性:basis 为新值、sum(workOrderStateCounts[0..6]) == denominator、denominator ≠ totalEvents、分母 0 时 reason=NO_ELIGIBLE_WORK_ORDERS。前端 contractMocks.js 的处置率分母/hint 文案仍是旧口径,归执行票 14–16。

2026-10-08 票 17 复验:票 11 切片已通过(③ 达成)。部署基线 origin/master = 89ca989(含 3de679c 与上游 7df9a87),进程 18:39:11 重启后实测:

复验项 实测 判定
events/handling-efficiency?eventFamily=ALARM basis=CLOSED_WORK_ORDERS_OVER_ELIGIBLE_WORK_ORDERS、num/den=2/3、value=0.6667、sum(状态0–6)=3==分母、totalEvents=6≠分母 通过
events/history-analysis?eventFamily=WARNING 汇总 num/den=2/3;行级仍 reason=NO_EVENTS(事件桶未变) 通过
overview/warning-settings warning / alarm 均 num/den=2/3(两 family 同源);事件计数各算(10 / 6) 通过

数据稀疏事实:work_order 仅 3 行(状态 1×1、5×2),分母即为 3 —— 故实测分母为 3 而非勘误前预期的 2,进一步确证判据须用自洽性而非固定数值。基线卡片 02 阶梯升至 ③ 真实数据联调完成;④「模式整体收口」仍待真人验收(决策票 01)与前端接线(14–16)。

票 17 定位(维护者裁定):作为贯穿票 11–13 的滚动复验票,保持开放(in-progress),票 12/13 落地并部署后在同一票、同一部署窗口追加,不另开复验票;故本票未记入 Decisions so far(未关闭)。票 11 切片结果单独记于其「复验进度」表。

复验窗口故障(已解决,教训留存):重启窗口内 5 个只读端点(events/* 与 overview/warning-settings)曾 500,根因是数据库表结构重构与 Java 层不匹配 —— app_user.equipment_warning_type 已改为关联表(equipment_type_id + warning_type_id),元数据移到新表 app_user.warning_type;app_user.alarm_data.warning_type 列已删除。该重构由上游 7df9a87「优化报警管理」完整修复(新增 EquipmentWarningType 实体、AlarmData 去 warning_type 并加非持久化 warningName、WarningThresholdServiceImpl 与 4 个 XML mapper 一并改到新结构)。本会话曾基于落后基点 9380c1b 做局部修复(分支 fix/cockpit-warning-type-split),确认上游已有完整解后已废弃(未推送、无损失)并跟随 master。教训:复验前必须先 git fetch 确认远端基线,不要在落后基点上把上游的新结构误诊为「改了一半」。

2026-10-08/09 执行票 12 已实施、推送并复验通过:12 报警/工单读模型、设备–监测点回联 + district 片区契约 诊断 + 六项维护者裁定 + 实施完成 —— 把旧自由串 region(实测恒为「未分区」,适配器写死 null)改为权威片区 district:新增口径单源 cockpit/foundation/CockpitDistrict.java(归一/点位归纳/入参解析/匹配),六族统一改造(地图摘要、运行监测 distribution+situation、基础设施 base-archives、事件多维分析),响应形态为 district(Integer,未分区 null) + districtName,筛选入参 district=0|1|2|UNASSIGNED(脏值 400),mapFilter 增 districtFilter(NONE/ASSIGNED/UNASSIGNED,用于区分「未筛」与「只看未分区」这两种编码同为 null 的情形)。管理信息按决策 06 删字段 organizations/ownershipDistribution/unmaintainedCount/organizationCount,改 districtIndustry[](片区×行业)。工单读模型新增逐张 associatedWithCurrentEvent + 顶层 unassociatedWorkOrderCount,满足「未关联当前报警的工单明确提示」。提交 818a6d7 已推 origin/master(89ca989..818a6d7),组合测试 372/372,部署后真实环境复验 8 项全通过(基线卡片 03 至 ③)。本票已 close,票 13 阻塞解除。

关键事实:只有 equipment_base 有 district(7 行全非空 0→4/1→2/2→1);monitor_point 无该列、PipeNetworkBase 无该字段、equipment_point_rel 实测 0 行 —— 故点位按「经其上挂设备归纳」、设施一律未分区,如实呈现、未加数据库列、未用行业或管理单位冒充(维护者裁定)。关联键经真实库核实为 alarm_data.work_order_id = work_order.order_id(维护者原述 alarm_no = order_no 命中 0 条且两列均不存在,已按数据库事实裁定)。

验证与状态(票 12 收口):48 个文件改动 + 1 个新增;编译通过、组合测试 372/372(早期 311 的统计漏掉 Business*AdapterTest 一族,已修正口径)。分支经复验后合入 master 并推送(818a6d7),部署后真实环境复验 8 项全通过,票 12 已 close。前端消费侧必须同步(已通知 执行票 15):regionMap 配置映射失效、管理信息三字段消失、NO_ORGANIZATIONS 改名 NO_RELATIONS。测量教训:复验中曾因控制台把 32 位十六进制串统一渲染成 0 误判 alarm_data.id 为占位值并提交改动,经 count(DISTINCT)/直方图/base64 复核后撤回(18db910)——判「相同/为零」不可凭肉眼读控制台。

2026-10-10 后端执行票 20 实施时记录(当时待部署;2026-10-12 已现场复验、审查补齐并关闭,最终结论见本票及审查报告):20 管网编码 0/1 映射与设备边界设施类型命名空间(票 18 真实数据口径核对发现、真人走查第 4 项佐证:界面设施总数 1001、实际 5268)。诊断用真实库只读探针坐实:network_type 分布 0=537、1=3735、2=996(合计 5268),GIS 权威规则 0燃气/1排水/2供水,而 equipment_type 主键 id=1「供水设备」、id=2「排水设备」——数值域重叠、语义不同。三处缺陷:(1) 三个适配器各自复制映射逻辑且都漏 0/1,4272 条管网被 continue 静默丢弃;(2) 设备边界把原始 network_type 透传去查 equipment_type 字典,造成 3735 条排水设施被标「供水设备/WATER_SUPPLY」、996 条供水设施被标「排水设备/DRAINAGE」(命名空间碰撞,非缺数据——原类注释「network_type 是自由文本、与 equipment_type.id 无对应关系」的前提为假);(3) 概览设施 SourceType 行业恒 null,5268 条管网被计入 excluded.unknownTypeCount。修复:新增单一权威来源 cockpit/foundation/CockpitPipeNetworkType(仿票 12 的 CockpitDistrict),设施改用管网命名空间码(GAS_PIPE/WATER_PIPE/DRAINAGE_PIPE,objectKind=FACILITY),四处适配器统一取用;维护者裁定删除旧映射 "3"(真实库无此值,与 equipment_type.id=3 同源混淆)。契约零变更——四个服务的 excluded.unknownTypeCount/unknownIndustryCount 承接逻辑本就存在,是适配器提前 continue 让它们恒为 0。提交 740d896 已推 origin/master(基点期间并行会话推入 4 个提交,经核实未触碰 cockpit 包);全量 439/439(新增 17 例),变异检验两处确认测试有牙齿(还原隔离后精确复现「排水→供水设备」等 7 例转红;还原概览行业 1 例转红)。基线卡片 05 管网编码与命名空间隔离(状态 ②)。本票未 close:真实计数复验(base-archives 覆盖 5268、概览 unknownTypeCount 不再 5268、设备边界类型名正确)与票 18 走查复跑待部署后进行。

2026-10-09 执行票 13 已收口(含部署复验),滚动复验票 17 亦收口:13 报警/工单实时同步 诊断 + 2 项维护者裁定(① 实现 cockpitWorkOrderStateDelta 工单状态增量帧;② 设备帧补 eventId 透传)+ 实施 + 复验完成。诊断证实:唯一工单推送 workOrderReminderPush 是管理端提醒(需鉴权+按人过滤),驾驶舱收不到——印证决策 01 预判;且 work_order.update_time 在状态流转时不更新(transition() 只 set orderStatus、无 FieldFill),增量检测必须逐单比对 orderStatus。新增 CockpitWorkOrderDeltaPushTask:定时扫描(60s 可配)+ 逐单比对 + 变化才推给全量订阅会话(免鉴权,不按人过滤,与管理端提醒语义隔离);首扫只建基线不推送(REST 才是初始快照);帧带 scanIntervalMs 诚实标注延迟上限、不带会误导的 updateTime、不泄漏主键 orderId(对外键 workOrderCode,与 REST 读模型同口径);stateCode/stateName 出自票 11 字典单源,脏码名称显式 null。设备帧 cockpitDeviceStatusDelta 补 eventId 透传(缺省显式 null;zk-api-service 是否真发未证实,防御性透传不臆造)。范围 1 REST 快照复用票 11/12 读模型无新端点;降级纪律(无订阅不查库、失效会话清理、断线重订)有测试锁定。提交 d8a6b03 已推 origin/master(4ef2159..d8a6b03),针对性 21/21(新增 8 例)+ 全量 422/422。部署复验 6 项全通过(实例 PID 20240 @ 13:41):WS 回执正常;无变化不推送(75 秒订阅窗口 + 库状态对照闭环);真人提交验收 284 工单(3→4)→ 40 秒帧到达(延迟 < scanIntervalMs=60000 标注上限,workOrderCode/stateCode=4/stateName=待验收/deviceCode 全对,帧内无 orderId/updateTime,items 只含变化那一张);且 13:55:47 一次只改 update_time 不改状态码的「处置」不触发帧(检测由 orderStatus 驱动的正面证明)。基线卡片 04 报警/工单实时同步 升至 ③;票 17 三切片(11/12/13)复验全部通过、滚动使命完成故收口。上位回写已按决策 01 执行(票 25 已回写三切片证据;Gogs #63 同文回写需负责人远端执行)。后端三切片全部完成;剩余前端 14–16 与阶段收口 18,真人闭环演示归阶段总收口。

2026-10-12 票 22 已收口(修复实施 + 真实复验全过):22 前端执行票 —— 真实响应信封消费与业务错误映射修复 经核验确认核心信封解包由并行提交 ead39442 提供(非本票实施);本轮新实施同一条业务错误映射链上的两处白名单继承键缺口 —— readBusinessReason 与 sectionStateFromBackend/sectionStateFromFreshness 用普通对象下标查白名单,后端回 category/state 为 toString、__proto__ 等继承键时会把函数漏成失败原因/分区状态,与「只认白名单」的既定纪律冲突。修复提交 86db4d4(两文件 5 行,改用自有键查找),新增离线回归 verify/t22-envelope-frontend.mjs 19/19(修复前 5 项实测为红),既有 t48/t04/t05(283)/t07(39)/t08(44) 无回退。经用户授权后的真机复验:重跑 t18-real-audit.mjs(116 次只读 GET),三项 frontend-* 由 failed 全转 passed(档案适配值与真实一致、地图 total/snapshotAt 正确、业务 code=500 由 success 改判 failed);yarn dev + 真实浏览器逐模式确认,总体概览出真实数字(设施底数 5276),/events/current?mode=ALARM 对应分区显示「数据加载失败 · 数据源暂不可用」而非 success 或空白。该次审计仍有 33 项失败(八桶 pointStatus、设备维事件/工单业务 500、monitoring/* 缺 createdAt),分属票 29、票 23与票 18,不因本票收口而消解。

进度

  • 45: 前端执行票 —— 场景监测点状态优先级、并行状态与告警特效 — 第三轮已实施并关闭(2026-10-17):仅 ALARM/WARNING/WORK_ORDER 产生特效,严重度为报警 > 预警 > 工单;辐射环中心锚定图标尖端落地位置;统一 profile 为 ALARM 4 层+中心辉光、WARNING 3 层中等透明度、WORK_ORDER 2 层低调旋转环;固定少量 DOM 节点 + CSS transform/opacity/filter,real 浏览器取证通过;t45 32/32、变异 7/7。

Comments

Answer