{"record":{"id":"1ae6218d9534dc23","repo":"gastownhall/beads","slug":"uow-resolving-server-root-dir-w-1ae621","errorCode":null,"errorMessage":"uow: resolving server root dir: %w","messagePattern":"uow: resolving server root dir: %w","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"internal/storage/uow/external_doltserver_provider.go","lineNumber":47,"sourceCode":"\texpectedProjectID string,\n\topts ...ProviderOption,\n) (UnitOfWorkProvider, error) {\n\tif idleTimeout == 0 {\n\t\tidleTimeout = defaultProxyIdleTimeout\n\t}\n\tif database == \"\" {\n\t\treturn nil, fmt.Errorf(\"uow: database name must not be empty (caller should default to %q)\", \"beads\")\n\t}\n\tif rootUser == \"\" {\n\t\treturn nil, fmt.Errorf(\"uow: rootUser must not be empty\")\n\t}\n\tif err := external.Validate(); err != nil {\n\t\treturn nil, fmt.Errorf(\"uow: external: %w\", err)\n\t}\n\n\tabsServerRootDir, err := filepath.Abs(serverRootDir)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"uow: resolving server root dir: %w\", err)\n\t}\n\n\tif err := os.MkdirAll(absServerRootDir, config.BeadsDirPerm); err != nil {\n\t\treturn nil, fmt.Errorf(\"uow: creating server root directory: %w\", err)\n\t}\n\n\ttlsConfigName, err := registerExternalTLSConfig(external)\n\tif err != nil {\n\t\treturn nil, fmt.Errorf(\"uow: external TLS: %w\", err)\n\t}\n\n\tep, err := proxy.GetCreateDatabaseProxyServerEndpoint(absServerRootDir, proxy.OpenOpts{\n\t\tBackend:     proxy.BackendExternal,\n\t\tLogFilePath: serverLogFilePath,\n\t\tExternal:    external,\n\t\tIdleTimeout: idleTimeout,\n\t\tPort:        proxyPort,\n\t})","sourceCodeStart":29,"sourceCodeEnd":65,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/internal/storage/uow/external_doltserver_provider.go#L29-L65","documentation":"The provider resolves serverRootDir to an absolute path with filepath.Abs before creating the server's working directory tree. This error wraps a failure of filepath.Abs itself. filepath.Abs only fails when the process cannot determine its current working directory (e.g. the cwd was deleted), so this error is rare and environmental rather than a config problem.","triggerScenarios":"Calling NewExternalDoltServerUOWProvider when the process's current working directory no longer exists or os.Getwd() fails for permission/OS reasons.","commonSituations":"A test or daemon started in a temp directory that was later removed; running inside a container after its cwd was deleted; restrictive environments where Getwd fails.","solutions":["Pass an already-absolute path for serverRootDir so filepath.Abs does not need the cwd","Ensure the process is started from a valid working directory (cd into an existing dir before launch)","Inspect the wrapped error after \"uow: resolving server root dir: \" to confirm the underlying Getwd failure"],"exampleFix":"// before\nprovider, err := uow.NewExternalDoltServerUOWProvider(ctx, db, root, serverRootDir, external)\n// after\nabsRoot, err := filepath.Abs(serverRootDir) // or use a hardcoded absolute path\nif err != nil {\n    return err\n}\nprovider, err := uow.NewExternalDoltServerUOWProvider(ctx, db, root, absRoot, external)","handlingStrategy":"validation","validationCode":"if _, err := os.Getwd(); err != nil {\n    // cwd unavailable: pass an absolute serverRootDir or chdir to a valid dir first\n    return fmt.Errorf(\"environment: working directory unavailable: %w\", err)\n}\nif !filepath.IsAbs(serverRootDir) {\n    serverRootDir = filepath.Join(fallbackBaseDir, serverRootDir)\n}","typeGuard":null,"tryCatchPattern":"provider, err := uow.NewExternalDoltServerUOWProvider(ctx, db, root, dir, ext)\nif err != nil {\n    if strings.Contains(err.Error(), \"resolving server root dir\") {\n        return fmt.Errorf(\"environment: cannot resolve cwd; pass an absolute server root dir: %w\", err)\n    }\n    return err\n}","preventionTips":["Always pass absolute paths for serverRootDir, especially in daemons and tests","Verify the working directory exists before launching long-running processes","Recover from cwd-deletion in tests by chdir-ing to a fresh temp dir in setup"],"tags":["filesystem","uow","dolt","wrapped-error","environment"],"backgroundTag":"working-directory-missing","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}