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

  1. Upgrade/restart the proxied server so its provider implements VersionReconcilerSource
  2. Verify provider wiring/configuration on the server side
  3. 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

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


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