{"record":{"id":"5faa53c31f49c83b","repo":"gastownhall/beads","slug":"newexternalproxiedserveruowprovider-resolve-log-p","errorCode":null,"errorMessage":"newExternalProxiedServerUOWProvider: resolve log path: %w","messagePattern":"newExternalProxiedServerUOWProvider: resolve log path: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/uow_factory.go","lineNumber":441,"sourceCode":"\n// newExternalProxiedServerUOWProvider fronts a Dolt SQL server this process\n// neither started nor owns. \"Proxied\" in the name is the PROXY it builds, not\n// the workspace mode: since bd-emv a server-mode workspace lands here too, and\n// the paths it resolves (root, log) are the same ones proxied mode uses because\n// both modes root their server at the same directory.\nfunc newExternalProxiedServerUOWProvider(ctx context.Context, beadsDir string, topology sqlServerUOWTopology, opts ...uow.ProviderOption) (p uow.UnitOfWorkProvider, err error) {\n\tdefer func() { p, err = activateEventsJournalProvider(ctx, beadsDir, p, err) }()\n\trootPath, err := resolveProxiedServerRootPath(beadsDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: resolve root path: %w\", err)\n\t}\n\tif err := validateProxiedServerRootPath(rootPath); err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: proxied server root (from env or %s): %w\", configfile.ProxiedServerClientInfoFileName, err)\n\t}\n\n\tlogPath, isCustomLog, err := resolveProxiedServerLogPath(beadsDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: 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(\"newExternalProxiedServerUOWProvider: proxied server log (from env or %s): %w\", configfile.ProxiedServerClientInfoFileName, err)\n\t\t}\n\t}\n\n\tif err := os.MkdirAll(rootPath, config.BeadsDirPerm); err != nil {\n\t\treturn nil, fmt.Errorf(\"newExternalProxiedServerUOWProvider: mkdir %s: %w\", rootPath, err)\n\t}\n\n\treturn uow.NewExternalDoltServerUOWProvider(\n\t\tctx,\n\t\trootPath,\n\t\ttopology.database,\n\t\tlogPath,\n\t\t*topology.external,\n\t\ttopology.external.ResolvedUser(),","sourceCodeStart":423,"sourceCodeEnd":459,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/uow_factory.go#L423-L459","documentation":"newExternalProxiedServerUOWProvider resolves the proxied server's log file path (env BEADS_PROXIED_SERVER_LOG, the proxied_server_client_info.json sidecar log_path, or <root>/server.log) and wraps any resolution failure with this error. Resolution fails when the sidecar cannot be loaded (corrupt JSON, unreadable file) since resolveProxiedServerLogPath consults it even when the env var is empty. It is distinct from the later validation error: this one fires before validation, during path lookup.","triggerScenarios":"proxied_server_client_info.json exists but is corrupt JSON, unreadable (bad permissions), or fails to parse, and resolveProxiedServerLogPath calls LoadProxiedServerClientInfo to read log_path.","commonSituations":"A crashed or interrupted migration left a truncated sidecar; the sidecar was edited by hand with invalid JSON; file permissions changed so bd running as another user cannot read .beads/proxied_server_client_info.json.","solutions":["Inspect .beads/proxied_server_client_info.json: fix invalid JSON or delete the sidecar so defaults are used","Set BEADS_PROXIED_SERVER_LOG explicitly so the sidecar is not needed for log resolution","Fix permissions on the sidecar file (and the .beads directory) for the user running bd","Re-run bd migrate-dolt-mode to regenerate the sidecar"],"exampleFix":"// before: corrupt sidecar\n$ cat .beads/proxied_server_client_info.json\n{\"root_path\": \"/var/lib/beads\",  // trailing junk\n// after: remove or repair\nrm .beads/proxied_server_client_info.json\n# or export BEADS_PROXIED_SERVER_LOG=/var/log/bd/server.log","handlingStrategy":"validation","validationCode":"sidecar := filepath.Join(beadsDir, \".beads\", \"proxied_server_client_info.json\")\nif _, err := os.Stat(sidecar); err == nil {\n\tvar raw map[string]any\n\tb, _ := os.ReadFile(sidecar)\n\tif err := json.Unmarshal(b, &raw); err != nil {\n\t\treturn fmt.Errorf(\"sidecar %s is corrupt: %v\", sidecar, err)\n\t}\n}","typeGuard":null,"tryCatchPattern":"path, _, err := resolveProxiedServerLogPath(beadsDir)\nif err != nil {\n\tvar perr *fs.PathError\n\tif errors.As(err, &perr) && errors.Is(perr.Err, syscall.EACCES) {\n\t\t// fix permissions or set BEADS_PROXIED_SERVER_LOG and retry\n\t}\n\treturn err\n}","preventionTips":["Never hand-edit proxied_server_client_info.json; regenerate it with bd migrate-dolt-mode","Validate the sidecar JSON after any manual change (jq . proxied_server_client_info.json)","Keep .beads readable by the user (and group) running bd","Set BEADS_PROXIED_SERVER_LOG explicitly in managed environments to avoid sidecar dependence"],"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"}