{"record":{"id":"a0624905e0dcc71e","repo":"gravitational/teleport","slug":"not-available-at-this-version","errorCode":null,"errorMessage":"not available at this version","messagePattern":"not available at this version","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"info","filePath":"lib/autoupdate/agent/updater.go","lineNumber":348,"sourceCode":"\t// UnlinkSystem unlinks the system (package) installation of Teleport from the system linking location.\n\t// UnlinkSystem must be idempotent.\n\tUnlinkSystem(ctx context.Context) error\n\t// List the installed revisions of Teleport.\n\tList(ctx context.Context) (revisions []Revision, err error)\n\t// Remove the Teleport agent at revision.\n\t// Remove must be idempotent.\n\tRemove(ctx context.Context, rev Revision) error\n\t// IsLinked returns true if the revision is linked to path.\n\tIsLinked(ctx context.Context, rev Revision, pathDir string) (bool, error)\n}\n\nvar (\n\t// ErrLinked is returned when a linked version cannot be operated on.\n\tErrLinked = errors.New(\"version is linked\")\n\t// ErrNotSupported is returned when the operation is not supported on the platform.\n\tErrNotSupported = errors.New(\"not supported on this platform\")\n\t// ErrNotAvailable is returned when the operation is not available at the current version of the platform.\n\tErrNotAvailable = errors.New(\"not available at this version\")\n\t// ErrNoBinaries is returned when no binaries are available to be linked.\n\tErrNoBinaries = errors.New(\"no binaries available to link\")\n\t// ErrFilePresent is returned when a file is present.\n\tErrFilePresent = errors.New(\"file present\")\n\t// ErrNotInstalled is returned when Teleport is not installed.\n\tErrNotInstalled = errors.New(\"not installed\")\n)\n\n// Process provides an API for interacting with a running Teleport process.\ntype Process interface {\n\t// Name of the process.\n\tName() string\n\t// Reload must reload the Teleport process as gracefully as possible.\n\t// If the process is not healthy after reloading, Reload must return an error.\n\t// If the process did not require reloading, Reload must return ErrNotNeeded.\n\t// E.g., if the process is not enabled, or it was already reloaded after the last Sync.\n\t// If the type implementing Process does not support the system process manager,\n\t// Reload must return ErrNotSupported.","sourceCodeStart":330,"sourceCodeEnd":366,"githubUrl":"https://github.com/gravitational/teleport/blob/1283425b60ec5f60d509ba4c791183d452923ff7/lib/autoupdate/agent/updater.go#L330-L366","documentation":"ErrNotAvailable (in updater.go) means the operation exists but is not available at the current version/state of the platform — i.e., a version-gating error. Note there is a same-named sentinel in lib/auth/touchid/api.go for Touch ID unavailability; both express 'feature gated off in this environment'. Callers check with errors.Is to skip or degrade gracefully.","triggerScenarios":"Calling updater operations that require a newer platform state or feature than the current install provides; the sentinel is returned directly by functions listed as consumers (Register/Login style entry points in other packages share the name). On macOS Touch ID: calling touchid.Register when IsAvailable() is false (api.go:231).","commonSituations":"Attempting managed-update features on an OS version that lacks support; invoking Touch ID registration on a Mac without Touch ID configured, or in an SSH/CI context where biometrics are unavailable.","solutions":["Check availability before calling: e.g. touchid.IsAvailable() or the updater's platform/version capability check.","Handle errors.Is(err, ErrNotAvailable) as a graceful skip — fall back to a non-biometric or manual path.","Upgrade the platform/OS or Teleport version if the feature is required.","For Touch ID, ensure biometrics are enrolled in System Settings and the binary is not running headless/over SSH."],"exampleFix":"// before\nreg, err := touchid.Register(origin, cc)\nif err != nil {\n    return err\n}\n// after\nif !touchid.IsAvailable() {\n    return nil, trace.NotImplemented(\"touch ID unavailable; use password auth\")\n}\nreg, err := touchid.Register(origin, cc)","handlingStrategy":"fallback","validationCode":"if !touchid.IsAvailable() {\n    // choose non-biometric auth path before calling Register\n}","typeGuard":"func IsNotAvailable(err error) bool { return errors.Is(err, autoupdate.ErrNotAvailable) }","tryCatchPattern":"reg, err := touchid.Register(origin, cc)\nif errors.Is(err, touchid.ErrNotAvailable) {\n    return fallbackAuth(ctx) // password/key-based flow\n}","preventionTips":["Probe capability (IsAvailable / version checks) before invoking gated features","Provide a non-biometric or manual fallback path","Keep platform/OS versions aligned with feature requirements"],"tags":["feature-availability","version-gating","sentinel-error","touchid"],"backgroundTag":"feature-not-available","analyzedSha":"1283425b60ec5f60d509ba4c791183d452923ff7","analyzedAt":"2026-09-02T04:06:41.601Z","contentChangedAt":null,"schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}