{"record":{"id":"d47b4bde8caca188","repo":"gastownhall/beads","slug":"proxied-server-provider-t-does-not-offer-the-issu-d47b4b","errorCode":null,"errorMessage":"proxied-server provider %T does not offer the issue-lifecycle surface","messagePattern":"proxied-server provider %T does not offer the issue-lifecycle surface","errorType":"exception","errorClass":null,"httpStatus":null,"severity":"error","filePath":"cmd/bd/update_proxied_server.go","lineNumber":78,"sourceCode":"\n\tif jsonOut && len(updated) > 0 {\n\t\t_ = outputJSON(updated)\n\t}\n\tif len(failures) > 0 {\n\t\treturn reportUpdateFailures(failures, len(args))\n\t}\n\treturn nil\n}\n\n// proxiedIssueLifecycle asks the unit-of-work provider for the write role, the\n// same way proxiedIssueReader asks it for the read one.\nfunc proxiedIssueLifecycle() (issueops.Lifecycle, error) {\n\tif uowProvider == nil {\n\t\treturn nil, errors.New(\"proxied-server UOW provider not initialized\")\n\t}\n\tsrc, ok := uowProvider.(uow.IssueLifecycleSource)\n\tif !ok {\n\t\treturn nil, fmt.Errorf(\"proxied-server provider %T does not offer the issue-lifecycle surface\", uowProvider)\n\t}\n\treturn src.IssueLifecycle()\n}\n\n// applyUpdateProxiedOne applies one issue's update — plain or --claim —\n// through issueops.Lifecycle. What stays here is this surface's own protocol:\n// the template guard, the advisory reassign pre-read, the per-id failure\n// taxonomy the multi-id batch needs and the notes-overwrite warning. Hooks are\n// NOT among them: they fire from the write plumbing now (the notifying provider\n// wired in main.go), which is what makes an update fire the same events here as\n// it does on the embedded path.\n//\n// Provenance carries the commit message this path has always written, so `bd\n// dolt log` reads the same after the move as before it. The plane is\n// deliberately NOT restricted: `bd update` has always resolved a wisp id,\n// unlike the HTTP claim endpoint, which serves durable issues only.\n//\n// The pre-read is a read of its own, one transaction earlier than the","sourceCodeStart":60,"sourceCodeEnd":96,"githubUrl":"https://github.com/gastownhall/beads/blob/71377f276968b452ee607177637970a4ff888584/cmd/bd/update_proxied_server.go#L60-L96","documentation":"On the proxied-server route, commands reach storage through a unit-of-work provider. proxiedIssueLifecycle requires that provider to also implement uow.IssueLifecycleSource; when the concrete provider type does not, the issue-lifecycle operations (create/reopen/update via issueops.Lifecycle) cannot proceed and this error names the actual provider type to aid diagnosis.","triggerScenarios":"Running create/reopen/update against a proxied server whose configured uowProvider lacks the IssueLifecycleSource interface — typically a mismatched or partially initialized server build/provider wiring.","commonSituations":"Version mismatch between bd client and proxied server; custom or stub provider injected in tests/embedded setups; server started with a provider that only implements a narrower surface.","solutions":["Upgrade the proxied server to a build whose provider implements IssueLifecycleSource","Check server/provider configuration and restart the proxied server","Report the provider type (%T in the message) if it looks like a wiring bug"],"exampleFix":null,"handlingStrategy":"type-guard","validationCode":"if _, ok := uowProvider.(uow.IssueLifecycleSource); !ok {\n    return fmt.Errorf(\"provider %T lacks IssueLifecycleSource; upgrade server\", uowProvider)\n}","typeGuard":"src, ok := uowProvider.(uow.IssueLifecycleSource)\nif !ok {\n    return nil, fmt.Errorf(\"provider %T does not offer the issue-lifecycle surface\", uowProvider)\n}\nreturn src.IssueLifecycle()","tryCatchPattern":"if err := runUpdate(); err != nil {\n    if strings.Contains(err.Error(), \"does not offer the issue-lifecycle surface\") {\n        // fall back to direct (non-proxied) route or surface an upgrade hint\n    }\n}","preventionTips":["Keep client and proxied-server builds on compatible versions","Verify provider wiring at server startup","Add startup-time interface assertions for required surfaces"],"tags":["proxied-server","interface-mismatch","dependency-injection"],"backgroundTag":"capability-not-supported","analyzedSha":"71377f276968b452ee607177637970a4ff888584","analyzedAt":"2026-08-30T18:55:39.744Z","schemaVersion":2},"datasetVersion":"2026-08-30T23:17:21.991Z"}