implement-suite.json 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472
  1. [
  2. {
  3. "test": "t01-panel-catalog",
  4. "exitCode": 0,
  5. "tail": [
  6. "T01 检查通过:4 个模式 / 16 个面板 / 展开收放与默认展开一致 / 筛选选项(5 范围 · 5 行业)正确 / 地图服务生命周期幂等且只创建一次 / Cesium 资源基址相对 publicPath 解析正确。"
  7. ]
  8. },
  9. {
  10. "test": "t03-pole-domain-probe",
  11. "exitCode": 0,
  12. "tail": [
  13. " 2: east=0 north=1263937 → 0.0000,-66.6316 |Δlat|=11.4342",
  14. " 3: east=0 north=1263937 → 0.0000,-55.1974 |Δlat|=11.4342",
  15. " 4: east=0 north=1263937 → 0.0000,-43.7632 |Δlat|=11.4342",
  16. " 5: east=0 north=1263937 → 0.0000,-32.3290 |Δlat|=11.4342",
  17. " 6: east=0 north=1263937 → 0.0000,-20.8948 |Δlat|=11.4342"
  18. ]
  19. },
  20. {
  21. "test": "t03-pan-direction-probe",
  22. "exitCode": 0,
  23. "tail": [
  24. "== 界上东西向(应绕极轴有界移动,纬度不变) ==",
  25. " 1: east=-6319600 → -113.5393,85.0000",
  26. " 2: east=-6319600 → 132.9213,85.0000",
  27. " 3: east=-6319600 → 19.3820,85.0000",
  28. " 4: east=-6319600 → -94.1574,85.0000"
  29. ]
  30. },
  31. {
  32. "test": "t03-antimeridian-probe",
  33. "exitCode": 0,
  34. "tail": [
  35. "单调推进: true",
  36. "",
  37. "== 反方向(-179.9 → 179.9)==",
  38. "落点: -179.900 → -179.920 → -179.940 → -179.960 → -179.980 → -180.000 → 179.980 → 179.960 → 179.940 → 179.920 → 179.900",
  39. "总弧长 °: -0.200 (应 ≈ +0.2)"
  40. ]
  41. },
  42. {
  43. "test": "t03-camera-contract",
  44. "exitCode": 0,
  45. "tail": [
  46. "PASS 10b 阻尼可拖调(τ=40 走 0.018° > τ=400 走 0.002°;τ=0 直接跟手)",
  47. "PASS 11 DOM 绑定:三类输入接上、右键菜单与滚轮默认行为被吃掉、可完整摘除",
  48. "PASS 12 状态串可读:h=0.0 p=-60.0 r=10000 pivot=110.39000,28.46000 focus=ground drag=none settled=yes",
  49. "",
  50. "T03 逻辑检查通过:三键契约、中心规则、换中心动画、阻尼(帧率无关)、DOM 绑定均符合契约与维护者裁定。"
  51. ]
  52. },
  53. {
  54. "test": "t04-config",
  55. "exitCode": 0,
  56. "tail": [
  57. "T04 检查通过:三态(ready/missing/failed)+ 四层来源 + 宽松校验 + 载荷判定 + mock/real 同一出口 + 凭据只在适配层(8 个页面/store 文件零 Authorization/token,15 个模块文件零登录跳转)。"
  58. ]
  59. },
  60. {
  61. "test": "t05-adapter",
  62. "exitCode": 0,
  63. "tail": [
  64. "PASS D5-domain/overviewPanels.js-no-login-redirect — 不跳登录页",
  65. "PASS D5-domain/warningResponsePanels.js-no-login-redirect — 不跳登录页",
  66. "",
  67. "T05 适配层检查:283/283 项通过。",
  68. "T05 领域适配层全部通过。"
  69. ]
  70. },
  71. {
  72. "test": "t06-assets",
  73. "exitCode": 1,
  74. "tail": [
  75. " at ModuleJob.syncLink (node:internal/modules/esm/module_job:276:33) {",
  76. " code: 'ERR_IMPORT_ATTRIBUTE_MISSING'",
  77. "}",
  78. "",
  79. "Node.js v24.20.0"
  80. ]
  81. },
  82. {
  83. "test": "t07-coordinate",
  84. "exitCode": 0,
  85. "tail": [
  86. "PASS I4-no-reason-code-in-list-ui — 清单组件零后端原因码",
  87. "PASS I5-list-renders-reason-and-name — 清单渲染对象名与中文原因",
  88. "PASS I6-backend-summary-fields-confined — 后端汇总字段只出现在 domain/coordinate.js 与 mock",
  89. "",
  90. "T07 逻辑检查:39/39 项通过。"
  91. ]
  92. },
  93. {
  94. "test": "t08-map-summary",
  95. "exitCode": 0,
  96. "tail": [
  97. "PASS H2-adapter-owns-the-params — 分页与快照参数只在 mapStore 的适配翻译处拼",
  98. "PASS H3-shell-says-what-not-how — 外壳只说「再取一批/刷新」,不直接翻页",
  99. "",
  100. "T08 逻辑检查:44/44 项通过。",
  101. "T08 逻辑检查全部通过。"
  102. ]
  103. },
  104. {
  105. "test": "t09-point-status",
  106. "exitCode": 0,
  107. "tail": [
  108. "PASS F4-colors-read-from-tokens — 地图标记的颜色从 .cockpit-shell 的计算样式读 --lv1..--neutral",
  109. "PASS F4b-engine-and-domain-never-read-css — 读样式只发生在服务层一处(引擎与 domain 都不碰 DOM)",
  110. "PASS F5-engine-knows-shape-not-status — cesiumEngine 只认 shape/tone,不认识业务状态名",
  111. "",
  112. "T09 逻辑检查:38/38 项通过。"
  113. ]
  114. },
  115. {
  116. "test": "t10-point-detail",
  117. "exitCode": 0,
  118. "tail": [
  119. "PASS F5-marker-source-is-map-summary-only — mapLayerPlan 是 planPointMarkers 的唯一调用点,MapCanvas 只把计划交给 syncPointMarkersForPlan",
  120. "PASS F6-card-mounts-detail-store — 组件的动作全部交回 store(组件里没有自己的状态机副本)",
  121. "PASS F7-shell-positions-card-without-map-rebuild — 浮层是 main 的兄弟并由外壳定位:地图节点结构不变(票 02 的常驻语义;票 46 起条件含选择态暂停)",
  122. "",
  123. "T10 逻辑检查:57/57 项通过。"
  124. ]
  125. },
  126. {
  127. "test": "t11-equipment-detail",
  128. "exitCode": 1,
  129. "tail": [
  130. "FAIL F7-card-does-not-hold-its-own-aggregate-state — 组件把状态交给 store,自己不存一份(票 10 的 F6 立场延续)",
  131. "PASS F8-no-write-operations — 驾驶舱只读:本票不引入任何写操作(spec 验收第 6 条)",
  132. "",
  133. "T11 逻辑检查:60/61 项通过。",
  134. "未通过:F7-card-does-not-hold-its-own-aggregate-state"
  135. ]
  136. },
  137. {
  138. "test": "t12-work-order-timeline",
  139. "exitCode": 0,
  140. "tail": [
  141. "PASS F12-EquipmentDetailSections.vue-script-calls-are-bound — 脚本体 19 个调用点(defineProps, computed, equipmentPanels, timelineSource, trackOfOrder, if, pathOnlyTrack, rowsOf, archiveRows, metricRows, workOrderRows, eventRows, metricsSource, metricsSourceText, image, imageView, emptyList, emptyListText, isPlaceholder)都解析得到",
  142. "PASS F11-WorkOrderTimeline.vue-template-references-are-bound — 模板表达式引用的 7 个标识符都有 import/const/props/v-for 定义",
  143. "PASS F12-WorkOrderTimeline.vue-script-calls-are-bound — 脚本体 3 个调用点(defineProps, computed, pathView)都解析得到",
  144. "",
  145. "T12 逻辑检查:52/52 项通过。"
  146. ]
  147. },
  148. {
  149. "test": "t13-event-list",
  150. "exitCode": 0,
  151. "tail": [
  152. "PASS I4-domain/statusTones.js-no-service-import — domain 不 import service",
  153. "PASS I5-switch-state-lives-in-store — 分段按钮只调 store 的 setMode(组件不私藏切换状态)",
  154. "",
  155. "T13 事件列表检查:49/49 项通过。",
  156. "T13 事件列表全部通过。"
  157. ]
  158. },
  159. {
  160. "test": "t14-event-detail",
  161. "exitCode": 0,
  162. "tail": [
  163. "PASS H6-close-does-not-refetch — closeEvent 只清选择与高亮,零取数(否则「返回」会把列表滚回第 1 页)",
  164. "PASS H7-detail-plans-no-marker — 详情/定位层不建标记计划、不认识 Cesium",
  165. "",
  166. "T14 事件详情与设备定位检查:44/44 项通过。",
  167. "T14 事件详情与设备定位全部通过。"
  168. ]
  169. },
  170. {
  171. "test": "t15-websocket",
  172. "exitCode": 0,
  173. "tail": [
  174. "PASS H6-subscribe-directly-no-authenticate-send — 服务里只有 cockpitSubscribe 一个发送点,不再发送 authenticate 帧",
  175. "PASS H7-runtime-service-knows-no-data-store — 运行时服务不认识任何数据 store —— 推送异常在结构上不可能牵连数据分区",
  176. "",
  177. "T15 状态推送检查:43/43 项通过。",
  178. "T15 状态推送全部通过。"
  179. ]
  180. },
  181. {
  182. "test": "t16-freshness",
  183. "exitCode": 0,
  184. "tail": [
  185. "PASS G9-partial-state-is-consumed-by-ui — 「部分失败」被外壳真的画出来(data-freshness-partial),不是只写在 domain 里",
  186. "PASS G10-bridges-section-to-freshness — 分区状态与新鲜度四态之间有唯一一处显式翻译(界面不自己数数)",
  187. "",
  188. "T16 数据新鲜度检查:43/43 项通过。",
  189. "T16 数据新鲜度全部通过。"
  190. ]
  191. },
  192. {
  193. "test": "t17-infrastructure-panels",
  194. "exitCode": 1,
  195. "tail": [
  196. " at async ModuleJob.run (node:internal/modules/esm/module_job:553:5)",
  197. " at async node:internal/modules/esm/loader:647:26",
  198. " at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)",
  199. "",
  200. "Node.js v24.20.0"
  201. ]
  202. },
  203. {
  204. "test": "t18-monitoring-panels",
  205. "exitCode": 1,
  206. "tail": [
  207. " at async ModuleJob.run (node:internal/modules/esm/module_job:553:5)",
  208. " at async node:internal/modules/esm/loader:647:26",
  209. " at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5)",
  210. "",
  211. "Node.js v24.20.0"
  212. ]
  213. },
  214. {
  215. "test": "t19-warning-response",
  216. "exitCode": 0,
  217. "tail": [
  218. "PASS D2-panel-view-dispatches-warning-builders",
  219. "PASS E1-shared-mode-and-range-controls-are-visible",
  220. "PASS E2-components-do-not-build-api-paths",
  221. "PASS E3-current-event-location-remains-detail-flow",
  222. "\\nT19 warning-response: 16/16"
  223. ]
  224. },
  225. {
  226. "test": "t20-overview-panels",
  227. "exitCode": 1,
  228. "tail": [
  229. "PASS F6c-shell-per-panel-data-sources-are-pinned — 外壳逐块分派数据源:态势总览→situationData()、基础设施→infrastructureData()、其余→section.data(与各视图函数的期望一一对应)",
  230. "PASS F7-domain-declares-its-own-paths-nowhere — domain 里不出现接口路径(路径归 services)",
  231. "PASS F8-paths-live-in-one-place — 四个端点路径只有一处声明:/overview/infrastructure / /overview/monitoring / /overview/warning-settings / /infrastructure/base-archives",
  232. "",
  233. "T20 overview-panels: 60/63"
  234. ]
  235. },
  236. {
  237. "test": "t21-terrain",
  238. "exitCode": 0,
  239. "tail": [
  240. "T21 检查通过:地形与叠加影像的归一化 + 计划层(默认不配、缺字段忽略、bounds/级别校验),并在本机有数据时把配置与 layer.json / meta.json 对齐核对。"
  241. ]
  242. },
  243. {
  244. "test": "t21-view-modes",
  245. "exitCode": 0,
  246. "tail": [
  247. "T21 视图条件检查通过:地面/管线计划(管线 pitch -18° / 距离 ×0.35 / 地形 α0.45 / 模型 α0.4)、pitch 上限放宽到 5°、切换不产中心字段(构造性不重置)、地面视图按基线还原、脏配置兜底。"
  248. ]
  249. },
  250. {
  251. "test": "t29-basemap",
  252. "exitCode": 0,
  253. "tail": [
  254. "T29 检查通过:默认不配底图(票 27 行为不变)/ 归一化(source 白名单、子域、级别、图层)/ 四来源计划(none · natural-earth · xyz · tianditu)/ 天地图开发代理与生产子域模板 / 缺 tk 与未知来源的失败态(invalid)。"
  255. ]
  256. },
  257. {
  258. "test": "t30-view-presets",
  259. "exitCode": 0,
  260. "tail": [
  261. " (已按本机配置核对:home=110.39028164, 28.4436787 label=沅陵县城 intro=true)",
  262. "T30 检查通过:home/intro 默认值与归一化(含错字段 issue)、预设解析与 label 文案、归位判定(容差 + heading 环绕 + 无状态),并与本机配置里的沅陵坐标对齐核对。"
  263. ]
  264. },
  265. {
  266. "test": "t34-status-summary",
  267. "exitCode": 0,
  268. "tail": [
  269. "PASS toolbar AST nesting, rightmost refresh, removed diagnostics, summary state cases, and overflow guards"
  270. ]
  271. },
  272. {
  273. "test": "t35-obb-distance",
  274. "exitCode": 0,
  275. "tail": [
  276. "T35 OBB distance: 4 cases passed"
  277. ]
  278. },
  279. {
  280. "test": "t35-tileset-loading",
  281. "exitCode": 0,
  282. "tail": [
  283. "T35 tileset loading: 12 scenarios passed"
  284. ]
  285. },
  286. {
  287. "test": "t36-primary-area",
  288. "exitCode": 0,
  289. "tail": [
  290. "T36 检查通过:四类输入(合法 · 顺序写反 · 缺字段 · 个数不对)判定一致 / 不自动翻转(甲方 [W,N,E,S] 原样判非法)/ 三条关闭路径各自留原因 / 配置问题清单记到字段名与后果 / 本部署显式值与甲方原值只差纬度对调 / 模板同步 / 静态守卫(判定唯一、无内置地理常量、无翻转、只读出口齐)。"
  291. ]
  292. },
  293. {
  294. "test": "t37-area-limits",
  295. "exitCode": 1,
  296. "tail": [
  297. " operator: 'match',",
  298. " diff: 'simple'",
  299. "}",
  300. "",
  301. "Node.js v24.20.0"
  302. ]
  303. },
  304. {
  305. "test": "t38-fog",
  306. "exitCode": 1,
  307. "tail": [
  308. " operator: 'match',",
  309. " diff: 'simple'",
  310. "}",
  311. "",
  312. "Node.js v24.20.0"
  313. ]
  314. },
  315. {
  316. "test": "t39-handover",
  317. "exitCode": 0,
  318. "tail": [
  319. "T39 检查通过:相位与 alpha 端点(落定必为 0/1,不留半透明卡死)/ 闸门(全球不揭示、雾不足不揭示、瓦片未就绪不揭示、边缘风险不揭示,三条件齐备才放行)/ 降级(雾不可用仍揭示但不承诺遮边、不绕过瓦片就绪)/ 瓦片失败保持隐藏优先报出 / 边缘判据与雾曲线同源(区内四角全过、证实不能照抄原型 38 km 魔数)/ 返回同步(按下返回那一帧绝不撤雾,收起后才撤)/ 过期取消与幂等 / 配置可调且脏值退回默认 / 读数不承诺已遮边 / 静态守卫(复用雾曲线、alpha 单写入口、原型互斥、隐藏用 alpha 不用 show、读数 diff) / 返回飞行(慢起、两端精确、单调、真的走 flightMs 而非阻尼;\"相机高于雾遮蔽端点而雾仍可见\"的窗口已算出并钉住已接受上限)。"
  320. ]
  321. },
  322. {
  323. "test": "t40-intro-return",
  324. "exitCode": 0,
  325. "tail": [
  326. "T40 检查通过:回引导态三件事齐备(相机回初始全景 + 自转恢复 + 引导层显示);粘滞开关 `spinPaused` 已被禁止;`setGlobeSpin` 不会\"没做事却报成功\";`stopSpin` 放弃意图而 `startSpin` 只停循环(不自己抹掉意图);落定后由 `resumeSpinIfWanted` 兑现意图;`resetToIntroView` 套用 `INITIAL_PANORAMA` 且已在初始全景时不排飞行;阈值复用 `SETTLE_EPSILON`;读数带 `spinWanted`。"
  327. ]
  328. },
  329. {
  330. "test": "t41-point-locate-anchor",
  331. "exitCode": 0,
  332. "tail": [
  333. "",
  334. "T41 点位定位与面板锚定检查:46/46 项通过。",
  335. "T41 定位与锚定全部通过。"
  336. ]
  337. },
  338. {
  339. "test": "t42-device-layer",
  340. "exitCode": 0,
  341. "tail": [
  342. "",
  343. "T42 关联设备图层检查:39/39 项通过。",
  344. "T42 关联设备图层全部通过。"
  345. ]
  346. },
  347. {
  348. "test": "t43-device-correspondence",
  349. "exitCode": 0,
  350. "tail": [
  351. "",
  352. "T43 设备双向对应检查:40/40 项通过。",
  353. "T43 设备双向对应全部通过。"
  354. ]
  355. },
  356. {
  357. "test": "t44-device-assets",
  358. "exitCode": 0,
  359. "tail": [
  360. "",
  361. "T44 设备位置符号与资产接缝检查:47/47 项通过。",
  362. "T44 设备位置符号与资产接缝全部通过。"
  363. ]
  364. },
  365. {
  366. "test": "t45-overlap-devices",
  367. "exitCode": 0,
  368. "tail": [
  369. "PASS F1-device-pick-precedes-aggregate-and-point",
  370. "PASS F2-aggregate-pick-is-not-device",
  371. "",
  372. "T45 重叠设备聚合检查:20/20 项通过。",
  373. "T45 重叠设备聚合全部通过。"
  374. ]
  375. },
  376. {
  377. "test": "t45-device-camera-height",
  378. "exitCode": 0,
  379. "tail": [
  380. "PASS same XY device selection still updates newly sampled Z",
  381. "PASS orbit drag pending selection preserves device ground height",
  382. "PASS service terrain sampling survives real setCameraFocus and controller",
  383. "PASS late terrain response cannot move camera down to previously selected device",
  384. "T45 device camera height: passed"
  385. ]
  386. },
  387. {
  388. "test": "t45-selection-continuity",
  389. "exitCode": 0,
  390. "tail": [
  391. "PASS first device selection dispatches device view at sampled ground height",
  392. "PASS device switching only changes center using sampled terrain",
  393. "PASS projected selected-entry pick retains device and group identity",
  394. "PASS ordinary scene pick retains the same selected-entry metadata",
  395. "T45 selection continuity: passed"
  396. ]
  397. },
  398. {
  399. "test": "t46-mode-layer-plan",
  400. "exitCode": 0,
  401. "tail": [
  402. "PASS G3-overview-monitoring-show-all — 概览/运行监测显示全部(状态未知也显示,不凭状态隐藏)",
  403. "PASS G4-attention-predicate-consistent — 「需要处置」两态判据一致",
  404. "",
  405. "T46 模式图层计划检查:29/29 项通过。",
  406. "T46 模式图层计划全部通过。"
  407. ]
  408. },
  409. {
  410. "test": "t47-device-effects",
  411. "exitCode": 0,
  412. "tail": [
  413. "PASS E6-no-rings-for-static-states — 正常/离线/未知**没有任何光环**(决策票 07:静态状态不参与动效)",
  414. "PASS E7-all-attention-states-have-rings — 三种需处置状态都是 4 层环(层数一致,差异靠节奏与色相表达)",
  415. "",
  416. "T47 设备状态动效检查:27/27 项通过。",
  417. "T47 设备状态动效全部通过。"
  418. ]
  419. },
  420. {
  421. "test": "t47-main-scene",
  422. "exitCode": 0,
  423. "tail": [
  424. "PASS default main scene MP-001: K=2, matching snapshot/detail, local coordinates, device anchors and effects",
  425. "PASS default main scene MP-002: K=11, matching snapshot/detail, local coordinates, device anchors and effects"
  426. ]
  427. },
  428. {
  429. "test": "t47-readability-anchor",
  430. "exitCode": 0,
  431. "tail": [
  432. "PASS hidden fan device has no fake parent anchor",
  433. "PASS effects off cancels the loop without hiding the center icon",
  434. "PASS wrong parent identity never resolves another device marker",
  435. "PASS pending device does not pretend to have a known location failure",
  436. "T47 readability/anchor: passed"
  437. ]
  438. },
  439. {
  440. "test": "t47-overlap-effects",
  441. "exitCode": 0,
  442. "tail": [
  443. "PASS same device codes with fresh status replace old ALARM rings with WORK_ORDER rings",
  444. "PASS replacement coordinates break overlap and old group ownership does not survive",
  445. "PASS effect entities cannot be picked as equipment",
  446. "PASS clearing the layer removes old effects, owners and scheduled callbacks",
  447. "T47 overlap/effects: 26 passed, 0 failed; no browser/GPU verification."
  448. ]
  449. },
  450. {
  451. "test": "t48-real-envelope",
  452. "exitCode": 0,
  453. "tail": [
  454. "PASS HTTP200 business failure is not a successful section",
  455. "PASS HTTP200 expired snapshot keeps recoverable category",
  456. "PASS successful envelope missing data is invalid instead of fake success",
  457. "PASS plain compatibility payload remains unchanged",
  458. "T48 real envelope: passed"
  459. ]
  460. },
  461. {
  462. "test": "t48-linkage-invariants",
  463. "exitCode": 0,
  464. "tail": [
  465. "PASS non-drawn device selection cancels previous terrain work",
  466. "PASS closing detail through level change cancels terrain work",
  467. "PASS hidden parent gates associated devices when abnormal linkage is unavailable",
  468. "PASS rapid A to B inherits an unapplied device tier",
  469. "T48 linkage invariants: passed"
  470. ]
  471. }
  472. ]