0109. The safety-check override (formerly ADR 0065's mechanism) is named override
Status: Accepted · Date: 2026-11-03 · Design section: Trust, Validation · Touches: 0065, 0085, 0089, 0094, 0101, 0107, 0108, 0110, 0111
Decided: the permission-gated override of a safety check with a recorded reason (ADR 0065, amended by 0101, 0107 and 0108) is called "override" everywhere, and the earlier name is removed from code, manifests, the UI, the CLI and the docs. The mechanism is unchanged: the user writes a reason, Ichor asks Kubernetes with a SubjectAccessReview made as that user whether they hold the verb, and the reason goes into the audit record and an Event. The CLI flag is --override (the reason is --override-reason and is optional, ADR 0110), the RBAC custom verb is override, and the old verb is no longer accepted.
Context
The user decided on 2026-11-03 that the previous name should disappear from Ichor entirely. The behaviour stayed right; only the word changed.
Decision
Renames, all in one change:
- CLI: the flag
--override "<reason>"replaces the earlier flag, with no alias.ichor node resetand the live etcd restore need it exactly as before. - RBAC: the custom verb is
overrideonichor.maesh.devresources, in every shipped role (config/rbac/override_role.yaml, the chart'sichor-override-role, the installer's role list) and in every SubjectAccessReview. The old verb is not accepted. - Connect API: the message is
Overrideand the request fields areoverrideandoverride_required. The field numbers are kept, so the binary wire format is unaffected. The JSON names change; the UI and CLI are built from the same proto and ship together. - Go:
Override*andoverride*identifiers,OverrideVerb,OverrideHandler,SetupOverrideWebhookWithManager; filesinternal/webhook/v1alpha1/override_*.goandinternal/uiapi/override.go. - Admission: the webhook path is
/validate-ichor-maesh-dev-v1alpha1-overrideand the webhook names arevoverrideandvoverrideop. The installer re-applies the webhook configuration, so the paths change together with the controller image. - Environment:
ICHOR_OVERRIDE_EXEMPT_USERSreplaces the earlier exempt-users variable. - Event and audit reasons, UI text ("Override" with the reason prompt) and the docs use the new word. ADR 0065's file is now
docs/adr/0065-override.md, ADR 0107's file isdocs/adr/0107-reset-and-add-replaces-the-override-reclaim-switch.md, and the other ADRs say "override" in their text with the same meaning.
Compatibility
- CRD fields are append-only (installed builds, including the demo, have the reason field on
TalosOperation.spec.node).spec.node.overrideReasonis added. The earlier field,spec.node.breakGlassReason, stays in the schema only as a deprecated alias: its doc comment says "Deprecated: use overrideReason", the controller and the operation webhook read it whenoverrideReasonis empty (the webhook gates it with the same verb), and Ichor's own CLI and UI never set it. This is the one place the earlier name remains. - Installed bindings that grant the earlier verb stop working. Ichor's own roles are re-applied by the installer or
helm upgrade, so they move tooverrideby themselves. The old ClusterRoleichor-ichor-break-glass-roleis removed too: the installer prunes it by name, as an object of an earlier build that carries Ichor's app label (ADR 0111), andhelm upgraderemoves it because the release record names it. For roles people wrote,ichor upgrade ichorprints a NOTICE that lists every ClusterRole and Role (not labelledapp.kubernetes.io/name=ichor) that grants the earlier verb onichor.maesh.dev, and tells the user to change it tooverride. The notice is advice; the upgrade goes on. The CLI therefore carries that one literal verb string for the check. - The CLI's scheme gains
rbac.authorization.k8s.io/v1so it can list the roles.
Consequences
- A user who scripted the old flag or verb must change both once. There is no alias, on purpose.
- Amended by ADR 0110: the flag no longer takes the reason.
--overrideis a boolean and--override-reasoncarries the optional reason;spec.node.overrideis added, and a reason alone still counts as an override. Where this record says--override "<reason>", read--overridewith--override-reason. - During a rolling upgrade the webhook configuration and the controller image change together; a request made in that window can be refused and succeeds when repeated.
Amendment 2026-11-05 (ADR 0130): --override-reason is removed along with every other reason input; --override is a bare boolean, and spec.node.overrideReason and breakGlassReason are deprecated and unused (a value an older build wrote still counts as an override).