Your Staging Environment Is Not an Anvil
Chaos engineering only proves resilience when the hammer hits where the load actually falls.
The hook
Six weeks ago a platform team I consult for declared their payment processing pipeline "resilient." They had run ten chaos experiments in staging over two weeks, all using Gremlin. CPU stress, network latency, disk I/O faults. All ten passed. Then a Redis connection pool exhaustion in production took down checkout for forty-seven minutes during a Thursday evening traffic spike. Staging had eleven concurrent users. Production had four thousand. They had tested a fake diamond and declared it real.
हिरा ठेवितां ऐरणी · A Diamond Placed on the Anvil
हिरा ठेवितां ऐरणी । वांचे मारितां जो घणी ॥
तोचि मोल पावे खरा । करणीचा होय चुरा ॥
तुका म्हणे तोचि संत । सोसी जगाचे आघात ॥
The real diamond survives the hammer on the anvil; the fake crumbles. True worth is proven only under real pressure, not under controlled conditions.
What I keep seeing
The post-incident review was revealing. Their Redis client library (ioredis in a Node.js stack) had a default connection pool size of ten. In staging, ten connections served eleven users without contention. In production, under a flash sale pattern (burst of writes, sustained read tail), the pool exhausted and requests queued until TCP timeout killed them. Gremlin's latency injection had added 200ms of delay but never simulated connection pool contention because the pool never filled in staging.
I have made this exact mistake. Years ago I ran a disaster-recovery drill against a staging database with 50,000 rows and declared our failover "tested." Production had 14 million rows. The failover took eight times longer than our drill predicted. The word "tested" did a lot of heavy lifting that day.
Every team I talk to runs chaos experiments. Almost none of them run chaos experiments that could actually falsify their resilience claims. That is not chaos engineering. That is a comfort ritual with dashboards.
The mechanics
Chaos engineering, as Netflix formalized it with Chaos Monkey in 2011, was always about production. The original Simian Army ran against Netflix's production AWS infrastructure during business hours. The premise was explicit: you cannot know how a system fails under real conditions by testing it under fake conditions.
Staging environments differ from production in at least four dimensions. Traffic volume: many failure modes are concurrency-dependent; a connection pool, a mutex, a rate limiter behave linearly at low concurrency and nonlinearly at high concurrency. Data distribution: a query that runs in 3ms against 10,000 rows runs in 900ms against 40 million rows with different index selectivity. State accumulation: production carries months of cached entries, stale sessions, orphaned records, half-migrated schemas that staging, rebuilt fresh every deploy, never has. Network topology: staging typically runs in a single AZ with local DNS; production spans regions with cross-AZ latency and partition events.
When you inject a fault in staging, you test your system's response to that fault in the absence of all four forces. The result is not "our system handles this fault." The result is "our system handles this fault when nothing else is going wrong." Those are very different statements.
Where Tuka comes in
Tukaram's anvil metaphor is not about suffering for its own sake. It is about the epistemic value of real conditions. हिरा ठेवितां ऐरणी, वांचे मारितां जो घणी: a diamond placed on the anvil, surviving when struck by the hammer. This is a test protocol. The anvil is production: hard, real, shaped by actual forces. The hammer is the fault. And करणीचा होय चुरा (the fake crumbles to powder) is the observation that controlled conditions cannot distinguish real from fake.
The structural claim is falsifiability. A staging chaos test cannot falsify your resilience claim because the conditions are too gentle. It is like testing a bridge with a bicycle and declaring it ready for trucks.
What I would actually do
Run chaos experiments in production, with guardrails. Use Gremlin or LitmusChaos with automated rollback triggers: if error rate exceeds your SLO threshold for ninety seconds, the experiment aborts. Start small: one pod, one availability zone, non-peak hours. Measure blast radius. Expand. Do this monthly, not quarterly. If your organization will not approve production chaos, then at minimum replay production traffic volume into staging using GoReplay or Speedscale, load a sanitized production data snapshot, and deploy across multiple AZs. Anything less, and you are polishing glass and calling it diamond.
Chetan Dhandal