gastownhall/beads · error
proxied-server provider %T does not offer the version-marker
Error message
proxied-server provider %T does not offer the version-marker surface
What it means
The proxied version reconciliation path needs a uow.VersionReconcilerSource from the unit-of-work provider to record the binary's version marker. If the provider's concrete type doesn't offer that surface, reconciliation cannot proceed and the error reports the offending type.
Source
Thrown at cmd/bd/version_proxied_server.go:22
"context"
"errors"
"fmt"
"github.com/steveyegge/beads/internal/debug"
"github.com/steveyegge/beads/internal/storage/uow"
"github.com/steveyegge/beads/issueops"
)
// proxiedVersionReconciler hands back the clone-local version markers for the
// proxied-server provider, through the provider's OWN capability accessor —
// the same two-step proxiedCounter performs.
func proxiedVersionReconciler() (issueops.VersionReconciler, error) {
if uowProvider == nil {
return nil, errors.New("proxied-server UOW provider not initialized")
}
src, ok := uowProvider.(uow.VersionReconcilerSource)
if !ok {
return nil, fmt.Errorf("proxied-server provider %T does not offer the version-marker surface", uowProvider)
}
return src.VersionReconciler()
}
// reconcileVersionProxiedServer records this binary's version on the proxied
// route, and is the twin of autoMigrateOnVersionBump's tail.
//
// EVERY FAILURE HERE IS SWALLOWED TO A DEBUG LINE, as
// issueops.VersionReconciler says its callers do. This runs from
// PersistentPreRun before every proxied command: a workspace whose markers
// cannot be read is a workspace whose commands must still run.
func reconcileVersionProxiedServer(ctx context.Context) {
if !versionUpgradeDetected || uowProvider == nil {
return
}
reconciler, err := proxiedVersionReconciler()
if err != nil {View on GitHub (pinned to 71377f2769)
Solutions
- Upgrade/restart the proxied server so its provider implements VersionReconcilerSource
- Verify provider wiring/configuration on the server side
- Skip version reconciliation on this route if the deployment doesn't need it
Defensive patterns
Strategy: type-guard
Validate before calling
if _, ok := uowProvider.(uow.VersionReconcilerSource); !ok {
log.Printf("provider %T lacks VersionReconcilerSource; skipping version marker", uowProvider)
} Type guard
src, ok := uowProvider.(uow.VersionReconcilerSource)
if !ok {
return nil, fmt.Errorf("provider %T does not offer the version-marker surface", uowProvider)
}
return src.VersionReconciler() Try / catch
if err := reconcileVersion(); err != nil {
if strings.Contains(err.Error(), "does not offer the version-marker surface") {
// non-fatal: log and continue without version reconciliation
}
} Prevention
- Pin compatible client/server versions
- Assert required interfaces at provider construction time
- Test proxied routes with the real provider type, not narrow stubs
When it happens
Trigger: Running a version command on the proxied route where reconcileVersionProxiedServer finds uowProvider non-nil but not a uow.VersionReconcilerSource.
Common situations: Older proxied server build predating the version-marker surface; misconfigured provider injection; embedded/test provider stubs lacking the method.
Related errors
- proxied-server provider %T does not offer the batch-close su
- proxied-server provider %T does not offer the add-comment su
- proxied-server provider %T does not offer the batch-create s
- proxied-server provider %T does not offer the issue-lifecycl
- dolt version output is unparseable
AI-assisted analysis of gastownhall/beads@71377f2769 (2026-08-30).
Data as JSON: /api/errors/03c333fa2ba30146.
Report an issue: GitHub.