{
  "meta": {
    "version": "0.1.0",
    "generatedAt": "2026-08-23T19:47:11.239Z",
    "generatedBy": "scripts/sync-coverage.mjs — do not edit by hand",
    "catalog": {
      "source": "DataAgent product fault catalog",
      "sha": "0efc434",
      "contentHash": "26c8833516c70eeec2d06c4ced88f390f662bdcf5f48bd0a411c4857c7624688",
      "faultCount": 35
    }
  },
  "inputsHash": "d5ae8f4e9d8296a55dffdb5edc9f705ccf733304fb0ce9a5b8d616dd0b5082a2",
  "faults": {
    "netpol_block": {
      "plane": "k8s",
      "group": "network",
      "description": "NetPol block checkout→postgres:5432",
      "remediation": "Add an egress rule to checkout-netpol allowing TCP 5432 to postgres.",
      "class": "network_partition"
    },
    "cpu_squeeze": {
      "plane": "k8s",
      "description": "CPU limit 500m→10m + stress load",
      "remediation": "Restore the checkout CPU limit (500m) / right-size requests+limits.",
      "class": "resource_exhaustion"
    },
    "postgres_s3_deny": {
      "plane": "aws",
      "group": "aws",
      "description": "IAM deny S3:* on postgres IRSA",
      "remediation": "Remove the deny / restore the postgres role's S3 permissions.",
      "class": "iam_permission_drift"
    },
    "checkout_sm_deny": {
      "plane": "aws",
      "group": "aws",
      "description": "IAM deny SM:GetSecretValue on checkout IRSA",
      "remediation": "Restore the checkout role's GetSecretValue permission.",
      "class": "iam_permission_drift"
    },
    "bad_image": {
      "plane": "k8s",
      "description": "Bad ECR image → ImagePullBackOff",
      "remediation": "Roll the deployment back to a valid (existing) image tag.",
      "class": "crash_loop"
    },
    "unschedulable_cpu": {
      "plane": "k8s",
      "group": "scheduling",
      "description": "Unschedulable resource requests",
      "remediation": "Lower the CPU request to fit a node (or add capacity).",
      "class": "scheduling_failure"
    },
    "broken_probe": {
      "plane": "k8s",
      "description": "Liveness probe misconfiguration → CrashLoop",
      "remediation": "Fix the liveness probe path back to the real health endpoint.",
      "class": "probe_failure"
    },
    "init_container_fail": {
      "plane": "k8s",
      "description": "Init container with bad image → Init:ImagePullBackOff",
      "remediation": "Correct or remove the init-container image reference.",
      "class": "crash_loop"
    },
    "pvc_unbound": {
      "plane": "k8s",
      "group": "storage",
      "description": "Standalone PVC with missing StorageClass → Pending",
      "remediation": "Point the PVC at a valid StorageClass (or create it).",
      "class": "storage_failure"
    },
    "pdb_blocking_rollout": {
      "plane": "k8s",
      "group": "scheduling",
      "description": "PDB minAvailable matches replicas → eviction blocked",
      "remediation": "Lower PDB minAvailable (or raise replicas) so a pod can be evicted.",
      "class": "bad_deployment"
    },
    "sts_stuck_pvc": {
      "plane": "k8s",
      "group": "storage",
      "description": "StatefulSet PVC stuck Pending on missing StorageClass",
      "remediation": "Fix the StatefulSet StorageClass to a provisionable one.",
      "class": "storage_failure"
    },
    "hpa_cannot_scale": {
      "plane": "k8s",
      "group": "scheduling",
      "description": "ResourceQuota pods=3 blocks HPA scale-up",
      "remediation": "Raise the ResourceQuota pod limit (or free quota).",
      "class": "resource_exhaustion"
    },
    "service_zero_endpoints": {
      "plane": "k8s",
      "description": "Service selector swapped → Endpoints empty → ALB 503",
      "remediation": "Fix the Service selector to match the deployment's pod labels.",
      "class": "service_failure"
    },
    "configmap_drift": {
      "plane": "k8s",
      "description": "ConfigMap feature flag flipped → checkout returns 503",
      "remediation": "Restore the ConfigMap value and roll the checkout pods.",
      "class": "config_drift"
    },
    "rbac_denied": {
      "plane": "k8s",
      "description": "Probe pod's `list configmaps` denied — Role missing `list` verb",
      "remediation": "Grant the missing RBAC verb in the Role/RoleBinding.",
      "class": "rbac_denial"
    },
    "cert_expired": {
      "plane": "k8s",
      "description": "cert-manager Certificate references a missing Issuer — never issued",
      "remediation": "Create the missing Issuer, or point the Certificate at an existing one.",
      "class": "cert_failure"
    },
    "elb_unhealthy": {
      "plane": "aws",
      "group": "aws",
      "description": "ALB target group health check path → 404 → unhealthy",
      "remediation": "Restore the target group's health-check path.",
      "class": "external_service_failure"
    },
    "sg_rule_block": {
      "plane": "aws",
      "group": "aws",
      "description": "EC2 RevokeSecurityGroupIngress on a placeholder SG (CloudTrail-driven)",
      "remediation": "Re-authorize the security-group ingress rule.",
      "class": "iam_permission_drift"
    },
    "db_conn_exhaustion": {
      "plane": "k8s",
      "description": "Postgres max_connections capped + conn-hog → FATAL: too many clients (RDS conn-storm proxy)",
      "remediation": "Kill the connection hog and/or raise max_connections; fix the connection leak.",
      "class": "resource_exhaustion"
    },
    "dependency_egress_block": {
      "plane": "k8s",
      "group": "network",
      "description": "Drop checkout :443 egress → SM/STS/external HTTPS unreachable (managed-dep network partition; SQS/RDS-endpoint/Elastic proxy)",
      "remediation": "Restore the :443 egress rule in the checkout NetworkPolicy.",
      "class": "dependency_unavailable"
    },
    "sg_db_block": {
      "plane": "aws",
      "group": "aws",
      "description": "Revoke 5432 ingress on the RDS security group → app loses its DB path (real network partition to RDS)",
      "remediation": "Re-authorize the :5432 ingress on the RDS security group.",
      "class": "dependency_unavailable"
    },
    "rds_failover": {
      "plane": "aws",
      "group": "aws",
      "description": "reboot-with-ForceFailover the Multi-AZ RDS instance → writer endpoint blips, connections drop",
      "remediation": "Transient — ensure the app's pool reconnects/retries; investigate the failover trigger if unexpected.",
      "class": "dependency_unavailable"
    },
    "sqs_receive_deny": {
      "plane": "aws",
      "group": "aws",
      "description": "IAM deny sqs:ReceiveMessage on the SQS-consumer IRSA role → AccessDenied on poll",
      "remediation": "Restore the consumer role's sqs:ReceiveMessage permission.",
      "class": "iam_permission_drift"
    },
    "dns_failure": {
      "plane": "k8s",
      "group": "network",
      "description": "Drop checkout :53 (DNS) egress → name resolution fails for postgres Service + SM hostname (UnknownHostException)",
      "remediation": "Restore DNS (:53) egress / fix the pod dnsConfig.",
      "class": "dependency_unavailable"
    },
    "redis_egress_block": {
      "plane": "k8s",
      "group": "network",
      "description": "Drop checkout-java :6379 egress → Redis cache unreachable → Lettuce RedisCommandTimeoutException on /checkout (503)",
      "remediation": "Restore the :6379 egress rule in checkout-java-netpol (or fix the cache route).",
      "class": "dependency_unavailable"
    },
    "kafka_egress_block": {
      "plane": "k8s",
      "description": "Drop checkout-java :9092 egress → Kafka broker unreachable → org.apache.kafka TimeoutException on /checkout (503)",
      "remediation": "Restore the :9092 egress rule in checkout-java-netpol (or fix the broker route).",
      "class": "dependency_unavailable"
    },
    "karpenter_capacity": {
      "plane": "k8s",
      "group": "scheduling",
      "description": "Workload requests more CPU than any NodePool instance type → Karpenter can't provision → pods Pending (FailedScheduling)",
      "remediation": "Reduce the request to a satisfiable size, or widen the NodePool instance-type/limits.",
      "class": "capacity_exhaustion"
    },
    "karpenter_runinstances_deny": {
      "plane": "aws",
      "group": "aws",
      "description": "IAM deny ec2:RunInstances on the Karpenter controller role → no new nodes (DISRUPTIVE; tight window)",
      "remediation": "Restore the Karpenter controller role's ec2:RunInstances/CreateFleet permissions.",
      "class": "iam_permission_drift"
    },
    "jvm_oom": {
      "plane": "k8s",
      "group": "runtime",
      "description": "POST /admin/oom — JVM heap leak → java.lang.OutOfMemoryError → pod OOMKilled",
      "remediation": "Stop the leak / restart the pod; right-size the JVM heap (-Xmx) and the container memory limit.",
      "class": "resource_exhaustion"
    },
    "latency_brownout": {
      "plane": "k8s",
      "group": "runtime",
      "description": "POST /admin/latency — per-request handler delay → /checkout p95 climbs + thread pool saturates (pod stays Ready)",
      "remediation": "Remove the injected delay; size the thread pool / add capacity to absorb the latency.",
      "class": "resource_exhaustion"
    },
    "sqs_consumer_stall": {
      "plane": "aws",
      "group": "aws",
      "description": "POST /admin/sqs-consumer enabled=false — consumer stops polling → SQS backlog (ApproximateNumberOfMessagesVisible) grows unbounded",
      "remediation": "Restart/unblock the consumer so it drains the queue; investigate why acking stalled.",
      "class": "dependency_unavailable"
    },
    "sqs_poison_messages": {
      "plane": "aws",
      "group": "aws",
      "description": "POST /admin/poison rate=0.5 — malformed messages exceed max-receive → DLQ depth spikes (DLQ storm)",
      "remediation": "Drain/triage the DLQ, fix the message contract or consumer parsing, and replay valid messages.",
      "class": "service_failure"
    },
    "external_secret_sync_failure": {
      "plane": "aws",
      "group": "aws",
      "description": "ExternalSecret sync failure (UpdateFailed)",
      "remediation": "Fix the backing secret's IRSA permissions, or correct the ExternalSecret spec if the source key/path changed.",
      "class": "secret_sync_failure"
    },
    "failed_prestop_hook": {
      "plane": "k8s",
      "description": "Pod preStop hook failure during termination (FailedPreStopHook)",
      "remediation": "Fix the preStop hook command, or extend terminationGracePeriodSeconds so the hook reliably completes.",
      "class": "workload_lifecycle"
    },
    "failed_daemon_pod": {
      "plane": "k8s",
      "description": "DaemonSet pod scheduling failure during node lifecycle transition (FailedDaemonPod)",
      "remediation": "Correlate with the node lifecycle event (drain, spot interruption, scale-down) and confirm the DaemonSet tolerates it.",
      "class": "node_lifecycle"
    }
  },
  "severity": {
    "jvm_oom": "critical",
    "cpu_squeeze": "critical",
    "db_conn_exhaustion": "critical",
    "sqs_consumer_stall": "critical",
    "service_zero_endpoints": "critical",
    "postgres_s3_deny": "critical",
    "latency_brownout": "critical",
    "dns_failure": "critical",
    "elb_unhealthy": "critical",
    "rds_failover": "critical",
    "unschedulable_cpu": "critical",
    "cert_expired": "critical",
    "kafka_egress_block": "critical",
    "bad_image": "warning",
    "broken_probe": "warning",
    "init_container_fail": "warning",
    "rbac_denied": "warning",
    "dependency_egress_block": "warning",
    "sg_rule_block": "warning",
    "sg_db_block": "warning",
    "pvc_unbound": "warning",
    "hpa_cannot_scale": "warning",
    "netpol_block": "warning",
    "configmap_drift": "warning",
    "checkout_sm_deny": "warning",
    "karpenter_capacity": "warning",
    "karpenter_runinstances_deny": "warning",
    "redis_egress_block": "warning",
    "sqs_poison_messages": "warning",
    "sqs_receive_deny": "warning",
    "pdb_blocking_rollout": "warning",
    "sts_stuck_pvc": "warning"
  },
  "components": {
    "platform": [
      "k8s",
      "ecs",
      "lambda",
      "bare-metal"
    ],
    "clusters": [
      "eks",
      "gke",
      "aks"
    ],
    "awsServices": [
      "rds",
      "sqs",
      "s3",
      "opensearch",
      "elasticache",
      "alb",
      "cloudfront",
      "dynamodb",
      "kinesis",
      "msk",
      "bedrock"
    ],
    "dataStores": [
      "mongodb",
      "elastic_cloud"
    ],
    "runtimes": [
      "java",
      "python",
      "nodejs",
      "go",
      "ruby",
      "dotnet",
      "rust"
    ],
    "patterns": [
      "microservices",
      "monolith",
      "serverless"
    ],
    "clusterSizes": [
      "cluster_small",
      "cluster_medium",
      "cluster_large"
    ],
    "obsMetrics": [
      "amp",
      "cloudwatch",
      "grafana_cloud",
      "datadog",
      "newrelic",
      "none"
    ],
    "obsLogs": [
      "cloudwatch_logs",
      "loki",
      "opensearch",
      "elastic",
      "elastic_cloud",
      "none"
    ],
    "obsTraces": [
      "xray",
      "none"
    ],
    "implied": [
      "iam"
    ],
    "noRules": [
      "gke",
      "aks",
      "ecs",
      "lambda",
      "bare-metal",
      "dynamodb",
      "kinesis"
    ]
  },
  "rules": [
    {
      "requires": [
        "k8s"
      ],
      "fault": "bad_image",
      "repro": "replayable",
      "confidence": "high",
      "why": "K8s workloads pull bad or unavailable container images"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "broken_probe",
      "repro": "replayable",
      "confidence": "high",
      "why": "Liveness/readiness probe misconfiguration crash-loops pods"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "init_container_fail",
      "repro": "replayable",
      "confidence": "high",
      "why": "Init container failures block the main container from starting"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "NEW:pod-not-ready",
      "repro": "planned",
      "confidence": "high",
      "why": "Pods enter not-ready state from resource constraints or config errors"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "service_zero_endpoints",
      "repro": "replayable",
      "confidence": "high",
      "why": "Services lose all ready endpoints when pods crash or fail probes"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "cpu_squeeze",
      "repro": "planned",
      "confidence": "high",
      "why": "Container CPU limits cause throttling under burst load"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "pvc_unbound",
      "repro": "replayable",
      "confidence": "high",
      "why": "PersistentVolumeClaims fail to bind (storage class unavailable, quota)"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "unschedulable_cpu",
      "repro": "replayable",
      "confidence": "high",
      "why": "Pods fail to schedule when nodes lack available CPU or memory"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "rbac_denied",
      "repro": "replayable",
      "confidence": "high",
      "why": "K8s RBAC misconfigurations block service accounts from accessing resources"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "configmap_drift",
      "repro": "replayable",
      "confidence": "low",
      "why": "ConfigMap / env drift causes silent misconfiguration at rollout"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "hpa_cannot_scale",
      "repro": "replayable",
      "confidence": "low",
      "why": "HPA fails to scale out when metrics are absent or a PDB blocks rollout"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "pdb_blocking_rollout",
      "repro": "replayable",
      "confidence": "low",
      "why": "PodDisruptionBudget blocks rolling updates when min-available is tight"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "netpol_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "NetworkPolicy rules accidentally block inter-service traffic"
    },
    {
      "requires": [
        "k8s"
      ],
      "fault": "cert_expired",
      "repro": "planned",
      "confidence": "low",
      "why": "TLS certificates expire and cause connection failures across any HTTPS service"
    },
    {
      "requires": [
        "eks"
      ],
      "fault": "karpenter_capacity",
      "repro": "replayable",
      "confidence": "high",
      "why": "Karpenter node provisioning fails under spot interruption or capacity shortage"
    },
    {
      "requires": [
        "eks"
      ],
      "fault": "karpenter_runinstances_deny",
      "repro": "replayable",
      "confidence": "low",
      "why": "IAM denies ec2:RunInstances — Karpenter nodes fail to provision"
    },
    {
      "requires": [
        "microservices"
      ],
      "fault": "dns_failure",
      "repro": "replayable",
      "confidence": "high",
      "why": "Service-to-service calls rely on DNS; CoreDNS overload causes cascading failures"
    },
    {
      "requires": [
        "microservices"
      ],
      "fault": "dependency_egress_block",
      "repro": "replayable",
      "confidence": "high",
      "why": "Outbound HTTP timeouts / connection resets propagate across service boundaries"
    },
    {
      "requires": [
        "microservices"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "low",
      "why": "Upstream latency cascades into p95 brownouts across service boundaries"
    },
    {
      "requires": [
        "rds"
      ],
      "fault": "db_conn_exhaustion",
      "repro": "replayable",
      "confidence": "high",
      "why": "RDS max_connections exhausted under concurrent load"
    },
    {
      "requires": [
        "rds"
      ],
      "fault": "rds_failover",
      "repro": "planned",
      "confidence": "high",
      "why": "Multi-AZ failover causes brief database unavailability"
    },
    {
      "requires": [
        "rds"
      ],
      "fault": "sg_db_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "Security group rules can block application → RDS port connectivity"
    },
    {
      "requires": [
        "rds"
      ],
      "fault": "NEW:db-lock-contention",
      "repro": "planned",
      "confidence": "high",
      "why": "Postgres lock contention under concurrent writes"
    },
    {
      "requires": [
        "rds",
        "s3"
      ],
      "fault": "postgres_s3_deny",
      "repro": "replayable",
      "confidence": "high",
      "why": "RDS WAL archiving fails when IAM denies s3:PutObject on the backup bucket"
    },
    {
      "requires": [
        "sqs"
      ],
      "fault": "sqs_consumer_stall",
      "repro": "replayable",
      "confidence": "high",
      "why": "Queue backlog grows when consumers are too slow or crash"
    },
    {
      "requires": [
        "sqs"
      ],
      "fault": "sqs_poison_messages",
      "repro": "replayable",
      "confidence": "low",
      "why": "Malformed messages cause consumer crash loops and queue growth"
    },
    {
      "requires": [
        "sqs"
      ],
      "fault": "sqs_receive_deny",
      "repro": "replayable",
      "confidence": "low",
      "why": "IAM denies sqs:ReceiveMessage — consumer fails silently"
    },
    {
      "requires": [
        "sqs",
        "k8s"
      ],
      "fault": "dependency_egress_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "NetworkPolicy or SG rules block pod → SQS endpoint connectivity"
    },
    {
      "requires": [
        "sqs"
      ],
      "fault": "NEW:sqs-dlq-overflow",
      "repro": "planned",
      "confidence": "low",
      "why": "Dead-letter queue fills up when poison messages are not retried or purged"
    },
    {
      "requires": [
        "iam"
      ],
      "fault": "sg_rule_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "Security group misconfiguration blocks inbound or outbound service traffic"
    },
    {
      "requires": [
        "iam"
      ],
      "fault": "checkout_sm_deny",
      "repro": "replayable",
      "confidence": "low",
      "why": "SecretsManager IAM denials block services from fetching credentials at startup"
    },
    {
      "requires": [
        "java"
      ],
      "fault": "jvm_oom",
      "repro": "replayable",
      "confidence": "high",
      "why": "JVM heap exhaustion under memory pressure causes OOMKilled pod crashes"
    },
    {
      "requires": [
        "elasticache"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "low",
      "why": "Redis connection saturation or eviction causes upstream latency brownouts"
    },
    {
      "requires": [
        "elasticache"
      ],
      "fault": "redis_egress_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "Security group / network rules block application → Redis connectivity"
    },
    {
      "requires": [
        "alb"
      ],
      "fault": "elb_unhealthy",
      "repro": "planned",
      "confidence": "high",
      "why": "ALB target groups become unhealthy when pods fail health checks"
    },
    {
      "requires": [
        "alb"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "low",
      "why": "ALB target group health issues increase p95 request latency"
    },
    {
      "requires": [
        "cloudfront"
      ],
      "fault": "latency_brownout",
      "repro": "planned",
      "confidence": "low",
      "why": "CDN edge cache misses or origin errors cause latency spikes"
    },
    {
      "requires": [
        "opensearch"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "low",
      "why": "OpenSearch query latency spikes under shard pressure or JVM GC pauses"
    },
    {
      "requires": [
        "opensearch"
      ],
      "fault": "dependency_egress_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "Network / SG rules can block application → OpenSearch connectivity"
    },
    {
      "requires": [
        "eks",
        "rds"
      ],
      "fault": "sts_stuck_pvc",
      "repro": "replayable",
      "confidence": "low",
      "why": "EBS CSI / STS token expiry causes PVC mount failures on pod restart"
    },
    {
      "requires": [
        "k8s",
        "cluster_medium"
      ],
      "fault": "pdb_blocking_rollout",
      "repro": "replayable",
      "confidence": "high",
      "why": "At medium scale (multi-replica services), PodDisruptionBudgets frequently block rolling updates under load"
    },
    {
      "requires": [
        "k8s",
        "cluster_medium"
      ],
      "fault": "hpa_cannot_scale",
      "repro": "replayable",
      "confidence": "high",
      "why": "At medium scale, HPA scaling failures during traffic spikes cause sustained saturation"
    },
    {
      "requires": [
        "eks",
        "cluster_medium"
      ],
      "fault": "karpenter_capacity",
      "repro": "replayable",
      "confidence": "high",
      "why": "At medium scale (on-demand + Spot mix), Karpenter capacity shortages become a common incident source"
    },
    {
      "requires": [
        "k8s",
        "cluster_large"
      ],
      "fault": "unschedulable_cpu",
      "repro": "replayable",
      "confidence": "high",
      "why": "At large scale (~50k pods), node bin-packing pressure causes frequent scheduling failures"
    },
    {
      "requires": [
        "k8s",
        "cluster_large"
      ],
      "fault": "pdb_blocking_rollout",
      "repro": "replayable",
      "confidence": "high",
      "why": "At large scale (1000+ services), PDB misconfigurations routinely block cluster-wide rollouts"
    },
    {
      "requires": [
        "eks",
        "cluster_large"
      ],
      "fault": "karpenter_capacity",
      "repro": "replayable",
      "confidence": "high",
      "why": "At large scale (multi-cloud, multi-region), node provisioning bottlenecks and spot interruptions are P1 incidents"
    },
    {
      "requires": [
        "sqs",
        "cluster_large"
      ],
      "fault": "sqs_consumer_stall",
      "repro": "replayable",
      "confidence": "high",
      "why": "At large scale (high-throughput queues), consumer stalls cause rapid queue depth growth with blast radius"
    },
    {
      "requires": [
        "xray",
        "k8s"
      ],
      "fault": "dependency_egress_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "X-Ray daemon (UDP 2000) can be blocked by NetworkPolicy, silently dropping trace segments"
    },
    {
      "requires": [
        "xray",
        "microservices"
      ],
      "fault": "NEW:xray-segment-loss",
      "repro": "planned",
      "confidence": "high",
      "why": "Trace segment overflow or misconfigured sampling rate causes trace data loss under high traffic"
    },
    {
      "requires": [
        "bedrock"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "high",
      "why": "LLM inference adds significant p95 latency; any calling service inherits that spike"
    },
    {
      "requires": [
        "bedrock"
      ],
      "fault": "NEW:bedrock-throttle",
      "repro": "planned",
      "confidence": "high",
      "why": "Bedrock per-model TPS limits trigger 429 ThrottlingException under concurrent inference load"
    },
    {
      "requires": [
        "bedrock",
        "microservices"
      ],
      "fault": "NEW:bedrock-model-timeout",
      "repro": "planned",
      "confidence": "high",
      "why": "Inference latency exceeds calling service read-timeout, causing cascading upstream failure"
    },
    {
      "requires": [
        "bedrock"
      ],
      "fault": "dependency_egress_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "VPC endpoint misconfig or SG rules can block pod → Bedrock API endpoint connectivity"
    },
    {
      "requires": [
        "bedrock",
        "iam"
      ],
      "fault": "rbac_denied",
      "repro": "replayable",
      "confidence": "low",
      "why": "Missing bedrock:InvokeModel IAM permission causes silent model call failures"
    },
    {
      "requires": [
        "elastic_cloud"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "high",
      "why": "Elasticsearch query latency spikes under shard pressure, JVM GC, or hot threads"
    },
    {
      "requires": [
        "elastic_cloud"
      ],
      "fault": "dependency_egress_block",
      "repro": "replayable",
      "confidence": "low",
      "why": "Network / SG rules can block application → Elastic Cloud endpoint connectivity"
    },
    {
      "requires": [
        "elastic_cloud"
      ],
      "fault": "jvm_oom",
      "repro": "replayable",
      "confidence": "low",
      "why": "Elasticsearch JVM heap exhaustion under heavy indexing or query load"
    },
    {
      "requires": [
        "elastic_cloud"
      ],
      "fault": "NEW:elastic-shard-failure",
      "repro": "planned",
      "confidence": "high",
      "why": "Shard allocation failures or replica degradation cause partial data unavailability"
    },
    {
      "requires": [
        "mongodb"
      ],
      "fault": "db_conn_exhaustion",
      "repro": "replayable",
      "confidence": "high",
      "why": "MongoDB connection pool exhaustion under concurrent client load"
    },
    {
      "requires": [
        "mongodb"
      ],
      "fault": "latency_brownout",
      "repro": "replayable",
      "confidence": "low",
      "why": "MongoDB query latency spikes from missing indexes, lock contention, or RS elections"
    },
    {
      "requires": [
        "mongodb",
        "k8s"
      ],
      "fault": "pvc_unbound",
      "repro": "replayable",
      "confidence": "high",
      "why": "MongoDB data PVC fails to bind on pod restart (EBS AZ mismatch, storage class)"
    },
    {
      "requires": [
        "mongodb",
        "k8s"
      ],
      "fault": "NEW:pod-not-ready",
      "repro": "planned",
      "confidence": "low",
      "why": "MongoDB pods enter not-ready during RS re-election or PVC mount delays"
    },
    {
      "requires": [
        "mongodb"
      ],
      "fault": "NEW:mongodb-replicaset-failover",
      "repro": "planned",
      "confidence": "high",
      "why": "ReplicaSet primary election causes a brief write-unavailability window"
    },
    {
      "requires": [
        "mongodb"
      ],
      "fault": "NEW:mongodb-lock-contention",
      "repro": "planned",
      "confidence": "low",
      "why": "Global write lock contention under high concurrency causes query queuing"
    },
    {
      "requires": [
        "k8s",
        "msk"
      ],
      "fault": "kafka_egress_block",
      "repro": "replayable",
      "confidence": "high",
      "why": "NetworkPolicy or SG rules block pod → MSK broker egress"
    }
  ],
  "pricing": {
    "meta": {
      "version": "0.1.0",
      "description": "Observability cost model — cluster-size presets and per-tool pricing. Mirrors the ROI calculator (CNCF 2023 Survey + AWS re:Invent benchmarks).",
      "note": "Estimates only; actual spend varies with usage patterns."
    },
    "presets": {
      "small": {
        "clusters": 2,
        "nodesPerCluster": 15,
        "pods": 500,
        "customMetrics": 1000,
        "logsGbMo": 150,
        "tracesMillMo": 5,
        "engineers": 50,
        "resources": 60
      },
      "medium": {
        "clusters": 6,
        "nodesPerCluster": 40,
        "pods": 5000,
        "customMetrics": 8000,
        "logsGbMo": 1500,
        "tracesMillMo": 50,
        "engineers": 300,
        "resources": 350
      },
      "large": {
        "clusters": 25,
        "nodesPerCluster": 40,
        "pods": 25000,
        "customMetrics": 16667,
        "logsGbMo": 5000,
        "tracesMillMo": 167,
        "engineers": 667,
        "resources": 1000
      }
    },
    "assumptions": {
      "cwLogsRetentionMo": 2,
      "cwInsightsScanRatio": 5,
      "lokiCompression": 6,
      "ampScrapesPerMin": 4,
      "s3RateGb": 0.023
    },
    "perNode": {
      "metrics": {
        "datadog": 23,
        "dynatrace": 25,
        "newrelic": 25,
        "splunk": 15
      },
      "logs": {
        "elastic_cloud": 8,
        "opensearch": 5
      },
      "traces": {
        "jaeger": 1.5,
        "tempo": 1.5
      }
    },
    "unitRates": {
      "cloudwatchMetricFirst10k": 0.3,
      "cloudwatchMetricAfter10k": 0.1,
      "ampPerMillionSamples": 0.9,
      "ampFreeBillionSamples": 2,
      "grafanaEditorMo": 9,
      "grafanaViewerMo": 5,
      "cwLogsIngestGb": 0.5,
      "cwLogsStoreGbMo": 0.03,
      "cwInsightsScanGb": 0.005,
      "xrayPerMillionTraces": 5,
      "xrayFreeMillionTraces": 0.1,
      "cloudtrailBase": 20,
      "cloudtrailPerResource": 0.05,
      "cloudtrailPerGbEvents": 0.01
    },
    "optimizer": {
      "pctLow": 40,
      "pctHigh": 50
    }
  }
}
