gastownhall/beads · error

proxied-server provider %T does not offer the neighbor-query

Error message

proxied-server provider %T does not offer the neighbor-query surface

What it means

proxiedIssueRelations checks that the proxied-server UOW provider implements uow.RelationsSource before handing back the neighbor-query surface for `bd dep list`. If the provider type lacks it, this error names the type. It protects list operations from providers that cannot enumerate issue relations.

Source

Thrown at cmd/bd/dep_proxied_server.go:48

	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
// proxied-server provider, through the provider's own capability accessor.
func proxiedEdgeReader() (issueops.EdgeReader, error) {
	if uowProvider == nil {
		return nil, errors.New("proxied-server UOW provider not initialized")
	}
	src, ok := uowProvider.(uow.EdgeReaderSource)
	if !ok {
		return nil, fmt.Errorf("proxied-server provider %T does not offer the stored-edge surface", uowProvider)
	}
	return src.EdgeReader()
}

// addDependencyEdgesProxied asserts edges through the DependencyEditor role.

View on GitHub (pinned to 71377f2769)

Solutions

  1. Upgrade the bd server daemon and restart so RelationsSource is available.
  2. Check version parity between client and server (bd --version; bd doctor).
  3. If using a custom provider, implement uow.RelationsSource (IssueRelations() accessor).
  4. Query dependencies directly against the local database (non-proxied route) as an interim workaround.

Example fix

// before: minimal provider without relations
// proxied-server provider *server.MinimalProvider does not offer the neighbor-query surface

// after: full provider via server restart
bd server stop && bd server start  # provider implements uow.RelationsSource
Defensive patterns

Strategy: type-guard

Validate before calling

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

Type guard

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

Try / catch

rel, err := proxiedIssueRelations()
if err != nil {
	if strings.Contains(err.Error(), "neighbor-query surface") {
		return fmt.Errorf("`bd dep list` unavailable via this server; upgrade server or query locally: %w", err)
	}
	return err
}

Prevention

When it happens

Trigger: Running `bd dep list` via the proxied-server route (runDepListProxiedServer) when the provider's concrete type does not implement RelationsSource.

Common situations: Older server daemon predating the relations surface; a minimal/custom provider implementing only edge writes but not neighbor queries; wrong provider wired in embedded/proxied configuration.

Related errors


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