gastownhall/beads · error

proxied-server provider %T does not offer the dependency-edg

Error message

proxied-server provider %T does not offer the dependency-edge surface

What it means

proxiedDependencyEditor guards the dependency mutation surface: in proxied-server mode the UOW provider must implement uow.DependencyEditorSource before add/remove dependency edges can run. If the concrete provider type lacks that interface, this error reports the type via %T.

Source

Thrown at cmd/bd/dep_proxied_server.go:35

type depAddResult struct {
	fromTitle string
	toTitle   string
	cycles    []issueops.Cycle
	cycleErr  error
}

// proxiedDependencyEditor hands back the guarded dependency-edge surface for
// the proxied-server provider, through the provider's OWN capability accessor
// — the same two-step proxiedIssueReader and proxiedBatchCloser perform, and
// for the same reason: the accessor is where each layer is added, so a command
// that reached for the constructor would get an unlayered editor.
func proxiedDependencyEditor() (issueops.DependencyEditor, error) {
	if uowProvider == nil {
		return nil, errors.New("proxied-server UOW provider not initialized")
	}
	src, ok := uowProvider.(uow.DependencyEditorSource)
	if !ok {
		return nil, fmt.Errorf("proxied-server provider %T does not offer the dependency-edge surface", uowProvider)
	}
	return src.DependencyEditor()
}

// proxiedIssueRelations hands back the guarded neighbor-query surface for the
// proxied-server provider, through the provider's own capability accessor.
func proxiedIssueRelations() (issueops.Relations, error) {
	if uowProvider == nil {
		return nil, errors.New("proxied-server UOW provider not initialized")
	}
	src, ok := uowProvider.(uow.RelationsSource)
	if !ok {
		return nil, fmt.Errorf("proxied-server provider %T does not offer the neighbor-query surface", uowProvider)
	}
	return src.IssueRelations()
}

// proxiedEdgeReader hands back the guarded stored-edge surface for the

View on GitHub (pinned to 71377f2769)

Solutions

  1. Upgrade and restart the bd server so its provider implements uow.DependencyEditorSource.
  2. Confirm client/server version parity (bd --version on both; bd doctor).
  3. If a custom provider is in use, add the DependencyEditor() accessor satisfying uow.DependencyEditorSource.
  4. Fall back to direct local (non-proxied) dependency add/remove if the server cannot be upgraded.

Example fix

// before: read-only provider in proxied mode
// proxied-server provider *server.ROProvider does not offer the dependency-edge surface

// after: run server with full provider
bd server stop && bd server start  # full provider implements uow.DependencyEditorSource
Defensive patterns

Strategy: type-guard

Validate before calling

if _, ok := uowProvider.(uow.DependencyEditorSource); !ok {
	fmt.Fprintln(os.Stderr, "server lacks dependency-edge surface; upgrade bd server")
	os.Exit(1)
}

Type guard

func hasDependencyEditor(p any) bool {
	_, ok := p.(uow.DependencyEditorSource)
	return ok
}

Try / catch

editor, err := proxiedDependencyEditor()
if err != nil {
	if strings.Contains(err.Error(), "dependency-edge surface") {
		return fmt.Errorf("server cannot edit dependencies; upgrade bd server or edit locally: %w", err)
	}
	return err
}

Prevention

When it happens

Trigger: Running dependency add/remove through the proxied server route (addDependencyEdgesProxied or runDepRemoveProxiedServer) when uowProvider does not satisfy DependencyEditorSource.

Common situations: Version skew: old server daemon without the dependency-edge surface serving a newer client; a read-only or custom provider plugged in that only supports queries; embedded mode wiring the wrong provider implementation.

Related errors


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