{"record":{"id":"05c4ac7d4a33d9aa","repo":"gastownhall/beads","slug":"newproxiedserveruowprovider-resolve-log-path-w","errorCode":null,"errorMessage":"newProxiedServerUOWProvider: resolve log path: %w","messagePattern":"newProxiedServerUOWProvider: resolve log path: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/uow_factory.go","lineNumber":503,"sourceCode":"\t\treturn nil, err\n\t}\n\n\trootPath, err := resolveProxiedServerRootPath(beadsDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"newProxiedServerUOWProvider: resolve root path: %w\", err)\n\t}\n\tif err := validateProxiedServerRootPath(rootPath); err != nil {\n\t\treturn nil, fmt.Errorf(\"newProxiedServerUOWProvider: proxied server root (from env or %s): %w\", configfile.ProxiedServerClientInfoFileName, err)\n\t}\n\n\tconfigPath, err := ensureProxiedServerConfig(beadsDir)\n\tif err != nil {\n\t\treturn nil, err\n\t}\n\n\tlogPath, isCustomLog, err := resolveProxiedServerLogPath(beadsDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"newProxiedServerUOWProvider: resolve log path: %w\", err)\n\t}\n\tif isCustomLog {\n\t\tif err := validateProxiedServerLogPath(logPath); err != nil {\n\t\t\treturn nil, fmt.Errorf(\"newProxiedServerUOWProvider: proxied server log (from env or %s): %w\", configfile.ProxiedServerClientInfoFileName, err)\n\t\t}\n\t}\n\n\treturn uow.NewDoltServerUOWProvider(\n\t\tctx,\n\t\trootPath,\n\t\ttopology.database,\n\t\tlogPath,\n\t\tconfigPath,\n\t\tproxy.BackendLocalServer,\n\t\t\"root\",\n\t\t\"\", // proxy is loopback-only, no auth\n\t\tdoltBin,\n\t\ttopology.proxyPort,","sourceCodeStart":485,"sourceCodeEnd":521,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/uow_factory.go#L485-L521","documentation":"newManagedProxiedServerUOWProvider resolves the proxied server log path (BEADS_PROXIED_SERVER_LOG env → proxied_server_client_info.json log_path → <root>/server.log) and wraps resolution failures with this message. As with root resolution, the primary failure mode is failing to load the client-info sidecar, which resolveProxiedServerLogPath reads unconditionally before falling back to defaults.","triggerScenarios":"LoadProxiedServerClientInfo fails (corrupt JSON, unreadable file) while the managed provider resolves the log path.","commonSituations":"Interrupted migration left a partial sidecar; permissions changed; sidecar edited by hand with syntax errors.","solutions":["Repair or delete .beads/proxied_server_client_info.json so resolution uses the default log location","Export BEADS_PROXIED_SERVER_LOG to supply the log path without consulting the sidecar","Fix read permissions on the sidecar for the user running bd","Regenerate the sidecar with bd migrate-dolt-mode"],"exampleFix":"// before: unreadable sidecar\n$ ls -l .beads/proxied_server_client_info.json  # owned by root, mode 0600\n// after\nsudo chown $USER .beads/proxied_server_client_info.json\n# or: export BEADS_PROXIED_SERVER_LOG=$HOME/.beads/logs/server.log","handlingStrategy":"validation","validationCode":"sidecar := filepath.Join(beadsDir, \".beads\", \"proxied_server_client_info.json\")\nif b, err := os.ReadFile(sidecar); err == nil {\n\tvar v any\n\tif err := json.Unmarshal(b, &v); err != nil {\n\t\treturn fmt.Errorf(\"unreadable sidecar %s: %v\", sidecar, err)\n\t}\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Validate the sidecar parses after any edit or migration","Fix .beads ownership/permissions when running bd under different users","Prefer explicit env vars (BEADS_PROXIED_SERVER_LOG) in CI so resolution never depends on the sidecar","Regenerate the sidecar with bd migrate-dolt-mode after failed upgrades"],"tags":["go","proxied-server","log-path","config"],"backgroundTag":"corrupt-client-info-sidecar","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}