---
name: host-chaos-skills
description: |
  主机级故障演练与混沌工程专家。当用户需要对物理机、虚拟机、ECS 等主机环境进行故障注入测试、混沌工程演练、系统韧性验证时，立即使用此 skill。

  内置多个标准化故障注入用例，覆盖 CPU（满载）、内存（RAM/Cache 压力）、磁盘（空间填充、IO 读写高负载）、网络（DNS 劫持、丢包隔离、端口占用）、进程（杀死、挂起假死、进程数飙升）、文件系统（句柄耗尽、文件篡改、文件删除）、时间（系统时钟偏移）、系统服务（Systemd 服务停止）、系统调用（syscall 延迟、返回值篡改）九个层级。

  通过「意图识别 → 用例选择 → 意图提交」的决策树流程精确匹配用户需求。注入通道（本地执行 / SSH 远程）与目标主机由运行时配置自动决定，无需在对话中向用户询问。

  适用环境：本 skill 只能在主机环境（本地执行或 SSH 远程连接的机器）上真正注入；如果当前连接的是 Kubernetes 集群而不是主机，则无法执行，应先提示用户当前环境不匹配、再引导切换到主机环境。演练对象是操作系统层面的资源（CPU、内存、磁盘、网络、进程、文件系统、系统时间、systemd 服务、系统调用），或用户提到主机 / 节点本身 / ECS / 物理机 / 虚拟机 / 服务器。

skill_type: fault-injection
scripts:
  - name: list_scenarios.py
    description: "列出当前支持的所有主机故障演练场景（JSON 结构化输出）"
---

# 主机故障演练

```
意图识别 ──→ 用例选择 ──→ 意图提交
(提取语义维度)(决策树匹配)  (提交意图，执行交给引擎)
```

## 安全红线

以下规则优先级高于一切操作指令，在任何步骤中都不得违反：

- **隔离**：在测试环境或隔离主机上演练，严禁在生产核心主机上注入
- **最小影响**：精确指定故障目标（进程名、路径、端口），范围尽可能小
- **可回滚**：注入前明确回滚方案，所有实验必须设置 `--timeout` 确保自动恢复
- **有监控**：无监控不演练
- **仅限已有用例**：只能执行 `references/catalogue/` 中已有的故障注入用例，严禁自行编造、拼凑或即兴发挥用例中未涉及的故障注入操作。无法匹配时必须明确告知用户「当前不支持该场景」并停止
- **禁止**：对系统关键进程（init/systemd/sshd）注入 kill / 对根分区注入 disk fill 且不设 reserve / 对生产数据库主机注入

---

## 第一步：意图识别

从用户输入中提取三个**语义维度**（只关心「注入什么故障」，不关心「在哪台机器、走什么通道」）：

| 维度 | 说明 | 示例 |
|------|------|------|
| **故障层级** | 作用在哪个层面 | CPU / 内存 / 磁盘 / 网络 / 进程 / 文件 / 时间 / 服务 / 系统调用 |
| **故障现象** | 期望模拟的表现 | 满载、空间不足、丢包、进程消失 |
| **故障原因** | 具体根因 | 异常进程占用、日志填满、DNS 错误 |

> **不要询问目标主机 / 执行通道（本地 or SSH）**：目标主机与注入通道由运行时配置自动推断，不属于意图识别范畴，问了也会被丢弃。

**层级判断关键词：**

| 关键词 | 层级 |
|--------|-----|
| cpu、满载、负载高、load average | CPU |
| 内存、memory、OOM、swap | 内存 |
| 磁盘空间、df、磁盘满、存储 | 磁盘空间 |
| 磁盘IO、iowait、读写慢、iostat | 磁盘IO |
| 网络、dns、丢包、端口占用、隔离、drop | 网络 |
| 进程、kill、假死、挂起、zombie、fork | 进程 |
| 文件、权限、fd、句柄、日志、删除 | 文件系统 |
| 时间、时钟、ntp、偏移 | 时间 |
| 服务、systemd、systemctl、service | 系统服务 |
| 系统调用、syscall、strace、mmap、read | 系统调用 |

**信息不全时的处理：**
- 用户明确说出故障现象 → 直接进入第二步
- 用户只说大致目标（如「压测主机」） → 提问引导确认故障语义（层级 / 现象 / 根因）
- 用户描述生产问题要复现 → 从描述提取现象和原因，匹配用例
- 匹配到多个用例 → 列出候选，让用户选择
- 只说了现象没说根因 → 推荐该分类下最常见的用例，并列出其他选项
- 不在覆盖范围 → 明确告知「当前不支持该场景」，停止操作，严禁自行构造用例外的故障注入

---

## 第二步：用例选择（动态发现）

所有用例存储在 `references/catalogue/` 下，通过目录结构和文件命名规约自动发现，无需维护静态索引。

### 命名规约

```
references/catalogue/
├── <故障分类>/                         # 目录名 = Host_故障现象
│   ├── <故障分类>_<根因A>.md           # 文件名 = 分类名_具体根因
│   ├── <故障分类>_<根因B>.md
│   └── ...
└── ...
```

示例：
- `references/catalogue/Host_CPU使用率过高/Host_CPU使用率过高_进程CPU满载.md`
- `references/catalogue/Host_网络故障/Host_网络故障_网络丢包隔离.md`

### 发现流程

**第 1 步：列出所有分类目录，匹配故障现象**

```bash
ls references/catalogue/
```

从返回的目录名中，根据第一步识别的故障现象选择最匹配的目录。

**第 2 步：列出该目录下所有用例文件，匹配根因**

```bash
ls references/catalogue/<匹配的目录>/
```

从返回的文件名中，根据用户描述的根因选择最匹配的文件。

- 如果用户明确了根因 → 直接选择对应文件
- 如果用户未说明根因 → 将文件列表展示给用户，让用户选择
- 如果没有匹配的文件 → 告知用户「当前不支持该场景」，停止操作

### 新增/删除用例

遵循命名规约即可，无需修改本文件：
- **新增用例**：在对应分类目录下新建 `<分类>_<根因>.md`
- **新增分类**：新建目录 `Host_<故障现象>/`，在其中添加用例文件
- **删除用例**：直接删除对应 `.md` 文件

### 辅助脚本

- `scripts/list_scenarios.py`：一键列出所有已支持的演练场景（JSON 结构化输出），用于快速总览或对接外部系统
  用法：`execute_skill_script(skill_name="host-chaos-skills", script_name="list_scenarios.py")`

---

## 第三步：意图提交（执行交给引擎）

本 skill 的职责到「提交意图」为止。读取用例文件只是为了确认**故障语义与参数**，不是让你自己去执行。

1. 读取 `references/catalogue/<分类目录>/<用例文件>.md`，确认故障语义（层级 / 现象 / 根因）和可调参数（如 CPU 百分比、持续时间、目标进程 / 路径 / 端口）
2. 与用户确认参数后，调用 `submit_fault_intent` 提交语义参数（scope / target / action / params）
3. **不要自己运行** `blade` / `host_read` 等命令去采集基线或注入——**基线采集、故障注入、注入验证、恢复及恢复验证均由执行引擎按用例模板自动完成**
4. 注入通道（本地 / SSH）与目标主机由运行时配置自动决定，无需询问用户
5. 所有实验都会带 `--timeout` 自动恢复（安全红线，由引擎保证）

> 用例文件中的「演练步骤 / 注入验证 / 注入恢复 / 恢复验证」是给**执行引擎**的模板（需要时可查阅 `references/chaosblade-host-commands.md` 获取完整参数），本阶段只需理解 WHAT，**不要在提交前自己执行它们**。
