{ "schema_version": 2, "index_version": "0.4.0", "compatibility": { "cli": ">=0.4.0, <0.5.0", "scenario_schema": 1 }, "evidence_suites": [ { "id": "core-http-faults", "workflow": ".github/workflows/ci.yml", "command": "cargo test --locked -p chaos_core injectors::http_fault", "assertions": ["disruption", "restoration"], "packs": [ "ai-openai-compatible", "ai-anthropic", "ai-gemini", "ai-openrouter", "ai-ollama", "auth-jwks-outage", "auth-oauth-refresh-failure", "hls-missing-segments", "hls-stale-manifest", "media-bitrate-oscillation", "webrtc-signaling-delay" ] }, { "id": "core-tls-faults", "workflow": ".github/workflows/ci.yml", "command": "cargo test --locked -p chaos_core injectors::crypto_fault", "assertions": ["disruption", "restoration"], "packs": ["auth-expired-certificate", "auth-incomplete-chain"] }, { "id": "docker-container-faults", "workflow": ".github/workflows/ci.yml", "command": "CHAOS_DOCKER_INTEGRATION=1 cargo test --locked -p chaos_core --test docker_integration", "assertions": ["disruption", "restoration"], "packs": ["container-compose-pause"] }, { "id": "local-database-faults", "workflow": ".github/workflows/ci.yml", "command": "cargo test --locked -p chaos_core injectors::database_fault", "assertions": ["disruption", "restoration"], "packs": [ "database-duckdb-unavailable", "database-duckdb-io-pressure", "database-sqlite-read-only" ] }, { "id": "rootless-dns-faults", "workflow": ".github/workflows/ci.yml", "command": "cargo test --locked -p chaos_core injectors::dns", "assertions": ["disruption", "restoration"], "packs": ["network-dns-spoof"] }, { "id": "protocol-postgres", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh postgres", "assertions": ["disruption", "restoration"], "packs": ["database-postgres-disconnect"] }, { "id": "protocol-mysql", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh mysql", "assertions": ["disruption", "restoration"], "packs": ["database-mysql-slow-queries", "database-pool-exhaustion"] }, { "id": "protocol-kafka", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh kafka", "assertions": ["disruption", "restoration"], "packs": ["kafka-rebalance"] }, { "id": "protocol-rabbitmq", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh rabbitmq", "assertions": ["disruption", "restoration"], "packs": ["rabbitmq-ack-loss"] }, { "id": "protocol-nats", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh nats", "assertions": ["disruption", "restoration"], "packs": ["nats-disconnect", "nats-duplicate-delivery"] }, { "id": "protocol-mqtt", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh mqtt", "assertions": ["disruption", "restoration"], "packs": [ "mqtt-packet-loss", "mqtt-retained-corruption", "mqtt-intermittent-connectivity" ] }, { "id": "protocol-s3", "workflow": ".github/workflows/protocol-evidence.yml", "command": "tests/protocol-evidence/run.sh s3", "assertions": ["disruption", "restoration"], "packs": [ "object-partial-upload", "object-stale-read", "object-throttling", "object-corrupt-download" ] }, { "id": "hft-protocol-evidence", "workflow": ".github/workflows/ci.yml", "command": "cargo test --locked -p chaos_hft", "assertions": ["disruption", "restoration"], "packs": [ "trading-market-data-reordering", "trading-fix-session-corruption", "trading-order-ack-tail-latency" ] }, { "id": "zero-buffer-pipeline-evidence", "workflow": ".github/workflows/ci.yml", "command": "cargo test --locked -p chaos_pipeline", "assertions": ["disruption", "restoration"], "packs": [ "pipeline-zero-buffer-backpressure", "pipeline-abrupt-end-of-stream" ] } ], "packs": [ { "id": "ai-openai-compatible", "title": "OpenAI-compatible stream failures", "category": "ai", "status": "stable", "description": "Delayed tokens, broken SSE streams, and malformed tool calls for OpenAI-compatible APIs.", "protocols": ["OpenAI API", "SSE"], "requirements": ["Point the SDK base URL at the local proxy"], "file": "scenario-packs/ai/openai-compatible.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/ai/openai-compatible.yaml" }, { "id": "ai-anthropic", "title": "Anthropic API failures", "category": "ai", "status": "stable", "description": "Provider-shaped rate limits and broken message streams for Anthropic clients.", "protocols": ["Anthropic API", "SSE"], "requirements": ["Point the SDK base URL at the local proxy"], "file": "scenario-packs/ai/anthropic.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/ai/anthropic.yaml" }, { "id": "ai-gemini", "title": "Gemini stream failures", "category": "ai", "status": "stable", "description": "Delayed and truncated streaming responses for Gemini clients.", "protocols": ["Gemini API", "SSE"], "requirements": ["Point the SDK base URL at the local proxy"], "file": "scenario-packs/ai/gemini.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/ai/gemini.yaml" }, { "id": "ai-openrouter", "title": "OpenRouter API failures", "category": "ai", "status": "stable", "description": "Rate limits, stream delays, and malformed responses for OpenRouter clients.", "protocols": ["OpenRouter API", "SSE"], "requirements": ["Point the SDK base URL at the local proxy"], "file": "scenario-packs/ai/openrouter.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/ai/openrouter.yaml" }, { "id": "ai-ollama", "title": "Ollama local API failures", "category": "ai", "status": "stable", "description": "Delayed and broken NDJSON streams for a local Ollama endpoint.", "protocols": ["Ollama API", "NDJSON"], "requirements": ["Ollama or a compatible local endpoint"], "file": "scenario-packs/ai/ollama.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/ai/ollama.yaml" }, { "id": "auth-expired-certificate", "title": "Expired TLS certificate", "category": "authentication", "status": "stable", "description": "Serve a verifiably expired leaf certificate from a local TLS endpoint.", "protocols": ["TLS", "X.509"], "requirements": ["Point the client at the local TLS endpoint"], "file": "scenario-packs/authentication/expired-certificate.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/authentication/expired-certificate.yaml" }, { "id": "auth-incomplete-chain", "title": "Incomplete certificate chain", "category": "authentication", "status": "stable", "description": "Serve a leaf certificate without its required intermediate certificate.", "protocols": ["TLS", "X.509"], "requirements": ["Point the client at the local TLS endpoint"], "file": "scenario-packs/authentication/incomplete-chain.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/authentication/incomplete-chain.yaml" }, { "id": "auth-jwks-outage", "title": "JWKS outage", "category": "authentication", "status": "stable", "description": "Fail JWKS document retrieval through a rootless HTTP proxy.", "protocols": ["HTTP", "JWKS", "JWT"], "requirements": ["Point the JWKS URL at the local proxy"], "file": "scenario-packs/authentication/jwks-outage.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/authentication/jwks-outage.yaml" }, { "id": "auth-oauth-refresh-failure", "title": "OAuth refresh failure", "category": "authentication", "status": "stable", "description": "Replace token refresh responses with deterministic invalid_grant errors.", "protocols": ["OAuth 2.0", "HTTP"], "requirements": ["Point the token endpoint at the local proxy"], "file": "scenario-packs/authentication/oauth-refresh-failure.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/authentication/oauth-refresh-failure.yaml" }, { "id": "container-compose-pause", "title": "Docker Compose service pause", "category": "containers", "status": "stable", "description": "Pause every replica of a Docker Compose service and restore its prior state.", "protocols": ["Docker", "Docker Compose"], "requirements": ["Docker CLI", "Running Compose project"], "file": "scenario-packs/containers/compose-pause.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/containers/compose-pause.yaml" }, { "id": "database-duckdb-unavailable", "title": "DuckDB unavailable", "category": "databases", "status": "stable", "description": "Make a local DuckDB file unavailable and restore its bytes exactly.", "protocols": ["DuckDB"], "requirements": ["Disposable local database file"], "file": "scenario-packs/databases/duckdb-unavailable.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/duckdb-unavailable.yaml" }, { "id": "database-duckdb-io-pressure", "title": "DuckDB I/O pressure", "category": "databases", "status": "stable", "description": "Generate neighboring disk reads and writes without corrupting the DuckDB file.", "protocols": ["DuckDB"], "requirements": ["Disposable local database directory"], "file": "scenario-packs/databases/duckdb-io-pressure.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/duckdb-io-pressure.yaml" }, { "id": "database-sqlite-read-only", "title": "SQLite read-only mode", "category": "databases", "status": "stable", "description": "Remove write permissions from a SQLite file and restore its exact prior permissions.", "protocols": ["SQLite"], "requirements": ["Disposable local database file"], "file": "scenario-packs/databases/sqlite-read-only.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/sqlite-read-only.yaml" }, { "id": "database-postgres-disconnect", "title": "PostgreSQL disconnects", "category": "databases", "status": "stable", "description": "Partition PostgreSQL connections through a rootless directional proxy.", "protocols": ["PostgreSQL", "TCP"], "requirements": ["Point the database client at the local proxy"], "file": "scenario-packs/databases/postgres-disconnect.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/postgres-disconnect.yaml" }, { "id": "database-mysql-slow-queries", "title": "MySQL response delay", "category": "databases", "status": "stable", "description": "Delay downstream MySQL traffic to exercise query timeout handling.", "protocols": ["MySQL", "TCP"], "requirements": ["Point the database client at the local proxy"], "file": "scenario-packs/databases/mysql-slow-queries.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/mysql-slow-queries.yaml" }, { "id": "database-pool-exhaustion", "title": "Database pool exhaustion", "category": "databases", "status": "stable", "description": "Reject connections beyond a deterministic concurrent connection limit.", "protocols": ["PostgreSQL", "MySQL", "TCP"], "requirements": ["Point the database client at the local proxy"], "file": "scenario-packs/databases/pool-exhaustion.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/pool-exhaustion.yaml" }, { "id": "network-dns-spoof", "title": "DNS spoofing", "category": "network", "status": "stable", "description": "Return a deterministic fake address for matching DNS questions.", "protocols": ["DNS", "UDP"], "requirements": ["Point the resolver at the local DNS proxy"], "file": "scenario-packs/network/dns-spoof.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/network/dns-spoof.yaml" }, { "id": "hls-missing-segments", "title": "Missing HLS segments", "category": "media", "status": "stable", "description": "Return 404 for a configurable percentage of media segment requests.", "protocols": ["HLS", "HTTP"], "requirements": ["Point the player at the local proxy"], "file": "scenario-packs/media/hls-missing-segments.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/media/hls-missing-segments.yaml" }, { "id": "hls-stale-manifest", "title": "Stale HLS manifest", "category": "media", "status": "stable", "description": "Replace a live playlist with a deterministic stale HLS manifest.", "protocols": ["HLS", "HTTP"], "requirements": ["Point the player at the local proxy"], "file": "scenario-packs/media/hls-stale-manifest.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/media/hls-stale-manifest.yaml" }, { "id": "media-bitrate-oscillation", "title": "Adaptive bitrate oscillation", "category": "media", "status": "stable", "description": "Alternate downstream bandwidth ceilings across scenario phases.", "protocols": ["HLS", "DASH", "TCP"], "requirements": ["Point the player at the local proxy"], "file": "scenario-packs/media/bitrate-oscillation.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/media/bitrate-oscillation.yaml" }, { "id": "webrtc-signaling-delay", "title": "WebRTC signaling delay", "category": "media", "status": "stable", "description": "Delay WebRTC signaling requests while leaving media packets untouched.", "protocols": ["WebRTC signaling", "HTTP"], "requirements": ["Point signaling requests at the local proxy"], "file": "scenario-packs/media/webrtc-signaling-delay.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/media/webrtc-signaling-delay.yaml" }, { "id": "media-keyframe-loss", "title": "Codec-aware keyframe loss", "category": "media", "status": "planned", "description": "Drop RTP packets belonging specifically to video keyframes.", "protocols": ["RTP", "WebRTC"], "requirements": ["Codec-aware RTP parser not implemented"], "file": "scenario-packs/media/keyframe-loss.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/media/keyframe-loss.yaml" }, { "id": "kafka-rebalance", "title": "Kafka rebalance pressure", "category": "queues", "status": "experimental", "description": "Intermittently disconnect broker traffic so clients exercise recovery and rebalance paths.", "protocols": ["Kafka", "TCP"], "requirements": ["Point the Kafka client at the local proxy"], "file": "scenario-packs/queues/kafka-rebalance.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/queues/kafka-rebalance.yaml" }, { "id": "rabbitmq-ack-loss", "title": "RabbitMQ acknowledgement loss", "category": "queues", "status": "experimental", "description": "Cut client-to-broker traffic after initial bytes so later acknowledgements cannot arrive.", "protocols": ["AMQP", "TCP"], "requirements": ["Point the RabbitMQ client at the local proxy"], "file": "scenario-packs/queues/rabbitmq-ack-loss.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/queues/rabbitmq-ack-loss.yaml" }, { "id": "nats-disconnect", "title": "NATS disconnects", "category": "queues", "status": "stable", "description": "Close selected NATS connections after a deterministic timeout.", "protocols": ["NATS", "TCP"], "requirements": ["Point the NATS client at the local proxy"], "file": "scenario-packs/queues/nats-disconnect.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/queues/nats-disconnect.yaml" }, { "id": "nats-duplicate-delivery", "title": "NATS duplicate delivery", "category": "queues", "status": "experimental", "description": "Duplicate selected downstream NATS protocol frames.", "protocols": ["NATS", "TCP"], "requirements": ["Point the NATS client at the local proxy"], "file": "scenario-packs/queues/nats-duplicate-delivery.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/queues/nats-duplicate-delivery.yaml" }, { "id": "mqtt-packet-loss", "title": "MQTT packet loss", "category": "iot", "status": "experimental", "description": "Apply native Linux network packet loss during MQTT experiments.", "protocols": ["MQTT", "IP"], "requirements": ["Linux", "tc", "CAP_NET_ADMIN"], "file": "scenario-packs/iot/mqtt-packet-loss.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/iot/mqtt-packet-loss.yaml" }, { "id": "mqtt-retained-corruption", "title": "MQTT retained-message corruption", "category": "iot", "status": "experimental", "description": "Corrupt selected broker-to-device bytes, including retained payload delivery.", "protocols": ["MQTT", "TCP"], "requirements": ["Point devices at the local proxy"], "file": "scenario-packs/iot/mqtt-retained-corruption.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/iot/mqtt-retained-corruption.yaml" }, { "id": "mqtt-intermittent-connectivity", "title": "Intermittent MQTT devices", "category": "iot", "status": "stable", "description": "Close a configurable portion of device connections after a timeout.", "protocols": ["MQTT", "TCP"], "requirements": ["Point devices at the local proxy"], "file": "scenario-packs/iot/mqtt-intermittent-connectivity.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/iot/mqtt-intermittent-connectivity.yaml" }, { "id": "object-partial-upload", "title": "Partial object upload", "category": "object-storage", "status": "stable", "description": "Cut upload streams after a deterministic byte limit.", "protocols": ["S3-compatible", "Azure Blob", "GCS-compatible", "TCP"], "requirements": ["Point the storage client at the local proxy"], "file": "scenario-packs/object-storage/partial-upload.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/object-storage/partial-upload.yaml" }, { "id": "object-stale-read", "title": "Stale object read", "category": "object-storage", "status": "stable", "description": "Replace one object response with deterministic stale content.", "protocols": ["S3-compatible", "HTTP"], "requirements": ["Point the storage client at the local proxy"], "file": "scenario-packs/object-storage/stale-read.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/object-storage/stale-read.yaml" }, { "id": "object-throttling", "title": "Object-store throttling", "category": "object-storage", "status": "stable", "description": "Return HTTP 429 for selected object-store requests.", "protocols": ["S3-compatible", "Azure Blob", "GCS-compatible", "HTTP"], "requirements": ["Point the storage client at the local proxy"], "file": "scenario-packs/object-storage/throttling.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/object-storage/throttling.yaml" }, { "id": "object-corrupt-download", "title": "Corrupt object download", "category": "object-storage", "status": "stable", "description": "Corrupt selected downstream response bytes.", "protocols": ["S3-compatible", "Azure Blob", "GCS-compatible", "TCP"], "requirements": ["Point the storage client at the local proxy"], "file": "scenario-packs/object-storage/corrupt-download.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/object-storage/corrupt-download.yaml" }, { "id": "pipeline-zero-buffer-backpressure", "title": "Zero-buffer producer backpressure", "category": "data-pipelines", "status": "stable", "kind": "pipeline_fault_plan", "description": "Stall a capacity-zero rendezvous consumer and measure the resulting producer blocking without hiding records in a queue.", "protocols": ["JSONL", "Zero-buffer channels", "Streaming pipelines", "Backpressure"], "requirements": ["JSON Lines records accepted by chaos pipeline replay"], "file": "scenario-packs/data-pipelines/zero-buffer-backpressure.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/data-pipelines/zero-buffer-backpressure.yaml" }, { "id": "pipeline-abrupt-end-of-stream", "title": "Abrupt end-of-stream", "category": "data-pipelines", "status": "stable", "kind": "pipeline_fault_plan", "description": "End a record stream at a deterministic boundary and prove record loss detection plus exact restored replay.", "protocols": ["JSONL", "Event streaming", "ETL", "ELT"], "requirements": ["JSON Lines records accepted by chaos pipeline replay"], "file": "scenario-packs/data-pipelines/abrupt-end-of-stream.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/data-pipelines/abrupt-end-of-stream.yaml" }, { "id": "pipeline-event-time-regression", "title": "Event-time and watermark regression", "category": "data-pipelines", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Move selected event timestamps backwards to exercise late-data, watermark, and window-recomputation policy.", "protocols": ["Apache Flink", "Kafka Streams", "Spark Structured Streaming", "Event time"], "requirements": ["Records with timestamp_ns"], "file": "scenario-packs/data-pipelines/event-time-regression.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/data-pipelines/event-time-regression.yaml" }, { "id": "pipeline-hot-key-collapse", "title": "Hot-key partition collapse", "category": "data-pipelines", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Collapse selected routing keys onto one value to expose partition skew, head-of-line blocking, and noisy-neighbor behavior.", "protocols": ["Kafka", "Pulsar", "Kinesis", "Partitioned streams"], "requirements": ["Records with routing keys"], "file": "scenario-packs/data-pipelines/hot-key-collapse.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/data-pipelines/hot-key-collapse.yaml" }, { "id": "pipeline-cdc-commit-marker-loss", "title": "CDC transaction commit-marker loss", "category": "data-pipelines", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Drop transaction-end records while retaining row changes to test atomicity and incomplete-transaction recovery.", "protocols": ["Debezium", "Change Data Capture", "Outbox", "Transaction streams"], "requirements": ["Normalized records with data.kind transaction_end markers"], "file": "scenario-packs/data-pipelines/cdc-commit-marker-loss.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/data-pipelines/cdc-commit-marker-loss.yaml" }, { "id": "pipeline-schema-poison", "title": "Schema-registry poison record", "category": "data-pipelines", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Replace selected schema versions with an incompatible marker to test dead-letter and poison-record handling.", "protocols": ["Schema Registry", "Avro", "Protobuf", "JSON Schema"], "requirements": ["Normalized records with data.schema_version"], "file": "scenario-packs/data-pipelines/schema-poison.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/data-pipelines/schema-poison.yaml" }, { "id": "network-websocket-slow-consumer", "title": "WebSocket slow consumer", "category": "data-pipelines", "status": "experimental", "description": "Constrain downstream bandwidth to exercise WebSocket backpressure, queue limits, disconnect, and resubscription behavior.", "protocols": ["WebSocket", "Real-time APIs", "Market data"], "requirements": ["Point the WebSocket client at the local proxy"], "file": "scenario-packs/network/websocket-slow-consumer.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/network/websocket-slow-consumer.yaml" }, { "id": "network-grpc-stream-truncation", "title": "gRPC stream truncation", "category": "data-pipelines", "status": "experimental", "description": "Cut a long-lived HTTP/2 transport stream after deterministic bytes to test retry, resume tokens, and idempotency.", "protocols": ["gRPC", "HTTP/2", "Streaming RPC"], "requirements": ["Point the gRPC client at the local proxy"], "file": "scenario-packs/network/grpc-stream-truncation.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/network/grpc-stream-truncation.yaml" }, { "id": "network-graphql-partial-response", "title": "GraphQL partial JSON response", "category": "network", "status": "experimental", "description": "Truncate GraphQL response bodies to test HTTP-success responses containing incomplete JSON and partial data.", "protocols": ["GraphQL", "HTTP", "JSON"], "requirements": ["Point the GraphQL client at the local HTTP proxy"], "file": "scenario-packs/network/graphql-partial-response.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/network/graphql-partial-response.yaml" }, { "id": "database-redis-response-lag", "title": "Redis directional response lag", "category": "databases", "status": "experimental", "description": "Delay server-to-client Redis traffic while requests remain fast to expose command timeouts, pool pressure, and stale-cache fallback.", "protocols": ["Redis", "RESP", "Valkey", "TCP"], "requirements": ["Point the Redis or Valkey client at the local proxy"], "file": "scenario-packs/databases/redis-response-lag.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/databases/redis-response-lag.yaml" }, { "id": "observability-otel-cardinality-explosion", "title": "OpenTelemetry cardinality explosion", "category": "observability", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Create a unique selected attribute value per telemetry record to test collector memory, limits, cost controls, and TSDB protection.", "protocols": ["OpenTelemetry", "OTLP", "Prometheus", "Metrics pipelines"], "requirements": ["Normalized telemetry records with data.attributes.tenant_id"], "file": "scenario-packs/observability/otel-cardinality-explosion.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/observability/otel-cardinality-explosion.yaml" }, { "id": "observability-otel-timestamp-regression", "title": "OpenTelemetry timestamp regression", "category": "observability", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Regress selected telemetry timestamps to test temporality conversion, out-of-order samples, and late-span handling.", "protocols": ["OpenTelemetry", "OTLP", "Prometheus remote write", "Tracing"], "requirements": ["Normalized telemetry records with timestamp_ns"], "file": "scenario-packs/observability/otel-timestamp-regression.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/observability/otel-timestamp-regression.yaml" }, { "id": "trading-market-data-reordering", "title": "Market-data reordering", "category": "trading", "status": "stable", "description": "Reorder a downstream feed while deterministic replay verifies sequence detection and exact state recovery.", "protocols": ["Market data", "TCP", "ITCH-like feeds"], "requirements": ["Point a simulated market-data client at the local proxy"], "file": "scenario-packs/trading/market-data-reordering.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/trading/market-data-reordering.yaml" }, { "id": "trading-fix-session-corruption", "title": "FIX session corruption", "category": "trading", "status": "stable", "description": "Duplicate and corrupt FIX traffic with message-aware sequence, PossDup, and checksum evidence fixtures.", "protocols": ["FIX 4.x", "TCP"], "requirements": ["Disposable FIX acceptor or checked-in FIX fixture"], "file": "scenario-packs/trading/fix-session-corruption.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/trading/fix-session-corruption.yaml" }, { "id": "trading-order-ack-tail-latency", "title": "Order acknowledgement tail latency", "category": "trading", "status": "stable", "description": "Degrade an order gateway and enforce a nanosecond p99 acknowledgement-latency budget.", "protocols": ["Order entry", "FIX", "TCP"], "requirements": ["Simulated order gateway or checked-in acknowledgement fixture"], "file": "scenario-packs/trading/order-ack-tail-latency.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/trading/order-ack-tail-latency.yaml" }, { "id": "trading-venue-partition", "title": "Single-venue partition", "category": "trading", "status": "experimental", "description": "Partition one simulated venue to test cancel-on-disconnect, failover, and risk controls.", "protocols": ["Venue connectivity", "TCP"], "requirements": ["Point one simulated venue session at the local proxy"], "file": "scenario-packs/trading/venue-partition.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/trading/venue-partition.yaml" }, { "id": "trading-crypto-snapshot-loss", "title": "Crypto order-book snapshot loss", "category": "trading", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Drop full-book snapshots while retaining deltas to test exchange reconnect, checksum, and resynchronization policy.", "protocols": ["Crypto exchange WebSocket", "L2 order book", "Snapshot and delta"], "requirements": ["Normalized records with data.kind snapshot"], "file": "scenario-packs/trading/crypto-snapshot-loss.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/trading/crypto-snapshot-loss.yaml" }, { "id": "trading-crypto-sequence-reset", "title": "Crypto exchange sequence reset", "category": "trading", "status": "experimental", "kind": "pipeline_fault_plan", "description": "Reset one symbol partition's sequence mid-stream to test stale-delta rejection and forced snapshot recovery.", "protocols": ["Crypto exchange WebSocket", "Market data", "Order book"], "requirements": ["Normalized BTC-USDT partition records"], "file": "scenario-packs/trading/crypto-sequence-reset.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/trading/crypto-sequence-reset.yaml" }, { "id": "windows-service-outage", "title": "Windows service outage", "category": "windows", "status": "experimental", "description": "Stop a Windows service and restore it only when it was originally running.", "protocols": ["Windows Service Control Manager"], "requirements": ["Windows", "Administrator"], "file": "scenario-packs/windows/service-outage.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/windows/service-outage.yaml" }, { "id": "windows-locked-file", "title": "Windows locked file", "category": "windows", "status": "experimental", "description": "Hold an exclusive file handle and verify competing opens fail.", "protocols": ["Win32 file sharing"], "requirements": ["Windows", "Disposable file"], "file": "scenario-packs/windows/locked-file.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/windows/locked-file.yaml" }, { "id": "windows-handle-exhaustion", "title": "Windows handle exhaustion", "category": "windows", "status": "experimental", "description": "Open measurable exclusive file handles and remove every temporary artifact on recovery.", "protocols": ["Win32 handles"], "requirements": ["Windows"], "file": "scenario-packs/windows/handle-exhaustion.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/windows/handle-exhaustion.yaml" }, { "id": "windows-named-pipe-blackhole", "title": "Windows named-pipe blackhole", "category": "windows", "status": "experimental", "description": "Accept a named-pipe client and intentionally withhold responses until cleanup.", "protocols": ["Windows named pipes"], "requirements": ["Windows", "Point the client at the generated pipe"], "file": "scenario-packs/windows/named-pipe-blackhole.yaml", "download_url": "https://raw.githubusercontent.com/Ninian-Lemain/chaos-engineering-rs/main/scenario-packs/windows/named-pipe-blackhole.yaml" } ] }