瀏覽代碼

docs(ticket18/19): 根因更正为部署时序错位,记录 WS 负向观察与后端基线前进

Kazerin 1 周之前
父節點
當前提交
f713a4dce1

+ 17 - 4
.scratch/cockpit-real-data-wayfinding/issues/18-frontend-real-integration-gate.md

@@ -37,9 +37,7 @@ Category: integration
 
 ## 进度
 
-真实联调已完成一轮程序取证与一轮真人闭环操作。真实只读探针 123 次请求:92 项通过、33 项失败。真人已完成报警触发、报警转工单与派单,并在浏览器走查中给出 5 项可视化结论。票保持 `open`/`claimed`:闭环在工单读接口侧可验证,但报警本体仍不可见,地图与四个面板仍不符合验收标准。按本票纪律不改代码,缺陷已拆为 [19](19-19-early-warning-warning-name.md)–[26](26-26.md) 八张执行票并接为前置。
-
-基线:前端 `b8917ed`(已推送);后端远端 `master=a151183`(已含 `d8a6b03`),运行实例与源码提交绑定待补。探针与矩阵见 `verify/artifacts/t18/`。
+真人闭环已取证:工单侧三项通过(关联标记/状态推进/时间线),报警侧不可见。走查 5 项均未通过,已拆为 19–26 并接为前置。票 19 根因更正为「部署时序错位」(DB 迁移领先于旧构建,修复已在 origin/master=94971b5),转为部署动作待人工执行。后端远端基线由 a151183 更新为 94971b5。WS 订阅通过;工单增量帧第一轮为干净负向观察(窗口内无状态变化),新窗口已开启待真人推进。
 
 ## 真人闭环证据(2026-10-10)
 
@@ -88,4 +86,19 @@ Category: integration
 ## 关联证据
 
 - 真实探针:`.scratch/cockpit-real-data-wayfinding/verify/t18/live-audit-results.json`、矩阵报告 `real-integration-gate-report.md`、端点快照 `initial-live-endpoints.json`、WS 订阅 `ws-observation.json`、WS 增量 `ws-order-advance-1512.json`(待生成)。
-- 项目规则要求的 build/debug 验证未自动运行;本次只执行用户明确授权的真实只读接口与浏览器联调。
+- 项目规则要求的 build/debug 验证未自动运行;本次只执行用户明确授权的真实只读接口与浏览器联调。
+
+## Comments
+
+### local — 2026-10-10T07:46:20.363Z
+**根因更正 + 新证据(2026-10-10 15:44)**
+
+1. **票 19 的根因已确证,不是「缺列要补」**:数据库迁移领先于运行构建。上游 `927fad2 refactor(warning): 重构预警系统数据结构和业务逻辑`(2026-10-10 11:43 +0800)已从 `EarlyWarning` 删除 `warningName`/`longitude`/`latitude` 映射并动了库结构;运行实例(PID 37792,启动于 08:28:52,基线 `d8a6b03`)仍按旧映射 SELECT 被删列。**修复已在远端**:`927fad2` 与 `94971b5` 均在 `origin/master`(远端现为 `94971b5`)。票 19 因此从「写代码」改为「用 `origin/master` 重新构建并部署」,已转 `ready-for-human`(部署不自动执行)。
+
+2. **后端基线更新**:远端 `master` 已从 `a151183` 前进到 `94971b5`,含预警重构两次提交。此前「远端 a151183」记录作废。
+
+3. **WS 增量取证第一轮:干净的负向观察**。捕获窗口 `15:36:15–15:43:15`,订阅成功,0 帧增量。双向核对:工单仍为 `stateCode=1`(待接单)、`updateTime=15:12:49`、时间线仍 2 条 —— 窗口内确实没有状态变化,因此「无帧」不构成链路故障。证据 `ws-order-advance-1512.json`。已开启 15 分钟新窗口等待真人推进状态。
+
+4. **新的部署后核对项**:`927fad2` 同时删除了预警经纬度,预警类事件将不再有坐标(用户提供的真实报警记录本身即 `longitude/latitude = null`)。需确认驾驶舱对无坐标预警的呈现,不得伪造坐标。
+
+**对本票判定的影响**:②(四个面板加载失败)中相当一部分很可能随重新部署即可恢复,不全是前端缺陷;但前端把 `code=500` 读成 success(票 22)放大了故障,必须独立修复。①(地图不显示)中「预警事件无坐标」也是成因之一,与坐标校核来源缺失同族。

+ 26 - 36
.scratch/cockpit-real-data-wayfinding/issues/19-19-early-warning-warning-name.md

@@ -1,52 +1,42 @@
-<!-- DSH-IDEMPOTENCY-KEY: t18-defect-warning-name -->
-<!-- parentKey: 00 -->
-# 19: 后端执行票 —— 预警/事件族结构漂移修复(early_warning.warning_name 缺列)
+# 19: 后端执行票 —— 预警/事件族故障根因(部署时序错位,非缺列)
 
 Type: task
-Status: ready-for-agent
-Label: ready-for-agent
-Category: backend-execution
+Status: ready-for-human
+Label: ready-for-human
+Category: backend-deployment
 
-## 来源
+## 根因(已确证,非猜测)
 
-票 18 真实联调与真人闭环实测发现(2026-10-10)。
+**不是缺列需要补,而是部署时序错位:数据库迁移领先于运行中的构建。**
 
-## 现象
+| 事实 | 证据 |
+| --- | --- |
+| 运行实例是旧构建 | 后端进程 PID 37792 启动于 `2026-10-10 08:28:52`,其源码基线为 `d8a6b03`(2026-10-09) |
+| 数据库已被上游重构 | `927fad2 refactor(warning): 重构预警系统数据结构和业务逻辑`(林仔,2026-10-10 11:43:10 +0800)提交说明明写「移除预警名称和经纬度字段,优化数据库表结构」,该提交从 `EarlyWarning.java` 删除了 `warningName`、`longitude`、`latitude` 映射 |
+| 旧构建仍读被删列 | `d8a6b03` 的 `EarlyWarning` 仍映射 `@TableField("warning_name")` → MyBatis-Plus 生成 `SELECT ... warning_name ... FROM early_warning` → KingbaseES 报「字段 "warning_name" 不存在」 |
+| 修复已在远端 | `927fad2` 与其后的 `94971b5 feat(warning): 添加预警参考服务` **均已包含在 `origin/master`**(远端 master 现为 `94971b5`) |
 
-以下端点 HTTP 200 但业务 `code=500`,错误一致:`ERROR: 字段 "warning_name" 不存在`,SQL 来自 `EarlyWarningMapper`:
+`sql/early_warning_system.sql` 里 `early_warning` 仍写着 `warning_name`,那是**旧版建表脚本**,不能作为当前库结构的依据;`warning_name` 现在只存在于 `warning_type` 表(`WarningType.java`)。
 
-```
-SELECT warning_id,warning_no,warning_name,... FROM early_warning
-Hint: 也许您想要引用列"early_warning.warning_no"或者列"early_warning.warning_type"
-```
+## 因此本票不需要写新代码
 
-受影响端点:`/equipments/{code}/events/current`、`/events/current`(WARNING 与 ALARM)、`/events/history-analysis`、`/events/handling-efficiency`、`/events/multidimensional-analysis`、`/monitoring/situation`、`/overview/warning-settings`、`/infrastructure/emergency-support`。
+**动作是:用 `origin/master`(≥ `927fad2`)重新构建并部署到联调环境。** 这是一次部署动作,按仓库规则不自动执行,由维护者执行。
 
-## 范围
+## 受影响范围(随部署一并验证)
 
-1. 定位 `early_warning` 与实体 `EarlyWarning` 的结构漂移(上游曾重构预警表结构),决定是补列、改实体还是改查询。
-2. 修复后确认上述八个端点在真实联调环境返回业务 `code=200`,且报警记录字段真实(`warningCode`、`warningName`、阈值、报警等级、坐标)。
-3. 补针对性契约测试锁定 `warning_name`(或替代字段)可读,防止结构漂移回归。
-4. 与历史地图条目一致:复验前必须先 `git fetch` 确认远端基线,不在落后基点上误诊为本地改动。
+部署后应同时恢复的端点:`/equipments/{code}/events/current` 与 `history`、`/events/current`、`/events/history-analysis`、`/events/handling-efficiency`、`/events/multidimensional-analysis`、`/monitoring/situation`、`/overview/warning-settings`、`/infrastructure/emergency-support`。
 
-## 验收
-
-编译通过 + `Cockpit*Test` 全绿 + 上述八端点真实 200 + 基线卡片更新 + 提交推送 Gogs,并在票 18 记录复验实测值。
-
-## 关联
-
-发现于票 18;修复后回票 18 复验。
+## 部署后必须核对的新事实
 
-## 进度
+`927fad2` 同时删除了预警的经纬度字段,因此**预警类事件将不再有坐标**。用户本次提供的真实报警记录本身即 `longitude: null, latitude: null`。这与「地图对象不上图」是同一族问题:需要确认驾驶舱对无坐标预警事件的呈现(不得伪造坐标),并与前端执行票 24 的坐标纪律一致。
 
-<!-- 做到哪一步了,在这里一行一行记 -->
-
-Status: ready-for-agent
-Type: task
-Blocked by:
-Labels: ready-for-agent, backend-execution, wayfinder:task
+## 验收
 
-## Comments
+1. 记录新部署实例的启动时间与所依据的提交哈希(必须 ≥ `927fad2`,且与 `origin/master` 一致)。
+2. 上述八个端点真实返回业务 `code=200`,且报警字段真实(`warningCode`、阈值、报警等级);确认 `warningName` 是改由 `warning_type` 关联取得还是按新契约置空。
+3. 重跑 `verify/t18-real-audit.mjs`,`events-*` 与 `warning-*` 相关失败项清零。
+4. 若部署后仍有 500,则说明还有第二处结构漂移,需重新取证而非再猜。
 
+## 关联
 
-## Answer
+发现于票 18;根因为部署时序,与前端执行票 22(前端把 `code=500` 读成 success)叠加放大了故障表现——两处都要修。

+ 21 - 0
.scratch/cockpit-real-data-wayfinding/verify/artifacts/t18/ws-order-advance-1512.json

@@ -0,0 +1,21 @@
+{
+  "url": "ws://192.168.110.96:8301/ws/deviceStatus",
+  "label": "order-advance-1512",
+  "windowSeconds": 420,
+  "startedAt": "2026-10-10T07:36:15.627Z",
+  "endedAt": "2026-10-10T07:43:15.655Z",
+  "frames": [
+    {
+      "receivedAt": "2026-10-10T07:36:15.660Z",
+      "frame": {
+        "serverUpdatedAt": "2026-10-10T15:36:15.6576366+08:00",
+        "scope": "all",
+        "type": "cockpitSubscribed"
+      }
+    }
+  ],
+  "errors": [],
+  "verdict": "subscription-confirmed",
+  "deltaFrames": 0,
+  "scope": "Read-only subscription; no authenticate, no business writes. Absence of deltas means only \"no change observed in this window\" and must be cross-checked against the database or the operator log before being called a defect."
+}