Type: execution Status: resolved Label: ready-for-agent Blocked by: 15 Category: execution
What to build: 实现位置符号合成计划层(唯一新接缝)并接入双层水滴徽标体系——唯二纯白母版(实心 WhiteFull / 镂空 White)承载状态色、内层行业/设备图标降饱和降亮度、尖端锚定、宽度基准 18/14、无设备点位不用内层图标、未关联设备用镂空 + 行业图标 + 降饱和;监测点仅报警态加扩散环。地图标记、图例、详情卡片、设备图层继续由同一语义来源生成。
依赖说明: 本批 Blocked by: 15(token 批)——外层母版着色读取 token 语义色,token 值未定稿前不动工。
--lv1..lv4 新值 #ff3b52/#ffb020/#01abea/#27d17a 即本批外层母版着色来源),后端依赖边 Blocked by: 15 已 closed。T_MarkPoint_WhiteFull / T_MarkPoint_White)与内层行业/设备图标已入 manifest 且通过校验。
markers/marker-{gas,water,drainage,manhole}.png);manifest 37 条全过(含 fonts 块与批次 4/5 并存)。research/measure-master.mjs,与票 05 一致):bbox 378×475(比例 1.257)、尖端 x=49.87%/y=100%、帽心相对高度 0.397——作为素材属性登记进 MASTER_GEOMETRY。实现者自测(纯逻辑 + 静态检查):
EMPTY 点位 = 镂空无内层;未关联设备 = 镂空 + 行业图标 + 降饱和);任何允许缩放下监测点恒大于设备;锚点为尖端偏移;内层图标直径约圆形区域 60% 且圆心对齐帽心;图例与标记同源。
research/check-marker-plan.mjs:34/34 全绿(六组:母版归属 5、内层规则 7、尺寸层级 7、锚点 1、内层几何 2、着色与降饱和 12)。tint 按状态词表推导(ALARM→lv1…未知状态→neutral 不猜),调用方可覆盖。research/anchor-migration-verify.mjs:7/7 全绿。三向验证——① 新断言×新实现(BOTTOM+22.63 高+宿主读数)过;② 新断言×旧签名(不传 planOf 保持 CENTER/18×18)如预期不同——证明「未迁移」可被查出;③ 旧断言(CENTER/方形 18×18)× 新实现必失败——证明不存在「改完仍是绿的」假象。兼容性:既有 verify 脚本(t09/t45/t47)用四参签名调 syncPointMarkers,第五参缺省走旧分支,不破坏。data-* 读数暴露合成结果(母版种类、内层图标、锚点偏移、降饱和标记)。
markerMaster(solid/hollow)/ markerInner(行业语义名)/ markerAnchor("0.4987,1")/ markerDesaturate(yes/no),由 planToDataset() 产出;锚点迁移脚本已断言 markerMaster=solid。marker.master.solid/hollow core=true + marker.inner.{gas,water,drainage,manhole});markerAssets.js/markerPlan.js 全部经 resolveAsset(),无物理路径。check-marker-plan.mjs 覆盖状态词表七态(含未知状态不猜);planPointMarkers 只加 industry 透传字段(data-legend-key/data-status-* 断言面未动);真实页面走查(截图)四模式面板/图例/标记正常,控制台无 Vue 报错。维护者走查(真实 /cockpit):
VerticalOrigin.BOTTOM),点位拾取/图例计数/定位行为正常;建议维护者复核放大视角下尖端与坐标点的贴合度。EMPTY 点位与未关联设备确实走镂空且彼此可辨。
point-statuses(合成计划断言已覆盖归属唯一性)。map.effects 开关生效。
deviceEffects.js/引擎特效代码零改动);监测点级扩散环为既有 haloSvg 链路的报警态门控(规格 10),本批未改动其触发逻辑——帧差证据留维护者走查补(需要多帧截图对比)。缺口登记:
data-* 读数:实体 properties markerMaster/markerInner/markerAnchor/markerDesaturate(planToDataset() 产出;锚点迁移脚本已断言)。维护者复核:拉伸 ✓、文字位置 ✓;四项反馈全部处理:
backgroundPadding 7×4 → 3×3(文字贴框边)。renderLabelPlate() 烘位图替换 label,维护者复核文字消失(根因:Cesium label 的 image 与 text 互斥渲染,text=' ' 零宽 + 位图替换时序不稳)。已回退为原生 label 底板(showBackground 深蓝 #03203c@0.78 + padding 3×3)——文字可见性优先于底板美化;Cesium 引擎限制(无圆角/装饰边)如实登记为走查遗留。renderLabelPlate 代码删除。plan.draw,高质量重采样)——Cesium billboard 纹理默认 LINEAR_MIPMAP_LINEAR,源图 458px 缩到 86px 走 mip 高层发虚;1:1 贴图不参与 mipmap,最锐利。(用户提的「UI 同层 DOM 渲染 + 3D 定位」评估过:需把标记迁出 GPU billboard、每帧同步 DOM、与拾取/聚合/特效全链路耦合,改动面与运行开销大——先以 1:1 贴图观察,若仍不满意再立票做 DOM overlay。)recolorInner 亮度反转提亮——形状处染「白 → 浅蓝 #9adcff」渐变(t 提亮 1.4 倍),形状亮、母版状态色暗,对比度拉开。染色规则已更新进图标素材使用共识 §4.2。openSelection 分支补 locateMonitoringPoint 已生效(走查确认)。复验:合成计划 38/38、镜头联动 5/5、ellipsis 6/6、语法检查过;真实页面走查——文字全部回来(多字完整显示)、内层浅蓝图形清晰可辨、描边平滑、控制台无报错。
维护者复核:拉伸 ✓、文字位置 ✓;另四项:
backgroundPadding 7→3)。renderLabelPlate()(markerAssets):「圆角深蓝底 + 青色装饰描边 + 文字」整体烘成位图,异步替换原生 label(label.image = 底板位图,text 退占位);首帧仍原生(可读降级)。第 5 项定位缺口的真因(两段叠加,前轮只修了第一段):
planDeviceFlight 缺「NONE→设备级」分支(第五轮已修,关联设备路径生效);unassociated-equipment),它的点选走 openSelection 只开面板无镜头——且它不在 deviceLayerStore.rows(关联清单)里,selectDevice 根本不适用。MapCanvas 的 onPointPick else 分支补镜头联动——复用 locateMonitoringPoint(object) 同一条定位链路(坐标准入与标记上图同源,坐标来自 map-snapshot 不借用不伪造);关联设备的 NONE→EQUIPMENT 修复保持有效(两段各自覆盖一类设备)。复验:合成计划 38/38、镜头联动 5/5、ellipsis 6/6;真实页面走查——描边平滑完整、内层可辨、限宽 2.6 倍多字显示、底板贴字;未关联设备点选镜头联动走 locateMonitoringPoint 同链路(与监测点定位同源,代码复用即用户所指)。
维护者复核:拉伸修复成功 ✓、文字位置没问题 ✓;另四项:
#03203c@0.78 + 面板线色描边」,对齐 UI 面板风格(Cesium 底板不支持渐变/圆角,取近似)。ellipsis 契约合并(走查第 4 项):与票 37 的共用省略方法确认关系——票 37 是 DOM 层(CSS text-overflow + title 属性,物理上够不着 Canvas 内部的 Cesium label),本批是 Canvas 层,两者不可共用实现、但共用语义。落地:domain/ellipsis.js 新增 ellipsisForMapLabel(text, maxWidthPx, fontSizePx)(显示串/截断标记/完整原文三字段,与 ellipsisView 同源同 ELLIPSIS_MARK),mapTextLabel 的内联截断逻辑收口到该函数(删除第二份字宽估算);并修一个边界 bug——恰好放得下的文本不再被省略号预留宽度误截(4 字 48px = 限宽 48px 的临界例)。自测 6/6(research/check-ellipsis-map.mjs)。
复验:合成计划 38/38、锚点迁移 7/7、镜头联动 5/5、ellipsis 契约 6/6;真实页面走查——限宽生效多字显示、底板协调、描边完整平滑、控制台无报错。
(签收:拉伸与文字位置维护者已确认;本轮效果以维护者下次复核为准。)
维护者复核:拉伸修复成功 ✓、文字位置没问题 ✓;另三项 + 一项事故:
backgroundPadding 撑出内边距),配色沿用 UI 深蓝系,与整体协调。withWhiteOutline 重写为形态学膨胀(chamfer 距离场逐像素求到符号的距离,≤ outlinePx 填白、边缘平滑衰减),描边源像素 2→28(屏显 ≈2px),裁剪窗含 pad 外扩(OUTLINE_PAD=40),billboard 绘制尺寸改用 plan.draw(本体 + 2×pad 屏显 2.86px),pixelOffset 下移 pad 补偿使尖端仍落真实坐标。contractMocks.js:253 SyntaxError)——并发会话在 deviceHitsFilters 上方留下悬空注释碎片(无 /** 开头)。已补回注释开头恢复语法(最小干预,未动其余内容);需知会该会话。复验:合成计划 38/38(新增 draw/pad 断言 2 项)、锚点迁移 7/7(期望值随 draw 尺寸更新)、镜头联动 5/5;真实页面走查——限宽生效多字显示、底板圆角协调、描边完整一圈平滑清晰、内层蓝白图形可辨。
维护者复核:拉伸已修复 ✓、文字位置已确认 ✓;另四项全部落地:
mapLabelText 回 plain);② 字号 13→12px;③ 深色半透明底板(showBackground + #02091b@0.72,label 与影像同色系时不再糊在一起)。pointName/deviceName;② 新增 pickPointMarkerForHover();③ mapService 在既有 pointermove 节流链路上挂 DOM tooltip(data-map-marker-tooltip,固定定位跟随鼠标,深色底板样式,无命中即隐藏)——不用 Cesium InfoBox(viewer infoBox:false 是票 32 的既定形态)。drawImage 双线性采样 + blur,边缘渐隐而非硬边)。复验:合成计划 36/36、锚点迁移 7/7、镜头联动 5/5;真实页面走查——标签带深色底板清晰可读、⟦⟧ 已除、截断+省略号正常、标记边缘平滑;hover tooltip 为 DOM 层(代码路径就位,需鼠标悬到标记上触发,留维护者操作确认)。
维护者复核后确认「图标基本符合预期」,另提五项,全部落地并复验:
renderMarker 输出裁剪到 bbox(378×475),billboard 宽高比 = bbox 比例,无变形。labelOffsetY 收近)。labelMaxWidth = 图标宽 × 1.1(左右各超 5%);mapTextLabel 按估算字宽截断加省略号(Cesium label 无 CSS max-width)。recolorInner 一律去色重染(亮部白、暗部主蓝 #01abea,蓝白双色层次);规则已并入图标素材使用共识 §4.2。配套:设备行 industry 继承所属点位(后端设备卡契约实测无 industry 字段——查 Java CockpitMonitoringPointDeviceCard 证实;快照监测点有)。另修一个非视觉缺陷(走查第 5 项诊断):点击设备图标只出面板不飞镜头。根因:planDeviceFlight 三段判定缺「NONE→设备级」分支(设备只能从点位详情进的时代留下的缺口;图标放大后可直接点选,暴露)。属本批直接引出的缺陷,就地修复不立票:补 NONE→EQUIPMENT = DEVICE_TIER 分支,断言 5/5(research/check-device-flight.mjs,含四条不变项)。
复验:合成计划断言 36/36、锚点迁移对抗式 7/7、设备点选联动 5/5;真实页面走查——水滴无变形、白描边清晰、标签贴近且限宽生效、内层蓝白图标可辨,控制台无报错。
(签收:图标观感由维护者确认符合预期;帧差证据与内层可辨性正式结论两项仍留维护者后续确认——见下节遗留。)
domain/markerPlan.js——唯一新接缝,输入 kind/status/industry/unassociated 输出母版选型/内层图标与几何/尺寸/尖端锚点/着色/降饱和,tint 按状态词表推导(未知状态→neutral 不猜);② 母版合成渲染 services/markerAssets.js——白剪影母版逐像素着状态色 + 内层行业图标(60% 直径、帽心对齐)烘焙成 billboard 位图,裁剪到 bbox(防拉伸)、白描边、内层去色蓝白渐变重染,内层失败降级可见;③ 引擎接入——syncPointMarkers/syncAssociatedDevices 支持合成计划(旧四参签名兼容既有 verify 脚本),billboard 改尖端锚定(BOTTOM);④ manifest 登记——marker.master.solid/hollow(core)+ marker.inner.* 四行业;⑤ 读数接缝——实体 properties 增 markerMaster/markerInner/markerAnchor/markerDesaturate;⑥ 两轮签收走查修复——标签重叠/放大 50%/标签贴近+限宽/白描边/内层去色重染/设备行 industry 继承点位/NONE→设备级飞镜头分支补齐。AGENTS.md:已跳过 build/debug 验证(走查使用维护者已运行的 http://127.0.0.1:8000/#/cockpit,未另起服务)。AGENTS.md,实施时未经用户明确要求不运行 build/dev。