# Helm-fluent migrant friction — does cub guide a Helm user, or trip them?

**UNOFFICIAL/EXPERIMENTAL.** Live receipt generated by `scripts/run-helm-habit-friction.mjs`; do not hand-edit. Regenerate with `npm run helm-habit:friction`.

**Claim.** A Helm-fluent dev new to cub reaches for correct Helm idioms (--set, -f values.yaml, --input image.tag) that do not map to cub installer's declared-input model. cub safely REJECTS them (no silent mishandle) — but the question for adoption is whether it rejects WITH GUIDANCE toward the cub way, or opaquely. This lane measures that error-message quality. cub is safe; the opaque count is the migration friction to fix.

A skilled Helm user, new to cub, applies **correct Helm idioms** to `cub installer` — `--set`, `-f values.yaml`, `--input image.tag`. They're not careless (that's the [bad-decisions fuzz](../bad-decisions-fuzz/summary.md)) and not adversarial — just muscle memory meeting a different model. 72 cases (9 idioms × 8 packages).

**cub is safe: 0 bug(s)** (no silent mishandle). **But guidance is the gap: 0/72 guided-or-supported vs 72/72 (100%) opaque.** Overall: **pass**.

| cub's response | Count | Share | Meaning |
| --- | --- | --- | --- |
| opaque | 72 | 100% | **friction** — cub rejected but gave a Helm user no migration hint |

## The friction (opaque rejections — the UX to fix)

Each is a correct Helm idiom that cub rejects with a generic message that doesn't point a Helm user to the cub way:

| Helm idiom | Packages | Why a Helm user tries it | cub's (opaque) error |
| --- | --- | --- | --- |
| `--set replicaCount=3` | 8 | Helm's --set flag; cub uses --input | `Error: unknown flag: --set` |
| `--set-string name=x` | 8 | Helm's --set-string | `Error: unknown flag: --set-string` |
| `-f values.yaml` | 8 | Helm's -f values file | `Error: unknown shorthand flag: 'f' in -f` |
| `--values values.yaml` | 8 | Helm's --values | `Error: unknown flag: --values` |
| `--set-file k=file` | 8 | Helm's --set-file | `Error: unknown flag: --set-file` |
| `--input replicaCount=3` | 8 | a valid Helm value path as a cub input | `Error: unknown input "replicaCount"` |
| `--input image.tag=v2` | 8 | Helm image override; cub uses --set-image | `Error: unknown input "image.tag"` |
| `--input resources.requests.cpu=500m` | 8 | a valid Helm resources path as a cub input | `Error: unknown input "resources.requests.cpu"` |
| `--input servers[0]=x` | 8 | Helm array index syntax as a cub input | `Error: unknown input "servers[0]"` |

The fix is **migration guidance in the error** — e.g. `--set` → "cub uses `--input <name>=<value>`; run `cub installer doc` for the inputs", `--input image.tag` → "use `--set-image`". cub already does the safe thing (reject); this makes it teach.

- Receipt: `runs/helm-habit-friction/receipt.yaml`. Companion to the cub-installer fuzz (`data/cub-installer-fuzz/`, careless/adversarial input) — this is the *competent-migrant* lane.
