gastownhall/beads · error

proxied-server provider %T does not offer the add-comment su

Error message

proxied-server provider %T does not offer the add-comment surface

What it means

Capability-mismatch guard for the add-comment path in proxied-server mode: the uowProvider does not implement `uow.CommenterSource`, so no Commenter role can be obtained. Mirrors the batch-close guard — it signals a wiring or version mismatch, not a user data problem.

Source

Thrown at cmd/bd/comments_proxied_server.go:110

	if jsonOutput {
		return outputJSON(comment)
	}
	fmt.Printf("Comment added to %s\n", issue.ID)
	return nil
}

// proxiedCommenter hands back the guarded add-comment surface for the
// proxied-server provider, through the provider's OWN capability accessor —
// the same two-step proxiedIssueReader performs, and for the same reason: the
// accessor is where each layer is added.
func proxiedCommenter() (issueops.Commenter, error) {
	if uowProvider == nil {
		return nil, errors.New("proxied-server UOW provider not initialized")
	}
	src, ok := uowProvider.(uow.CommenterSource)
	if !ok {
		return nil, fmt.Errorf("proxied-server provider %T does not offer the add-comment surface", uowProvider)
	}
	return src.Commenter()
}

// addCommentProxied appends one comment through the Commenter role and returns
// it with the issue it landed on.
//
// The RESOLVE stays here, in a read-only pre-flight, for the reason the
// proxied close keeps its own policy pre-flight: `bd comment` refuses a
// template, and refusing a template is not library policy. The pre-flight is
// also where the TITLE comes from — the confirmation line prints it, and a
// result type carrying presentation for one front door is a result type that
// grows one field per front door. The role is handed the canonical id the
// pre-flight resolved, exactly as `bd show` hands Reader.Get one.
func addCommentProxied(ctx context.Context, id, author, text string) (*types.Comment, *types.Issue, error) {
	issue, err := resolveCommentTargetProxied(ctx, id)
	if err != nil {
		return nil, nil, err

View on GitHub (pinned to 71377f2769)

Solutions

  1. Rebuild and restart the proxied server from the same commit as the bd CLI
  2. Update the provider implementation to satisfy uow.CommenterSource (add a Commenter() method)
  3. Pin CLI and server versions together in deployment
  4. Use local (non-proxied) comment add as a workaround until versions align

Example fix

// before
type MyProvider struct{} // no Commenter method
// after
func (p *MyProvider) Commenter() (issueops.Commenter, error) { return p.store, nil }
Defensive patterns

Strategy: type-guard

Validate before calling

bd --version  # verify CLI/server version parity before proxied comments

Type guard

if _, ok := provider.(uow.CommenterSource); !ok {
    // use local comment path instead
}

Try / catch

if err := addComment(); strings.Contains(err.Error(), "does not offer the add-comment surface") {
    // rebuild/upgrade server, then retry
}

Prevention

When it happens

Trigger: `bd comment` routed through the proxied server while the assembled provider type lacks Commenter() — stale server binary, mixed client/server versions, or a custom provider implementing only part of the source interfaces.

Common situations: Server built from an older commit predating the Commenter surface; deployment where the CLI was upgraded but the server wasn't restarted/rebuilt.

Related errors


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