elsa-workflows/elsa-core · error · InvalidOperationException
{string.Join(" ", failures)}
Error message
{string.Join(" ", failures)} What it means
A validation guard thrown by ExtensionDescriptorValidator.ValidateDescriptor: the extension descriptor failed one or more structural checks (identifier not a stable name, descriptor/extension type mismatch, missing display name or description, etc.), and the aggregated failure list is joined into the exception message.
Solutions
- Fix each listed failure: give the extension a stable identifier type name, matching descriptor type, non-empty display name and description.
- Validate descriptors at startup or in tests so misconfigured extensions are caught before registration.
- Compare against a known-good ExtensionDescriptor in the same feature for the expected shape.
Defensive patterns
Strategy: validation
When it happens
Trigger: Thrown at src/modules/Elsa.ExternalAuthentication/Services/ExtensionDescriptorValidator.cs:75 when the library encounters an invalid state.
Common situations: See trigger scenarios.
AI-assisted analysis of elsa-workflows/elsa-core@fe9217bdfa (2026-09-13).
Data as JSON: /api/errors/7e7e97ddbb1ac350.
Report an issue: GitHub.
Appendix: source
Thrown at src/modules/Elsa.ExternalAuthentication/Services/ExtensionDescriptorValidator.cs:75
if (!IsIdentifier(extensionType))
failures.Add($"Extension type '{extensionType}' is not a stable identifier.");
if (!string.Equals(extensionType, descriptorType, StringComparison.Ordinal))
failures.Add($"Descriptor type '{descriptorType}' does not match extension type '{extensionType}'.");
if (string.IsNullOrWhiteSpace(displayName))
failures.Add($"Extension '{extensionType}' must define a display name.");
if (string.IsNullOrWhiteSpace(description))
failures.Add($"Extension '{extensionType}' must define a description.");
if (settingsVersion <= 0)
failures.Add($"Extension '{extensionType}' must define a positive settings version.");
if (fields is null)
failures.Add($"Extension '{extensionType}' must define a fields collection.");
else
ValidateFields(extensionType, fields, failures);
if (customEditor is not null && (!IsIdentifier(customEditor.Key) || customEditor.ContractVersion <= 0))
failures.Add($"Extension '{extensionType}' has an invalid custom-editor contract.");
if (failures.Count > 0)
throw new InvalidOperationException(string.Join(" ", failures));
}
private static void ValidateFields(string extensionType, IReadOnlyCollection<SettingFieldDescriptor> fields, ICollection<string> failures)
{
var names = new HashSet<string>(StringComparer.Ordinal);
foreach (var field in fields)
{
if (!IsSettingFieldName(field.Name))
failures.Add($"Extension '{extensionType}' has invalid field name '{field.Name}'.");
else if (!names.Add(field.Name))
failures.Add($"Extension '{extensionType}' defines field '{field.Name}' more than once.");
if (string.IsNullOrWhiteSpace(field.DisplayName) || string.IsNullOrWhiteSpace(field.Description))
failures.Add($"Field '{field.Name}' must define display text.");
if (!SupportedValueTypes.Contains(field.ValueType))
failures.Add($"Field '{field.Name}' has unsupported value type '{field.ValueType}'.");
if (string.IsNullOrWhiteSpace(field.UiHint))
failures.Add($"Field '{field.Name}' must define a UI hint.");
if (field.Validation.MinimumLength is < 0 ||View on GitHub (pinned to fe9217bdfa)