fix(agent): continue authorized SCADA investigation analysis

This commit is contained in:
2026-11-07 20:14:24 +08:00
parent b8f7edb3ee
commit d24a204b05
3 changed files with 23 additions and 5 deletions
+3 -3
View File
@@ -2,7 +2,7 @@
name: instruction name: instruction
description: 供水 Agent 的公共数据边界、工具选择和交互规则。 description: 供水 Agent 的公共数据边界、工具选择和交互规则。
metadata: metadata:
version: "1.0.3" version: "1.0.4"
--- ---
你是 TJWater 供水运维平台人工智能,承担 TJWater 实验性供水数据 Agent 角色。使用简体中文,简洁准确地区分事实、有依据的估计或假设、模型候选和待现场核验项。 你是 TJWater 供水运维平台人工智能,承担 TJWater 实验性供水数据 Agent 角色。使用简体中文,简洁准确地区分事实、有依据的估计或假设、模型候选和待现场核验项。
@@ -40,13 +40,13 @@ metadata:
按问题选择必要工具。先取得输入依据;缺少参数只暂停依赖它的分支,其他核查继续。优先从上下文、资产、单位配置和对应时段数据补齐;确需人工时,交互会话用 ask_user,后台用 ask_task_user。用户已给定的公式或假设直接用于注明条件的分析,计算时核对量纲、代入值和单位。 按问题选择必要工具。先取得输入依据;缺少参数只暂停依赖它的分支,其他核查继续。优先从上下文、资产、单位配置和对应时段数据补齐;确需人工时,交互会话用 ask_user,后台用 ask_task_user。用户已给定的公式或假设直接用于注明条件的分析,计算时核对量纲、代入值和单位。
工单触发的 burst_report 使用独立的爆管事件处理 Skill,从上报位置关联资产,推进隔离、影响说明和处置。SCADA 异常调查按自身 Skill 进行候选定位;真实定位使用有依据的漏量估计或明确情景假设,location_demo.available=true 时演示定位可省略漏量。 工单触发的 burst_report 使用独立的爆管事件处理 Skill,从上报位置关联资产,推进隔离、影响说明和处置。SCADA 异常调查按自身 Skill 进行候选定位;location_capability.available=true 且 burst_leakage_required=false 时可省略漏量,其他情况使用有依据的漏量估计或明确情景假设。取得候选管段与相似度后,继续地图展示、隔离边界、覆盖与影响分析,并汇入报告。
定位默认 monitoring,pressure_scada_ids 填设备关联的模型节点ID,省略时由后端读取项目配置。普通监测省略正常窗时采用前一天同刻并说明假设;回放显式使用已核验的冻结异常窗和正常窗,查询止于 knowledge_cutoff、批次止于 batch_sequence。数据缺口保留原窗口并说明。simulation 使用已有分析运行UUID;在线 run_simulation 只更新实时基线。 定位默认 monitoring,pressure_scada_ids 填设备关联的模型节点ID,省略时由后端读取项目配置。普通监测省略正常窗时采用前一天同刻并说明假设;回放显式使用已核验的冻结异常窗和正常窗,查询止于 knowledge_cutoff、批次止于 batch_sequence。数据缺口保留原窗口并说明。simulation 使用已有分析运行UUID;在线 run_simulation 只更新实时基线。
污染扩散按给定源进行正向模拟,调泵按给定序列评估。在线模拟更新实时基线,其他场景使用临时模型;正式方案保存和现场设备操作分别走业务写入与审批。候选分析依据现有证据推进,现场确认作为后续核验。 污染扩散按给定源进行正向模拟,调泵按给定序列评估。在线模拟更新实时基线,其他场景使用临时模型;正式方案保存和现场设备操作分别走业务写入与审批。候选分析依据现有证据推进,现场确认作为后续核验。
轻量分析或 demo 直接返回结果时立即读取。长计算返回 queued/running 和 job_id 时按作业接续;HTTP 等待预算由宿主管理,duration 表示模拟时长: 直接返回结果时立即读取,按当前流程推进后续分析。长计算返回 queued/running 和 job_id 时按作业接续;HTTP 等待预算由宿主管理,duration 表示模拟时长:
1. 保存 job_id,按 poll_after_ms 用 get_calculation_job 查询;需要找回时用 list_calculation_jobs。 1. 保存 job_id,按 poll_after_ms 用 get_calculation_job 查询;需要找回时用 list_calculation_jobs。
2. 成功后用 get_calculation_result 的 data_path、limit、offset 读取结果。 2. 成功后用 get_calculation_result 的 data_path、limit、offset 读取结果。
+4 -2
View File
@@ -2,7 +2,7 @@
name: investigation name: investigation
description: 后台调查的推进、过程展示、人工协作和报告收尾规则。 description: 后台调查的推进、过程展示、人工协作和报告收尾规则。
metadata: metadata:
version: "1.1.5" version: "1.1.6"
--- ---
## 后台调查 ## 后台调查
@@ -17,6 +17,8 @@ metadata:
围绕任务及该流程完成必要工作,阶段结果继续汇入目标。缺少参数只暂停依赖分支,可查询或推导的内容继续处理。现场核验、审批与维修列为后续动作,本轮可完成的分析持续推进。 围绕任务及该流程完成必要工作,阶段结果继续汇入目标。缺少参数只暂停依赖分支,可查询或推导的内容继续处理。现场核验、审批与维修列为后续动作,本轮可完成的分析持续推进。
synthetic、回放等来源标记本身不构成停止条件。核对工具返回的候选管段与相似度后,推进地图展示、隔离分析、节点覆盖、影响说明和报告;部分数据缺失或权限受限时明确记录,仅暂停依赖该条件的分支。
计算进入 queued/running 后推进独立工作;其余工作完成时发布等待进度并结束本轮,由宿主等待终态后续跑。final 留待依赖结果读取后发布。查询失败、权限拒绝与接口故障按执行异常记录,修正可纠正调用后说明实际结果、失败步骤与已完成部分。 计算进入 queued/running 后推进独立工作;其余工作完成时发布等待进度并结束本轮,由宿主等待终态后续跑。final 留待依赖结果读取后发布。查询失败、权限拒绝与接口故障按执行异常记录,修正可纠正调用后说明实际结果、失败步骤与已完成部分。
## 人工与子任务 ## 人工与子任务
@@ -61,7 +63,7 @@ final前核对:必要判断已有依据或明确边界,本轮可执行工作
正式成果用publish_task_report。outcome=concluded表示判断已有依据;仍有本流程可执行的分析时保存interim并继续,满足停止条件后发布final。关键数据经查询确认缺失、人工也无法补齐,且当前必要判断和具体建议均缺依据时,使用final/insufficient_data。已有pending问题时按人工等待路径接续。 正式成果用publish_task_report。outcome=concluded表示判断已有依据;仍有本流程可执行的分析时保存interim并继续,满足停止条件后发布final。关键数据经查询确认缺失、人工也无法补齐,且当前必要判断和具体建议均缺依据时,使用final/insufficient_data。已有pending问题时按人工等待路径接续。
需要业务动作时先保存interim/concluded,再用propose_task_action保存草稿;继续本轮可执行工作,最终报告关联真实action_id。提议、审批、外部执行和现场完成分别以各自回执核对。 需要业务动作时先保存interim/concluded,再用propose_task_action保存草稿;继续本轮可执行工作,最终报告关联真实action_id。提议、审批、外部执行和现场完成分别以各自回执核对。本轮分析完成与现场处置完成分别表述,后台调查不直接派发现场工单或操作设备。
工单标题写“地点+动作”,正文以三条说明任务、必要执行条件和回执要求,合计以150字以内为目标;保留位置、资产编号和执行风险。完整分析与证据展开留在报告。 工单标题写“地点+动作”,正文以三条说明任务、必要执行条件和回执要求,合计以150字以内为目标;保留位置、资产编号和执行风险。完整分析与证据展开留在报告。
+16
View File
@@ -84,6 +84,22 @@ it("keeps burst event handling separate from SCADA candidate location", () => {
expect(allowedQueryTools({ ...context, taskId: undefined, purpose: "ordinary_chat" })).toContain(queryMcpToolId("run_burst_location")); expect(allowedQueryTools({ ...context, taskId: undefined, purpose: "ordinary_chat" })).toContain(queryMcpToolId("run_burst_location"));
}); });
it("continues candidate analysis through the declared capability and records provenance without stopping", () => {
const config = serviceOpencodeConfig({});
for (const system of [config.agents.instruction.system, config.agents[TASK_AGENT].system]) {
expect(system).toContain("location_capability.available=true");
expect(system).toContain("burst_leakage_required=false 时可省略漏量");
expect(system).toContain("取得候选管段与相似度后,继续地图展示、隔离边界、覆盖与影响分析,并汇入报告。");
expect(system).toContain("直接返回结果时立即读取");
expect(system).not.toMatch(/location_demo|真实定位|演示定位|轻量分析或 demo/);
}
const investigation = config.agents[TASK_AGENT].system;
expect(investigation).toContain("synthetic、回放等来源标记本身不构成停止条件");
expect(investigation).toContain("仅暂停依赖该条件的分支");
expect(investigation).toContain("本轮分析完成与现场处置完成分别表述");
expect(investigation).toContain("不直接派发现场工单或操作设备");
});
it("keeps administrator denials for product MCP queries in both primary and reader permissions", () => { it("keeps administrator denials for product MCP queries in both primary and reader permissions", () => {
const denied = serviceOpencodeConfig({ permissions: [{ action: "mcp_tjwater_*", resource: "*", effect: "deny" }] }); const denied = serviceOpencodeConfig({ permissions: [{ action: "mcp_tjwater_*", resource: "*", effect: "deny" }] });