{"record":{"id":"c1eb1919f2ddc213","repo":"microsoft/semantic-kernel","slug":"subscription-with-id-subscription-id-already-exi","errorCode":null,"errorMessage":"Subscription with id {subscription.Id} already exists.","messagePattern":"Subscription with id (.+?) already exists\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"dotnet/src/Agents/Runtime/InProcess/InProcessRuntime.cs","lineNumber":205,"sourceCode":"    public async ValueTask LoadAgentStateAsync(AgentId agentId, JsonElement state)\n    {\n        IHostableAgent agent = await this.EnsureAgentAsync(agentId).ConfigureAwait(false);\n        await agent.LoadStateAsync(state).ConfigureAwait(false);\n    }\n\n    /// <inheritdoc/>\n    public async ValueTask<JsonElement> SaveAgentStateAsync(AgentId agentId)\n    {\n        IHostableAgent agent = await this.EnsureAgentAsync(agentId).ConfigureAwait(false);\n        return await agent.SaveStateAsync().ConfigureAwait(false);\n    }\n\n    /// <inheritdoc/>\n    public ValueTask AddSubscriptionAsync(ISubscriptionDefinition subscription)\n    {\n        if (this._subscriptions.ContainsKey(subscription.Id))\n        {\n            throw new InvalidOperationException($\"Subscription with id {subscription.Id} already exists.\");\n        }\n\n        this._subscriptions.Add(subscription.Id, subscription);\n\n#if !NETCOREAPP\n        return Task.CompletedTask.AsValueTask();\n#else\n        return ValueTask.CompletedTask;\n#endif\n    }\n\n    /// <inheritdoc/>\n    public ValueTask RemoveSubscriptionAsync(string subscriptionId)\n    {\n        if (!this._subscriptions.ContainsKey(subscriptionId))\n        {\n            throw new InvalidOperationException($\"Subscription with id {subscriptionId} does not exist.\");\n        }","sourceCodeStart":187,"sourceCodeEnd":223,"githubUrl":"https://github.com/microsoft/semantic-kernel/blob/c028a0c7dc4f0814cdcbaba9d998f187a41197bf/dotnet/src/Agents/Runtime/InProcess/InProcessRuntime.cs#L187-L223","documentation":"AddSubscriptionAsync refuses duplicates keyed by subscription.Id and throws InvalidOperationException. Subscription IDs default to a new GUID, so collisions are rare unless you pass an explicit `id`. The dictionary is keyed solely by Id, so two distinct subscriptions sharing an Id conflict even with different topic/agent mappings.","triggerScenarios":"Registering a subscription with an explicit `id` that was already added; re-running registration code (e.g. in a retry or re-init) without clearing subscriptions; reusing a subscription object whose Id was already added.","commonSituations":"Deterministic subscription IDs in config-driven setup that get re-applied; test setup not resetting the runtime; idempotent init code that runs twice.","solutions":["Generate a fresh subscription (omit `id`) or use RemoveSubscriptionAsync before re-adding.","Make registration idempotent by checking/looping existing subscriptions before AddSubscriptionAsync.","Use a new InProcessRuntime instance per independent run."],"exampleFix":"// before\nawait runtime.AddSubscriptionAsync(new TypeSubscription(\"t1\", \"a1\", id: \"fixed-id\"));\nawait runtime.AddSubscriptionAsync(new TypeSubscription(\"t2\", \"a2\", id: \"fixed-id\")); // throws\n\n// after\nawait runtime.AddSubscriptionAsync(new TypeSubscription(\"t1\", \"a1\", id: \"fixed-id\"));\nawait runtime.AddSubscriptionAsync(new TypeSubscription(\"t2\", \"a2\")); // unique GUID id","handlingStrategy":"validation","validationCode":"// No public enumeration of IDs; track added IDs yourself.\nHashSet<string> added = new();\nasync ValueTask AddOnceAsync(InProcessRuntime rt, ISubscriptionDefinition sub)\n{\n    if (added.Add(sub.Id)) await rt.AddSubscriptionAsync(sub);\n}","typeGuard":null,"tryCatchPattern":"try { await runtime.AddSubscriptionAsync(sub); }\ncatch (InvalidOperationException) { /* duplicate id; already registered */ }","preventionTips":["Omit explicit ids (use generated GUIDs) unless you need deterministic ids.","Make registration idempotent by tracking added ids.","Remove before re-adding when reusing a deterministic id."],"tags":["inprocess-runtime","subscription","duplicate","runtime","dotnet"],"backgroundTag":null,"analyzedSha":"c028a0c7dc4f0814cdcbaba9d998f187a41197bf","analyzedAt":"2026-08-13T13:48:05.040Z","schemaVersion":2},"datasetVersion":"2026-08-13T14:17:21.547Z"}