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, errView on GitHub (pinned to 71377f2769)
Solutions
- Rebuild and restart the proxied server from the same commit as the bd CLI
- Update the provider implementation to satisfy uow.CommenterSource (add a Commenter() method)
- Pin CLI and server versions together in deployment
- 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
- Build and deploy CLI and server together
- Restart server processes after upgrades
- Ensure custom providers implement CommenterSource
- Cover proxied comment add in integration tests
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
- proxied-server provider %T does not offer the batch-close su
- proxied-server provider %T does not offer the batch-create s
- proxied-server provider %T does not offer the issue-lifecycl
- proxied-server provider %T does not offer the version-marker
- resolve proxied server root: %w
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/86a3ab6767699ab2.
Report an issue: GitHub.