{"record":{"id":"00fd4fd41a1964ca","repo":"tailscale/tailscale","slug":"no-gaf-for-device-q-on-q-track","errorCode":null,"errorMessage":"no GAF for device %q on %q track","messagePattern":"no GAF for device %q on %q track","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"clientupdate/clientupdate.go","lineNumber":915,"sourceCode":"\n// updateGokrazy fetches the latest signed GAF for this gokrazy device variant\n// (vm-amd64, vm-arm64, or pi-arm64) from up.PkgsAddr and applies it via the\n// local gokrazy init update API.\nfunc (up *Updater) updateGokrazy() error {\n\tif !GokrazyUpdateFromURL.IsSet() {\n\t\treturn errors.New(\"gokrazy update support is not linked into this binary\")\n\t}\n\tvariant, err := gokrazyDeviceVariant()\n\tif err != nil {\n\t\treturn err\n\t}\n\tlatest, err := LatestPackages(up.Track)\n\tif err != nil {\n\t\treturn err\n\t}\n\tgafName, ok := latest.GAFs[variant]\n\tif !ok {\n\t\treturn fmt.Errorf(\"no GAF for device %q on %q track\", variant, up.Track)\n\t}\n\tif latest.GAFsVersion == \"\" {\n\t\treturn fmt.Errorf(\"no GAF version on %q track\", up.Track)\n\t}\n\tif !up.confirm(latest.GAFsVersion) {\n\t\treturn nil\n\t}\n\tgafURL := fmt.Sprintf(\"%s/%s/%s\", strings.TrimRight(up.PkgsAddr, \"/\"), up.Track, gafName)\n\tup.Logf(\"Updating to %s (%s)\", latest.GAFsVersion, gafURL)\n\treturn GokrazyUpdateFromURL.Get()(context.Background(), GokrazyUpdateArgs{\n\t\tURL:  gafURL,\n\t\tLogf: up.Logf,\n\t})\n}\n\n// gokrazyDeviceVariant returns the GAFs JSON key for the current gokrazy\n// device, e.g. \"vm-amd64\", \"vm-arm64\", or \"pi-arm64\". On arm64, it reads the\n// device-tree model to tell a Raspberry Pi apart from a VM.","sourceCodeStart":897,"sourceCodeEnd":933,"githubUrl":"https://github.com/tailscale/tailscale/blob/cfe32b8be6a33f8e24fbc369cbfbf7c729d9e042/clientupdate/clientupdate.go#L897-L933","documentation":"The gokrazy update path (updateGokrazy) resolves the device variant via gokrazyDeviceVariant() (vm-amd64, vm-arm64, or pi-arm64) and looks it up in the GAFs map of the TrackPackages returned by LatestPackages(up.Track); if the track's package listing has no GAF for that variant, this error names the variant and the track. Nothing has been downloaded or applied.","triggerScenarios":"Calling the update flow on a gokrazy device whose variant key is absent from the track's packages listing - e.g. a pi-arm64 device on a track/moment where only vm-* GAFs are published, or a mirrored listing that omits the variant's GAF file.","commonSituations":"A track was just switched or a new device class is not yet published for that track; a self-hosted PkgsAddr mirror that did not sync GAF files; a listing schema change on the packages server.","solutions":["Check https://pkgs.tailscale.com/<track>/ for a GAF matching your variant (vm-amd64, vm-arm64, pi-arm64)","Switch to the stable track if the GAF is missing on unstable/release-candidate","If using a custom PkgsAddr mirror, mirror the whole track directory including GAFs and the listing JSON","If the variant is genuinely unsupported, update the gokrazy image via gokrazy's own update mechanism instead"],"exampleFix":null,"handlingStrategy":"validation","validationCode":"// Resolve the variant and check the track listing before updating.\nvariant := \"vm-arm64\" // resolve per device like gokrazyDeviceVariant()\nlatest, err := clientupdate.LatestPackages(track)\nif err != nil {\n    return err\n}\nif _, ok := latest.GAFs[variant]; !ok {\n    log.Printf(\"no GAF for %s on %s track; skipping update\", variant, track)\n    return nil\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Verify the pkgs listing includes a GAF for your device variant before automating updates","Prefer the stable track for gokrazy fleets","Mirror GAF files as well as listing JSON when self-hosting PkgsAddr"],"tags":["gokrazy","gaf","track","arm","update"],"backgroundTag":null,"analyzedSha":"cfe32b8be6a33f8e24fbc369cbfbf7c729d9e042","analyzedAt":"2026-08-15T19:58:31.583Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}