{"record":{"id":"03c333fa2ba30146","repo":"gastownhall/beads","slug":"proxied-server-provider-t-does-not-offer-the-vers","errorCode":null,"errorMessage":"proxied-server provider %T does not offer the version-marker surface","messagePattern":"proxied-server provider %T does not offer the version-marker surface","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/version_proxied_server.go","lineNumber":22,"sourceCode":"\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/steveyegge/beads/internal/debug\"\n\t\"github.com/steveyegge/beads/internal/storage/uow\"\n\t\"github.com/steveyegge/beads/issueops\"\n)\n\n// proxiedVersionReconciler hands back the clone-local version markers for the\n// proxied-server provider, through the provider's OWN capability accessor —\n// the same two-step proxiedCounter performs.\nfunc proxiedVersionReconciler() (issueops.VersionReconciler, error) {\n\tif uowProvider == nil {\n\t\treturn nil, errors.New(\"proxied-server UOW provider not initialized\")\n\t}\n\tsrc, ok := uowProvider.(uow.VersionReconcilerSource)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"proxied-server provider %T does not offer the version-marker surface\", uowProvider)\n\t}\n\treturn src.VersionReconciler()\n}\n\n// reconcileVersionProxiedServer records this binary's version on the proxied\n// route, and is the twin of autoMigrateOnVersionBump's tail.\n//\n// EVERY FAILURE HERE IS SWALLOWED TO A DEBUG LINE, as\n// issueops.VersionReconciler says its callers do. This runs from\n// PersistentPreRun before every proxied command: a workspace whose markers\n// cannot be read is a workspace whose commands must still run.\nfunc reconcileVersionProxiedServer(ctx context.Context) {\n\tif !versionUpgradeDetected || uowProvider == nil {\n\t\treturn\n\t}\n\n\treconciler, err := proxiedVersionReconciler()\n\tif err != nil {","sourceCodeStart":4,"sourceCodeEnd":40,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/version_proxied_server.go#L4-L40","documentation":"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.","triggerScenarios":"Running a version command on the proxied route where reconcileVersionProxiedServer finds uowProvider non-nil but not a uow.VersionReconcilerSource.","commonSituations":"Older proxied server build predating the version-marker surface; misconfigured provider injection; embedded/test provider stubs lacking the method.","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"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"if _, ok := uowProvider.(uow.VersionReconcilerSource); !ok {\n    log.Printf(\"provider %T lacks VersionReconcilerSource; skipping version marker\", uowProvider)\n}","typeGuard":"src, ok := uowProvider.(uow.VersionReconcilerSource)\nif !ok {\n    return nil, fmt.Errorf(\"provider %T does not offer the version-marker surface\", uowProvider)\n}\nreturn src.VersionReconciler()","tryCatchPattern":"if err := reconcileVersion(); err != nil {\n    if strings.Contains(err.Error(), \"does not offer the version-marker surface\") {\n        // non-fatal: log and continue without version reconciliation\n    }\n}","preventionTips":["Pin compatible client/server versions","Assert required interfaces at provider construction time","Test proxied routes with the real provider type, not narrow stubs"],"tags":["proxied-server","interface-mismatch","versioning"],"backgroundTag":"capability-not-supported","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}