{"record":{"id":"78783f4cb8483fc5","repo":"microsoft/autogen","slug":"invalid-subscription-type","errorCode":null,"errorMessage":"Invalid subscription type","messagePattern":"Invalid subscription type","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"dotnet/src/Microsoft.AutoGen/RuntimeGateway.Grpc/Services/Orleans/RegistryGrain.cs","lineNumber":211,"sourceCode":"                    if (topics is null)\n                    {\n                        topics = new HashSet<string>();\n                        state.State.AgentsToTopicsMap[subscription.Subscription.TypeSubscription.AgentType] = topics;\n                    }\n                    topics.Add(subscription.Subscription.TypeSubscription.TopicType);\n\n                    // add the agent type to the set of agent types for the topic\n                    state.State.TopicToAgentTypesMap.TryGetValue(subscription.Subscription.TypeSubscription.TopicType, out var agents);\n                    if (agents is null)\n                    {\n                        agents = new HashSet<string>();\n                        state.State.TopicToAgentTypesMap[subscription.Subscription.TypeSubscription.TopicType] = agents;\n                    }\n                    agents.Add(subscription.Subscription.TypeSubscription.AgentType);\n                    break;\n                }\n            default:\n                throw new InvalidOperationException(\"Invalid subscription type\");\n        }\n        // add the subscription by Guid\n        state.State.GuidSubscriptionsMap.TryGetValue(guid, out var existingSubscriptions);\n        if (existingSubscriptions is null)\n        {\n            existingSubscriptions = new HashSet<Subscription>();\n            state.State.GuidSubscriptionsMap[guid] = existingSubscriptions;\n        }\n        existingSubscriptions.Add(subscription.Subscription);\n        await state.WriteStateAsync().ConfigureAwait(false);\n    }\n    public async ValueTask UnsubscribeAsync(RemoveSubscriptionRequest request)\n    {\n        var guid = request.Id;\n        // does the guid parse?\n        if (!Guid.TryParse(guid, out var _))\n        {\n            throw new InvalidOperationException(\"Invalid subscription id\");","sourceCodeStart":193,"sourceCodeEnd":229,"githubUrl":"https://github.com/microsoft/autogen/blob/027ecf0a379bcc1d09956d46d12d44a3ad9cee14/dotnet/src/Microsoft.AutoGen/RuntimeGateway.Grpc/Services/Orleans/RegistryGrain.cs#L193-L229","documentation":"InvalidOperationException thrown by RegistryGrain.SetSubscriptionAsync when a Subscription message's SubscriptionCase is neither TypeSubscription nor TypePrefixSubscription. The registry stores subscriptions in per-kind maps, so it must know which oneof case it received; an unset or unknown case hits the default arm.","triggerScenarios":"Sending a SubscribeAsync request whose Subscription message has neither oneof branch set (constructing new Subscription {} and calling subscribe); adding a new SubscriptionOneofCase to the proto without updating this switch; forwarding a corrupt/uninitialized protobuf payload.","commonSituations":"Client code that builds Subscription imperatively and forgets to set TypeSubscription or TypePrefixSubscription; proto3 oneof semantics where assigning nothing leaves the case at None; SDK version skew introducing a third subscription kind the grain does not know.","solutions":["Set exactly one oneof branch before subscribing: subscription.TypeSubscription = new TypeSubscription { TopicType = ..., AgentType = ... } or the TypePrefixSubscription equivalent.","Guard client-side: throw early if request.Subscription.SubscriptionCase == SubscriptionOneofCase.None.","Keep publishers and the gateway on proto definitions that agree on the subscription kinds."],"exampleFix":"// before\nvar sub = new Subscription();\nawait registry.SetSubscriptionAsync(new SubscriptionRequest { Subscription = sub });\n\n// after\nvar sub = new Subscription\n{\n    TypeSubscription = new TypeSubscription { TopicType = \"events\", AgentType = \"MyAgent\" }\n};\nawait registry.SetSubscriptionAsync(new SubscriptionRequest { Subscription = sub });","handlingStrategy":"type-guard","validationCode":null,"typeGuard":"static bool IsValidSubscription(Subscription s) =>\n    s.SubscriptionCase is Subscription.SubscriptionOneofCase.TypeSubscription\n                     or Subscription.SubscriptionOneofCase.TypePrefixSubscription;\n\nif (!IsValidSubscription(request.Subscription))\n    throw new ArgumentException(\"Subscription must set TypeSubscription or TypePrefixSubscription\");","tryCatchPattern":"try { await registry.SetSubscriptionAsync(request); }\ncatch (InvalidOperationException ex) when (ex.Message == \"Invalid subscription type\")\n{\n    _logger.LogError(\"Subscription payload missing oneof branch; rejecting request {Id}.\", request.Id);\n}","preventionTips":["Always assign exactly one oneof branch when building Subscription messages.","Check SubscriptionCase == None client-side to reject uninitialized subscriptions early.","Keep client and gateway protos in sync when adding subscription kinds."],"tags":["dotnet","orleans","grpc","protobuf","oneof"],"backgroundTag":null,"analyzedSha":"027ecf0a379bcc1d09956d46d12d44a3ad9cee14","analyzedAt":"2026-08-15T03:38:00.719Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}