{"record":{"id":"c50676f33a59e365","repo":"mvanhorn/last30days-skill","slug":"engine-resolve-user-cache-dir-set-s-to-override","errorCode":null,"errorMessage":"engine: resolve user cache dir (set %s to override): %w","messagePattern":"engine: resolve user cache dir \\(set (.+?) to override\\): %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"mcp/internal/engine/extract.go","lineNumber":66,"sourceCode":"\t\t// Reset the sync.Once so a follow-up call can retry rather than\n\t\t// permanently caching the error. Retry is the right default when\n\t\t// the failure is transient (e.g., disk full, parent dir restored).\n\t\tresetOnce(cacheDir)\n\t\treturn \"\", extractErr\n\t}\n\treturn cacheDir, nil\n}\n\n// EnsureUserCache wraps Ensure with the OS user cache dir (or the\n// LAST30DAYS_CACHE_DIR override) as base. Production callers use this; tests\n// use Ensure with an explicit temp dir.\nfunc EnsureUserCache(src fs.FS, version string) (string, error) {\n\tif override := os.Getenv(CacheEnvOverride); override != \"\" {\n\t\treturn Ensure(src, override, version)\n\t}\n\tbase, err := os.UserCacheDir()\n\tif err != nil {\n\t\treturn \"\", fmt.Errorf(\"engine: resolve user cache dir (set %s to override): %w\", CacheEnvOverride, err)\n\t}\n\treturn Ensure(src, base, version)\n}\n\nfunc ensureLocked(src fs.FS, cacheDir, version string) error {\n\tif sentinelMatches(cacheDir, version) {\n\t\treturn nil\n\t}\n\ttmpDir := cacheDir + \".tmp\"\n\tif err := os.RemoveAll(tmpDir); err != nil {\n\t\treturn fmt.Errorf(\"engine: clean tmp cache: %w\", err)\n\t}\n\tif err := os.MkdirAll(tmpDir, 0o755); err != nil {\n\t\treturn fmt.Errorf(\"engine: create tmp cache (%s, set %s to override): %w\", tmpDir, CacheEnvOverride, err)\n\t}\n\tif err := extractAll(src, tmpDir); err != nil {\n\t\t_ = os.RemoveAll(tmpDir)\n\t\treturn err","sourceCodeStart":48,"sourceCodeEnd":84,"githubUrl":"https://github.com/mvanhorn/last30days-skill/blob/c7460f6114449ddfe6ea3fc2f23c3d910c0e740c/mcp/internal/engine/extract.go#L48-L84","documentation":"Error \"engine: resolve user cache dir (set %s to override): %w\" thrown in mvanhorn/last30days-skill.","triggerScenarios":"Fires during engine cache extraction when the OS user cache directory cannot be resolved (e.g. XDG_CACHE_HOME/HOME unset or invalid). Set the override environment variable named in the message to point at a writable directory.","commonSituations":"See trigger scenarios.","solutions":["Set the cache dir override environment variable (LAST30DAYS_CACHE_DIR) to a writable directory so the engine does not need to resolve the OS user cache dir.","Fix the environment so os.UserCacheDir() works: set HOME (Unix) or APPDATA (Windows) to a valid directory."],"exampleFix":null,"handlingStrategy":null,"validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"c7460f6114449ddfe6ea3fc2f23c3d910c0e740c","analyzedAt":"2026-08-15T03:34:49.540Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}