{"record":{"id":"bd21cf6bb7051176","repo":"elsa-workflows/elsa-core","slug":"secret-reference-name-was-not-found","errorCode":null,"errorMessage":"Secret '{reference.Name}' was not found.","messagePattern":"Secret '(.+?)' was not found\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":404,"severity":"error","filePath":"src/modules/Elsa.Secrets/Services/DefaultSecretResolver.cs","lineNumber":11,"sourceCode":"namespace Elsa.Secrets.Services;\n\npublic class DefaultSecretResolver(ISecretManager secretManager) : ISecretResolver\n{\n    public Task<string> ResolveAsync(string name, CancellationToken cancellationToken = default) => ResolveAsync(new SecretReference(name), cancellationToken);\n\n    public async Task<string> ResolveAsync(SecretReference reference, CancellationToken cancellationToken = default)\n    {\n        var secret = await secretManager.GetAsync(reference.Name, cancellationToken);\n        if (secret == null)\n            throw new InvalidOperationException($\"Secret '{reference.Name}' was not found.\");\n\n        if (!string.IsNullOrWhiteSpace(reference.TypeName) && !string.Equals(secret.TypeName, reference.TypeName, StringComparison.OrdinalIgnoreCase))\n            throw new InvalidOperationException($\"Secret '{reference.Name}' is not compatible with required type '{reference.TypeName}'.\");\n\n        if (!string.IsNullOrWhiteSpace(reference.Scope) && !string.Equals(secret.Scope, reference.Scope, StringComparison.OrdinalIgnoreCase))\n            throw new InvalidOperationException($\"Secret '{reference.Name}' is not compatible with required scope '{reference.Scope}'.\");\n\n        var payload = await secretManager.ResolvePayloadAsync(secret, cancellationToken);\n        return payload.Value!;\n    }\n}\n","sourceCodeStart":1,"sourceCodeEnd":23,"githubUrl":"https://github.com/elsa-workflows/elsa-core/blob/fe9217bdfa0e27f0e09e45006eb6898f616e513d/src/modules/Elsa.Secrets/Services/DefaultSecretResolver.cs#L1-L23","documentation":"DefaultSecretResolver.ResolveAsync fetches the secret by name via ISecretManager.GetAsync and throws InvalidOperationException when it returns null. Unlike GetExistingAsync this is the public resolution path used by activities/configuration binding. It means no usable secret exists under that reference name.","triggerScenarios":"Resolving a SecretReference whose name matches no secret; secret soft-deleted (status Deleted filtered from lookups); store not registered.","commonSituations":"Typo in secret reference; secret removed after a cleanup; environment promotion forgot to create the secret; tenancy/scope mismatch hiding the secret.","solutions":["Verify the secret name exists (list secrets) and correct the reference.","Create the missing secret.","Check the environment/database the app is connected to.","Confirm the secret is not soft-deleted (Deleted status is excluded)."],"exampleFix":"// before\nvar conn = await resolver.ResolveAsync(new SecretReference(\"Db_Connection\"));\n// after\nvar secret = await secretManager.GetAsync(\"Db_Connection\");\nif (secret is null)\n    throw new InvalidOperationException(\"Secret 'Db_Connection' must be provisioned before startup.\");\nvar conn = await resolver.ResolveAsync(new SecretReference(\"Db_Connection\"));","handlingStrategy":"try-catch","validationCode":"var secret = await secretManager.GetAsync(reference.Name, ct);\nif (secret is null) throw new InvalidOperationException($\"Secret '{reference.Name}' is missing; provision it first.\");","typeGuard":"bool IsResolvable(Secret? s) => s is { Status: SecretStatus.Active, LatestActiveVersion: not null };","tryCatchPattern":"try { var value = await resolver.ResolveAsync(reference, ct); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"was not found\")) { logger.LogError(ex, \"Secret {Name} missing in {Env}\", reference.Name, env.Name); throw; }","preventionTips":["Add a startup check that all referenced secret names exist","Keep a manifest of required secret names per environment","Avoid renaming secrets without a migration"],"tags":["secrets","not-found","resolution"],"backgroundTag":"resource-not-found","analyzedSha":"fe9217bdfa0e27f0e09e45006eb6898f616e513d","analyzedAt":"2026-09-13T20:32:34.702Z","contentChangedAt":"2026-09-13T20:32:34.702Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}