gastownhall/beads · error

newProxiedServerUOWProvider: resolve root path: %w

Error message

newProxiedServerUOWProvider: resolve root path: %w

What it means

The managed variant newManagedProxiedServerUOWProvider (cmd/bd/uow_factory.go) also resolves the proxied server root via resolveProxiedServerRootPath (env → proxied_server_client_info.json sidecar → default Dolt dir) and wraps resolution errors with this message. Unlike the validation error that follows, this fires during resolution itself: most commonly when the client-info sidecar exists but cannot be loaded/parsed, since the resolver reads it to find root_path.

Source

Thrown at cmd/bd/uow_factory.go:490

	// it: an env/sidecar override that is explicitly named but broken
	// should fail loudly here rather than surface as a confusing spawn
	// failure downstream. See internal/doltversion for the resolution
	// precedence (env > sidecar > PATH) and probe hardening (timeout,
	// output cap, pre-exec validation).
	//
	// The error label names this function rather than the proxied-server
	// entry point: since upstream's server-mode path (bd serve ->
	// newSQLServerUOWProvider) also lands here, a hardcoded
	// "newProxiedServerUOWProvider" would mislabel a `bd serve` failure as a
	// proxied-server one.
	doltBin, err := resolveAndProbeDolt(ctx, "newManagedProxiedServerUOWProvider", quietFlag)
	if err != nil {
		return nil, err
	}

	rootPath, err := resolveProxiedServerRootPath(beadsDir)
	if err != nil {
		return nil, fmt.Errorf("newProxiedServerUOWProvider: resolve root path: %w", err)
	}
	if err := validateProxiedServerRootPath(rootPath); err != nil {
		return nil, fmt.Errorf("newProxiedServerUOWProvider: proxied server root (from env or %s): %w", configfile.ProxiedServerClientInfoFileName, err)
	}

	configPath, err := ensureProxiedServerConfig(beadsDir)
	if err != nil {
		return nil, err
	}

	logPath, isCustomLog, err := resolveProxiedServerLogPath(beadsDir)
	if err != nil {
		return nil, fmt.Errorf("newProxiedServerUOWProvider: resolve log path: %w", err)
	}
	if isCustomLog {
		if err := validateProxiedServerLogPath(logPath); err != nil {
			return nil, fmt.Errorf("newProxiedServerUOWProvider: proxied server log (from env or %s): %w", configfile.ProxiedServerClientInfoFileName, err)
		}

View on GitHub (pinned to 71377f2769)

Solutions

  1. Inspect and repair .beads/proxied_server_client_info.json, or delete it so resolution falls back to the default Dolt dir
  2. Set BEADS_PROXIED_SERVER_ROOT_PATH explicitly to bypass sidecar-based root resolution
  3. Fix file permissions on the sidecar and .beads directory for the running user
  4. Re-run bd migrate-dolt-mode to regenerate a valid sidecar

Example fix

// before: corrupt sidecar blocks resolution
{"root_path": "/var/lib/beads", "log_path": 
// after: remove or repair
rm .beads/proxied_server_client_info.json
# or: export BEADS_PROXIED_SERVER_ROOT_PATH=/var/lib/beads/shared-server/dolt
Defensive patterns

Strategy: validation

Validate before calling

b, err := os.ReadFile(filepath.Join(beadsDir, ".beads", "proxied_server_client_info.json"))
if err == nil {
	var v map[string]any
	if err := json.Unmarshal(b, &v); err != nil {
		return fmt.Errorf("client info sidecar invalid: %v", err)
	}
}

Prevention

When it happens

Trigger: LoadProxiedServerClientInfo fails because .beads/proxied_server_client_info.json is corrupt JSON, unreadable, or unparsable while resolving the root for the managed proxied server.

Common situations: Truncated sidecar after an interrupted bd migrate-dolt-mode run; sidecar hand-edited with invalid JSON; sidecar permissions exclude the current user.

Related errors


AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30). Data as JSON: /api/errors/1d04290d7d2277a9. Report an issue: GitHub.