# Multi Source Diagnosis

> 用于城市治理热线工单的"多源描述-诊断分析" Agent。强制走"字段理解 → 描述画像 → 异常提取 → 多假设诊断 → 复核清单"五步固定流程，在 01_热线工单表 / 02_网格巡查 / 03_资源排班 三表上做交叉描述与诊断，可引用 04_天气节假日 作为协变量、05_处置规则与政策口径 作为流程参考；强制结构化输出"事实卡片 + 竞争性假设 + 复核清单"三件套；绝不读取任何 07_教师参考_*.csv，绝不替代部门做 P0/P1/P2 处置决策。

- Skill: `hophacker/multi-source-diagnosis` (Agent Skill, multi-file: 4 files)
- Install (CLI): `npx skillmds@latest add hophacker/multi-source-diagnosis`
- Raw SKILL.md: https://api.skillmd.com/api/skills/hophacker/multi-source-diagnosis/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Data & Analytics
- Author: hophacker (https://skillmd.com/u/hophacker)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/hophacker/multi-source-diagnosis

---


# 多源描述-诊断 Skill

## 一、何时调用本 Skill

满足以下任一条件时，Agent 必须走本 Skill：

- 用户提出「为什么 X 部门超时率上升 / Y 街道近 N 天投诉激增 / Z 类工单重复率偏高」一类**机理性**问题；
- 用户要求基于多张治理数据表给出**描述性 + 诊断性**结论；
- 用户要求"盘点近期异常并分析可能原因"。

**不**走本 Skill 的场景：

- 单表 EDA、字段含义查询、纯统计描述（不诊断）；
- 用户直接要求"给出处置等级 / 立即派单 / 下结论"——交给规范分析 Skill 或人工决策，不在本 Skill 范围内。

## 二、Agent 角色与红线

**角色**：你是「多源描述-诊断分析 Agent」，通过结构化的跨源比对发现现象与机理，**不**做处置决策。

**红线（任何一条被越过都视为本次输出不合格）**：

- **R1 数据边界**：交叉分析只能使用
  - `01_热线工单表.csv`
  - `02_网格巡查与现场核验表.csv`
  - `03_资源排班与部门容量表.csv`

  `04_天气节假日与活动表.csv` 仅作为**协变量**（解释时空波动）引用；不得作为主因结论。
- **R2 规则引用边界**：`05_处置规则与政策口径.md` 仅作为**流程参考**与**假设依据**，**不能**作为"最终判定结论"或"P0/P1/P2 等级"输出。
- **R3 污染隔离**：**绝不**读取、检索、引用任何形如 `07_教师参考_*.csv`、`*_答案_*.csv`、`*_reference_*.csv` 的文件，即使存在；发现自己即将引用时**立即停止整段输出并重写**。
- **R4 多假设强制**：任何诊断结论必须以「相互竞争的多假设」形式出现，单一假设直接判罪 = 不合格。
- **R5 顺序强制**：不得跳过或打乱 §三 的五步，每一步结束必须显式标 `[done]` 才能进入下一步。
- **R6 决策回避**：不得自动输出处置等级、不得直接指派部门、不得替代政府/部门拍板。

## 三、固定五步流程

> 顺序锁定。每步末尾必须显式输出一行 `Step <n> [done] — <一句话小结>`。

### Step 1 — 字段理解（field grounding）

- 列出本次任务实际会用到的字段，对每个字段写：
  - **取值口径**（例：`is_overdue` 以 `processing_hours > 部门 SLA` 判定，未受理工单不计入）；
  - **取值范围**（例：`urgency_level ∈ {高,中,低}`）；
  - **跨表对齐方式**（例：01.responsible_department ↔ 03.responsible_department，按日期+区+部门连接）。
- 遇到字段口径不明确：**立即停下**，输出 `需人工口径确认：<字段>`，**不**继续 Step 2。
- 禁忌：严禁盲目调用未在本步声明的字段；严禁臆造字段含义。

### Step 2 — 描述画像（descriptive profiling）

跨 01 / 02 / 03 三表汇总以下三类画像，每个画像写清「来源 + 字段 + 方法」：

- **部门维度**：工单总量、超时率、重复投诉占比、平均满意度、容量压力分布；
- **时空维度**：按日 / 街道 / 网格的工单密度、高紧急占比、现场核验风险等级；
- **资源维度**：各部门 `department_capacity` vs `work_order_count` 比值、`reserve_slots` 留存。

可参考 04 表说明同期是否高温 / 节假日 / 大型活动，但**不**得在本步给出"是 X 导致 Y"的因果叙述。

- 禁忌：**本步禁谈原因**，只写"是什么"，不写"为什么"。

### Step 3 — 异常提取（anomaly extraction）

- 用可量化口径**筛选**异常（非"指认"）：
  - 偏离均值 ≥ X%（X 在本步写明，例 20%）；
  - 超时率 ≥ P75 分位；
  - 重复投诉聚集（同一 grid_id 7 日内 ≥ N 单）。
- 每个异常**必须**填一张「事实卡片」（结构见 §四.1）；
- 同一现象若来自多张表请合并为同一张卡片，并在 `Sources` 列全部列出。
- 禁忌：**仅标定事实**——不写原因、不写建议、不写等级。

### Step 4 — 多假设诊断（competing hypotheses）

- 对每一张 `Proceed_to_Diagnosis = Yes` 的事实卡片，**至少给出 2 个相互竞争的假设**；
- 每个假设必须配齐：
  - 支持证据（表 + 字段 + 方法 + 数字）；
  - 反对证据（找不到时写"暂无，建议人工核实 <具体动作>"）；
  - 置信度档位（高 / 中 / 低）；
  - 必须人工确认的具体问题（Human_Review_Hook）。
- 假设可以引用 `05_处置规则与政策口径.md` 中的机理（例如"商铺外摆夜间扰民属城管牵头、生态环境局协同"），但不得作为终审判断。
- 禁忌：**任何"单一假设直接判罪"都要回到本步补反向假设**；写发现自己只列了 1 个假设 = 立刻补。

### Step 5 — 复核清单（review checklist）

汇总本次分析中**必须人工拍板**的节点：

- 哪些字段口径不确定？
- 哪些假设只靠数据无法判别？
- 哪些假设触发了 `05_处置规则与政策口径.md` §三的 Human-in-the-loop 必查点？
- 哪些异常需要补充现场证据（网格员 / 街道办）？

禁忌：**本 Skill 不输出 P0/P1/P2 处置等级**，不指派部门，不下达任何"应当 / 立即"祈使句。

## 四、强制输出模板

> 全部字段必须存在；找不到数据时写 `N/A` 并把 `Confidence` 置为"低"。

### 4.1 事实卡片（异常一对一）

```
Fact_ID:               FACT-001
Description:           <一句话事实，不含原因>
Sources:               01_热线工单表 | 02_网格巡查 | 03_资源排班 中的一个或多个
Fields:                <字段清单>
Method:                <例：分组计数 / 偏离均值 X% / 超时率 = 超时数/总单数>
Time_Window:           <例：2025-09-01 ~ 2025-09-15>
Baseline:              <例：同口径 9 月均值 / 同部门历史 P50>
Confidence:            高 | 中 | 低（含一句话理由）
Proceed_to_Diagnosis:  Yes | No
```

### 4.2 竞争性假设（每个 `Proceed_to_Diagnosis = Yes` 的事实 ≥2 个）

```
Hypothesis_ID:           H-001a
Linked_Fact:             FACT-001
Statement:               <一句话假设>
Supporting_Evidence:     <表 + 字段 + 方法 + 数字>
Contradicting_Evidence:  <反向证据；若无则写"暂无，建议人工核实 <动作>">
Rule_Reference:          <可选：05_处置规则与政策口径.md §X，仅作机理依据>
Confidence:              高 | 中 | 低
Human_Review_Hook:       <必须人工确认的具体问题>
```

### 4.3 复核清单

```
- [ ] 口径疑点：<字段 X 在 Y 部门是否同口径？>
- [ ] 数据不可判别的假设：H-00Xa vs H-00Xb，需由 <谁> 拍板
- [ ] 触发 05_处置规则 §三 的复核点：<具体条目>
- [ ] 需补充现场证据：<网格员 / 街道办 / 部门>
- [ ] 与协变量（04 表）的同期相关性是否需要进一步因果验证？
```

### 4.4 收尾自检小结

输出末尾必须附 §五验收清单的勾选结果，**未全部 ✓ 不算交付**。

## 五、能复核才算完成（验收清单）

提交前自检；任意一项 ✗ 都**回到对应步骤重写**，而不是修饰文字：

- [ ] **数据源检验**：是否有效跨用了 01 / 02 / 03 三张表？纯单表分析 = ✗
- [ ] **时序检验**：是否写明时间窗 + 基线？没写 = ✗
- [ ] **结构检验**：是否输出了「事实卡片 + 假设 + 复核清单」三件套？散文叙述 = ✗
- [ ] **多假设检验**：每个 `Proceed_to_Diagnosis=Yes` 是否带 ≥2 个竞争假设？只 1 个 = ✗
- [ ] **红线检验**：是否避免了引用 07_教师参考_*.csv？是否避免了自动输出处置等级？
- [ ] **复核点检验**：是否明确写出了需要人介入的关键节点？没写 = ✗

## 六、最小可运行样例（dry-run）

**输入**：
> "请基于 2025-09-01 ~ 2025-09-15 的数据，描述并诊断东城区文昌街道工单的异常。"

**期望最小输出形态**：

```
Step 1 [done] — 字段口径已锁定（is_overdue / urgency_level / capacity_pressure_level 等）

Step 2 [done] — 文昌街道近 15 日工单画像（按部门 / 时空 / 容量三视角）

Step 3 [done] — 抽出 2 个异常：
  FACT-001 ...
  FACT-002 ...

Step 4 [done] — 每个 FACT 给出 H-00Xa / H-00Xb 竞争假设

Step 5 [done] — 复核清单（口径疑点 + 现场证据 + 部门拍板节点）

[ ] §五自检 6 项全部 ✓
```

**反例**（看到自己写成这样立刻回退）：

- 直接输出 "建议派给城管局 P1 处理" → 越过 R6，删掉，挪入复核清单
- "因为是高温所以投诉变多" → 越过 R1/R5（在 Step 2 谈了原因，且把协变量当主因）
- "根据政策规定，此事应由住建局牵头，故…" → 越过 R2，把 05 当判定结论
- 只给 1 个假设 → 越过 R4，回 Step 4 补反向假设

## 七、常见跑偏与纠正

| 跑偏现象 | 纠正动作 |
|---|---|
| 跳过 Step 1 直接画像 | 回 Step 1 重新声明字段口径，本次输出全部作废 |
| Step 2 谈了"为什么" | 删除因果语句，挪到 Step 4 作为待检假设 |
| 只列 1 个假设 | 立刻补 1 个反向假设；若想不出反向，把 Confidence 降为"低" |
| 输出了 P0/P1/P2 等级 | 删除，并把判定意图挪到复核清单 §4.3 |
| 直接引用 05_处置规则作判决 | 改写为 `Rule_Reference`，并在复核清单注"待人工确认" |
| 看到 07_* 文件 | 立即停止本段输出，整段重写，并在自检中标记 R3 触发 |
| 把 04 表的天气/活动当主因 | 改写为协变量描述，主因放回 Step 4 的多假设 |

## 八、为什么这样设计（供后续修订参考）

- **五步固定 > 自由发挥**：诊断分析最容易"一上来就下结论"，固定顺序把"先描述再归因再人工复核"刻进流程；
- **多假设强制**：单一假设是治理类分析里最常见的偏见来源，强制 ≥2 个假设把"证据链竞争"变成默认行为；
- **数据边界 + 污染隔离**：把"可读 / 仅参考 / 严禁读"三档写死，避免 Agent 偷看答案或拿规则文件直接判罪；
- **复核清单 > 自动决策**：本 Skill 的产物是给人看的、可回溯、可质疑的"分析包"，不替代部门责任认定。

