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

  1. Fix each listed failure: give the extension a stable identifier type name, matching descriptor type, non-empty display name and description.
  2. Validate descriptors at startup or in tests so misconfigured extensions are caught before registration.
  3. 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)