feat(scada): add calibrated monitoring and incident recovery
This commit is contained in:
+41
-227
@@ -1,248 +1,62 @@
|
||||
# 从爆管上报到处置闭环
|
||||
# 从爆管工单到事件处置闭环
|
||||
|
||||
本文定义爆管调查的完整业务路线,供维护者审阅和验收。运行时指令位于 [burst-report/SKILL.md](../resources/work-order-skills/burst-report/SKILL.md),由 Server 根据绑定任务的 `workflow=burst_report` 经 MCP 分发。
|
||||
工单触发的 `workflow=burst_report` 使用 [爆管事件处理 Skill](../resources/work-order-skills/burst-event-handling/SKILL.md)。Server 按持久化来源选择流程,Agent 接收同一任务的核验上下文;SCADA 异常和历史回放使用 [SCADA Skill](../resources/work-order-skills/scada-anomaly/SKILL.md)。
|
||||
|
||||
重点成果是有依据的事故候选位置、隔离阀门清单和影响范围,以及经审批执行、反馈核验后的闭环记录。Agent 根据证据选择、跳过或重做分支,不按图逐节点机械调用工具。工程图覆盖多轮调查和人工业务;每轮发布的进度图只标注实际进行的工作,不复制整图冒充执行记录。
|
||||
|
||||
## 完整工程图
|
||||
## 固定处理路线
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
subgraph intake[工单进入与后台任务]
|
||||
order[用户或外围系统提交爆管上报工单]
|
||||
source[保存原工单及来源版本、发生时间、位置和描述]
|
||||
sync[同步器按来源关联调查及工单投影]
|
||||
queue[Server 保存调查任务和 queued run]
|
||||
claim[Worker 投递,Agent 领取并维持租约]
|
||||
context[读取任务摘要、业务 Skill、历史报告和既有动作]
|
||||
order --> source --> sync --> queue --> claim --> context
|
||||
end
|
||||
|
||||
subgraph investigation[Agent 调查与工程分析]
|
||||
scope[确定事件时刻、地点、调查目标和真实或演练来源]
|
||||
location[核对已有资产编号;必要时解析地点和查询附近管段]
|
||||
monitor[核对相关测点映射、异常窗口、正常对照和数据质量]
|
||||
cover{查询是否实际覆盖事件与对照窗口}
|
||||
more[缩小对象和窗口,按需补页,核对缺测及零值]
|
||||
hypothesis{是否具备定位所需观测和漏水量依据}
|
||||
locate[计算爆管候选排序,保留假设、覆盖范围与证据]
|
||||
candidate[整合上报、资产关联、算法与现场反馈得到候选集合]
|
||||
usable{是否存在可用于隔离评估的候选资产}
|
||||
isolation[逐候选分析拓扑隔离边界、必关阀及受影响节点]
|
||||
isolateok{可隔离且阀门可用性有可核验依据}
|
||||
alternate[纳入已知不可关闭阀门,重新评估替代隔离方案]
|
||||
hydraulic[按需模拟候选关阀组合的压力和流量影响]
|
||||
impact[区分拓扑停水区、水力影响区和有资料支持的用户范围]
|
||||
findings[形成候选位置、阀门清单、影响对比和建议方案]
|
||||
fieldbasis{是否已有足以支持具体现场核验的结论}
|
||||
fielddraft[形成有位置、核验目标及回执要求的现场核验建议]
|
||||
gap[真实关键数据缺失:发布 final insufficient_data 并结束本轮]
|
||||
error[接口、权限或配置异常:记录具体失败并由宿主结束失败运行]
|
||||
scope --> location --> candidate
|
||||
scope --> monitor --> cover
|
||||
cover -->|未覆盖且可补齐| more --> monitor
|
||||
cover -->|已覆盖或确认实际缺失| hypothesis
|
||||
hypothesis -->|具备依据| locate --> candidate
|
||||
hypothesis -->|条件不具备,明确原因| candidate
|
||||
candidate --> usable
|
||||
usable -->|候选有效,标明待现场确认| isolation --> isolateok
|
||||
isolateok -->|有可评估方案| hydraulic --> impact --> findings
|
||||
isolateok -->|已知存在不可关阀| alternate --> isolation
|
||||
isolateok -->|无法形成方案| fieldbasis
|
||||
usable -->|尚无候选| fieldbasis
|
||||
fieldbasis -->|可形成具体核验建议| fielddraft
|
||||
fieldbasis -->|当前判断所需证据确实缺失| gap
|
||||
monitor -->|不可恢复的查询异常| error
|
||||
location -->|不可恢复的必要查询异常| error
|
||||
end
|
||||
|
||||
subgraph approval[报告、审批与现场处置]
|
||||
interim[保存本轮 interim concluded 阶段报告]
|
||||
proposals[创建具体待审批草稿,关联证据和执行前置条件]
|
||||
finalround[保存本轮 final 报告,由宿主结束本轮 run]
|
||||
review[有权限人员审核当前草稿版本]
|
||||
decision{审批结果}
|
||||
revise[驳回理由保存并触发原调查新一轮]
|
||||
submit[Server 通过配置的适配器幂等提交]
|
||||
receipt{外部提交结果}
|
||||
reconcile[使用同一执行请求号核对回执,不重复下发]
|
||||
unsupported[未配置或明确失败:记录原因并重新分析]
|
||||
workkind{本次获批的是核验还是处置}
|
||||
fieldcheck[现场核验准确位置、漏水迹象及资产,回传实际记录]
|
||||
notice[人工实施获批的通知、供水保障和应急安排]
|
||||
isolatefield[现场核验阀门及实际隔离结果]
|
||||
repair[现场定位、止水和抢修,回传实际故障管段及修复记录]
|
||||
clean[按现场风险及获批方案清洗、消毒或冲洗]
|
||||
restore[核验修复与适用复测,按批准方案恢复供水]
|
||||
follow[记录恢复后压力流量、漏水复查及用户回访]
|
||||
findings --> interim
|
||||
fielddraft --> interim
|
||||
interim --> proposals --> finalround --> review --> decision
|
||||
decision -->|驳回| revise
|
||||
decision -->|批准| submit --> receipt
|
||||
receipt -->|结果不明或仍在执行| reconcile --> receipt
|
||||
receipt -->|明确失败或不支持| unsupported
|
||||
receipt -->|工单已创建或设备动作有回执| workkind
|
||||
workkind -->|现场核验事项| fieldcheck
|
||||
workkind -->|有依据的处置事项| notice
|
||||
notice --> isolatefield --> repair --> clean --> restore --> follow
|
||||
end
|
||||
|
||||
subgraph closure[现场反馈、复核与原事件闭环]
|
||||
feedback[外围系统保存关联工单的新反馈和单调版本]
|
||||
requeue[Server 校验来源并为原调查排队新 generation]
|
||||
reread[重新读取现场事实、执行回执和最新监测证据]
|
||||
verify[对照预测与现场结果,复核修复、恢复和风险]
|
||||
faultstate{复核结果支持故障、误报还是尚待核验}
|
||||
falsealarm[核对排除故障的证据及人工确认]
|
||||
closed{处置及闭环证据是否齐全}
|
||||
remaining[列出未完成事项及对应已有或待审批动作]
|
||||
sourceclosed{原上报工单已结案且版本已核对}
|
||||
readyreport[发布具备结案条件报告并结束本轮]
|
||||
closedreport[发布闭环复核 final 报告并结束本轮]
|
||||
closeowner[有权限人员在原工单系统核对并完成原事件结案]
|
||||
closedcase[报告与来源事实一致,确认业务闭环]
|
||||
follow --> feedback --> requeue
|
||||
fieldcheck --> feedback
|
||||
reread --> verify --> faultstate
|
||||
faultstate -->|已确认故障| closed
|
||||
faultstate -->|有依据排除故障| falsealarm --> sourceclosed
|
||||
faultstate -->|尚需核验| remaining
|
||||
closed -->|尚未齐全或复测异常| remaining --> interim
|
||||
closed -->|证据齐全| sourceclosed
|
||||
sourceclosed -->|是| closedreport --> closedcase
|
||||
sourceclosed -->|否| readyreport --> closeowner --> feedback
|
||||
reread -->|现场位置或阀门条件改变| candidate
|
||||
end
|
||||
|
||||
subgraph presentation[贯穿调查的地图、图表与数据整理]
|
||||
progress[发布真实调查进展和 Mermaid 状态]
|
||||
map[高亮候选管段、闪烁建议关阀、展示已有证据覆盖层]
|
||||
chart[打开异常与对照曲线,展示候选及影响对比表]
|
||||
filepermit{会话是否已有文件写入权限}
|
||||
jsonl[按权限整理有来源引用的 JSONL 调查数据]
|
||||
reportui[通过报告 ui_blocks 发布 json-render 结构化界面]
|
||||
sourceview[展示保持证据来源,失败不阻断业务调查]
|
||||
progress --> map --> chart --> filepermit
|
||||
filepermit -->|已获准且需要导出| jsonl --> reportui
|
||||
filepermit -->|未获准或无需导出| reportui
|
||||
reportui --> sourceview
|
||||
end
|
||||
|
||||
context -->|首次或需要重新分析| scope
|
||||
context -->|已有新反馈待复核| reread
|
||||
revise --> requeue
|
||||
unsupported --> requeue
|
||||
requeue --> queue
|
||||
gap -->|补充事实被 Server 接受后才重开| requeue
|
||||
findings -->|无须新增动作| finalonly[无需新增动作时保存 final 报告并结束本轮]
|
||||
scope -.-> progress
|
||||
candidate -.-> map
|
||||
impact -.-> chart
|
||||
verify -.-> reportui
|
||||
flowchart TD
|
||||
order[爆管上报工单] --> context[读取原工单与当前任务]
|
||||
context --> asset[核对地点并关联管网资产]
|
||||
asset --> isolation[分析隔离边界与阀门方案]
|
||||
isolation --> impact[说明事件与隔离方案影响]
|
||||
impact --> report[保存阶段报告与处置建议]
|
||||
report --> approval[人工审批与现场执行]
|
||||
approval --> feedback[接收实际处置与恢复反馈]
|
||||
feedback --> verify[复核影响与结案条件]
|
||||
verify --> close[来源系统确认事件闭环]
|
||||
verify -->|新增事实或遗留事项| asset
|
||||
```
|
||||
|
||||
图中的现场处置由实际审批、工单与回执推进;顺序按现场紧迫性和获批方案调整。必要的紧急通知、现场核验和供水保障不应等待可选的完整模型计算。`clean` 为按风险适用的步骤,不能把每次爆管都判断为污染。`hydraulic` 在缺少模型、时序输入或权限时记录具体限制,仍可保留已完成的拓扑隔离结果。
|
||||
1. **接收核对**:保留来源工单ID、单调版本、发生时间、位置、描述、现场反馈和已有动作;后续轮次从新增事实接续。
|
||||
2. **资产关联**:优先核对上报资产编号。坐标或地址通过地理编码、附近资产、属性和连接关系形成有依据的关联;位置歧义列为具体待确认项。
|
||||
3. **隔离方案**:用 analyze_valve_isolation 分析关联资产,保留必关阀、可选阀、直接隔离与供水失源节点;已知失效阀门用于替代方案分析,现场可操作性列为执行条件。
|
||||
4. **影响说明**:先展示拓扑范围,再按可用SCADA、水力结果和用户关联资料解释事件当前影响、方案预计影响和保障需求。
|
||||
5. **报告与处置**:保存阶段报告后提出核验、通知、保障、抢修和恢复等动作草稿;关联现场任务采用 general 工单。审批、派发和现场完成分别核对回执。
|
||||
6. **反馈复核**:已派发的关联工单保持 `waiting_work_order`,全部收到有效 `completed` 反馈后进入 `waiting_scada`。以现场反馈业务时间为起点,核验之后连续两个完整采样周期;正常范围使用事件前15天同采样相位的正常包络。数据未到或仍异常时保持等待,后台工作进程定期复核;通过后持久保存恢复证据并接续 Agent。Agent 最终报告必须引用该证据,运行完成后才能完成任务并解除对应告警。原事件由有权限人员在来源系统确认行政结案。
|
||||
|
||||
`requeue` 表示 Server 接受了新业务事实后分配下一轮,不是 Agent 复活旧会话或自行循环等待。原工单结案由原系统有权限人员处理,后台 Agent 目前没有直接关闭原工单的工具。`completed`、`concluded`、动作 `succeeded` 和“业务闭环”分别核对,不能互相推导。
|
||||
SCADA作为事件影响的辅助证据,按目标测点和事件/对照窗口读取。具备水力输入且工具已授权时,使用 analyze_valve_closure 评估给定阀门方案;各步骤记录实际结果、适用范围或具体待补项。
|
||||
|
||||
## 将业务步骤映射为现有能力
|
||||
## 报告固定内容
|
||||
|
||||
以下产品查询与计算均使用 `mcp_tjwater_` 前缀。参数以本轮实际发现的工具 schema 为准。
|
||||
报告包含事件概况、地点与资产关联、隔离方案、影响说明、处置建议和待办。摘要以150字以内为目标,资产和测点明细放表格,完整依据引用证据。
|
||||
|
||||
| 业务动作 | 已有入口 | 必须形成的结果 |
|
||||
| --- | --- | --- |
|
||||
| 接续原任务 | `get_task_context`,依次读取 summary、skill 及所需分节;`get_task_run_history` | 原工单来源、事件时刻、调查代次、流程版本、既有动作与现场反馈 |
|
||||
| 查找地点和资产 | `geocode` / `search_project_places`、`query_nearby_elements`、`get_element_properties`、`get_node_connections` | 实际候选管段或节点、位置来源、匹配理由;邻近不代表故障确认 |
|
||||
| 核对监测 | `list_scada_devices`、`get_scada_device`、`query_scada_readings`、`query_element_history` | 设备和模型节点的映射、异常及对照窗口、单位、缺测、分页覆盖 |
|
||||
| 压力异常侦测 | `run_burst_detection` | 至少 5 个完整压力测点及此前 15 天数据满足时才调用;不把侦测当作定位 |
|
||||
| 爆管候选定位 | `run_burst_location` | 候选排序、算法实际返回的评价值、观测范围、漏水量假设及来源 |
|
||||
| 逐候选隔离 | `analyze_valve_isolation` | `accident_elements`、`isolatable`、`must_close_valves`、`optional_valves`、`affected_nodes`、`affected_node_count` 及已知 `disabled_valves` |
|
||||
| 水力影响 | `analyze_valve_closure` | 指定关阀组合、时间窗、输出对象和模拟压力流量;参数不足时保留明确原因 |
|
||||
| 用户影响 | 已授权资产属性、区域及外围资料查询 | 受影响对象、关联依据和覆盖限制;没有用户资料不估造户数 |
|
||||
| 发布和提议 | `publish_task_progress`、`publish_task_report`、`propose_task_action` | 持久化报告、证据引用和待审批动作;动作不是执行事实 |
|
||||
| 反馈接续 | Server `external-feedback` / `human-evidence` 及 worker | 同一任务的新轮次、真实来源版本、修复和复测证据 |
|
||||
“影响说明”逐项保留时间、对象、单位、范围、来源与实际或预计的性质:
|
||||
|
||||
定位的 `burst_leakage` 必须有依据,单位为 m³/s;`pressure_scada_ids` 是模型节点 ID,不能填设备查询编号,也可省略并使用服务的项目配置。monitoring 模式正常窗可成对省略,使用前一天同窗,但这只是一项对照假设,仍要核对数据有效性。simulation 模式必须引用已有分析运行 UUID,不把在线重算当成已有分析运行。已知事故管段可直接做候选隔离;不必先完成一次没有必要的定位计算,也不能把已知答案作为算法独立定位成功的证明。
|
||||
| 影响项 | 依据与输出 |
|
||||
| --- | --- |
|
||||
| 事件当前影响 | 已查询测点的压力、流量、持续时间和恢复情况 |
|
||||
| 直接隔离范围 | affected_nodes及对应计数、地图覆盖 |
|
||||
| 新增供水失源范围 | supply_affected_nodes及对应计数、地图覆盖 |
|
||||
| 水力影响 | 给定阀门组合、起算时间、模型条件下的压力和流量结果 |
|
||||
| 用户与保障影响 | 有资料关联的用户、重点设施、保障需求;缺少关联时报告节点与区域范围 |
|
||||
|
||||
隔离工具支持明确标注的候选管段,无须等到现场确认才评估方案。多个候选的比较优先分开调用;把多个 ID 一次传入表示联合事故场景,不等同于逐个比较。`disabled_valves` 仅填已有事实支持的不可关阀;空数组不证明现场阀门均可用。`isolatable=false` 不能解释为零影响,即使 `affected_nodes` 为空也须解释返回的计数和限制。
|
||||
变化量基于同口径对象、单位、时间与模型条件计算;现场实际、模型预测和空间示意分别标注。缺少可选模拟参数时,继续形成已有依据的隔离与保障建议。
|
||||
|
||||
## 像调查员一样查询、查看、比较和复核
|
||||
## 工具与入口约束
|
||||
|
||||
每一步先明确待回答的问题,再查小范围资料,观察实际结果后决定下一步。例如:核实地址,查附近管段并查看属性,关联压力点,比较事件前后及正常对照,检查候选,评估关阀影响。只把必要的查询、事实和判断依据写入进度及报告,不保存模型内部推理。
|
||||
工单事件从上报位置开展资产关联。Agent会话策略隐藏 run_burst_location,Server在绑定与后续解析时同步移除其调用能力;普通聊天和SCADA候选定位沿用各自策略。持久计算在执行前重新校验任务绑定。
|
||||
|
||||
- 不满足于“查过 SCADA”:必须确认返回的时间实际覆盖事件。查询 24 小时而只返回当天前 45 分钟时,应缩到事件前后的小窗,按需补页,不直接进入最终判断。
|
||||
- 正常基线、实测、模型模拟、外围演练和人工反馈分别标注;缺测不是零值,异常不是爆管确认,候选评分不是校准后的概率。
|
||||
- 查不到事故管段时先检查地址解析、附近资产与上下游关联;能查询的字段先查询,不能直接全部交给现场。
|
||||
- 既有证据通过 `get_task_evidence` 的有界分页读取,不重复拉取同一批事实。失败、权限拒绝和存储未配置不当作“无异常”或“无数据”。
|
||||
- 可以用最多两个前台 `investigation-reader` 并行核对无依赖的问题。读取、计算、发布和文件权限仍按角色执行;reader 只返回查询事实及真实证据编号。
|
||||
历史 burst_report 任务携带 replay_context 时,Server分发scada-anomaly,时序查询保持 knowledge_cutoff 与 batch_sequence,demo能力提示按冻结窗口返回。
|
||||
|
||||
## 地图与图表操作
|
||||
业务阶段和工单、返回时间、复核回执保存在任务文档 `handling_context` JSON 中,不增加数据库列。外围样板更新工单时可提供带时区的 `occurred_at`,同时必须填写现场反馈;该时间写入活动记录,系统的 `updated_at` 仍是实际记录时间。同步器将现场反馈时间传给调查,避免历史演示误用电脑当前时间。
|
||||
|
||||
后台调查统一调用 `publish_task_presentation`,每个不同命令使用不同 UUID `request_id`,相同命令重试复用原编号。以下为工具已有能力,不需要浏览器自动化。
|
||||
预约时间 `scheduled_at` 可在派单前的工单草稿和已创建工单的编辑表单中调整。实际完工反馈时间与预约安排分别记录;Agent 以实际反馈时间为恢复复核起点。新的有效现场反馈修订完工时间后,旧复核证据保留为历史记录,当前复核起点更新并重新等待新时间之后的两个正常监测周期。只修改预约安排或其他工单信息,不改写已有现场反馈时间。
|
||||
|
||||
| 调查进展 | command.action | 取值及依据 |
|
||||
| --- | --- | --- |
|
||||
| 找到实际候选资产 | `highlight_features` | `layer=pipes` / `junctions`,`feature_ids` 为已核实的地图要素编号,`effect=steady` |
|
||||
| 正在核查候选或建议关阀 | `highlight_features` | 对应 pipes 或 valves,`effect=pulse`;闪烁只表示调查关注,不代表设备正在操作 |
|
||||
| 查看异常与对照 | `open_chart` | 有限长度的时间和值,引用真实 `evidence_refs`;不同日期的对照对齐方式在标题或来源中说明 |
|
||||
| 查看已有空间结果 | `set_overlay` | 提供 `overlay_id/title/mode/evidence_id`,Server 从证据提取几何,不接收手绘影响区 |
|
||||
| 撤下旧的临时展示 | `close_chart` / `clear_overlay` / `clear_highlights` | 清理自己记录的临时展示;清理失败不修改业务结果 |
|
||||
`POST /operational-tasks/recovery/reconcile` 由现有 operational worker 每轮调用,按项目及任务创建边界处理等待复核的任务;SCADA 读取失败不阻断其他调查派发。复核直接读取项目时序库中完工反馈时间之后的 SCADA,不依赖回放状态或推进回放时间。
|
||||
|
||||
支持的图层为 junctions、pipes、valves、pumps、tanks、reservoirs、scada。先核实业务 ID 与地图 feature ID 的映射,不能把设备编号、节点编号与 GIS 编号混用。每次高亮最多 100 个要素,需要更多时说明所显示的子集;不要假定多次命令会累积成完整范围。没有几何时可以按已知 ID 高亮、用表格解释结果,不画包络多边形冒充影响范围。
|
||||
## 验证
|
||||
|
||||
图表最多 100 个横轴值和 8 组数值序列,单位须在系列名称或标题中明确。不能把 null 缺测填零以通过 schema;可以按有数据的区间分图,并保留缺测说明。`recorded` 仅表示请求保存。浏览器未开 Dev 跟随时仍继续调查,不能等待地图显示回执。后台接口目前没有摄像机缩放、平移、鼠标点击或任意图层开关命令;不要调用仅供聊天的 `locate_features`、`zoom_to_map` 或原生浏览器工具替代。
|
||||
检查Skill名称、版本、摘要与正文digest一致、内联体积、角色权限、工单工具隔离和SCADA定位回归。Agent类型检查与会话工具策略测试共同覆盖运行时入口。发布后分别验收工单事件处理报告和SCADA候选定位,原有报告按既有修订保留。
|
||||
|
||||
## JSONL 调查数据与 json-render 展示
|
||||
|
||||
JSONL 用于整理已经取得的数据与分析结果,不补造监测、阀门、现场反馈或审批。推荐每行一个对象,记录 `record_type/origin/source_evidence_refs`,并按对象保留时间窗、单位、模型或假设、覆盖限制和实际结果。`origin` 沿用来源分类;本地派生记录引用输入证据,并说明转换方法。不要把 JSONL 文件自身当作 Server 已保存的业务证据。
|
||||
|
||||
按内容选择 `event_context`、`monitoring_coverage`、`candidate`、`isolation`、`hydraulic_impact`、`field_feedback`、`closure_check`,无需为没有结果的类别制造空壳文件。候选记录写实际排序及评价值;隔离记录保留建议必关阀、可选阀、已知不可关阀及受影响节点;闭环记录逐项保留已核验、待核验或不适用及原因。JSONL 是导出约定,不新增 MCP 输入字段或服务端数据协议。
|
||||
|
||||
以下两行只演示文件格式,`synthetic`、`example_only` 与空证据引用表示它们不可用于实际报告或审批,不包含真实分析结果:
|
||||
|
||||
```jsonl
|
||||
{"record_type":"candidate","origin":"synthetic","example_only":true,"source_evidence_refs":[],"element_id":"DEMO-PIPE-01","rank":null,"evaluation_value":null,"status":"not_computed","limitations":["仅说明字段,未执行定位"]}
|
||||
{"record_type":"closure_check","origin":"synthetic","example_only":true,"source_evidence_refs":[],"item":"repair_verified","status":"not_verified","observed_at":null,"limitations":["无现场反馈,不能声称闭环"]}
|
||||
```
|
||||
|
||||
如果当前会话已获准使用原生文件写入,则在当前 workspace 下写 `files/burst-investigation-<generation>.jsonl`,保留原始证据不变;通过允许的读取工具逐行复核 JSON、行数、对象 ID、时间和单位。只引用宿主绑定的 generation,不能从用户文本自选。不得读取兄弟会话、业务数据库、宿主源码或凭据;需要本地转换时只使用已获准的原生工具及沙箱 Shell,不引入 HTTP、SQL 或自由命令查询桥。
|
||||
|
||||
当前没有专用的免审批 JSONL 导出工具。文件权限未授予时,不通过 Shell 绕过、不让后台无限等待批准、不声称已生成文件;继续完成报告内的结构化数据,并如实说明文件未保存。恢复写入授权须由有权限的人或宿主处理,Skill 不扩大权限。
|
||||
|
||||
图表、表格和指标使用 `publish_task_report.report.ui_blocks`,每块为 `answer-ui@1`,包含独立 `block_id`、`fallback_text` 和 json-render 的 `spec.root/elements`,外层附真实 `evidence_refs`。最多 8 块、总计 400 KB,单块还受现有 schema 限制。优先组织以下内容:
|
||||
|
||||
| 展示 | 建议组件 | 数据来源 |
|
||||
| --- | --- | --- |
|
||||
| 候选管段及理由 | Table、Evidence、MapLocation | 地点、资产与定位证据;明确候选和已确认的区别 |
|
||||
| 异常及正常对照 | Chart | 同单位的实际序列,说明时间对齐及缺测 |
|
||||
| 关阀与隔离范围 | Table、Metric、MapLocation | 隔离证据、阀门属性及候选场景 |
|
||||
| 水力与用户影响 | Table、Chart | 指定输出节点的模拟结果及真实用户关联资料 |
|
||||
| 处置与闭环核对 | Table、Evidence | 动作回执、现场反馈、恢复监测和原工单版本 |
|
||||
|
||||
只用工具公布的组件属性。JSONL 可作为整理中间格式,但目前没有“把任意 JSONL 直接传给 json-render”的通道;需转换为已注册组件的 JSON 属性。后台不用 `present_answer`,不把原始 JSONL 输出到聊天正文,也不把表单提交当成已保存现场证据。小数据和简单结论可直接文字表达。
|
||||
|
||||
## 本轮成果与爆管闭环的验收
|
||||
|
||||
报告至少回答下列四类问题,逐项给出实际结果或经过查询证实的具体限制;无需固定排版或创建固定数量的动作。
|
||||
|
||||
1. **位置**:事故已确认还是仅有候选?每个候选的模型/地图编号、匹配或定位依据、排名及未确认事项是什么?
|
||||
2. **隔离**:每个候选场景是否可隔离?应关、可选和已知不可关的阀门分别是什么?有无替代方案及现场前置核验?
|
||||
3. **影响**:拓扑受影响节点、水力压降或失供范围、用户关联分别有哪些实际结果?未覆盖什么?没有水力或用户资料时分别说明,不能推定为零。
|
||||
4. **处置与闭环**:当前可审批的工作是什么?已有哪些动作、审批、提交回执和现场事实?还缺什么反馈才具备结案条件?
|
||||
|
||||
有具体结论和动作建议时,先保存 `interim/concluded`,再 `propose_task_action`,最后保存 `final`。人工执行事项使用 `work_order_type=general`,保留原爆管事件。工单描述写位置、任务内容、依赖、执行前核验、需回传的事实和责任要求;`propose_task_action` 当前 payload 没有独立的 dependencies 或 feedback_requirements 字段,不发明字段。没有客户通知适配器时,将通知作为人工工单事项,不宣称已发送。
|
||||
|
||||
闭环复核至少核对实际故障资产及原因、隔离/阀门实施记录、抢修结果、适用的清洗及水质复测、恢复供水记录和恢复后监测、用户通知及回访、未决动作与遗留风险、原上报工单结案状态。不适用事项必须有事件依据;未收到结果写待核验,不把记录创建时间当现场完成时间。只齐备处置证据而原工单未结案时,结论为“具备结案条件,待原系统确认”,而非“已闭环”。误报或未发现故障的结案也要有支持排除的实际核查与人工确认。
|
||||
|
||||
必要查询失败、权限拒绝和存储未配置属于执行异常,按 schema 修正可纠正问题;仍无法取得当前判断必需的资料时交宿主记录失败。已通过有效查询确认关键数据确实缺失且无法补齐,才发布 `final/insufficient_data`,提供 blocking 缺口和查询依据,建议与待办为空,不在该退出分支再生成补数据工单。能够明确形成一项现场核验结论时可提议具体核验动作,但不能把“尚未开展定位”包装为“已完成定位调查”。
|
||||
|
||||
## 能力边界与验证
|
||||
|
||||
本次交付为工程图和运行时 Skill 文本,使用现有 MCP、发布、审批与反馈能力;不新增自动关单、鼠标自动化、摄像机操作、JSONL 导出接口或数据库字段。Server 目前没有按 Skill 检查定位/隔离成果的强制验收器,本文的业务验收要求仍由 Agent 执行并由人复核。
|
||||
|
||||
当前 Skill 仅通过 `section=skill` 整份分发,没有相对路径 reference 读取协议,因此运行时指令保持自包含,不能要求 Agent 读取本工程文档。内容需控制在既有内联预算内。Server 更新资源后,应按原发布方式让实际 Server 实例取得新文件;Agent 读取时核对 `name/version/content_sha256`,不把本地文件更新当成运行中实例已生效。
|
||||
|
||||
验证包含 Mermaid 语法解析、本地路径和工具 ID 核对、Skill 分发/权限/体积测试及 `git diff --check`。后续真实行为验收应分别覆盖:有效观测和漏水量依据下的定位;已知候选但缺漏水量时的候选隔离;不可关阀替代方案;SCADA 首屏未覆盖事件时继续读取;接口失败明确终止;文件权限缺失不绕过;无浏览器时照常调查;实际反馈触发新轮及最终闭环复核。没有真实模型计算或现场回执,不报告定位准确性或业务闭环已通过。
|
||||
|
||||
关联契约:[分析 MCP](mcp-analysis-tools.md)、[调查展示](investigation-progress-and-presentation.md)、[报告契约](investigation-report-contract.md)、[任务与多轮反馈](operational-tasks.md)、[后台工作进程](operational-task-workers.md)。
|
||||
关联契约:[分析 MCP](mcp-analysis-tools.md)、[调查展示](investigation-progress-and-presentation.md)、[报告契约](investigation-report-contract.md)、[任务与多轮反馈](operational-tasks.md)。
|
||||
|
||||
@@ -16,7 +16,9 @@ Agent 根据401 challenge 或路径/根 well-known 发现受保护资源元数
|
||||
|
||||
普通查询默认20条;目录类最多500条,时序最多10000条、20个标识、24小时;offset 最大10000。Agent 首次优先单对象、必要的短时间窗和小页,仅在证据不足时按需扩大,不自动遍历全网。SQL 有 limit/offset 和 statement_timeout。历史对比在同一条SQL中按序列、时间对数据点分页,返回 page.has_more;非零offset也标明覆盖不完整。历史曲线展示调用初始每页500点,`RESULT_TOO_LARGE` 时原位减半重试,最多读取1000条、发出16次请求,共用120秒超时(单次请求同时受该剩余总预算约束),图表最多100个有效点;这不改变模型首次查询默认值或时序接口上限。
|
||||
|
||||
单份结果超过8MiB报错;超过12KB的调查工具消息只返回证据资源引用,完整快照仍保存,Server 的 `resources/read` 可以读取它。Agent 本地 MCP 只提供工具,将上游资源引用转为 `evidence_read` 中的 `mcp_tjwater_get_task_evidence` 参数,不向 OpenCode 泄露不可在本地读取的链接。`get_task_evidence` 在数据库中按 data_path、limit、offset 选页,嵌套集合和超过256字符的字符串返回路径描述;字符串按 Unicode 字符分页。页和完整资源均在数据库返回前检查8MiB上限,保留原证据编号和合成来源;普通查询要求缩小范围。其他结果仍保留执行后的整体8MiB检查,不能把它理解为所有查询均有数据库端字节限制。原始/清洗实测、模型基线、分析结果、比较和 synthetic 均明确标记。非有限数值转为 null 并记录数据缺口。
|
||||
单份结果超过8MiB报错;超过12KB的调查工具消息默认返回证据资源引用,设备目录的精简路径见下段。完整快照仍保存,Server 的 `resources/read` 可以读取它。Agent 本地 MCP 只提供工具,将上游资源引用转为 `evidence_read` 中的 `mcp_tjwater_get_task_evidence` 参数,不向 OpenCode 泄露不可在本地读取的链接。`get_task_evidence` 在数据库中按 data_path、limit、offset 选页,嵌套集合和超过256字符的字符串返回路径描述;字符串按 Unicode 字符分页。页和完整资源均在数据库返回前检查8MiB上限,保留原证据编号和合成来源;普通查询要求缩小范围。其他结果仍保留执行后的整体8MiB检查,不能把它理解为所有查询均有数据库端字节限制。原始/清洗实测、模型基线、分析结果、比较和 synthetic 均明确标记。非有限数值转为 null 并记录数据缺口。
|
||||
|
||||
`list_scada_devices` 默认每页100个、最多500个,其他集合仍沿用各自的分页默认值。设备目录超过12,000字节时,先内联本页全部设备的 `device_id`、`device_type` 和 `measurement_unit`,省略其他属性并明确标注;模型映射、坐标等通过 `get_scada_device` 核验,任务证据和幂等回执保留完整属性。此时 `truncated` 表示属性省略,设备是否还有后续页以 `page.has_more` 为准,按本页实际设备数递增 `offset`。精简目录仍超预算时沿用证据引用或缩页路径。
|
||||
|
||||
`get_task_context` 默认 section=summary,只查固定元数据、160字符任务标题及200字符结论预览,并返回 available_sections;preview_only 和 truncated 明确说明不是完整报告。按 section=task/report/evidence/actions/progress/access_requests/plan/run 读取详情,report_revision 保留选择旧报告的语义。data_path 选择嵌套值,limit 默认20、最多500,offset 最大10000;证据、动作和授权申请集合以稳定 ID 为键,按 ID 字典序分页。字符串按字符分页。详情在数据库返回前检查8KB预算,超限缩页或选更深路径。缺少可选进度或授权申请表时返回 metadata.available=false,不冒充空事实。绑定权限范围只读取七类既有 scope,不再加载整个任务上下文。不增加工具数量、数据库表或迁移,也不改变原 REST 完整上下文契约。
|
||||
|
||||
@@ -26,7 +28,9 @@ Agent 根据401 challenge 或路径/根 well-known 发现受保护资源元数
|
||||
|
||||
### Server 分发业务处置 Skill
|
||||
|
||||
业务流程源文件位于 `resources/work-order-skills/*/SKILL.md`,随 Server 镜像分发。`get_task_context` 摘要提供 `handling_skill`(适用 workflow、名称、版本和 SHA-256)及 `display_time_zone=Asia/Shanghai`;使用 `section="skill"` 读取完整正文。流程由服务端持久化任务的 workflow 选择,调用方不能传入文件路径或其他任务类型;未知 workflow 返回 `available=false`,不自动套用其他流程。
|
||||
业务流程源文件位于 `resources/work-order-skills/*/SKILL.md`,随 Server 镜像分发。`get_task_context` 摘要提供 `handling_skill`(适用 workflow、名称、版本和 SHA-256)及 `display_time_zone=Asia/Shanghai`;使用 `section="skill"` 读取完整正文。流程由持久化任务的 workflow 与 replay_context 选择:工单 burst_report 使用 burst-event-handling,scada_anomaly 及带回放来源的历史 burst_report 使用 scada-anomaly;未知 workflow 返回 available=false。工单事件处理的绑定工具范围移除 run_burst_location,保留资产关联、隔离和影响分析。
|
||||
|
||||
报告阅读时区统一为 UTC+8(Asia/Shanghai)。MCP 在原始证据和回执保存后,将模型可见结果中的显式带时区时间转换为 `+08:00`,保留同一时刻和源小数秒精度;存储、查询参数及冻结窗口沿用原始时刻,标识符与引用保持原文。前端对报告正文、交互表格、证据卡片、图表提示及数据表采用同一阅读时区,并兼容历史正文中的 `Z`、`UTC` 和 `UTC0` 标记。历史正文中省略时区的时间按读者默认 UTC+8 展示。
|
||||
|
||||
当前覆盖爆管上报、水质投诉与预约跟进。业务 Skill 描述风险核查、隔离停水、用户通知、现场处置和恢复条件;Agent 本地 Skill 维护通用执行方法。权限、审批和执行仍由 Server 代码控制。流程说明没有 evidence_id,不记录成事件证据。具体草稿由现有 `propose_task_action` 保存并等待人工审批;人工通知等步骤通过关联预约工单承接,不能当作通知已发送或现场工作已完成。
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ Forward Hostname 后追加 `/api/sample/v1`。本机开发和预览模式也将
|
||||
|
||||
SCADA 按月数据集、5 分钟时间定位、主动周期监测、质量校验、爆管调查与定位边界见 [SCADA 外围系统时段回放、主动监测与爆管调查设计](scada-peripheral-replay-design.md)。部署回放存储需在项目 BizDB 执行 `031_scada_replays.sql`;项目通用配置需在 MetaDB 执行 `033_metadata_project_settings.sql`。监测频率保存于 `projects.settings.scada_monitoring_interval_seconds`,压力与出厂边界流量角色保存在类型化 `projects.settings.scada_monitoring` 中;本阶段不注册定时任务,也不部署 SCADA 回放 worker。代码和结构迁移完成不等于月度数据或 Agent 联调已经验收。
|
||||
|
||||
演示数据通过 `scripts/seed_peripheral_sample.py` 写入 `tjwater_v2` 的 `peripheral_sample` schema。当前固定窗口为 2026-09-17,所有记录标记为 `synthetic`,并使用 `DEMO-` 前缀。
|
||||
独立监测样本和测试数据通过 `scripts/seed_peripheral_sample.py` 写入 `tjwater_v2` 的 `peripheral_sample` schema。固定窗口为 2026-09-17,样本标记为 `synthetic` 并使用 `DEMO-` 前缀;业务工单保持 `system_data` 来源。
|
||||
|
||||
## 工单事件调查
|
||||
|
||||
|
||||
@@ -16,10 +16,35 @@
|
||||
|
||||
本版冻结设备、区间、规则及批次输出,按批次原始值摘要校验源变更。完整月度数据清单、全月源版本摘要、独立事件真值和检测效果评估仍是后续数据准备工作;能力接口仅判断回放存储是否存在与当前操作权限,不声明月度数据已经就绪。现有 14 天数据不能当作一个月验收。
|
||||
|
||||
Agent 查询本轮已检测的固定批次快照,受任务的 replay_id、knowledge_cutoff、batch_sequence 约束。开始前历史只供后台基线初始化,本版调查查询不返回该部分;爆管定位已支持受回放截止约束的冻结输入适配,其他未适配计算工具继续拒绝。新 [SCADA 调查 Skill](../resources/work-order-skills/scada-anomaly/SKILL.md) 要求据实说明这些证据限制。运行异常自动建立调查,数据质量异常仅建立告警,不触发模型;恢复时推进调查代次。真实模型推理与报告效果尚未联调。
|
||||
Agent 查询本轮已检测的固定批次快照,受任务的 replay_id、knowledge_cutoff、batch_sequence 和设备集合约束。新回放首次监测以只读一致快照冻结开始前 15 天历史,负序号静默基线按最多 2,000 行分块暂存为 `clean_prepared`;全部读取完成后,在一个 BizDB 短事务中把批次转为 `detected` 并原子发布基线与初始化标记,历史查询和定位对照才能读取。
|
||||
|
||||
读取各页期间不持有 BizDB 事务,内存只保留当前页和设备短历史。固定准备预算为 1,000,000 行、512 MiB 序列化批次,覆盖 500 设备十五天每 15 分钟一条所需的 720,000 行并留有余量。超限不保存超限页,状态明确返回 `BASELINE_BUDGET_EXCEEDED` 及中文原因;未发布批次不进入观测、监测或待处理批次。失败重试只清理当前项目、本轮回放的未发布基线,从新的一致源快照重新准备,已发布基线保持不变。
|
||||
|
||||
旧回放没有冻结基线时明确拒绝回放前查询,不回落到实时 TSDB。爆管定位支持受回放截止约束的冻结输入适配,其他未适配计算工具继续拒绝。[SCADA 调查 Skill](../resources/work-order-skills/scada-anomaly/SKILL.md) 要求据实说明证据限制。运行异常自动建立调查,数据质量异常仅建立告警;恢复时推进调查代次。真实模型推理与报告效果尚未联调。
|
||||
|
||||
控制进度和事件状态使用有界轮询,沿用告警流发布业务告警;本版未新增 scada.replay.changed SSE 主题。演示面板只显示最近一个周期的组合结论,逐测点输出和完整事件历史由分页 API 保留给诊断与调查入口,不在主面板重复铺开。
|
||||
|
||||
## Case 3 临时定位 mock(2026-11-07)
|
||||
|
||||
`tjwater2_v2` 及其隔离演示项目 `tjw_bench_tjwater2_20261105` 中,2026-07-16
|
||||
08:00–13:00(北京时间)的 monitoring 定位暂用快速 mock。异常窗起点可提前 15 分钟,
|
||||
终点必须已经到达事件时刻且不超过事件结束;其他项目、时间和 simulation 输入仍运行原算法。
|
||||
mock 直接返回并沿用 MCP 权限、回放冻结证据校验、调查证据与幂等回执,不提交慢计算队列。
|
||||
|
||||
预设候选为同一 DN600 线路的 `515870`。每次读取当前拓扑,验证候选与事件位于完全相同的
|
||||
可隔离分区、所需边界阀一致,且不跨阀的同径管线路径距离为 200–500 m。距离定义为实际
|
||||
事件节点沿管线至候选管段最近点的距离;当前为 495.368 m,不以两条管段中点计算。
|
||||
无法满足任一条件时返回空候选,不扩大隔离区,也不回落到耗时定位。
|
||||
|
||||
候选结果固定返回 `similarity=0.9708` 和 `similarity_percent=97.08`,展示为97.08%。
|
||||
同一案例在 T 与 T+15 分钟返回相同候选与排序。Agent可见结果不再附加 `mock`、
|
||||
`demo_mock` 说明、空相似度或 `simulation_times=0` 等阻断提示,也不虚构水力仿真次数。
|
||||
MCP 回放证据仍保留 `origin=synthetic`;固定相似度是该演示路径的预设返回值,未运行水力定位。
|
||||
取得候选后继续地图展示、隔离边界与影响分析。
|
||||
事件真值仅在服务端 fixture 中用于约束校验,
|
||||
不返回给 Agent。撤回时移除 `app/services/burst_location_demo.py` 的两项目匹配即可恢复原路径;
|
||||
不修改观测、管网或关阀数据。本项不代表自动监测建单或真实 Agent 报告已完成验收。
|
||||
|
||||
## 已确定的设计边界
|
||||
|
||||
- 数据集覆盖一个月,包含多次独立异常及各次事件发生、持续、恢复的过程。
|
||||
@@ -59,7 +84,7 @@ MetaDB 的 `projects.settings` 为项目级通用 JSONB 对象,默认 `{}`,
|
||||
"settings": {
|
||||
"scada_monitoring_interval_seconds": 900,
|
||||
"scada_monitoring": {
|
||||
"rule_version": "burst-monitor-v1",
|
||||
"rule_version": "burst-monitor-v2",
|
||||
"pressure_device_ids": ["明确的压力设备 ID"],
|
||||
"outlet_flow_device_ids": ["明确的出厂边界流量设备 ID"]
|
||||
}
|
||||
@@ -67,10 +92,62 @@ MetaDB 的 `projects.settings` 为项目级通用 JSONB 对象,默认 `{}`,
|
||||
}
|
||||
```
|
||||
|
||||
当前代码已类型校验并在创建回放时冻结 `scada_monitoring`。项目没有出厂流量或不足 5 个完整压力点时保持缺项,能力接口说明原因,监测回执返回 `insufficient_data`;不能为了让演示通过而把其他流量点冒充出厂流量或虚构设备。`tjwater_v2` 现有目录只有通用 `pipe_flow` 类型及模型管段映射,没有足以证明“出厂边界”的角色字段,因此本轮未写入该嵌套配置。
|
||||
当前代码已类型校验并在创建回放时冻结 `scada_monitoring`。不足 5 个完整压力点时保持缺项,能力接口说明原因,监测回执返回 `insufficient_data`。加权模式允许出厂流量缺项,其贡献为零且不重分配权重;`all_signals` 模式仍要求出厂流量就绪。不能把普通流量点冒充出厂流量或虚构设备。`tjwater_v2` 未补写未经核实的监测角色。
|
||||
|
||||
部署前需在 MetaDB 执行 `resources/sql/033_metadata_project_settings.sql`。迁移会将实验版本可能存在的独立监测间隔列搬入 `settings`,核对冲突后移除旧列;重复执行不丢失已有配置。当前 `tjwater_v2` 与 `tjwater2_v2` 均配置 900 秒,即 15 分钟的主动监测周期。该参数不改变 5 分钟时间轴定位,本阶段明确不实现通用定时任务调度。
|
||||
|
||||
### 动态阈值与加权判定(2026-11-07)
|
||||
|
||||
新建回放默认使用 `burst-monitor-v2`,配置仍位于项目 `settings.scada_monitoring`:
|
||||
|
||||
```json
|
||||
{
|
||||
"rule_version": "burst-monitor-v2",
|
||||
"decision_policy": "weighted",
|
||||
"pressure_device_ids": ["已核实的至少5个压力设备"],
|
||||
"outlet_flow_device_ids": ["已核实的出厂流量设备"],
|
||||
"weights": {"burst_detection": 0.5, "pressure": 0.4, "outlet_flow": 0.1},
|
||||
"alert_threshold": 0.8
|
||||
}
|
||||
```
|
||||
|
||||
三项权重均为 0–1 且总和必须为 1。每项达到自身阈值时贡献其固定权重,加权和达到
|
||||
`alert_threshold` 才判为疑似爆管。默认侦测与压力共同命中可得 0.90,出厂流量仅提供
|
||||
0.10 辅助支持。缺数或未配置的流量贡献为零,不把剩余权重重新归一化;压力或侦测
|
||||
数据不足时仍返回数据不足。综合分不是概率,也不代表现场确诊。
|
||||
|
||||
首步只用回放开始前完整 15 天的冻结历史学习阈值,在历史发布事务中一起保存
|
||||
`monitoring_calibration`;随后固定使用,事件发生后的数据不会参与更新阈值。准备时
|
||||
为角色测点与参与相对变化规则的测点保留紧凑数值序列,最多 500 个测点;
|
||||
15 分钟周期下数值数组上限约 5.8 MB。继续逐页保存基线,不重新聚合全部设备的 raw。
|
||||
15 天历史不完整就声明不足,不插值或借用未来数据。
|
||||
|
||||
压力与流量按设备计算此前若干样本中位值对应的历史变化率,阈值取正常变化中位值加
|
||||
3 倍稳健波动尺度,并分别保留 3%、5% 下限。侦测阈值从冻结正常历史的得分估计,取
|
||||
`min(-0.04, 正常得分中位值-3×稳健波动尺度, 正常得分5%分位值-0.02)`。
|
||||
稳健波动尺度在本实现中定义为 `1.4826×MAD`。保留真实侦测分数,调整判定阈值;
|
||||
不按已知事件日期制造异常分数。周期回执保存实际阈值、权重、各项贡献和校准截止时间。
|
||||
|
||||
加权流程的测点诊断采用 `normal-phase-envelope@1`:按前 15 天同一日采样相位的正常值
|
||||
建立 `[历史最小值−3×稳健波动尺度, 历史最大值+3×稳健波动尺度]` 包络,保留数值精度余量。
|
||||
普通测点越过所配置方向的同期包络即可启动调查,不再用固定 30% 门槛筛选。
|
||||
零基准、日常反向流量、近零分母的百分比变化不再单独制造异常。压力/出厂流量的
|
||||
爆管参考贡献还需越过其历史动态变化阈值;只命中同期包络的有效单点异常仍可进入调查。
|
||||
显式水质上下限保留。角色参考的滚动基线严格取目标观测之前的样本,与校准窗口对齐;
|
||||
本周期必须有新观测,模型必须具备周期终点读数,不能复用上一时刻的得分。
|
||||
|
||||
本轮校准版本为 `scada-monitor-calibration@2`,并保存 `diagnostic_policy`、各测点包络与
|
||||
截止时间。缺少完整历史的测点不回退到固定百分比,并在监测回执的缺项中列出。
|
||||
已预热的加权回放缺少新版校准时,推进/重试返回 409,明确要求停止后新建;
|
||||
旧相对规则事件不进入新诊断信号,已有历史事件和工单不删除。新事件采用独立规则状态和策略标识。
|
||||
请求 schema 中的 `relative_change.threshold` 仅为既有协议兼容保留,在加权测点诊断路径
|
||||
不参与触发;同一规则的窗口参数仍用于角色指标的动态变化计算。
|
||||
|
||||
既有冻结回放没有 `decision_policy` 时沿用三项同时命中的旧判定;新加权配置需新建
|
||||
回放才生效,不更改旧回放的历史结论。显式 `decision_policy=all_signals` 仍为旧规则兼容路径,
|
||||
不用于当前 Case3 加权演示,也不是新版校准缺失时的回退路径。
|
||||
本项修改无需数据库迁移。
|
||||
|
||||
## 实施前基础与原设计差距
|
||||
|
||||
下表记录实施前基础,用于说明改动缘由;本次实际实现以首版范围及后文接口表为准。设备目录采样周期为本轮讨论中 2026-11-02 的只读核查快照,与项目监测任务间隔是两个概念。
|
||||
@@ -202,7 +279,7 @@ SCADA 单步命令在当前 API 请求内按原始时间顺序完成 raw 读取
|
||||
|
||||
演示建立后改变时间区间需要停止并创建新回放;保留旧回放的事件和证据,不把旧回放时间游标直接重设。已完成区间需要再次演示时,新建独立回放;不自动循环处理和重复触发调查。
|
||||
|
||||
选定区间之前的可用历史仅用于已声明的基线初始化,不占用主时间轴、不作为新到达批次、不预触发此前事件。基线不足时在当前区间显示具体可用性,不能悄悄扩大演示范围或读取区间之后的数据。
|
||||
选定区间之前的可用历史用于已声明的基线初始化及冻结历史对照,不占用主时间轴、不计入当前处理量、不预触发此前事件,也不回写 TSDB 的 cleaned_value。基线不足时保留实际行数和模型数据缺口,不能悄悄扩大演示范围或读取区间之后的数据。
|
||||
|
||||
处理到选定终点后停在终点,显示数据处理是否完成及剩余调查数量;不会自动继续处理该月剩余数据。空区间明确显示没有观测,不能通过控件动画假装已经收到 SCADA 数据。
|
||||
|
||||
@@ -234,8 +311,8 @@ SCADA 单步命令在当前 API 请求内按原始时间顺序完成 raw 读取
|
||||
2. 汇总压力下降幅度。只使用映射明确、单位一致、质量合格的压力测点,并同时保留异常测点数、覆盖测点数、基线窗口和最大或中位下降幅度。
|
||||
3. 汇总出厂流量变化。设备必须在项目配置或设备档案中明确标注为“出厂边界流量”,不能把任意 `pipe_flow` 测点当作出厂流量;保留方向、单位、基线和增量。
|
||||
4. 条件满足时运行爆管侦测。现有侦测要求至少 5 个完整压力点和目标时刻之前 15 天同周期数据;不满足时返回 `baseline_not_ready` 或 `sensor_coverage_insufficient`,不能将“未运行”解释为“无异常”。
|
||||
5. 组合上述证据形成监测结论;只有疑似爆管才创建 `event_investigation`,工作流使用现有 `burst_report`,并绑定本轮 `replay_context`。正常周期只保存回执,不启动 Agent;数据不足周期保存缺口并在界面展示。
|
||||
6. `burst_report` Skill 核对证据后决定是否调用爆管定位。定位必须有 m³/s 的有依据漏量估计或明确情景假设,以及模型节点映射、异常窗和正常对照窗;输入不具备时保持“疑似爆管、定位待补充”,不能填默认漏量。
|
||||
5. SCADA 数据诊断发现任一已配置指标异常,就创建 `event_investigation`,使用现有 `scada_anomaly` 工作流并绑定本轮 `replay_context`。调查先核验数据,再进行爆管诊断;综合分用于判断爆管嫌疑,不能作为启动调查的前置门槛。没有异常的正常周期只保存回执。数据不足但已有有效异常信号时仍发起调查并列出缺口。
|
||||
6. `scada_anomaly` Skill 核对异常证据并进行爆管诊断,输入具备时决定是否调用爆管定位。定位必须有 m³/s 的有依据漏量估计或明确情景假设,以及模型节点映射、异常窗和正常对照窗;输入不具备时保持“疑似爆管、定位待补充”,不能填默认漏量。
|
||||
|
||||
组合判定采用可版本化策略,首版演示建议如下:
|
||||
|
||||
@@ -243,10 +320,10 @@ SCADA 单步命令在当前 API 请求内按原始时间顺序完成 raw 读取
|
||||
| --- | --- | --- |
|
||||
| `insufficient_data` | 必需点位缺测、质量无效、单位或角色未配置,或爆管侦测基线不满足 | 保存缺口,不声明正常,不启动定位 |
|
||||
| `normal` | 数据完整,爆管侦测未命中,压力与出厂流量规则均未命中 | 保存周期回执,不创建 Agent 任务 |
|
||||
| `attention` | 只有单项指标命中,或指标间方向不一致 | 保存观察结果;下一步继续监测,必要时由人发起调查 |
|
||||
| `suspected_burst` | 爆管侦测命中,且压力下降与出厂流量增加在同一业务时间窗内相互支持 | 创建一次 `burst_report` 调查;定位输入具备后进入计算 |
|
||||
| `attention` | 单项指标命中、指标方向不一致,或周期内曾出现测点异常 | 创建或复用 `scada_anomaly` 调查,进入爆管诊断 |
|
||||
| `suspected_burst` | 加权分达到门槛,或旧版联合策略的三项指标共同命中 | 同一份 `scada_anomaly` 调查标记爆管嫌疑;定位输入具备后进入计算 |
|
||||
|
||||
爆管侦测和压力下降存在相关性,因此回执不能把两者描述成完全独立的两票。出厂流量也会受泵站调度、储水设施和正常用水变化影响。组合结论只是调查触发条件,不是现场确诊。
|
||||
爆管侦测和压力下降存在相关性,因此回执不能把两者描述成完全独立的两票。出厂流量也会受泵站调度、储水设施和正常用水变化影响。组合结论用于评估爆管嫌疑,不是调查启动门槛或现场确诊。
|
||||
|
||||
回放中的 MCP 定位已走 Server 持有的安全适配层:按 `replay_id`、`knowledge_cutoff` 和 `batch_sequence` 从已固化清洗输出组装压力与可选流量序列,再调用现有计算队列。回放只允许 monitoring 模式,并要求显式异常窗、正常对照窗和有依据的 `burst_leakage`;不能直接查询 TSDB 中尚未回放的未来记录。步长爆管侦测同样只读取最近 15 天已固化输出。计算结果保存输入、算法与证据引用,任务恢复或重试仍使用相同知识上限。
|
||||
|
||||
@@ -366,7 +443,7 @@ BizDB 批次状态是持久待处理队列,通知只负责唤醒。后台启
|
||||
|
||||
## Agent 调查与时间隔离
|
||||
|
||||
主动单步在边界形成组合监测回执:一般关注和数据不足只保存回执,只有 `suspected_burst` 进入 `burst_report`。SCADA 演示请求只负责建立持久调查任务,不要求先生成一条合成 test_data,也不在请求内执行 Agent。
|
||||
主动单步在边界形成组合监测回执:任一有效指标异常进入 `scada_anomaly` 调查;缺少爆管判别资料不能阻止已知异常进入调查。SCADA 演示请求只负责建立持久调查任务,不要求先生成一条合成 test_data,也不在请求内执行 Agent。
|
||||
|
||||
告警事实与“待建立调查”意图在事件事务中保存。创建调查失败时后台对账重试;组合监测调查的来源稳定标识使用 `scada_replay:<replay_id>:monitor:<period_end>:<rule_version>`,一般事件继续使用 `scada_replay:<replay_id>:event:<event_id>`,均沿用现有外部来源幂等约束。事件不因 Agent 不可用而丢失。
|
||||
|
||||
@@ -391,7 +468,7 @@ BizDB 批次状态是持久待处理队列,通知只负责唤醒。后台启
|
||||
| `GET /api/v1/scada-replays/capabilities` | 回放表可用性、写权限、监测频率、爆管组合监测角色是否就绪及最近一轮状态;不代表完整月度数据就绪 |
|
||||
| `POST /api/v1/scada-replays` | 固定区间、设备、规则和质量量程,返回 ready;携带稳定 request_id |
|
||||
| `GET /api/v1/scada-replays/{replay_id}` | 权威控制、时间、计数、设备与固定规则、当前输出及故障 |
|
||||
| `POST /api/v1/scada-replays/{replay_id}/commands` | play、pause、step、set_speed、stop、retry;request_id + expected_revision |
|
||||
| `POST /api/v1/scada-replays/{replay_id}/commands` | step、monitor、stop、retry;request_id + expected_revision,monitor 另需带时区的 at_time |
|
||||
| `GET /api/v1/scada-replays/{replay_id}/observations?through=...` | 仅本轮已读取时间范围内的历史快照,每设备最近一条、最多 500 个 |
|
||||
| `GET /api/v1/timeseries/scada-readings/raw` | 当前项目 TSDB 原始值联合游标分页;不插入、不隐式清洗 |
|
||||
| `GET /api/v1/scada-replays/{replay_id}/events?offset=0&limit=100` | 检测变化与调查关联,返回 items、next_offset |
|
||||
@@ -437,7 +514,7 @@ next_cursor 绑定项目、设备、查询区间并固定本轮分页时间上
|
||||
- 周期内多批次单步、重复单步拒绝、并发请求互斥和尾步完成状态。
|
||||
- 5 分钟时间定位与 15 分钟监测周期相互独立、非整点起点、周期配置变更不影响当前回放、尾步不足完整周期和未配置时禁止开始。
|
||||
- 每个步长边界只产生一份幂等监测回执;正常、数据不足、单指标关注和疑似爆管分别处理,不为正常周期创建 Agent。
|
||||
- 爆管侦测基线不足、压力下降、出厂流量变化、设备角色错误、指标方向冲突和多指标同时命中;只有疑似爆管建立 `burst_report`。
|
||||
- 爆管侦测基线不足、压力下降、出厂流量变化、设备角色错误、指标方向冲突和多指标同时命中;单指标、部分资料不足及疑似爆管均复用 `scada_anomaly` 调查入口,正常且无异常信号时不建单。
|
||||
- 回放 MCP 侦测与定位只能读取固定批次和知识截止前数据;定位缺少漏量依据时停止在待补充,不调用算法。
|
||||
- 选定小时区间、跨日区间和再次演示;刻度与进度只对应选定区间,基线初始化不释放旧事件,到终点不自动播放整月。
|
||||
- FM 红线固定、刻度带移动、拖动回看不重复投递、未来位置不泄露读数;桌面与 375px、320px 窄屏下的长日期、键盘、减少动态效果及玻璃回退。
|
||||
@@ -474,3 +551,39 @@ next_cursor 绑定项目、设备、查询区间并固定本轮分页时间上
|
||||
| 仓库 | Server、供水前端、Agent 的 git diff --check 通过;未提交、推送或部署 |
|
||||
|
||||
生产联调仍需核验真实 HTTP 接口、调查执行链路和 Agent 报告,并单独准备完整月度数据及事件真值。不能将以上局部测试解释为这些环节已经完成。
|
||||
|
||||
### 同一事故的告警与调查去重(2026-11-07)
|
||||
|
||||
同一轮回放首次检出任一有效指标异常时,持久保存 `monitoring_incident`,发送一次 SCADA 异常告警并创建一份 `scada_anomaly` 调查工单,先核验数据再进行爆管诊断。T+15 等后续周期复用事故 ID 和工单,回执 `incident.action=ongoing`;缺数、部分命中或仍处低压时也保持该事故。每个周期的检测结果仍独立保存,原工单的证据截止时间不随每个周期滚动;若单项异常首次升级为疑似爆管,使用既有 `advance_replay_investigation` 推进同一工单的调查代次,为新代次冻结新增证据,仍不重复报警或建单。
|
||||
|
||||
只有连续两个相邻的正常监测周期,且首次命中的压力测点全部有新的有效读数、达到事故开始时冻结基准的恢复范围,才将事故标记为恢复并解除同一条告警。恢复范围使用首次压力基准与该点下降阈值,不能因滚动基线适应低压就解除告警;缺数、过期读数或跳过周期会中断连续恢复确认。确认恢复后再次检出指标异常,才新建事故和调查。流量异常的恢复也需核对其冻结基准,不能仅依赖已适应高流量的滚动基线。
|
||||
|
||||
主动步进中,压力、流量变化与水质上下限规则保留检测事件作为证据,测量指标的异常通知统一由周期诊断发出;数据质量通知继续独立。周期内已恢复的短暂异常仍保存为本周期调查依据,不因结束时读数恢复而丢失。状态、告警、工单及批次在原有处理锁和同一业务事务内保存,失败重试沿用确定的请求标识。旧回放首次升级时可承接上一周期已有工单,不批量合并历史重复工单。主动创建新一轮回放仍属于独立演示,不跨回放合并事故。
|
||||
|
||||
精简演示面板保留时间区间与 FM 时间轴,集中显示最新结论、监测区间、综合分与门槛;指标权重和命中情况按需展开。持续事故明确显示“沿用已有调查工单,本周期未重复报警”,下一周期处理期间保留上一周期结论并标明处理进度。
|
||||
|
||||
|
||||
### 面板规则与实际流程(2026-11-07)
|
||||
|
||||
面板以“SCADA 数据诊断 → 任一指标异常 → 爆管诊断 → 报告”为入口,不以爆管综合分筛掉单指标异常。`/capabilities.monitoring_config` 返回新一轮采用的项目规则;回放快照的 `monitoring_config` 和 `monitoring_calibration` 返回本轮实际冻结的配置及阈值。进行中的回放不套用后来修改的项目配置,旧回放未保存判定策略时按原有 `all_signals` 展示。
|
||||
|
||||
规则区显示实际三项权重、爆管嫌疑门槛、动态阈值学习状态与历史区间。基线就绪后显示实际侦测阈值及压力/出厂流量的逐测点阈值范围;基线不足不展示虚构阈值。加权角色测点采用实际动态阈值,不再套用固定 30% 输入;“采样范围与基础规则”配置区已移除,面板只读展示实际诊断规则。已具备有效流量基线时,即使压力模型基线不足也保留该流量异常,不以组合资料缺口屏蔽单项诊断。`anomaly_signals` 保存三项爆管参考指标之外的有效测点异常,数据不足与单项命中也能创建同一诊断工单。当前阶段仍需单独验收真实 Agent 推理与报告。
|
||||
|
||||
演示新建默认采用 Case3 的北京时间 2026-07-16 07:30–08:30,事件起点为 08:00,即事件前后各 30 分钟。存在其他时段的活动回放时,提供“切换到 Case3”,先停止旧回放再设定该区间,不自动推进或创建调查;后续监测按钮按项目周期推进。停止或完成的旧回放不再覆盖新建演示默认区间,也不将旧结果显示为 Case3 的结论。
|
||||
|
||||
### 自动播放与简短通知(2026-11-07)
|
||||
|
||||
调查任务仍按 `replay_context.knowledge_cutoff` 与 `batch_sequence` 截断知识,后续播放不自动扩大当前调查窗口。任务摘要只保留指标与异常数量,逐测点明细通过冻结 SCADA 证据查询。`scada-anomaly` 要求高嫌疑诊断继续候选定位;当前 Case3 的任务摘要和 skill 响应返回 `location_demo` 能力提示。提示可用时 `run_burst_location` 允许省略 `burst_leakage`,仍先核验冻结异常窗、正常窗及压力设备,再调用固定候选方法;水力算法仍要求漏量依据。候选输出不再含 mock 提示,MCP回放证据保留 `origin=synthetic`,不向 Agent 暴露事件真值。
|
||||
|
||||
回放调查开放项目资产属性、空间查询、拓扑隔离和节点覆盖,沿用原有业务权限。它们依据当前模型,不代表历史现场状态。实时 TSDB、在线模拟等未接入冻结输入的路径仍不可用;候选定位不以出厂流量命中或现场确诊为前提。
|
||||
|
||||
点击“自动播放”后,浏览器以 180 倍速推进演示时钟,一小时区间约用 20 秒播放,后端处理耗时另计。到达项目监测周期边界时调用原有 `step` 接口,每次只允许一个监测请求,等待持久回执后再继续。播放时钟与已处理时间分别展示;时间轴的手动浏览仍按 5 分钟定位,手动拨动先暂停自动播放,不直接触发处理。暂停、关闭面板、切换页签或页面转到后台后停止自动推进;接口失败暂停,终点自动结束,不自动重试或新建下一轮。此能力属于前台演示,不引入通用后台定时任务或新的 SCADA worker。
|
||||
|
||||
通知只展示异常状态、调查已启动或沿用原调查及时间,通过“查看调查”打开已有调查与报告。指标、评分、基线、定位和处置依据保留在调查摘要与报告中,Server 告警描述不再复制完整任务摘要。首次实际监测检出新的异常时,局部图标以 1.4 秒单次扩散和轻微缩放强调;同一异常下一周期及旧回执刷新不重播,减少动态效果模式保留文字并关闭动画。异常事件的持久去重与冻结证据规则继续有效。
|
||||
|
||||
|
||||
### 指针选定时刻监测
|
||||
|
||||
前端“回到开始时间”只把指针定位到所选区间起点并暂停播放,不清空已处理进度,也不自动调用监测。显式点击“监测选定时刻”才提交 `POST /api/v1/scada-replays/{replay_id}/commands`,动作 `monitor`,携带带时区的 `at_time`、`request_id` 和 `expected_revision`。服务端复用逐帧读取、清洗、检测、历史基线和调查流程,知识截止与最终处理时间精确停在 `at_time`,不自动推进到下一个监测周期。选定起点也可以监测;同一已完成时刻的重复请求复用已有回执,不重复计次、解除告警或创建调查。
|
||||
|
||||
`at_time` 必须在本轮区间内,不能替换进行中的处理步;直接要求本轮回到已经处理过的更早时刻返回 409。前端在该场景下提前说明将建立新一轮,停止旧轮后使用原区间配置新建回放,再处理至选定时刻;原回放、告警和调查保留,历史判断不携带旧轮的后续状态。`step` 继续按冻结的项目周期从本轮起点对齐,选定 08:05 后下一步为 08:15,而不是 08:20。此变更新增命令字段,不需要数据库迁移;需同步更新 Server、前端 API 客户端与 OpenAPI 契约。
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
# tjwater_v2 爆管 Agent Benchmark
|
||||
|
||||
状态:场景框架与只读数据预检已准备;隔离执行环境、真实触发链、Agent 轨迹采集和正式评分器尚未实现。2026-11-03。
|
||||
|
||||
## 目标与边界
|
||||
|
||||
本套 benchmark 用固定的管网状态、触发条件和隐藏真值,比较提示词、Skill、MCP 工具或模型配置变更对爆管处置的影响。首版限于 `tjwater_v2` 爆管,不扩展水体污染。已有数据库是数据来源;每次正式执行必须在独立评测数据库和运行时完成,原项目数据库不承担工单、SCADA 清洗、告警、任务、计算或证据写入。
|
||||
|
||||
```text
|
||||
原 MetaDB / BizDB / TimescaleDB
|
||||
| 仅 SELECT、只读事务
|
||||
v
|
||||
版本化私有数据快照 -> 隔离评测 BizDB + TimescaleDB -> Server/MCP/worker -> Agent Host
|
||||
| |
|
||||
+----轨迹与业务结果----+
|
||||
|
|
||||
评分报告 + 版本归档
|
||||
```
|
||||
|
||||
评测 Agent 只能连接隔离环境。单靠客户端 `READ ONLY` 事务不足以保证未来服务不误连原库;运行配置必须使用隔离数据库路由,并由原库侧评测账号权限拒绝写入。现有 `temporary_project_database`/模型模板复制路径不能直接用于原项目,因为它会暂时关闭连接并终止源库会话。应在独立实例先生成逻辑快照,再把可写副本作为评测环境。
|
||||
|
||||
## 场景矩阵
|
||||
|
||||
配置文件 `resources/benchmarks/tjwater-v2-burst.json` 定义四个候选物理工况:
|
||||
|
||||
| 场景 | 管段 | 管径 | 发生时间(北京时间) | 当前观测准备状态 |
|
||||
|---|---:|---:|---|---|
|
||||
| B01 | 540672 | DN315 | 2026-10-08 02:00 | 需在隔离集生成事件观测 |
|
||||
| B02 | 540672 | DN315 | 2026-10-08 12:00 | 历史回放声明待核对当前窗口 |
|
||||
| B03 | 537407 | DN600 | 2026-10-08 02:00 | 需在隔离集生成事件观测 |
|
||||
| B04 | 537407 | DN600 | 2026-10-08 12:00 | 需在隔离集生成事件观测 |
|
||||
|
||||
每个工况各有工单上报(WO)和 SCADA 监测(SCADA)入口,共 8 个候选用例。另设无爆管正常控制作为误报检查,不算第三类业务。管段、时间和历史分析名称仅是候选定义;准备报告须检查观测窗口、参考工况和触发是否吻合。未满足条件的用例标为 `not_ready`,不能作为 Agent 失败,也不能从统计中静默删除。
|
||||
|
||||
工单路径使用 `burst_report` 来源,经既有外围工单同步、操作任务 worker、Agent Host 和 MCP 完成调查。SCADA 路径从隔离副本的正常数据起步,再释放事件数据,由真实 replay worker/规则创建通用异常调查;不能把目标管段或爆管类型预先告诉检测器。纯规则预览只作准备检查,不能代替这条端到端路径。
|
||||
|
||||
工单位置由冻结的网络 GIS 几何转成稳定的人类可读位置,结合近似范围和现象描述,不把真实 link ID 直接写成答案。Agent/Server 业务结果是首版主分数;前端呈现单独做 Playwright 结果回放检查,不能用工作台 mock 结果代替 Agent 评测,也不混入业务能力分。
|
||||
|
||||
首版使用单一持续爆管,不模拟修复恢复;预计结束状态是有证据的调查报告,可以合理等待人工确认或审批。现有模型只含 2 个阀门,目标管段即使移除全部模型阀门仍与水源连通,因此成功关闭隔离不作为成功标准。Agent 应说明拓扑限制和现场核查需求,不得编造阀门方案。
|
||||
|
||||
## 真值、可见信息与评分
|
||||
|
||||
真值包在运行前冻结并与 Agent 输入分开保存,至少包含:管段及端点、泄漏参数和单位、观测窗口、传感器映射、独立拓扑参考、允许的等价候选集合、定位是否具备有效流量输入。工单只给近似位置、时间和现象;SCADA 检测器只能看到已释放观测及设备元数据。隐藏真值不得进入 Skill、提示词、任务说明、MCP 上下文、可读工作区、文件名或执行轨迹。
|
||||
|
||||
由于当前仿真将 emitter 放在管段端点,邻近管段可能不可区分。定位适用的用例按冻结的等价候选集合和排名评估(Hit@1/3/10),不强求唯一 ID。爆管定位需要有效的 `burst_leakage`(m³/s);孔口面积(cm²)不能直接代替流量。缺少输入时,评分应奖励明确说明限制和所需数据,不鼓励猜测。
|
||||
|
||||
总分 100,结果与过程分开报告:
|
||||
|
||||
| 维度 | 权重 | 评分依据 |
|
||||
|---|---:|---|
|
||||
| 业务结果 | 60 | 触发来源与结论置信度 10;证据、时间窗、单位和数据质量 15;定位 Hit@1/3/10 或正确 abstain 15;影响与不可隔离判断 10;报告和人工后续建议 10 |
|
||||
| 工具执行 | 20 | 场景清单定义的唯一必需操作有效完成率 12;有效参数、时间/单位范围及结果证据引用 8;同一操作重复调用不增加分数 |
|
||||
| 计划推进 | 15 | 依赖顺序与证据覆盖 6;根据新证据调整计划 5;报告终态、待人工确认和停止条件 4;不评分模型私有思维链或固定调用顺序 |
|
||||
| 效率 | 5 | 仅在业务结果至少 45/60 且无关键错误陈述时计分;以已接受基线的 Token、Agent wall time、有效调用数中位数对比,三项等权,单项最高 1.67 分 |
|
||||
|
||||
定位分在“输入足以定位”的真值用例中按 Hit@1=15、Hit@3=12、Hit@10=8、未命中=0;输入不足的用例不要求猜管段,明确限制和所需数据得 15,猜测得 0。工具有效完成率按每个场景冻结的唯一必需操作计分;单个操作重复尝试只取首次有效终态,额外调用不扩大分母或分子。
|
||||
|
||||
结构化事实、调用结果、时间/单位、候选排名、计划依赖、任务终态由确定性 scorer 判定。报告措辞与计划是否有证据支撑由同一固定版本盲评器独立评分两次,输出结构化子分和引用依据;每次保留评审器模型、提示词版本与原始评分。黄金样例由爆管业务负责人标注。双评差异超过任一子项 2 分、评审器无证据引用或关键结论不确定时转人工复核,复核值和原因进入报告。效率基线建立后,单项得分为 `1.67 × min(1, 基线中位值 / 当前值)`,三项合计最高 5 分;效率基线建立前,该项标为 `unscored`,报告总分上限 95,不伪造完整 100 分。
|
||||
|
||||
报告必须同时给出总分、业务通过率、工具调用成功率、定位 Hit@k、误报/漏报、延迟、分项分数和失败原因。队列 accepted 不算计算成功;MCP `isError`、超时和业务拒绝分开统计。系统错误记为 `infra_error`,保留尝试并有限重试幂等步骤;模型业务失败按实际结果计分。不做 retry-until-pass。
|
||||
|
||||
初始分项数值映射需要用一个人工审阅的黄金样例和重复运行校准后冻结为 scorer 版本;不能在第一次运行后按期望结果回调规则。首轮建议每个就绪用例重复 3 次,并对同版本做 A/A 重跑,估计模型随机波动;小样本只报告原始分布,不声称统计显著。
|
||||
|
||||
## 自动执行与复现
|
||||
|
||||
正式 runner 的单个入口按以下检查点运行:
|
||||
|
||||
1. `prepare`:校验套件、来源版本、传感器/数据窗口、触发可检出性、模型拓扑和真值包完整性;输出明确就绪/阻塞清单。
|
||||
2. `snapshot`:以只读导出生成 BizDB、TimescaleDB 及必要文件的不可变版本包和哈希;所有评测写入只落在该版本的可写副本。
|
||||
3. `trigger`:每例建立唯一 attempt ID,按 WO 或逐步 SCADA 事件路径触发。SCADA 没触发时记录触发失败,不补发 Agent 任务。
|
||||
4. `investigate`:通过真实 Agent Host 和 Server/MCP 执行,脚本化反馈只提供当时可知事实;模型不得读取未来观测或真值。
|
||||
5. `collect`:记录 case/attempt、task/run/execution/session、任务和报告修订、计算 job、MCP receipt、工具调用、计划版本、Token/耗时与终态。续跑先查已有业务 ID,禁止重复建单或重复触发。
|
||||
6. `score/archive`:确定性 scorer 读取隐藏真值和收集轨迹,生成逐例 JSON、汇总报告、HTML/CSV 可选视图及所有代码/配置/数据/scorer 指纹。基线升级由人工明确选择。
|
||||
|
||||
每个 case 串行运行,直到能证明不同可写副本完全隔离后再并发。事件时间使用虚拟时钟;JWT、worker lease、heartbeat 和 HTTP timeout 使用现实时间。Agent 输入的查询统一受 `knowledge_cutoff` 约束。每次运行保留所有尝试和原始错误,不保存密钥、访问令牌或完整 DSN。结果进入 Git 忽略的私有工件目录或受控 CI 存储,不提交业务观测和轨迹。
|
||||
|
||||
每轮实验固定记录:Agent/Server/frontend 代码内容摘要、提示词与 Skill 摘要、模型及参数、MCP 工具 schema/版本、数据快照 ID/哈希、suite/scorer 版本、基线版本、case、重复次数、运行预算和实际服务指纹。只存 Git SHA 不足以标识当前含未提交改动的运行版本。
|
||||
|
||||
## 当前准备状态与执行门槛
|
||||
|
||||
当前已有:四个候选场景清单、严格字段校验、分库只读查询与规则预览函数、独立拓扑参考。只读预检已在 2026-11-03 执行:四个场景均有 83 个完整短窗压力测点,但没有一个触发当前短窗 SCADA 规则;15 天检测窗口也没有满足连续 1440 点的压力节点。B02 的工单路径是唯一有现成数据候选的路径,B02 的 SCADA 路径仍需隔离生成能触发的事件数据。该结果只说明历史窗口/当前规则的匹配情况,不证明实际 worker 或 Agent 行为。刚加入的 `scripts/prepare_burst_benchmark.py` 只生成私有预检 JSON,不会建任务、写 SCADA 修正值、运行 Agent 或声称数据集已冻结。
|
||||
|
||||
完成自动评测前仍需依次补齐并验收:
|
||||
|
||||
1. 已执行只读预检;下一步由评测维护者确认是否保留 B02-WO 为首个可用试跑,并在隔离副本生成 SCADA 触发与 B01/B03/B04 所需观测。
|
||||
2. 爆管业务/水力分析负责人审阅四个用例的数值参考、有效泄漏流量和等价候选;评测维护者据此固定触发规则与控制组期望。
|
||||
3. Server 数据维护者形成带模型/观测版本哈希的快照导出和隔离 BizDB/TimescaleDB 路由;通过受限角色、连接路由检查和数据库审计证明 Agent/worker 无法写回源库。源库其他日常服务可能同时写入,因此验收证明 benchmark 没有源写入,不承诺整库前后字节完全相同。
|
||||
4. Agent 与 Server 维护者实现可恢复 runner 和全链路轨迹导出;先执行一例 WO 与一例 SCADA 的闭环试跑。
|
||||
5. 评测维护者与爆管业务负责人共同冻结 scorer,在首个通过门槛的用例跑 A/A;再扩到 8 例 × 3 次 × 候选版本。
|
||||
|
||||
若源数据在准备期间被日常业务改变,重新读取后产生不同内容指纹,应建立新快照版本,不覆盖旧报告。预检报告只证明来源库读取与候选数据检查完成,不是 Agent 评测结果或上线验收。
|
||||
|
||||
## 命令
|
||||
|
||||
只读检查命令(在 Server 仓库根目录):
|
||||
|
||||
```bash
|
||||
conda run -n server python scripts/prepare_burst_benchmark.py
|
||||
```
|
||||
|
||||
只检查单个场景可追加 `--case B02`。预检报告写入 `data/benchmark/preflight/`,该目录在 `.gitignore` 中。此命令只读源数据库;正式评测 runner 尚未提供。
|
||||
@@ -0,0 +1,185 @@
|
||||
# tjwater2_v2 多距离、弱信号爆管场景
|
||||
|
||||
状态(2026-11-07):完成四区域、三档破口、四时段的 48 组本地水力校准与固定阈值敏感性分析,并从中选出 4 个演示 case。4 个爆管方案已保存,压力、流量和正常水质数据已写入隔离项目与 `tjwater2_v2` 的 IoT 库。动态阈值尚未接入真实监测 worker,正式 benchmark Runner、真实工单和 SCADA Agent 链路、评分及归档仍待实现。
|
||||
|
||||
同日管网 ID 修复后,R1 管段当前 ID 为 `564345`,流量设备 `542121` 的绑定管段当前 ID 为 `570995`。管段属性、几何、拓扑和 SCADA 测量值未变化。隔离 benchmark 的 BizDB、852,960 条正常实时结果,以及清单直接引用的 2,016 条方案管段结果已同步。以下清单统一使用新 ID。
|
||||
|
||||
48 个历史方案保存了全管网结果,其中未被当前 benchmark 清单引用的长管段仍属于迁移前的校准归档,不进入 Agent 输入或当前 scorer。完整历史结果的全量迁移因压缩块重写耗时过长而回滚;如需把旧方案用于全管网地图展示,应重新生成方案或另行离线迁移,不能混用新模型 ID 与旧结果 ID。
|
||||
|
||||
## 当前演示数据集
|
||||
|
||||
演示数据使用隔离项目 `tjw_bench_tjwater2_20261105`,项目 UUID 为 `66ce6b1a-4415-4cd0-b68f-bf1505576c79`。`tjwater2_v2` 与隔离项目的 IoT 库均写入相同数据,便于在完整系统中演示,也便于 benchmark 指定隔离数据源运行。后续自动评测默认使用隔离项目,避免业务操作、清洗结果或回放状态互相影响。
|
||||
|
||||
每个月写入 1 日 00:00 至 18 日 00:00 前的数据,共 17 天、1,632 个 15 分钟时刻。设备包括 83 台压力设备、35 台流量设备和 50 台水质设备,共 168 台。每台设备每月 1,632 点,每月 274,176 行,四个演示窗口合计 1,096,704 行。`cleaned_value` 初始为空,由真实清洗和回放流程产生。
|
||||
|
||||
每个事件前都有精确的 15 天同时间点历史,即 1,440 个时刻。按全部 168 台设备计算,每个 case 的事前基线为 241,920 行。检测算法使用事件时刻之前 15 天的同时间点数据,不要求自然月内其余日期全部正常或完整。
|
||||
|
||||
### 4 个演示 case
|
||||
|
||||
时间均为北京时间(UTC+8)。事件持续 5 小时,包含起止点共 21 帧;事件结束后的下一个 15 分钟时刻恢复正常数据。
|
||||
|
||||
| Case | 事件时间 | 入口 | 管段 | 破口面积 | 等效圆孔直径 |
|
||||
| --- | --- | --- | --- | ---: | ---: |
|
||||
| `B26-severe` | 2026-05-16 08:00 至 13:00 | SCADA 自动发现 | `564345` | 22.089323 cm² | 53.03 mm |
|
||||
| `B28-severe` | 2026-06-16 20:00 至 06-17 01:00 | SCADA 自动发现,跨日 | `564345` | 22.089323 cm² | 53.03 mm |
|
||||
| `B30-severe` | 2026-07-16 08:00 至 13:00 | 工单在事件发生 60 分钟后上报 | `541725` | 353.429174 cm² | 212.13 mm |
|
||||
| `B35-severe` | 2026-08-16 12:00 至 17:00 | 工单在事件发生 120 分钟后上报 | `538540` | 245.436926 cm² | 176.78 mm |
|
||||
|
||||
四个 case 均使用管道截面积的 1/8,比例不是管径的 1/8。B26 和 B28 复用同一物理位置,用来比较早间与晚间跨日条件。B30、B35 使用更大口径和更远压力测点,用来覆盖区域、信号强度和工单发现延迟的差异。
|
||||
|
||||
| Case | 破口坐标 WGS84 | 管径 / 长度 | 最近压力设备 / 沿网距离 |
|
||||
| --- | --- | --- | --- |
|
||||
| B26 / B28 | 121.471119, 31.005631 | DN150 / 249.176 m | `92724` / 约 0.205 m |
|
||||
| B30 | 121.569785, 30.956880 | DN600 / 495.368 m | `170486` / 约 1.19 km |
|
||||
| B35 | 121.487510, 30.823888 | DN500 / 121.485 m | `102837` / 约 2.67 km |
|
||||
|
||||
### 泄漏真值与 SCADA 流量响应
|
||||
|
||||
破口泄漏量来自水力模拟,是隐藏评测真值,不能直接进入 Agent 的提示词、任务上下文或可见工具结果。SCADA 流量是 Agent 可见证据,单位为 m³/h,已完成 L/s 到 m³/h 的换算并加入确定性仪表噪声。
|
||||
|
||||
| Case | 泄漏量 L/s | 泄漏量 m³/h | 代表性 SCADA 流量变化 |
|
||||
| --- | ---: | ---: | --- |
|
||||
| B26 | 21.60 至 23.49 | 77.76 至 84.58 | `449417` +37.32 m³/h;`516234` +15.63 m³/h |
|
||||
| B28 | 21.99 至 25.81 | 79.15 至 92.90 | `449417` +49.42 m³/h;`542121` +102.68 m³/h |
|
||||
| B30 | 424.15 至 446.33 | 1,526.95 至 1,606.79 | `524529` +296.26 m³/h;`541061` +241.34 m³/h |
|
||||
| B35 | 236.97 至 261.11 | 853.08 至 940.01 | `508453` +926.08 m³/h;`527865` +46.96 m³/h |
|
||||
|
||||
三个主要水厂计量设备的 5 小时最大变化如下。百分比按同时间正常值计算;小流量管段的基线接近 0 时,百分比会失真,评分必须同时看绝对变化量和流向。
|
||||
|
||||
| Case | `542017` | `486033` | `542121` |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| B26 | +50.11 m³/h,1.23% | -82.44 m³/h,1.27% | +32.15 m³/h,3.47% |
|
||||
| B28 | -81.51 m³/h,3.37% | +129.10 m³/h,3.65% | +102.68 m³/h,19.10% |
|
||||
| B30 | +713.91 m³/h,19.13% | +293.30 m³/h,4.75% | +258.24 m³/h,27.95% |
|
||||
| B35 | +212.19 m³/h,5.43% | +491.69 m³/h,8.01% | +102.87 m³/h,11.64% |
|
||||
|
||||
### 正常水质数据
|
||||
|
||||
50 台水质设备使用 EPANET 化学水质模拟生成正常余氯数据,没有用固定常数补值。13 个水库和 15 个正常入流水源设置为 0.50 mg/L,全网初始余氯为 0.35 mg/L,体相衰减为 -0.05/天,管壁衰减为 -0.02/天。模型预热 6 天后取第 7 天的正常日曲线,按 15 分钟间隔重复到各 case 窗口。
|
||||
|
||||
仪表噪声使用固定种子,标准差为读数的 0.5%,最低标准差为 0.001 mg/L,并截断在正负 3 倍标准差内。最终数据约为 0.071 至 0.507 mg/L,没有零值、负值或求解警告。当前四个爆管 case 内的水质保持正常,只用于保证设备读数完整,不作为爆管响应或判分指标。
|
||||
|
||||
## 管段与监测距离
|
||||
|
||||
保留一个近测点强信号对照,其余改用中远距离候选。距离取爆管节点到全部压力设备中的最近沿网距离,不是到任意挑选的某个测点的距离。按管道模型长度累计,阀门连接按近零长度处理,表中取近似值。
|
||||
|
||||
| 组别 | 管段 ID | 管径 / 长度 | 最近压力设备 / 沿网距离 | 破口经纬度 WGS84 | 边界阀 / 分区节点 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| R1 近点对照 | `564345` | DN150 / 249.176 m | `92724` / 约 0.205 m | 121.471119, 31.005631 | 5 / 11 |
|
||||
| R2 中距干管 | `541725` | DN600 / 495.368 m | `170486` / 约 1.19 km | 121.569785, 30.956880 | 4 / 64 |
|
||||
| R3 远距多点响应 | `538540` | DN500 / 121.485 m | `102837` / 约 2.67 km | 121.487510, 30.823888 | 2 / 10 |
|
||||
| R4 远距弱信号 | `541116` | DN200 / 228.424 m | `406444` / 约 2.91 km | 121.441641, 30.982725 | 4 / 9 |
|
||||
|
||||
四处均经过后端隔离算法和水源连通校验,关闭所列边界阀后可在模型拓扑上切断水源。分区节点数不等于用户数、实际停水范围或现场阀门可操作性。
|
||||
|
||||
上轮贴近测点的 DN110、DN315、DN500 候选及其结果仍保留,不能因本轮换管段而重用其 case ID。
|
||||
|
||||
## 破口面积与发生时间
|
||||
|
||||
比例均指管道截面积,不是管径;不再只选一个最容易触发的面积。
|
||||
|
||||
| 管段 | 1/32 面积 cm² | 1/16 面积 cm² | 1/8 面积 cm² |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| R1 DN150 | 5.522331 | 11.044662 | 22.089323 |
|
||||
| R2 DN600 | 88.357293 | 176.714587 | 353.429174 |
|
||||
| R3 DN500 | 61.359232 | 122.718463 | 245.436926 |
|
||||
| R4 DN200 | 9.817477 | 19.634954 | 39.269908 |
|
||||
|
||||
发生时间统一为北京时间 2026-10-08 的 02:00、08:00、12:00、20:00,分别覆盖夜间、早间、日间、晚间。每个事件持续泄漏 5 小时,15 分钟一步,共 21 帧;20:00 场景结束于次日 01:00。3/4 小时视图按前缀截取。
|
||||
|
||||
R1 至 R4 分别对应 B25 至 B28、B29 至 B32、B33 至 B36、B37 至 B40;三档面积作为 case 的独立维度,例如 `B29-medium`。共 4×3×4=48 个物理场景,后续再派生 SCADA 与 WO-30/60/120/180 等入口 case,不能把这些派生用例当成不同物理事件。
|
||||
|
||||
所有场景有相同起始时间、模型状态、需求模式和 PDA 参数的无爆管对照。三个主要水厂出口设备 `542017`、`486033`、`542121` 均保留;压力单位 m,流量结果 L/s 映射 SCADA 时转为 m³/h。
|
||||
|
||||
## 观测结果与动态阈值
|
||||
|
||||
各场景在 5 小时内的最大监测压降,以下取四个发生时段的范围。这是相同时间正常/事故模拟的差异,不是运行告警直接可用的未来对照。
|
||||
|
||||
| 管段 | 1/32 | 1/16 | 1/8 |
|
||||
| --- | ---: | ---: | ---: |
|
||||
| R1 | 11.58% 至 12.69% | 26.37% 至 28.08% | 52.84% 至 54.65% |
|
||||
| R2 | 4.48% 至 5.57% | 9.92% 至 11.90% | 22.05% 至 25.14% |
|
||||
| R3 | 3.95% 至 6.24% | 7.91% 至 12.21% | 14.65% 至 21.58% |
|
||||
| R4 | 0.10% 至 0.13% | 0.19% 至 0.26% | 0.37% 至 0.50% |
|
||||
|
||||
48 组均完成求解,未出现求解警告、指定监测点负压或结果缺失。R2 至 R4 因未达到旧 30% 门槛而被标为 `weak_signal_candidate`,仍然是有效爆管正例;不当成无爆管样本,也不为让所有 case 通过而增大破口。
|
||||
|
||||
固定阈值复用实际清洗/回放相对变化规则,使用四帧预热和连续两帧,未加入绝对压降门槛。16 个正常对照按“管段×时间”去重:
|
||||
|
||||
| 固定压降阈值 | 触发的爆管场景 / 48 | 误报的正常对照 / 16 |
|
||||
| --- | ---: | ---: |
|
||||
| 3% | 47 | 13 |
|
||||
| 5% | 41 | 8 |
|
||||
| 10% | 25 | 3 |
|
||||
| 20% | 11 | 0 |
|
||||
| 30% | 4 | 0 |
|
||||
|
||||
这里的“触发”只是规则预览,不是 Agent 识别成功;极低阈值下的高触发率不能忽略正常误报。
|
||||
|
||||
动态规则采用独立版本,初始实验方案如下:
|
||||
|
||||
1. 每个测点仅用事件前 15 天完整正常数据拟合,15 分钟间隔要求 1440 点;有缺点时报告历史未就绪。
|
||||
2. 按日内时段建立正常压力中位数参考,避免将正常早晚变化当成事故;用去除日内模式后的 `1.4826×MAD` 表示相对波动。
|
||||
3. 测点相对阈值取 `max(3%, 3×相对波动)`,与绝对压降至少 0.5 m、连续两帧同时成立。3%、0.5 m 是首轮实验参数,需结合测点精度和正常误报结果校准。
|
||||
4. 在事件前冻结参考、阈值和规则版本;拟合函数拒绝事件时刻及之后的观测。评估遇到采样中断会重置连续计数。
|
||||
5. 压力异常后仍需流量或独立压力证据交叉验证。实验函数目前只覆盖压力层,未接入生产监测 worker。
|
||||
|
||||
本次水力包只有四帧事件前预热,因此尚不能给出真实项目动态规则的检测率。当前新增的学习与评估函数仅通过合成正常历史验证;不能把上表固定阈值结果说成动态规则已验收。
|
||||
|
||||
## 复现与数据边界
|
||||
|
||||
清单:[tjwater2-v2-burst-balanced.json](../resources/benchmarks/tjwater2-v2-burst-balanced.json)。原有强信号清单保持不变。
|
||||
|
||||
```bash
|
||||
conda run -n server python scripts/check_burst_simulation_design.py \
|
||||
--design resources/benchmarks/tjwater2-v2-burst-balanced.json
|
||||
|
||||
conda run -n server python scripts/calibrate_burst_benchmark.py \
|
||||
--design resources/benchmarks/tjwater2-v2-burst-balanced.json --all-severities
|
||||
|
||||
conda run -n server python -m pytest \
|
||||
tests/unit/test_burst_benchmark_calibration.py \
|
||||
tests/unit/test_regional_burst_selection.py \
|
||||
tests/unit/test_burst_pressure_thresholds.py -q
|
||||
```
|
||||
|
||||
`scripts/analyze_burst_thresholds.py --calibration-dir <某次校准目录>` 复用已冻结结果做阈值敏感性分析,无需重跑水力。`scripts/prepare_regional_burst_design.py` 输出的 GeoJSON 包含管段、实际破口点和边界阀,位于被忽略的本地数据目录。
|
||||
|
||||
源管网模型在准备阶段保持只读。当前已建立隔离 BizDB、IoT 库和模型模板,并通过正常模拟与保存的爆管方案按设备绑定生成最终 `scada.measurements`。为支持完整系统演示,同一份 SCADA 数据也写入 `tjwater2_v2` 的 IoT 库。动态拟合和 Agent 评测只能读取各自知识截止时刻以前的数据;模拟真值及方案信息不进入 Agent 可见上下文。
|
||||
|
||||
## 正式生成优先本地后端方法
|
||||
|
||||
本地执行优先复用 `app.services.simulation_scenarios.burst_analysis()`。MCP 的 `run_burst_simulation` 适配器和 `save_simulation_scenario` 保存入口也调用这个函数,分别设置 `persist_results=False` 和 `True`。固定模型、SCADA 边界输入、时间、破口与单位后,两条入口共用水力计算实现;MCP 额外承担权限、上下文、任务和审计等流程。
|
||||
|
||||
此前直接修改 INP 的结果只用于选管校准。正式 4 个演示 case 已在隔离路由下保存方案,保留正式 `run_id`、模型和结果摘要,再按设备绑定写入 SCADA。Agent 评测仍需使用真实工具链,数据生成成功不能替代 MCP 工具成功率、计划过程和最终业务效果评分。
|
||||
|
||||
## 方案结果到 SCADA 的映射
|
||||
|
||||
先分配日期窗口,再按该时间运行正常模拟和爆管方案;默认沿用计算结果的真实时间戳写入 SCADA,不在写入时悄悄平移日期。
|
||||
|
||||
| SCADA 设备类型 | 绑定字段 | 正常数据源 | 事故数据源 | 写入值 |
|
||||
| --- | --- | --- | --- | --- |
|
||||
| 压力 | `asset.scada_devices.node_id` | `realtime.node_results.pressure` | 指定 `run_id` 的 `analysis.node_results.pressure` | 单位核验后写 m |
|
||||
| 管道流量 | `asset.scada_devices.link_id` | `realtime.link_results.flow` | 指定 `run_id` 的 `analysis.link_results.flow` | 本模型 L/s × 3.6,写 m³/h |
|
||||
|
||||
最终键使用 SCADA 的 `device_id`,不能使用模型节点 ID 代替;写入 `scada.measurements.monitored_value`,`cleaned_value` 初始为空,由真实清洗流程计算。压力和管道流量来自正常与爆管水力计算,水质来自独立的正常化学水质模拟。设备列表、绑定、单位和排除原因在生成前冻结,不为了补齐数据自动移动或改绑设备。
|
||||
|
||||
`analysis` 的 `run_id` 能区分多个方案,SCADA 的主键只有 `(time, device_id)`,不能区分同一设备同一时刻的多个场景。因此,同管段的不同破口面积也必须分配独立日期,不能只给不同管段分日期。
|
||||
|
||||
每个物理 case 的保留窗口覆盖事前 15 天正常历史、5 小时事故、末点采样和恢复缓冲。当前 4 个演示 case 分配在 2026 年 5 月至 8 月,每月一个 case,基线不会混入其他事故。
|
||||
|
||||
当前日期映射已冻结在 `resources/benchmarks/tjwater2-v2-burst-demo.json`。B26、B28、B30、B35 分别使用 2026 年 5 月、6 月、7 月、8 月窗口。工单时间、发现检查点和知识截止随日期统一生成。更换提示词、工具或 MCP 版本时复用同一冻结数据,不重新分配日期或重新生成噪声。
|
||||
|
||||
5 小时事故结果包含起止点,共 21 帧;当前正常在线模拟为右端不含,直接运行 5 小时仅有 20 帧。若保留事故末点,正常对照须额外生成该时刻,不能将缺失的正常值补零或与上一时刻配对。SCADA 记录使用带时区时间,按北京时间规划、按 UTC 存储和比较;回放查询的右端不含时,查询终点需覆盖最后一帧。
|
||||
|
||||
写入前检查整个保留窗口和 `(time, device_id)` 冲突;发现已有记录时停止并重新分配日期,不使用覆盖式 upsert 或 `ON CONFLICT DO NOTHING` 隐藏碰撞。写入采用事务和生成器之间的排他锁,唯一约束兜底。重复执行依据数据集清单和内容摘要验证幂等,不重复插入。
|
||||
|
||||
提交后已使用新连接按设备、日期、行数、单位和数值摘要读回校验。生成状态保存在 Git 忽略目录 `data/benchmark-generation/tjwater2-20261105/`,包括 `demo-scada-state.json` 和 `normal-quality-state.json`。这些文件记录 `case_key`、方案 `run_id`、实际日期、单位、行数与指纹,属于本地生成证据,不提交 Git,也不向 Agent 暴露方案真值。
|
||||
|
||||
## Benchmark 执行边界
|
||||
|
||||
当前数据集已经满足 4 个演示 case 的数据输入要求,但还不能据此声称 Agent benchmark 已完成。后续自动化执行需要按 case 恢复初始业务状态,设置知识截止和入口触发时间,运行真实工单或 SCADA 发现链路,记录计划、工具调用、MCP 调用、任务结果和展示结果,再统一评分和归档。
|
||||
|
||||
建议将评分拆成四部分:事件识别与时间得分、定位与影响分析效果得分、工具调用成功率与参数正确性得分、计划和证据链完整性得分。泄漏量、真实管段、方案 `run_id` 和无噪声模拟结果只供 scorer 使用。Agent 可见输入限于当时可查询的 SCADA、工单和正常业务配置。
|
||||
|
||||
当前仍有两个运行配置缺口:`tjwater2_v2` 只设置了 `scada_monitoring_interval_seconds=900`,尚未配置 `scada_monitoring.pressure_device_ids` 和 `outlet_flow_device_ids`,联合爆管监测会报告角色未配置;新的 4 个 case 尚未执行完整 SCADA 回放和真实 Agent 端到端验收。
|
||||
@@ -1,10 +1,14 @@
|
||||
# tjwater2_v2 爆管模拟校准设计
|
||||
|
||||
状态:参数与只读校验已准备,尚未运行水力模拟。目标项目为 `tjwater2_v2`(演示项目2(新版)),不是 `tjwater_v2`。
|
||||
状态(2026-11-07):本文记录早期强信号管段的校准过程。后续已完成多距离管段校准、4 个演示方案保存,以及压力、流量和正常水质 SCADA 数据生成。正式 Agent benchmark Runner、评分和端到端验收尚未执行。目标项目为 `tjwater2_v2`(演示项目 2(新版))。
|
||||
|
||||
当前可执行数据集、4 个演示 case、流量响应、水质数据和 benchmark 边界见[多距离、弱信号与动态阈值设计](tjwater2-v2-burst-balanced-design.md)。本文保留为较早的强信号校准记录,30% 不再作为全部有效爆管用例的统一淘汰条件。
|
||||
|
||||
2026-11-07 管网 ID 修复后,本文主候选的当前管段 ID 为 `564345`,流量设备 `542121` 的当前绑定管段 ID 为 `570995`。物理管段、模型参数和校准数值未变化,清单及下文引用均使用新 ID。
|
||||
|
||||
## 目标
|
||||
|
||||
先用现有管网、阀门和监测点选择可观测的事故管段,再在隔离评测数据库中校准破口面积。首版使用管道截面积的 1/32、1/16、1/8;1/8 是上限。若 1/8 仍不能形成明确降压信号,该管段退出 SCADA 爆管用例,不继续扩大破口。
|
||||
先用现有管网、阀门和监测点选择可观测的事故管段,通过只读导出的 INP 文件校准破口面积,再在隔离评测数据库保存正式方案。首版使用管道截面积的 1/32、1/16、1/8;1/8 是上限。比例指面积,等效圆孔直径分别为管径的约 17.68%、25%、35.36%。若 1/8 仍不能形成明确降压信号,该管段退出 SCADA 爆管用例,不继续扩大破口。
|
||||
|
||||
模拟调用链为:
|
||||
|
||||
@@ -16,6 +20,8 @@
|
||||
|
||||
当前 `temporary_project_database` 会从项目模型模板创建临时数据库,同时短暂禁止模板连接并终止模板会话。因此即使 `run_burst_simulation` 不保存结果,也不能直接针对原项目执行。正式运行必须把只读逻辑快照恢复到独立评测数据库及其模板,Server、worker 和 Agent 全部使用评测路由。
|
||||
|
||||
当前校准入口使用 `REPEATABLE READ, READ ONLY` 导出源模型,再修改本地 INP 中的参数,调用仓库自带原生 EPANET;不调用数据库克隆接口,不写原项目或模板,不使用旧 `realtime` 结果代替重算。正常与事故对照均采用 PDA、`REQUIRED PRESSURE=10 m`,避免把 DDA/PDA 的差异算成爆管效果,并保留源配置的 `HEADERROR`、`FLOWCHANGE`、最低压力和压力指数。已确认当前模型无水池、水泵、控制与规则;若后续新增,入口会停止,待补齐状态继承实现。
|
||||
|
||||
## 方法参数
|
||||
|
||||
`run_burst_simulation` 接收带时区的 `start_time`、60 至 86400 秒的 `duration`、1 至 20 个输出节点、至多 20 条输出管段、1 至 20 条爆管管段,以及与管段一一对应的正数孔口面积 `orifice_areas_cm2`。本次每个调用只模拟一条爆管管段,等待预算使用 240 秒;排队成功只表示已接受,仍需查询计算任务和最终结果。
|
||||
@@ -28,27 +34,31 @@
|
||||
coefficient[L/s/sqrt(m)] = 0.65 * area[cm²] / 10000 * sqrt(19.6) * 1000
|
||||
```
|
||||
|
||||
正式运行后,定位使用的泄漏量按事故节点相对正常对照的 demand 增量计算,并从 L/s 除以 1000 转成 m³/s。流量监测设备单位为 m³/h,模型流量结果为 L/s,映射 SCADA 时乘以 3.6。
|
||||
模拟真值的泄漏量按 `coefficient * sqrt(max(事故节点压力, 0))` 计算,并从 L/s 除以 1000 转成 m³/s。PDA 下节点实际需水量会随压力改变,事故与正常的 demand 差值不能直接当成精确泄漏量。该模拟真值留在隐藏评测包,Agent 定位仍需从其可见证据获得泄漏量。流量监测设备单位为 m³/h,模型流量结果为 L/s,映射 SCADA 时乘以 3.6。
|
||||
|
||||
## 管段与场景
|
||||
|
||||
主场景管段 `541720` 为 DN800、长 483.038 m,破口节点 `502046`。附近两个压力点沿管网约 1.2 km,最近流量点约 1.2 km;两座边界阀可隔离 11 个节点。其破口面积为 157.079633、314.159265、628.318531 cm²。
|
||||
原 B01/B02 管段 `541720`、B03/B04 管段 `520323` 在恢复水源支路后进行了 1 小时最大面积校准,监测点最大降压分别仅约 2.03%、2.87%,不满足门槛,已退出当前候选。失败结果及当时的完整清单保存在本地报告,不能复用旧 case ID 表示其他管段。
|
||||
|
||||
清单同时保存 SCADA 设备 ID 与其实际水力模型对象 ID,不能假定两者相同。例如压力设备 `447382`、`444985` 分别绑定节点 `7543252226207002012`、`14141146287589625673`,流量设备 `542121` 绑定管段 `pipe-eaa5c512bd8f4649b37bdbe3d`。模拟输出使用模型对象 ID,得分与数据映射使用设备 ID。
|
||||
重新从压力点沿网距 400 m 内、DN150 至 DN800、长度至少 50 m 的管段中筛查,按 `length / diameter²` 作为试算排序启发式,优先覆盖不同测点;它不代表水力计算结论。首批试算 24 条,筛出两条进入昼夜完整校准。
|
||||
|
||||
启动校验还要求所选压力设备到绑定节点、流量设备到绑定管段的本地坐标距离均不超过 1 m。全量复核中待人工确认的 `542017`、`547063` 和 `DEMO-WQ-551571` 不进入本套爆管 benchmark;不得为通过校验而自动吸附设备坐标或猜测改绑对象。
|
||||
当前主候选 `564345` 为 DN150、长 249.176 m,起点 `92686`、破口节点 `7427148338069072993`。该节点距压力点 `92724` 沿网约 0.205 m。关闭全部模型阀门后的所在分区含 11 个节点、5 座边界阀;这只是拓扑参考,尚未验证逐阀关闭的水力影响。三档面积为 5.522331、11.044662、22.089323 cm²。
|
||||
|
||||
次级场景管段 `520323` 为 DN300、长 33.5951 m,破口节点 `91055`。最近压力点沿管网约 262 m,五座边界阀可隔离 19 个节点。其破口面积为 22.089323、44.178647、88.357293 cm²。
|
||||
次候选 `540173` 为 DN200、长 162.128 m,起点 `500819`、破口节点 `517120`,距压力点 `535381` 沿网约 269.125 m。所在分区含 23 个节点、6 座边界阀。三档面积为 9.817477、19.634954、39.269908 cm²。其夜间校准未通过,目前保留为失败对照,不能随主候选一起生成正向 SCADA 用例。
|
||||
|
||||
两条管段分别在北京时间 2026-10-08 02:00 和 12:00 模拟,形成 B01 至 B04 四个物理场景。每个场景都必须有同时间、同持续时长、相同模型状态的无爆管正常对照。严重档先验证是否可观测;通过后依次测试中度和轻度,最终选择满足要求的最小面积。最坏情况下执行 12 次爆管校准模拟,正常对照按项目、时间和模型版本复用。
|
||||
清单同时保存 SCADA 设备 ID 与其实际水力模型对象 ID。例如压力设备 `430299` 绑定节点 `3186958412475415759`;流量设备 `542121` 绑定管段 `570995`。模拟输出使用模型对象 ID,得分与数据映射使用设备 ID。
|
||||
|
||||
`542017` 已依据 `tjwater_v2` 恢复缺失的水源 `551778` 和出口管段,并将 SCADA 绑定恢复到 `542017`;原始空间坐标保持不变。当前 BizDB 与模板均为 92393 个节点、91050 条管道、4489 座阀门、13 个水源。三个主要水厂设备 `542017`、`486033`、`542121` 的实际出口绑定均进入两条候选的输出。待核实的 `547063`、`DEMO-WQ-551571` 不参与本轮判分,重筛也排除 `547063`,不得自动移动设备或猜测改绑对象。
|
||||
|
||||
两条候选分别在北京时间 2026-10-08 02:00 和 12:00 模拟,使用新 case ID B05/B06、B07/B08。每个场景均有同时间、同持续时长、相同模型状态的正常对照。严重档先验证,双时段均通过后再执行中度和轻度,选择双时段都通过的最小面积;严重档有一个时段失败即退出。正常对照按时间与模型版本复用。
|
||||
|
||||
## 通过条件
|
||||
|
||||
一个面积只有同时满足以下条件才可冻结:
|
||||
|
||||
1. 至少一个指定压力点连续两个 15 分钟时刻较正常对照下降 30%。
|
||||
2. 第二压力点下降至少 10%,或指定流量点相对正常对照变化至少 20%。
|
||||
3. 正常对照不触发相同规则。
|
||||
2. 同一连续窗口内,另一独立压力点下降至少 10%,或同一指定流量点变化至少 20%。零流量基线不能提供相对变化佐证。
|
||||
3. 事件前四个 15 分钟正常样本预热后,生产回放清洗/相对变化规则对事故触发、对正常对照不触发。校准预览配置为降压 30%、连续两帧、至少一台压力设备,不等同于完整监测 worker、15 天检测算法或 Agent 已通过。
|
||||
4. 指定监测节点不出现负压,模拟正常收敛,所有请求输出完整。
|
||||
5. 同一管段的夜间和白天场景使用同一面积;两者都通过时才能进入正式 benchmark。
|
||||
|
||||
@@ -65,3 +75,43 @@ conda run -n server python scripts/check_burst_simulation_design.py
|
||||
```
|
||||
|
||||
隔离评测数据库准备完成后,runner 先按清单调用非持久 `run_burst_simulation` 校准。面积冻结后,通过 `save_simulation_scenario` 在评测数据库保存全量节点和管段结果,生成固定的运行 ID 和数据摘要。模型分析结果与模拟 SCADA 保留明确来源,不标记为实测数据。
|
||||
|
||||
## 自动校准入口与本次结果
|
||||
|
||||
```bash
|
||||
# 1 小时面积校准;输出结果和每次试算的 INP、报告、原生输出
|
||||
conda run -n server python scripts/calibrate_burst_benchmark.py
|
||||
|
||||
# 5 小时完整事件窗口,可派生 3/4/5 小时视图
|
||||
conda run -n server python scripts/calibrate_burst_benchmark.py --duration-seconds 18000
|
||||
|
||||
# 对一个已有校准快照筛查其他管段;每条只算白天单时刻,不代表通过
|
||||
conda run -n server python scripts/screen_burst_benchmark_pipes.py \
|
||||
--calibration-dir data/benchmark-calibration/20261104T101304Z-029cc055 --limit 24
|
||||
|
||||
conda run -n server python -m pytest tests/unit/test_burst_benchmark_calibration.py -q
|
||||
```
|
||||
|
||||
生成文件仅保存在 Git 忽略的 `data/benchmark-calibration/` 私有目录,清单、源 INP 与求解器均记录 SHA256,每完成一个 case 原子更新报告。源库访问均只读;本入口不创建 `analysis.runs`,不写 `realtime.*` 或 `scada.measurements`。退出码 0 表示校准流程完成,具体管段是否合格须读取报告的 `selection`,不能把运行完成当成所有 case 通过。当前支持进度留存,尚不支持从中断处自动续跑。
|
||||
|
||||
2026-11-04 的 5 小时结果(21 帧/场景)为:
|
||||
|
||||
| 场景 | 管段 | 面积 cm² | 主要测点压降范围 | 相对变化规则首次触发 | 判定 |
|
||||
| --- | --- | --- | --- | --- | --- |
|
||||
| B05 夜间 | `564345` | 22.089323 | 46.08% 至 54.17% | 02:15(+15 min) | 通过 |
|
||||
| B06 白天 | 同上 | 22.089323 | 49.81% 至 52.84% | 12:15(+15 min) | 通过 |
|
||||
| B07 夜间 | `540173` | 39.269908 | 26.27% 至 33.96% | 未触发 | 失败 |
|
||||
| B08 白天 | `540173` | 39.269908 | 30.83% 至 33.92% | 12:15(+15 min) | 通过,但该管段双时段不合格 |
|
||||
|
||||
主候选的 1/16 与 1/32 面积在昼夜均未通过,最小通过档位为 1/8 截面积(等效圆孔直径约 53.03 mm)。主压力点 `92724` 的事故压力约 12.21 至 17.87 m,隐藏泄漏真值约 22.21 至 26.86 L/s,流量点 `449417`、`516234` 提供同步佐证。全部正常对照未触发,全部求解无警告,指定监测点无负压。
|
||||
|
||||
本地证据目录:
|
||||
|
||||
- 原管段失败报告:`data/benchmark-calibration/20261104T101304Z-029cc055/calibration.json`。
|
||||
- 首批 24 条重筛:该目录下 `screening-df8b9408/screening.json`(明确排除待核实流量点 `547063`)。
|
||||
- 新候选 1 小时校准:`data/benchmark-calibration/20261104T101859Z-83f0c1a2/calibration.json`。
|
||||
- 新候选 5 小时验证:`data/benchmark-calibration/20261104T101949Z-3704704b/calibration.json`。
|
||||
|
||||
本次 5 小时报告的源 INP 摘要为 `dfb20e54356c2c96d36c97d96516361da7fb1201ce37da4ffc39f339aa8e3e0f`,清单摘要为 `bbcdbf7ce502264ffd826a0bb2c7188c619d6a14c42f82cdbb9320c9d254dd92`。当模型、绑定或参数变化时应重新校准并生成新摘要。
|
||||
|
||||
后续多距离设计已从校准结果中选择 B26、B28、B30、B35 四个严重档演示 case,保存到隔离库并按绑定生成 SCADA,同时补齐事件前 15 天历史。中小破口与被淘汰管段仍作为难例或阴性材料,必须另行定义预期,不能沿用正向通过预期。下一步是验证工单和监测真实入口,再执行 Agent 的工具、计划与效果评分。
|
||||
|
||||
Reference in New Issue
Block a user