47-device-status-effects.md 30 KB

This was generated by AI during triage.

47: 设备状态视觉特效与门控

Type: implementation Status: resolved Assignee: codex Blocked by: 38, 44, 45, 46 Labels: bug, ready-for-agent

进度

✅ 2026-10-12 维护者收口。 维护者明确指示「进行一遍检查并进行收口」,即人工确认到位,按 tracker 约定置 Status: resolved。收口前独立复核(当前工作区实测,非沿用历史证据):

  • 修复内容经历史重写后完整存活:并行会话重写过本仓历史(35e5fab 原哈希不再可达),但修复本体(cesiumEngine.js 的 overlapEffectCode / representsGroup / entryHasGroupEffect 聚合光环承接逻辑)在 HEAD、origin/master、工作区三处逐字一致;工作区未提交改动(并行票 24 的灯光/tileset 区域)对修复区域零触及。
  • 当前工作区全量复跑:t47-device-effects 27/27、t47-overlap-effects 27/27、相邻 10 组(t41/42/43/44/45/46/48×2/main-scene/readability-anchor)全部通过。唯一失败 t05 D1(overviewStore 出现 deviceStatistics 裸字段)经归因为并行票 24/25 的既有问题——35e5fab 对该文件 0 处涉及。
  • 对抗式四维度断言仍在位:边界(30/31 降级、K>maxFan 与动效阈值独立)、异常分支(显式关动效/图层隐藏/stop 清理 7 处用例)、回归影响(拾取身份/pixelOffset 10 处)、并发旧数据(同编码状态重同步换环、撤层清 owner/回调)。四类内存变异(owner-only/wrong-representative/fake-visible/skip-cleanup)此前全被拒绝的证据保留于 implement-status.md。
  • 场景证据(前轮已取得,本轮不重复):K2/K11 静态入口、K2 局部帧差 469/6000(静态地面对照 0/17500)、hover 预览/收起、选报警、关闭撤层、管线视图切换、31 台降级,共 8 张截图与 acceptance.md。

如实保留的残余缺口(不因收口消失,随联调票 48 继承):运行时逐层 readDeviceEffects 跨帧采样未取得(本轮以非浏览器闸门 + 局部帧差替代);远景雾衰减对照与透明管线完整几何交叠/鼠标反选链未做;可靠性能样本未取。deck 读写闸本轮返回 gate-defer(读额度耗尽),上报以本 Markdown 记录为准。

实施完成时记录(历史)

代码修复与非浏览器验证已完成,修复提交 35e5fab(master,未推送)。新组合回归27/27、最终相关16/16组通过,四类内存变异全被拒绝;完整非浏览器48组检查41通过/7失败,逐项原因留存。Standards双轴审查0硬性违规、1低优先级标签重复建议;Spec未发现新增规格缺陷,另确认真实场景帧差/雾与透明管线/性能/人工验收仍待完成。保持open/claimed与bug + ready-for-agent,不标100%或closed。本地认领字段为codex;deck写认领不支持且会重设Status,已按Markdown约定补记。当前结论优先于下方历史诊断/旧关闭记录。证据:本轮实施验证。

本轮实施与对抗式自查

  • 复现:同坐标ALARM+NORMAL,折叠/选NORMAL隐藏异常光环;新公开接口回归先失败(0≠5)再通过。
  • 定位与修复:按既有最高状态代表的光环承接可见聚合/selected入口,展开恢复逐台owner;effectFxFor来源身份不变,NORMAL/OFFLINE/UNKNOWN自身无动效。入口写明组内状态,防止语义混淆。
  • 边界:K11且最高状态位于前10台之外、异常30/31边界、三动态×三静态状态、同最高状态所选入口不叠重复环。
  • 异常与生命周期:显式关效果、主动降级、source隐藏/恢复、stop/撤层/换点均不留可见旧环或帧调度;静态状态与计数保留。
  • 回归影响:pixelOffset、设备/聚合拾取身份、中心清晰度、设备持续选中、换锚/模式/图层相邻套件通过。
  • 并发与旧数据:同编码状态/坐标重同步清旧环,换点不留旧设备owner;异步定位/token路径未改,相邻生命周期回归通过。其他会话改动未纳入本轮代码提交。
  • 对抗式验证:owner-only / wrong-representative / fake-visible / skip-cleanup四类内存变异全失败;不在磁盘改写生产文件。
  • 双轴审查:Standards无硬性违规(仅可选标签表达式重复建议);Spec无可复现新增缺陷/越界,额外多组隔离、近坐标借位恢复、开关恢复与同编码状态切换4项通过。
  • 真实受控场景整体收口:本轮已获明确浏览器授权,已取得K2/K11静态入口画面、K2局部帧差、hover预览/收起、关闭和31异常提示;仍缺运行时逐层采样、远景雾/完整透明管线组合、性能及维护者目视确认。未构建/启动/重启服务。

上轮诊断进度(历史)

This was generated by AI during triage.

诊断完成,保持 open,唯一分流终态为 ready-for-agent,类别 bug;尚未实施本轮修复。维护者已确认以最新重开记录为准,旧关闭结论仅为历史。已有设备状态/光环实现真实存在,但折叠聚合与选中 NORMAL 中心入口的异常动效被隐藏,组合验收不成立。生产函数最小探针两次稳定复现(折叠/选 NORMAL 两项失败,展开/选 ALARM 两项对照通过)。本轮只更新诊断、验收状态与标签,保存诊断探针,未修改业务源码、未关闭本票。

What to build

按决策票 07 在票 44 的独立设备状态词表上实现特效计划,不复用监测点聚合状态。设备五态为 ALARM、WARNING、WORK_ORDER、NORMAL、OFFLINE,未知状态落 UNKNOWN;报警扩散脉冲、预警闪烁、工单旋转环,正常/离线无特效。特效随关联设备图层生命周期门控,选中设备强化,关闭详情随图层销毁;超过 30 台异常设备降级为静态异常标记并显示计数。

本轮后续修复范围:完成已有特效与重叠聚合/持续选中入口的共存,不重定义设备状态、坐标、拾取或阈值语义;具体行为契约见本轮 Agent Brief 评论。

Acceptance

以下保留已有单项实现记录;未勾选项为重开后仍缺的组合验收,不把历史证据当作本轮复跑。

  • 消费票 44 已落地的独立 deviceStatus 静态词表,并添加 effect 维度;设备状态不从 pointStatus 推导,未知不猜正常。
  • 三种需处置状态有各自动效,正常/离线无动效;颜色/形状/文字沿设备状态语义。(已有单项实现;聚合共存仍待下条验收。)
  • 特效随关联设备图层出现/消失,选中设备可强化,详情关闭后无残留动画。(已有单项记录;本轮未重新作场景验收。)
  • 超过 30 台异常设备按规则降级为静态异常标记 + 异常计数,不静默删点;降级后仍看得出异常。(已有单项记录;同屏聚合组合仍待验证。)
  • 特效与雾气、透明管线和重叠聚合共存,不能破坏拾取;沿既有雾规则随远景衰减,不开穿雾例外。K2/K11选正常入口已取得画面,hover预览/收起与管线视图切换时光环保留;仍缺远景雾衰减、透明管线几何交叠与完整鼠标拾取链。
  • map.effects 配置缺省 null 跟随构建形态;关闭动效不隐藏静态状态表达。
  • 纯逻辑覆盖状态映射、未知、门控和并发降级;真实帧差与人工走查分别记录结果,未获人工确认不关闭本票。原动效27/27及新组合27/27通过;已补K2 JPEG归一化截图局部帧差(静态地面零变化);仍缺可靠性能和人工确认。
  • 对受控的 coordinateValidation.renderable=true 设备样例做场景跨帧快照证明逐点动画确实变化;真实环境仍为清单-only 时不得从纯逻辑断言推断现场特效已生效。已有实体回归及本轮受控场景画面/局部像素差;运行时逐层跨帧读回尚未取得,不以截图代替该层契约。

历史诊断:重叠聚合与设备动效共存缺口

阶段与既有实施核验

  • deck 当前 state=open;诊断前实际标签 needs-triage,正文 Status=ready-for-agent,另有“100%,已关闭”旧记录。维护者本轮明确选择“按重开诊断”,据此将旧关闭文字降为历史并同步当前字段。
  • 已有实施是真实但不完整的组合交付:设备独立词表、effect 计划、光环池、动效驱动、配置与生命周期路径都存在;不是未动工,也不能认定已完整实现而转 wontfix。
  • 依据:决策票 07 的随图层常驻/选中额外强化;规格 17 第 24 条的重叠报警/预警特效照常可见;票 45 的“状态特效不因聚合开关失效”;本票聚合共存验收。旧人工确认针对旧效果,不涵盖此次重开组合。
  • 本轮 redundancy 按设备状态、光环 owner、重叠聚合、持续选中入口概念搜索 src,并核对 deviceStatus/deviceEffects/overlapDevices、deviceLayerStore、mapService、cesiumEngine 和现有 t47 检查。未找到补偿折叠异常动效的其他实现。
  • 全仓未找到 .out-of-scope/*.md,无可引用的既往拒绝记录。所有直接依赖 38/44/45/46 在 deck 读回中已关闭,本票仍阻塞 48;本轮未修改关系或其他票。

现象与影响范围

关联监测设备图层已显示、特效显式启用且未超过异常阈值时,同坐标/极近距离设备聚合后,设备光环随被折叠的设备实体隐藏;聚合符号只有静态色/形/计数,没有承接动效。选中 NORMAL(同理 OFFLINE/UNKNOWN)成为中心入口后,其余异常设备仍被隐藏,组内异常动效再次不可见。这不等于数据或设备清单丢失,也不证明静态状态全都消失。

影响含需动效设备的 K>1 重叠组;K>maxFan 的聚合降级也走相同隐藏路径,不应与异常设备>30的“主动停动效”混淆。默认 mock success 的 MP-001(ALARM+NORMAL,K=2)及 MP-002(K=11、6台报警/预警+1台工单,低于30台异常阈值)均具有该触发条件;后者的实际页面组合本轮未跑。已展开且异常设备可见的路径、选中 ALARM 的对照可正常显示光环。生产默认 map.effects.enabled=null 可能按构建形态关闭,复现需显式 enabled=true 排除此因素;真实无有效坐标/清单-only 样本不能用于该场景验收。

最小复现与证据边界

已保存仅供诊断的进程内探针:triage-overlap-probe.mjs。命令:

node .scratch/cockpit-shell-panel-layout/verify/artifacts/t47/triage-overlap-probe.mjs

探针执行源码中的 syncAssociatedDevices、setOverlapPresentation、applyDeviceEffects、writeEffectFrame 和 readDeviceEffects,使用真实领域分组/特效函数;Cesium API 用最小替身,时间固定为300ms,无浏览器、服务或GPU。两台设备属于同一监测点、同坐标、可上图,状态为 ALARM 和 NORMAL;enabled=true,异常数1、未降级。两次运行结果一致:

场景 动效计划设备数 可见设备 可见光环 读回光环 结果
collapsed 1 无逐台设备(保留静态聚合符号) 0 5 FAIL
expanded 1 ALARM + NORMAL 5 5 PASS 对照
selected NORMAL 1 NORMAL 0 5 FAIL
selected ALARM 1 ALARM 5 5 PASS 对照

退出码1来自两项症状预期失败;无异常崩溃。两个设备是最小分组条件:只有一台时不进入K>1聚合分支。移除ALARM则不存在应显示的异常动效;只改为expanded则恢复。这是生产函数显隐逻辑复现,不能声称真实画面、雾衰减、拾取或性能已通过。

待后续获当前会话明确浏览器验证授权的最小用户步骤:在mock success、特效显式开启且有效样例可上图的场景,选MP-001,保持聚合折叠且鼠标离开入口,观察异常光环;hover/click展开作对照;选正常设备EQ-002,离开预览使其回中心,再观察组内报警表达;返回摘要/关闭详情验证收场。不启动新服务,不修改后端坐标或关系。

多个根因候选与排查结论

  1. 聚合显隐与光环owner门控耦合:高置信度,主因已确认。 syncAssociatedDevices 对聚合成员设 show=false;setOverlapPresentation 在 selected 时仅保留所选设备;writeEffectFrame 以 deviceCode 找owner并写 entity.show=Boolean(owner && owner.show!==false)。聚合实体不带deviceCode、不建自身光环。预测“只展开组就恢复光环”被两次探针证实。源码证据:cesiumEngine.js 的同步聚合段、setOverlapPresentation 与 writeEffectFrame。
  2. 可观察接口与验收断言缺可见性:高置信度,漏检原因已确认。 readDeviceEffects 返回光环属性但不带show/isShowing;即使visibleFx=0,reportedFx仍为5。t47走查采样光环属性变化,主场景检查只断言领域计划非空;不能证明隐藏光环实际可见。仅截图字节不同也不能定位到设备光环,需实际场景范围帧差与可见性对照。
  3. 配置关闭或30台动效降级:低可能,本最小样本排除。 若它是主因,应在enabled=true、异常数1、degraded=false时恢复;实际仍失败。注意K>10是展开容量阈值,不能用它解释动效阈值降级。
  4. 未知状态/坐标校验/雾或透明管线遮挡:低可能,本隔离样本不支持为此症状主因。 用明确ALARM、可上图坐标、无雾无管线的替身仍出现隐藏;真实雾/透明管线共存未在本轮验证,不能据此宣称所有渲染因素已排除。

附带代价:隐藏光环仍按非空animated计划请求渲染,读数可显示“on/参与动效1”但可见光环为0;源码支持这一机制,尚无真实性能量化。本票修复需避免把计划参与数当作画面验收。

分流与剩余工作

分类 bug,终态 ready-for-agent。修复目标已有成文契约,无需重新选择状态映射、阈值或引入监测点级特效;代码修复可由agent处理,后续场景/人工验收要求不是将整个票转ready-for-human的理由。具体实施方式留给后续修复阶段,既有单项实现可复用;本次不开始修复。

后续须覆盖折叠/展开/选NORMAL/选异常、K>10且异常≤30、超过30主动降级、关闭动效与撤层,并证明可见异常表达与拾取身份正确。真实帧差、人工走查和性能证据尚缺;真实有效关联样本不足的外部联调由48及相应联调票跟踪,不用mock冒称真实联调完成。

无待维护者拍板的新增业务事项;已按授权转到ready-for-agent。由于AGENTS.md项目规则,本轮跳过build/debug验证及浏览器调试/截图;仅执行上述非浏览器诊断探针。

历史:最终自检与主场景同步(重开前记录,不代表当前已关闭)

下列记录及旧人工确认原样留档;当前状态以上方本轮诊断为准。

维护者已确认效果“基本符合我的要求”并明确要求自检、主场景同步、提交推送后关闭;本票曾按该授权收口。

维护者确认“基本符合我的要求”,授权再次自检、同步主场景、提交推送后关闭本票,人工确认前置条件已满足。代码提交 09ef651 已推送至 origin/master,本票当时改为 resolved。

历史进度:100%,当时已关闭

历史 Answer

中心设备图标保持常亮不透明,状态动画由外围四层能量环与辉光表达;设备详情和连接短线随所选设备换锚,返回摘要恢复监测点锚点。默认主场景保留 MP-001 K=2 / MP-002 K=11,并修正太常设备坐标、补齐五态样例。维护者人工确认结合本轮脱浏览器自检完成收口;本轮未运行 build/debug/浏览器。

  • 默认 success 主场景共用中心图标清晰度、设备详情换锚及外围光环代码,无需 URL 场景参数。MP-001 保持 K=2;MP-002 保持 K=11,设备坐标修至太常点附近,五态分布为 3 报警 / 3 预警 / 1 工单 / 3 正常 / 1 离线,前三种状态播外围动效。
  • 新增主场景契约检查 t47-main-scene.mjs:真实 mock 传输→地图/详情适配→聚合/动效/锚点计划,验证编码一致、设备自身有效坐标、K2/K11与五态动效。
  • t47-readability-anchor.mjs 19 项通过,涵盖中心 alpha=1、外围闪烁、展开偏移、图层撤下、关特效停循环、设备换锚、返回点位、无位置与待确认退化。
  • 相关 11 组脱浏览器检查全部通过(t05 283/283、t09 38/38、t41 46/46、t42 39/39、t43 40/40、t44 47/47、t45 18/18、t46 29/29、t47 27/27及两个新增脚本)。Vue SFC 解析和修改文件语法检查通过。
  • 扩大检查共 39 组,35 组通过,4 组失败保留:t06 素材 JSON 导入要求 import attribute;t11 设备卡片局部 ref 撞旧守卫;t15 WebSocket 刷新断言;t28 Puppeteer 依赖缺失。本票提交不包含并行素材/3D Tiles/其它接口在途变更。
  • 本轮按 AGENTS.md 跳过 build/dev、浏览器调试和截图;人工验收依据维护者本次确认,历史浏览器证据不是本次复跑结果。deck 写入通道仍报旧 sandbox 权限,但在用户更新当前文件权限后,已按本地 Markdown tracker 更新本票状态与上游决策票 04;规格 12/15、地图索引及 CONTEXT 已同步用户直接裁定。

本次复验反馈修复(历史记录)

维护者指出中心图标闪烁太暗、设备间距较大时设备详情仍留在父点并遮住所选设备。本次已将中心图标改为不透明、稳定形状且不缩小至正常尺寸以下;闪烁/扩张/旋转仅写外围光环。光环跟随设备显示与 pixelOffset;按需渲染时动态设备主动请求帧。

设备详情及面板连接短线改为锚向所选设备(设备 A→B 换锚,返回摘要恢复监测点)。锚点包含贴地高度、展开偏移和当前图标尺寸;无位置设备显示自身原因,不借父点坐标。维护者直接裁定已记录在决策规格 12/15、决策地图与 CONTEXT.md;上游决策票 04 的 deck 写入被文件权限拒绝,尚待同步。

验证:新增 verify/t47-readability-anchor.mjs 覆盖生产动画写帧、锚点身份、设备位置退化与实际投影;相邻特效/锚定/联动/重叠/模式脱浏览器闸门通过。本次依据 AGENTS.md 未执行 build/dev、浏览器调试或截图;已更新真实走查脚本,尚未复跑,因此下方历史跨帧结果不能当作本次画面验收。票保持 claimed,待人工复验与权限允许后的决策票同步。

历史进度:实施完成,待人工确认(2026-09-30)

当时未关闭:本票验收第 7 条明写「真实帧差与人工走查分别记录结果,未获人工确认不关闭本票」。 自动证据(纯逻辑 20/20、跨帧快照 9/9、降级 6/6、真实帧差已取)已齐,缺的只有维护者目视裁定 (脉冲强度是否合适、正常/离线是否够可辨、30 台降级是否仍读得出「有异常」)。

交付物

  • domain/deviceStatus.js:按决策票 07 给设备独立词表新增 effect 维度 (ALARM: pulse / WARNING: blink / WORK_ORDER: spin / NORMAL: null / OFFLINE: null / UNKNOWN: null)。正常、离线、未知一律无动效 —— 未知状态更不编一个"正在报警"的样子。
  • domain/deviceEffects.js(新,纯函数):deviceEffectOf() 映射、effectPhaseAt() / pulseStrengthAt() / blinkStrengthAt() / spinAngleAt() 相位、planDeviceEffects() 门控与降级、 degradedAbnormalNote() 计数文案。「什么算异常」复用票 46 的 isAttentionDeviceStatus 单一住址(ALARM/WARNING),不另造一份定义。
  • services/cockpitConfig.js:新增 map.effects { enabled, abnormalLimit },与票 32 的 map.ui.debug 完全同构(enabled: null=跟随构建形态;脏值退回默认并记 issue)。
  • services/cesiumEngine.js:applyDeviceEffects() / stopDeviceEffects() / readDeviceEffects()(只读跨帧读回)。动效乘在票 43 反应量的基准上(deviceBaseStyle), 不与选中/hover/弱化互相覆盖;载体是场景内 billboard,不是后处理级 ⇒「先特效、后雾」自动成立,不占 PostProcessStageCollection、不开穿雾例外。
  • services/mapService.js + stores/deviceLayerStore.js + components/PointDetailCard.vue: 计划随图层下发、图层撤下即停(特效随图层消失)、降级时面板显示「异常设备较多(N 台)· 动效已暂停」。 宿主新增只读字段 data-map-device-effects(on|off|degraded)、data-map-device-effects-abnormal、 data-map-device-effects-animated。
  • mocks/contractMocks.js:两个受控样例 —— device-effects(五态各一台,坐标各自错开)与 device-effects-degraded(31 台报警)。受控可上图样例是决策票 07 的硬要求 (真实环境仍是清单-only 时不得从纯逻辑推断现场特效已生效)。

三层证据(决策票 07 问题 7,历史记录)

  1. 领域纯逻辑:verify/t47-device-effects.mjs 20/20 —— 映射唯一、未知不猜、 门控、恰好 30 台不降级/31 台降级、阈值可调、map.effects 默认与脏值。 相位函数按时间采样(脉冲 8 个不同取值、闪烁两段、旋转单调推进),不是拿两份 JS 数据互比。
  2. 场景图跨帧快照(关键层):verify/t47-device-effects-walkthrough.mjs 9/9 —— 8 帧采样下,报警 scale/alpha 各 8 个不同取值、预警 alpha 2 个取值(闪烁两段)、 工单 rotation 8 个取值;而正常与离线全程只有一个取值(完全静止)。真实鼠标点开点位。
  3. 真实帧差:同一视角两帧截图字节不同(走查新增 cdp-driver.screenshot(); 字节级判据,未做逐像素解码 —— 无依赖可解 PNG)。
  4. 降级场景:device-effects-degraded 6/6 —— data-map-device-effects=degraded、 动效台数 0、8 帧全部无动效、异常计数 31 可见、31 台静态标记仍画着(不静默删点)。

一处需要维护者确认的解读(历史判断,不是本轮新增待决事项)

决策票 07 说「同屏异常设备超过 30 台时降级」,而它同时把 WORK_ORDER 列为有动效的状态。 我按票 46 的「需处置」判据(ALARM/WARNING)计异常台数,而不是按"所有带动效的设备"计 —— 理由是票 08 的现场校准记录正是「23 台异常 ⇒ 已降级、动效台数 0、异常台数 23 仍在」。 若维护者认为该按"带动效台数"计,这是回票 07 重议的事,不由本实现自行改。

历史下一步(后续已获原效果人工确认,不重复询问)

请维护者目视裁定三件事:① 脉冲/闪烁/旋转的强度是否合适(当前幅度 0.34、选中 0.55); ② 正常/离线完全静止是否够可辨;③ 31 台降级时是否仍一眼读得出「有异常」。 确认后即可关闭本票。

历史回归

零依赖闸门 37 道(含本票新增 t47)全绿;三处红与本票无关: t11(并发会话给 PointDetailCard.vue 新增了 ref(,撞票 10 的"组件不自己存状态"守卫)、 t15(并发会话在改快照/推送语义)、t28(需 puppeteer,模块不在本机)。 守卫同步更新 2 处(都是本票有意变更契约):t44 的 F11 原写「动效留给票 47」,现按新契约 允许 effect 并钉住取值域与"正常/离线/未知无动效";t43 的 F12 正则允许新增的 effects 选项。

按 AGENTS.md:该历史会话未跑 build;yarn dev 未由当时agent启动(8000 端口已有服务在跑)。 浏览器仅用于走查(维护者授权的提权通道)。本轮不继承为浏览器验证授权。

Out of scope

  • 监测点级扩散环/监测点自身特效仍未被设备五态决策裁定,需另立决策票,不得在本票自行实现;设备图层触发、资产选择、双向联动、重叠聚合、设施/管线/事件图层和后端状态来源改造。
  • 本轮只修订诊断记录;后续修复只补设备特效与既有重叠呈现的共存,不重定义上述边界,不写后端,不伪造设备位置。

Comments

local — 2026-10-10T08:10:42.790Z

整体验收源码审查确认:折叠聚合使所有设备owner.show=false,外围环按owner.show隐藏;聚合实体无特效owner,因此异常聚合折叠时动效全不可见。对应规格重叠特效不因聚合开关失效,不能以原特效脚本全绿代替此组合。先构造折叠/已选NORMAL中心的场景回归再修复。

local — 2026-10-12T01:16:28.722Z

This was generated by AI during triage.

Agent Brief

Category: bug Summary: 补齐设备状态特效与重叠聚合/持续选中入口的共存,避免聚合折叠后组内异常动效全部不可见。

Current behavior: 已有设备独立词表、effect计划、光环池及动效驱动真实存在。聚合成员被隐藏后,光环按成员owner.show隐藏;聚合符号不带deviceCode,也未承接光环。两台同坐标ALARM+NORMAL、特效开启、异常数1且未降级的生产函数探针两次稳定出现:collapsed可见光环0,expanded为5,选NORMAL回中心为0,选ALARM为5。readDeviceEffects仍能返回5个隐藏光环且不带可见性;计划/属性变化不能作为画面成功判据。本次仅诊断,无业务代码修复。

Desired behavior:

  • 特效开启、关联图层可见、未触发动效降级时,重叠组中的应有异常动效在折叠、预览、展开及持续选中入口状态下有符合既有状态语义的可见表达。选NORMAL/OFFLINE/UNKNOWN不能使组内应有异常表达消失,也不能把所选静态设备伪装成报警设备。
  • 展开后逐台光环跟随实际设备位置/屏幕偏移,选中额外强化;聚合符号、设备身份、面板换锚、拾取与K/N口径沿既有契约。
  • K>maxFan的聚合展开降级与异常数>abnormalLimit的动效降级独立。前者不自行停掉未超阈值的异常动效,后者必须停动效并保留静态异常表达与计数。
  • map.effects关闭、图层暂停/撤下或详情关闭时,动效按生命周期停止/清理;正常、离线和未知仍无设备自身状态动效,静态状态保持。

Key interfaces:

  • planDeviceEffects({devices, enabled, abnormalLimit}) — 保持设备独立状态映射、异常计数和主动降级语义。
  • syncAssociatedDevices / setOverlapPresentation / applyDeviceEffects / writeEffectFrame — 使动效显示生命周期兼容聚合与selected入口,不能只依赖被聚合隐藏的单设备owner。
  • readDeviceEffects与宿主data-map-device-effects* — 区分计划参与/属性变化与真实可见性,验收不能仅据tick、动效台数或隐藏光环属性判成功。
  • map.overlap.maxFan / map.effects.abnormalLimit / map.effects.enabled — 保持现有默认与归一化规则,不改业务阈值或默认构建行为。

Acceptance criteria:

  • 同坐标ALARM+NORMAL的最小组合在collapsed与selected NORMAL下可见异常动效;expanded与selected ALARM对照继续成立,静态NORMAL中心不产生自身报警动效。
  • WARNING/WORK_ORDER及未知/离线静态对照符合现有映射;同组静态设备的持续选中不吞掉其余应有异常表达。
  • K=11且异常数低于30时,聚合展开容量降级不误触发动效降级;异常数恰好30与31的边界、显式关动效仍遵守原规则,静态异常符号/计数不丢失。
  • 展开偏移、设备拾取、聚合入口、设备A→B换锚、返回摘要/关闭详情及图层暂停/恢复无新身份或残留错误。
  • 回归在真实症状上能先失败后通过;核验可见性及其跨帧变化,不能只证明实体存在或计划非空。诊断替身可用于锁定显隐缺口,但不是GPU/画面证据。
  • 在获得当前会话明确验证授权后,对受控renderable=true样例完成真实用户路径、场景范围帧差、雾/透明管线共存及性能记录;人工走查结果单独记录,未确认不关闭票。真实清单-only数据不冒充现场特效成功。

Out of scope:

  • 新增监测点级状态特效、重定义五态/异常判据/阈值、改坐标或后端关系、改资产/图层业务语义、设施/管线功能改造。
  • 本次triage不实施、不关闭;当前ready-for-agent只代表可进入后续修复,不代表已有组合验收通过。

诊断正文已记录最小命令、两次结果、多个候选、源码链路与历史证据边界。无待维护者拍板的新增业务事项;本轮分流为bug + ready-for-agent。按AGENTS.md,本轮跳过build/debug及浏览器验证。

local — 2026-10-12T02:11:23.453Z

设备状态视觉特效与门控本轮修复已提交为35e5fab:折叠组最高状态光环承接当前入口,静态设备保持自身身份,公开读回区分可见性与聚合归属,同状态所选入口去重。新组合回归27/27;最终相关16/16组通过;四类内存变异全被拒绝。完整非浏览器检查41/48,七组失败已逐条留证,未为本票改断言。Standards审查无硬性违规,Spec审查进行中。真实帧差/人工/性能验收未执行,保持open;完整证据见verify/artifacts/t47/implement-status.md。

local — 2026-10-12T04:18:57.024Z

本轮按维护者明确授权继续现有页面场景复验:K2选择NORMAL保留绿色中心与组内红色异常光环;hover预览/移开收起、返回选ALARM和关闭撤层均取得截图;K11选择正常EQ-DG-008后异常外围仍可见;管线视图切换后仍保留;31异常显示动效暂停与静态标记说明。K2两帧局部比较469/6000像素通道差>10,静态地面对照0/17500变化。证据见verify/artifacts/t47/scene-20261012/acceptance.md。配置已恢复real及原effects缺省。未启动/重启服务、未构建、未写后端。debug/performance与运行时逐层采样未取得,远景雾/完整透明管线组合/人工确认仍缺,保持open。新任务页已关闭,session stop未成功确认;旧session归属已丢失,不冒称全清理完成。