cadneowl/chaos-loop

GitHub: cadneowl/chaos-loop

一个基于多 Agent AI 的闭环混沌工程系统,从代码分析、故障注入、根因诊断到自动生成修复 PR,填补了传统混沌工具在注入后缺乏行动闭环的空白。

Stars: 1 | Forks: 0

# chaos — 闭环、安全感知的混沌工程 [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/05/7b04bc1746032106.svg)](https://github.com/cadneowl/chaos-loop/actions/workflows/ci.yml) [![mypy](https://img.shields.io/badge/mypy-strict-blue)](pyproject.toml) [![ruff](https://img.shields.io/badge/ruff-clean-blue)](pyproject.toml) [![License](https://img.shields.io/badge/license-Apache%202.0-blue)](LICENSE)

The cast: orchestrator, tester, chaos goblin, security bouncer, diagnostician, fixer, meta-harness

一个多 Agent 系统,其中每个 Agent 都有自己的职责、混沌主题的人设, 且对其他人的决策没有任何干预权。欢迎在 [**docs/CAST.md**](docs/CAST.md) 中认识全体角色 — 包括负责指挥全局的 orchestrator 和负责审查每位乐手的 meta-harness。 这是一个**闭环**的混沌工程多 Agent 系统:它通过阅读目标源代码生成假设, 通过 [Chaos Mesh](https://chaos-mesh.org/) 注入故障,使用统计基线验证稳态, 利用附带引用证据的方式诊断回退,并开启一个包含修复建议 + 回归测试的 **draft PR**。 像 Chaos Mesh、Litmus、AWS FIS 和 Gremlin 等仅限注入的工具在注入故障后就停止了。 人类需要阅读仪表板,提交 Jira 工单,几周后再开启一个 PR。 本系统试图完成所有这些工作 — *或者在无法完成时诚实地失败*。

The orchestrator delegating to five agents: tester, chaos, security, diagnostician, fixer — each labelled with its responsibilities

## 目录 - [状态](#status) - [为什么存在这个项目](#why-this-exists) - [有何不同](#what-is-different-vs-prior-art) - [算法](#the-algorithm) - [逐步解析的闭环流程](#the-closed-loop-step-by-step) - [策略模式: `static` / `hybrid` / `llm`](#strategy-modes-static--hybrid--llm) - [统计基线](#statistical-baselines) - [模式匹配检测器](#pattern-match-detectors) - [混合合并算法](#hybrid-merge-algorithm) - [安全门禁](#safety-gates) - [Meta-harness: 如何控制每次 AI 调用](#the-meta-harness-how-every-ai-call-is-controlled) - [安装说明](#installation) - [配置说明](#configuration) - [操作系统](#operating-the-system) - [诊断 UI](#diagnostic-ui) - [测试状态](#test-status) - [仓库结构](#repo-layout) - [延伸阅读](#further-reading) - [许可证](#license) ## 状态 | 领域 | 状态 | |---|---| | Orchestrator + 状态机 | 正常运行 | | Tester(基线、验证、假设) | 正常运行 — Static + Hybrid + LLM 策略 | | Chaos(渲染器 + KubernetesClusterIO) | 正常运行 — 已通过实际的 Chaos Mesh v2.7+ 验证 | | Security(Trivy + Syft + Grype + gitleaks + cosign + kubescape) | 正常运行 — 每个扫描器按需启用;SBOM 漂移检测已上线 | | Diagnostician | 正常运行 — Static + Hybrid + LLM 策略 | | Fixer(生成提议产物) | 正常运行;实际的文件编辑 + `gh pr create` 属于 M6.x.b 阶段 | | LLM 后端 | Anthropic Claude(默认),Ollama(本地),任意 LiteLLM 提供商 | | 测试 | 458 个单元测试,81%+ 覆盖率,mypy strict,ruff clean | ## 为什么存在这个项目 混沌工程工具链通常在**注入**阶段就停止了。Chaos Mesh 应用 CRD;Litmus 运行工作流;Gremlin 渲染仪表板 — 然后 人类阅读结果,决定它意味着什么(如果有的话),提交一个 工单,并且(可能)在几个月后写一个修复补丁。 这个缺口 — 介于*我们引发了回退*和*我们拥有一份经过审查的解决产物* 之间 — 是混沌工程大部分价值流失的地方。混沌的目的不是破坏事物; 而是暴露潜在的脆弱性并**对其采取行动**。如果没有形成闭环,每一次 混沌运行都会变成被丢弃的上下文。 本项目旨在闭合这个环路。它并不是第一个这样尝试的项目(参见 [docs/COMPARISON.md](docs/COMPARISON.md) 了解全貌)— 但它有几个 与众不同的做法。 ## 有何不同(对比现有技术) 1. **应用代码 PR**,而不仅仅是 k8s 配置修改。Fixer Agent 在目标仓库中发起一个 **draft** PR,包含提议的代码修改 + 回归 测试 + 推理过程。默认为 draft 状态,从不自动合并, 具有黑名单强制机制。 2. **安全混沌工程是一等公民。** 安全发现与功能回退 流经同一个闭环。Diagnostician 将 `auth.outage` 和 `network.loss` 同等对待。参见 [docs/SECURITY_CHAOS.md](docs/SECURITY_CHAOS.md)。 3. **在每个认知接缝处都有确定性底线。** Hypothesize / diagnose / propose-fix 各自都有一个基于规则的 `Static*` 实现, 运行成本为 $0。LLM 是增强而不是取代它们。如果 LLM 缺失或失败,闭环仍能产出有用的结果。参见 [策略模式](#strategy-modes-static--hybrid--llm)。 4. **通过 LiteLLM 支持多后端 LLM。** 支持 Anthropic Claude (默认),本地 Ollama 模型(Qwen、Llama 等),或任何其他 LiteLLM 支持的提供商,只需一个标志位即可切换。 5. **严格的 Agent 间契约。** 每个 Agent 都在 `shared/contracts.py` 中有基于 Pydantic 类型化 的输入/输出 schema。Agent 是可替换的; 非 Claude 的实现也是一等公民。 6. **Orchestrator 是确定性的 Python 代码。** 状态转换、安全门禁、爆炸半径限制和预算执行都是代码,而不是 LLM 的判断。认知工作被委派给 Agent;而安全属性则不然。 ## 算法 ### 逐步解析的闭环流程 The Orchestrator Orchestrator(`orchestrator/loop.py`)运行一个确定性的状态 机。每次转换都持久化到 SQLite,以便在运行中途崩溃时可以 恢复。*"每个人都在自己的车道上。状态机不接受请求。"*

The orchestrator state machine: INITIALIZING through pre-flight gates, BASELINE / BASELINE_OK / INJECT / VERIFY branches, then STEADY → RECORDED on the happy path or REGRESSED → DIAGNOSE → DIAGNOSED → PROPOSE_FIX → FIX_PROPOSED → RECORDED, with explicit BASELINE_FAIL / INJECT_FAILED → ABORTED branches

**内置在状态机中的硬性规则:** - 基线已显示回退时,**在**注入任何 故障之前中止实验。对处于亚健康状态的系统进行混沌测试可能会使其彻底崩溃。 - 除非设置 `allow_multi_fault: true`,否则每次实验只允许一个故障 — 归因很重要。 - 每步预算检查:每次产生花费的 Agent 调用(基于 LLM 的 hypothesize / diagnose / propose-fix)都会从 harness 刷新支出,然后在下一步之前重新评估硬性上限。 - Fixer 从不自动合并。PR 始终是 draft 状态。 ### 策略模式: `static` / `hybrid` / `llm` 闭环中的每个认知接缝都有多个实现,隐藏在一个 Pydantic 类型化的 Protocol 之后。你可以通过 `chaos run` 上的 `--profile` 标志来选择你想要的组合: | 模式 | Hypothesize | Diagnose | Propose-fix | 成本 | 何时使用 | |---|---|---|---|---|---| | **`static`** | `StaticHypothesizer` | `StaticDiagnoser` | `StaticFixerStrategy` | **$0** | CI、默认情况、$0 基线、完全可重复的运行 | | **`hybrid`** | `Hybrid…` (Static + LLM,合并) | 相同 | 相同 | **$$** | 尽力而为:静态底线 + LLM 增强 | | **`llm`** | `Claude…` (LiteLLM) | 相同 | 相同 | **$$$** | 具有明确 LLM 预算的生产环境运行 | 还有第四种级别 — `Fixture*` — 用于单元测试和 `--dry-run`。这四种级别都实现了相同的 `Hypothesizer` / `Diagnoser` / `FixerStrategy` Protocol;Orchestrator 无法区分它们。 参见 [docs/MODES.md](docs/MODES.md) 了解每种模式的详细分解。 ### 统计基线 Tester 的 `baseline()` **不是**单次快照。它会将目标探针集中的每个探针运行 N 次(默认 5 次),并为每个指标记录一个 `StatisticalSample`:样本、平均值、p50、p95、p99、标准差。 百分位数使用线性插值(NIST `linear` 方法),因此 `[100, 200, 300, 400]` 的 p50 是 `250`,而不是 `300`。 混沌注入后,`verify()` 会重新运行相同的探针。比较是基于新均值与基线分布的 **3-σ z-test**: ``` z = abs(new_mean - baseline_mean) / baseline_stdev if z > 3.0: flag_as_anomaly() ``` 在正态分布下,3-σ 对应于约 0.3% 的假阳性率。这个阈值故意设置得很保守 — 假阳性会浪费 Diagnostician 的注意力;而假阴性无论如何都会被每次探针的通过/失败判定捕获。 ### 模式匹配检测器 `StaticHypothesizer` 对目标的源代码运行八个检测器。每个检测器发出 `Issue` 对象, 然后由一个模板层将其转换为映射到目录的 `Hypothesis` 实例。零 LLM 成本,完全确定性。 | 检测器 | 模式 | 映射到混沌故障 | |---|---|---| | `MissingTimeoutDetector` | 没有 `timeout=` 的 `requests.get(...)` / `subprocess.run(...)` | `network.delay` | | `MissingRetryDetector` | 文件中没有重试原语的外部依赖调用点 | `network.loss` | | `MissingCircuitBreakerDetector` | 没有熔断器原语的外部依赖调用点 | `network.partition` | | `NoFallbackForCacheDetector` | 对已知缓存客户端变量的 GET 型缓存调用,文件中没有 `try/except` | `pod.kill` | | `SyncCallInAsyncDetector` | `async def` 中的 `time.sleep` / `requests.*` / 同步 subprocess,且未被卸载执行 | `network.delay` | | `SingleReplicaDetector` | `replicas: 1` 的 k8s Deployment | `pod.kill` | | `HardPodAffinityDetector` | `requiredDuringSchedulingIgnoredDuringExecution` | `pod.kill` | | `HardcodedSecretDetector` | 将具有秘密暗示的名称分配给长字符串字面量(跳过环境变量加载模式和注释) | `secret.rotate` | 检测器位于 `agents/tester/detectors/` 中。添加检测器只需实现 `Detector` Protocol(一个 `find(code) -> list[Issue]` 方法),在 `hypothesizer.py` 的 `_DETECTOR_CONFIG` 中添加模板条目,并在 `default_detectors()` 中注册。 ### 混合合并算法 `HybridHypothesizer` 和 `HybridDiagnoser` **同时**运行 Static 和 LLM, 然后进行合并: - **Hypothesizer 去重键:** `(proposed_fault, normalized code_references)`。 引用被标准化为 `file:line`,因此同一文件不同行上的两个发现仍会保持独立。 - **Diagnoser 去重键:** `(suggested_fix_class, overlapping affected_paths)`。 - **冲突解决:** 置信度高者胜出;来自双方的非重复项都会保留;结果按置信度降序排序。 如果 LLM 抛出异常,混合模式会记录一条警告并降级为纯 Static。 闭环绝不会因为暂时的 API 问题而中断。 `HybridFixerStrategy` 是二选一的(提议不是一个列表):首先尝试 LLM;如果 LLM 抛出异常 **或者** 返回为空/极其简短的提议(`reasoning < 50` 个字符且没有 `files_touched`),则回退到 Static。 ### 安全门禁 在任何故障注入之前,会运行四个确定性的门禁(`orchestrator/safety.py`): 1. **`check_cluster_allowed`** — 配置的 `cluster_context` 不得 匹配子字符串黑名单(默认值:`prod`、`production`、`live`、`main`)。 2. **`check_blast_radius`** — 除非 `allow_multi_fault: true`,否则每次实验只允许一个故障;每次故障的持续时间 ≤ `max_duration_seconds`。 3. **`check_namespace_annotation`** — 目标 namespace 必须带有 `chaos.kosta.dev/allowed=true`。如果集群不可达,该门禁将**失败并闭合** — 一个无法验证其自身定位的实验将不会继续。 4. **`check_baseline_healthy`** — 基线 `TesterReport.steady_state` 必须为 `True` 且 `SecurityReport_critical_or_high` 必须为 `False`。对一个已经崩溃的系统进行混沌测试只会产生无用的数据。 此外还有持续的预算执行(见下一节)。 参见 [docs/SAFETY.md](docs/SAFETY.md) 了解完整的安全模型以及针对 `requires_approval` 故障的审批模式。 ### Meta-harness: 如何控制每次 AI 调用 The Meta-Harness LLM 是系统的认知表层;它们也是会消耗金钱、泄露数据、产生幻觉且可能陷入死循环的表层。每次调用基于 LLM 的 Agent 都会通过一个 **meta-harness** 包装器(`agents/_harness.py`),它为 Orchestrator 提供了一个集中的地方,以便跨所有五个 Agent 强制执行控制属性。*"请出示许可证。支出报告。审计日志。继续前行。"* 该包装器是一个 `__getattr__` 代理 — 调用 `harness.instrument(name, agent)` 会返回一个透明的替代品,满足与底层 Agent 相同的 Protocol。同步属性读取会穿透;协程方法会被插桩。被包装的 Agent 是**只读的**:`__setattr__` 会抛出异常,因此行为不当的调用者无法改变被包装实例上的状态。 包装器在每次异步方法调用时执行的操作: | 关注点 | Harness 如何处理 | |---|---| | **可观测性** | 记录入口 / 出口 / 持续时间 / 错误 / 一行式的输入 + 输出摘要 — 成功时为 INFO 级别,抛出异常时为 WARNING 级别。 | | **审计追踪** | 构建一个 `AgentInvocation` 记录并将其附加到 `Harness.invocations`。Orchestrator 在每次 SQLite 保存之前将完整列表附加到 `ExperimentRecord.agent_invocations`,因此即使运行中途崩溃,也会留下取证追踪。 | | **成本归因** | 将每个任务的 `ContextVar` 设置为当前的 `AgentInvocation`。当 Agent 的策略调用 `complete_with_tools` 时,该函数会读取 ContextVar 并将调用的 `response_cost` 计入触发它的 invocation — 无需跨三个构造函数传递 harness 引用。 | | **预算执行** | 在闭环的每一步之后,Orchestrator 会汇总 `harness.invocations` 中的 `inv.spend_usd`,将其持久化在记录上,在达到 `soft_cap_usd` 时记录一次日志,在达到 `hard_cap_usd` 或 `wall_clock_seconds` 时以 `BUDGET_EXCEEDED` 中止。 | | **错误传播** | 异常总是被传播。Harness 会为审计日志记录错误字符串,但**绝不**吞没异常。一个失败的 Agent 会导致整个实验失败 — 不允许静默的部分成功。 | | **禁止修改** | `_Wrapped.__setattr__` 阻止了对代理本身的写入;被包装的 Agent 在概念上是冻结的视图。 | 端到端的 LLM 成本流如下所示: ``` ExperimentRunner.run() └─ awaits harness_wrapped_tester.hypothesize(req) ← proxy └─ ContextVar.set(AgentInvocation) └─ awaits inner_tester.hypothesize(req) └─ awaits ClaudeHypothesizer.generate(...) └─ awaits complete_with_tools(...) └─ for each turn: └─ litellm.acompletion() └─ cost = response.usage.cost └─ record_llm_spend(cost) └─ inv.spend_usd += cost ← ContextVar └─ records AgentInvocation in Harness.invocations └─ budget.spent_usd = sum(inv.spend_usd for inv in harness.invocations) └─ if budget.hard_exceeded(): abort ``` 这在实践中为何重要: - **Orchestrator 从不直接看到 LLM 调用**。它只通过 Protocol 接口看到 Agent 的调用。Harness 是边界控制。 - **添加新 Agent** 不需要更改任何 harness 代码 — 只需 `harness.instrument("new-agent", instance)`,它就会获得相同的可观测性 / 审计 / 成本 / 预算执行。 - **即使 Agent 调用多个 LLM,控制属性依然成立。** ContextVar 模式意味着 N 次嵌套的 `complete_with_tools` 调用都会将其成本计入启动外部 Agent 方法的那个 invocation。 - **测试可以完全脱离 Harness**(`Fixture*` 实现本来就不使用 LLM),或者独立使用它来验证调用日志是否符合预期。`tests/test_harness.py` 这两种情况都测试了。 本地 Ollama 运行报告的成本为 0(LiteLLM 没有自托管端点的定价数据),因此预算路径在免费层设置中会优雅地空操作 — 可观测性 + 审计追踪属性依然成立。 ## 安装说明 ### 前置条件 - **Python 3.11+**(推荐 3.13;与开发环境一致) - **Docker**(用于 Chaos Mesh 的 `kind` 测试集群以及任何镜像扫描) - **kubectl**(1.27+ 版本;兼容 `client-go` v0.29) - **kind**(仅当你想要一个本地 k8s 集群时需要;替代方案:现有集群 + Chaos Mesh 安装) - **(可选) Anthropic API 密钥**,用于 `--profile llm` / `--profile hybrid` 配合 Claude — 在 https://console.anthropic.com 注册 - **(可选) Ollama**,用于本地 LLM — https://ollama.com ### 1. 克隆并安装 Python 依赖 ``` git clone chaos && cd chaos python -m venv .venv source .venv/bin/activate # POSIX # .\.venv\Scripts\Activate.ps1 # Windows PowerShell pip install -e ".[dev]" ``` 验证安装: ``` chaos --help # the orchestrator's `chaos run` CLI python -m pytest tests/ -q # should print "411 passed, 1 skipped" ``` ### 2. 启动 kind 集群 + 安装 Chaos Mesh 适用于 Linux / macOS: ``` kind create cluster --name chaos-dev --wait 60s helm repo add chaos-mesh https://charts.chaos-mesh.org && helm repo update kubectl create ns chaos-mesh helm install chaos-mesh chaos-mesh/chaos-mesh \ --namespace=chaos-mesh \ --version 2.7.2 \ --set chaosDaemon.runtime=containerd \ --set chaosDaemon.socketPath=/run/containerd/containerd.sock \ --wait --timeout=4m kubectl get pods -n chaos-mesh # all should be Running ``` 适用于 Windows + WSL2 (Ubuntu):上述所有内容都在 WSL 内运行。然后将 kubeconfig 暴露给 Windows,以便 Windows 上的 Python 可以与集群通信: ``` mkdir "$env:USERPROFILE\.kube" -Force wsl -d Ubuntu-24.04 -- cat ~/.kube/config | Out-File -Encoding utf8 "$env:USERPROFILE\.kube\config-kind" $env:KUBECONFIG = "$env:USERPROFILE\.kube\config-kind" ``` 使用本仓库的渲染器验证 Chaos Mesh: ``` python scripts/validate_renderers.py --context kind-chaos-dev # 应输出:所有 7 个渲染器已通过真实的 Chaos Mesh 验证。 ``` ### 3. (可选) 安装 Ollama 用于本地 LLM ``` # Linux / macOS curl -fsSL https://ollama.com/install.sh | sh ollama pull qwen2.5-coder:14b # ~9 GB ollama serve # default: http://localhost:11434 ``` ### 4. (可选) 配置可观测性后端 为了让 `--profile llm` 能从日志/指标中进行真正的根因分析 (RCA),需要将 Agent 指向 Loki + Prometheus: ``` export PROM_URL=http://prometheus.example/api/v1 export LOKI_URL=http://loki.example ``` 没有它们闭环依然可以运行 — 只是 Diagnostician 收集的证据范围会窄一些。 ## 配置说明 Orchestrator 和 Agent 通过三个层级进行配置,按优先级排序如下: 1. `chaos run` 上的 **CLI 标志位**(最高) 2. **环境变量** 3. `agents/_factory.py` 中的 **`AgentConfig` 默认值** | CLI 标志 | 环境变量 | 默认值 | 用途 | |---|---|---|---| | `--profile` | — | `static` | 策略组合: `static` / `hybrid` / `llm` | | `--dry-run` | — | 关闭 | 使用模拟 Agent(无 LLM,无集群) | | `--prom-url` | `PROM_URL` | 未设置 | Prometheus 基础 URL | | `--loki-url` | `LOKI_URL` | 未设置 | Loki 基础 URL | | `--target-repo-path` | `TARGET_REPO_PATH` | 未设置 | 目标仓库的本地检出路径 | | `--kubeconfig` | `KUBECONFIG` | `~/.kube/config` | kubeconfig 的路径 | | `--kube-context` | `KUBE_CONTEXT` | 当前 context | 在 kubeconfig 中使用的 context | | `--model` | `CHAOS_LLM_MODEL` | `claude-opus-4-7` | LiteLLM 模型标识符 | | `--api-base` | `CHAOS_LLM_API_BASE` | 提供商默认值 | 覆盖 LLM API 基础 URL | | `--db` | — | `~/.local/share/chaos/experiments.sqlite` | SQLite 存储路径 | 此外,实验计划(YAML)本身也是一种配置 — 参见 [experiments/examples/](experiments/examples/) 中带有完整注释的示例。 ### 模型选择 `--model` 会直接传递给 LiteLLM。裸名称通过前缀路由到提供商: | 裸名称模式 | 提供商 | 示例 | |---|---|---| | `claude-*`, `anthropic-*` | Anthropic | `claude-opus-4-7` | | `gpt-*`, `o1-*`, `o3-*` | OpenAI | `gpt-4o` | | `qwen*`, `llama*`, `mistral*`, `deepseek*`, `phi*` | Ollama | `qwen2.5-coder:14b` | | 其他 | 使用显式的 `provider/model` 形式 | `groq/llama-3.1-70b` | 对于 Ollama(和其他自托管端点),你还需要 `--api-base http://localhost:11434`。 ### 调优闭环 | 调优项 | 位置 | 备注 | |---|---|---| | 基线漂移的 Z-score 阈值 | `agents/tester/agent.py` `_BASELINE_SHIFT_Z_THRESHOLD` | 默认 3.0(约 0.3% 假阳性)。越低越敏感。 | | 基线运行次数 | `TesterRequest.baseline_run_count` | 默认 5。越多 = 分布越紧凑,基线耗时越长。 | | 触发操作的最低置信度 | `agents/fixer/policy.py` `DEFAULT_MIN_CONFIDENCE` | 默认 0.5。Fixer 提议代码编辑而非仅输出 DOC_ONLY 的阈值。 | | 路径黑名单 | `agents/fixer/policy.py` `PathDenylist` | Fixer 拒绝触碰的文件。默认包括 `.github/`、`infra/`、`secrets/`。 | | LLM 工具循环最大轮次 | `Claude*` 策略构造函数 `max_turns=25` | 每次 LLM 调用。越大 = 探索越多,成本越高。 | | LLM 单次调用预算 | `Claude*` 策略构造函数 `max_budget_usd=3.0` | 单个工具循环内的本地熔断器。 | | 检测器集合 | `agents/tester/detectors/__init__.py` `default_detectors()` | 增加 / 删除模式。 | | 故障目录 | `agents/chaos/faults/_meta.py` `CATALOGUE` | Orchestrator 接受哪些故障。 | | 禁止的集群子字符串 | 每个计划的 `SafetyConstraints.forbidden_cluster_substrings` | 默认 `("prod", "production", "live", "main")`。 | ## 操作系统 ### 运行实验 ``` # 确定性的,无 LLM,无需 API key。 chaos run experiments/examples/01-redis-network-loss.yaml --profile static # 使用 Claude。 ANTHROPIC_API_KEY=sk-ant-... chaos run experiments/examples/01-redis-network-loss.yaml --profile hybrid # 使用本地 Ollama。 chaos run experiments/examples/01-redis-network-loss.yaml \ --profile hybrid \ --model ollama/qwen2.5-coder:14b \ --api-base http://localhost:11434 # 使用 mock agents 完整 dry-run —— 无 cluster,无 API,无其他依赖。 chaos run experiments/examples/01-redis-network-loss.yaml --dry-run ``` 输出的内容是 JSON 格式的 `ExperimentRecord`:状态机演进过程, 每次 Agent 调用及其输入/输出摘要 + 花费、混沌时间线、诊断以及修复建议。 ### 验证计划但不运行 ``` chaos validate experiments/examples/01-redis-network-loss.yaml ``` 检查项:schema 验证,每个 `fault.name` 存在于目录中,集群黑名单,爆炸半径。不执行任何 I/O 操作。 ### 列出 + 检查过往实验 ``` chaos list # 20 most recent chaos list --limit 100 chaos show # full JSON record ``` ### 中止正在运行的实验 ``` chaos abort # one chaos abort --all # everything in a non-terminal state ``` **注意:** `chaos abort` 会更新存储;它**不会**删除集群资源。请使用 Chaos Agent 的清理路径或: ``` kubectl delete chaos \ -l chaos.kosta.dev/experiment-id= ``` ### 列出故障目录 ``` chaos list-faults # everything chaos list-faults --category network chaos list-faults --requires-approval # which faults need explicit approval ``` ### 验证集群 + Chaos Mesh 集成 ``` # 对每个故障 renderer 进行 Server-side dry-run apply: python scripts/validate_renderers.py --context kind-chaos-dev # 真实的 KubernetesClusterIO 往返测试 (apply / get / list / delete): python scripts/smoke_kubernetes_cluster_io.py --context kind-chaos-dev # 针对真实 nginx 目标的 Live chaos 测试(观察 pods 实际被 kill): python scripts/smoke_live_chaos.py --context kind-chaos-dev # 完整的 ClaudeChaosAgent 生命周期测试: python scripts/smoke_chaos_agent.py --context kind-chaos-dev ``` 每个冒烟测试脚本都接受 `--kubectl ""`(shlex 分割)用于 非简单调用(例如,从 Windows 调用 WSL)。参见各自的 `--help`。 ## 诊断 UI [`ui/`](ui/) 中附带了一个只读的 Web UI。它以 WAL 快照模式打开 Orchestrator 的 SQLite 存储(绝不阻塞写入者),并将每个实验渲染为六个标签页 — 概述、时间线(交错显示调用和混沌事件)、LLM 遥测(支出 / token 数 / 按 Agent 细分)、诊断(带有置信度标记的排序假设列表)、修复建议(操作 + draft-PR 链接)和原始 JSON。基于 NestJS 11 + Angular 21 standalone 构建,默认单机和仅限本地访问;通过 bearer-token 模式可以开放给团队共享使用。

Timeline of a real chaos run, with chaos-mesh CRD events highlighted

``` cd ui && pnpm install pnpm --filter @chaos/ui-server start:dev # http://127.0.0.1:3000 pnpm --filter @chaos/ui-web start # http://localhost:4200 ``` 完整的设置、每个标签页的截图,以及如何将其连接到真实的 Chaos Mesh 集群:[**ui/README.md**](ui/README.md)。 ## 测试状态 ``` $ python -m pytest tests/ -q 458 passed, 1 skipped in 2.55s $ python -m mypy agents/ shared/ orchestrator/ Success: no issues found in 61 source files $ python -m ruff check . All checks passed! ``` 按领域划分的覆盖率(`pytest --cov`): | 领域 | 覆盖率 | |---|---| | `shared/contracts.py` | 99% | | `orchestrator/safety.py` | 95% | | `orchestrator/loop.py` | 82%+(变更后) | | `agents/_factory.py`, `_harness.py`, `_llm.py`, `_retry.py` | 92–96% | | `agents/chaos/*` | 74–100%(cluster.py 91% — kubernetes-client 路径) | | `agents/tester/detectors/*` | 89–100% | | `agents/diagnostician/diagnoser.py` | 78% | | `agents/fixer/strategy.py` | 79% | | **项目总计** | **81%+** | 实际的集群集成由scripts/` 中的四个脚本进行验证(不属于单元测试运行的一部分;它们需要一个真实的集群 + Chaos Mesh)。 ## 仓库结构 ``` chaos/ ├── shared/ Pydantic contracts — the inter-agent interface (most important file) ├── orchestrator/ Deterministic loop, safety gates, budget tracking, SQLite store, typer CLI ├── agents/ │ ├── _factory.py build_real_agents(profile=…): wire agents per static/hybrid/llm │ ├── _harness.py Meta-harness: invocation log, contextvar for LLM cost attribution │ ├── _llm.py Universal LiteLLM tool-loop runner (Anthropic / Ollama / OpenAI) │ ├── _json.py Shared JSON-from-LLM extraction (used by all three strategies) │ ├── _retry.py Async retry helper used by Loki + Prometheus HTTP backends │ ├── _mocks.py Mock agents for `chaos run --dry-run` │ ├── tester/ baseline + verify + hypothesize; detectors live here too │ ├── chaos/ Chaos Mesh CRD renderers + ClusterIO Protocol (Fake + Kubernetes impls) │ ├── security/ Scanner runner + Trivy (more scanners in M4.1) │ ├── diagnostician/ RCA agent: Loki + Prom + code tools; Static/Hybrid/Claude Diagnoser │ └── fixer/ Draft-PR agent: decision tree + Static/Hybrid/Claude FixerStrategy ├── experiments/ Plan YAMLs + run artifacts ├── tests/ 411 unit tests (mock-based; live cluster tested via scripts/) ├── scripts/ Live-cluster smoke tests + renderer validator ├── ui/ Read-only diagnostic web UI: NestJS server + Angular SPA └── docs/ Deeper architecture / safety / modes / comparison / roadmap docs ``` ## 延伸阅读 - [docs/CAST.md](docs/CAST.md) — 完成所有工作的七个角色(包含画像和属性面板) - [docs/MODES.md](docs/MODES.md) — `static` / `hybrid` / `llm` 三分法详解 - [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) — Agent 规范 + 深入理解状态机 - [docs/SAFETY.md](docs/SAFETY.md) — 爆炸半径 + 中止条件 + 审批 - [docs/SUPPRESSION.md](docs/SUPPRESSION.md) — 静默处理那些允许系统继续产生但你已决定不采取行动的发现 - [docs/SECURITY_CHAOS.md](docs/SECURITY_CHAOS.md) — 安全混沌工程集成 - [docs/COMPARISON.md](docs/COMPARISON.md) — 现有技术概貌(ChaosEater、Harness、Litmus 等) - [docs/ROADMAP.md](docs/ROADMAP.md) — 里程碑 + 剩余工作 - 各 Agent 的 README: [tester](agents/tester/README.md) · [chaos](agents/chaos/README.md) · [security](agents/security/README.md) · [diagnostician](agents/diagnostician/README.md) · [fixer](agents/fixer/README.md) - [ui/README.md](ui/README.md) — 基于 SQLite 存储的只读诊断 UI,包含每个标签页的截图和真实集群连接指南 ## 许可证 Apache 2.0 — 参见 [LICENSE](LICENSE)。
标签:AI智能体, AI风险缓解, Chaos Mesh, CISA项目, DevSecOps, DLL 劫持, LLM, PyRIT, Python, SRE, Unmanaged PE, 上游代理, 云资产清单, 人工智能, 代码分析, 偏差过滤, 凭证管理, 多智能体系统, 大语言模型, 子域名突变, 安全测试, 开源框架, 微服务可靠性, 持续集成, 攻击性安全, 故障注入, 无后门, 模块化设计, 混合策略, 混沌工程, 用户模式Hook绕过, 站点可靠性工程, 系统弹性, 自动化修复, 自动生成PR, 自定义请求头, 请求拦截, 逆向工具, 逆向工程, 闭环测试