# Bad-decisions fuzz — "hundreds of stupid devs making random bad decisions"

**UNOFFICIAL/EXPERIMENTAL.** Live receipt generated by `scripts/run-bad-decisions-fuzz.mjs`; do not hand-edit. Regenerate with `npm run bad-decisions:fuzz`.

**Claim.** Across hundreds of random bad config decisions over real catalog charts, every case ends in a named outcome — rejected at render, leaked into a manifest (caught by the k8s API), or silently absorbed (the footgun) — and 0 are unclassified. No bad decision is silently mishandled.

180 bad decisions (18 decision types × 10 charts that baseline-render) fed to real catalog charts via `helm template --set`. Every case is classified; **0 unclassified** (silent outcomes are 0 by construction).

| Outcome | Count | Share | Meaning |
| --- | --- | --- | --- |
| rejected | 2 | 1% | Helm / values.schema.json caught the bad decision at render (best). |
| leaked | 60 | 33% | The bad value rendered into a manifest — the k8s API is the backstop (rejected at apply). Named, not hidden. |
| absorbed | 118 | 66% | Helm silently ignored/defaulted the value — the classic "my --set did nothing" footgun. Surfaced here, not silent. |

Overall: **pass**.

## Per chart

| Chart | Cases | Outcomes |
| --- | --- | --- |
| bitnami/nginx@25.0.0 | 18 | rejected 0 · leaked 11 · absorbed 7 |
| bitnami/redis@27.0.0 | 18 | rejected 0 · leaked 1 · absorbed 17 |
| bitnami/mysql@14.0.3 | 18 | rejected 0 · leaked 1 · absorbed 17 |
| bitnami/mongodb@19.1.0 | 18 | rejected 0 · leaked 11 · absorbed 7 |
| bitnami/rabbitmq@16.0.14 | 18 | rejected 1 · leaked 11 · absorbed 6 |
| fluent/fluent-bit@0.57.6 | 18 | rejected 0 · leaked 10 · absorbed 8 |
| prometheus-community/prometheus@29.9.0 | 18 | rejected 0 · leaked 0 · absorbed 18 |
| grafana/grafana@10.5.15 | 18 | rejected 0 · leaked 8 · absorbed 10 |
| ingress-nginx/ingress-nginx@4.15.1 | 18 | rejected 0 · leaked 0 · absorbed 18 |
| metrics-server/metrics-server@3.13.0 | 18 | rejected 1 · leaked 7 · absorbed 10 |

- The skeptic point: a careless dev's random bad decision is never *silently mishandled* — it is rejected at render, caught by k8s at apply, or shown to be a no-op. The **absorbed** column is the honest footgun count (Helm accepts any `--set` key, so typos vanish).
- Receipt: `runs/bad-decisions-fuzz/receipt.yaml`.
