{"record":{"id":"2552314d6b5ec2ea","repo":"elsa-workflows/elsa-core","slug":"runtime-entity-definition-definition-name-is-not-published","errorCode":null,"errorMessage":"Runtime entity definition '{definition.Name}' is not published.","messagePattern":"Runtime entity definition '(.+?)' is not published\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/modules/Elsa.Persistence.VNext.Runtime/Services/RuntimeEntityManager.cs","lineNumber":73,"sourceCode":"        var existing = await LoadDefinitionDocumentAsync(name, cancellationToken)\n            ?? throw new InvalidOperationException($\"Runtime entity definition '{name}' was not found.\");\n\n        existing.Definition.Status = RuntimeEntityDefinitionStatus.Retired;\n        existing.Definition.UpdatedAt = DateTimeOffset.UtcNow;\n\n        await SaveDefinitionAsync(existing.Definition, existing.Document.Version, cancellationToken);\n        await AppendAuditAsync(\"RuntimeEntityDefinition\", existing.Definition.Name, \"Retired\", $\"Version {existing.Definition.Version} retired.\", cancellationToken);\n        return existing.Definition;\n    }\n\n    public async Task<RuntimeEntityInstance> SaveInstanceAsync(RuntimeEntityInstance instance, CancellationToken cancellationToken = default)\n    {\n        instance.DefinitionName = NormalizeName(instance.DefinitionName);\n        var definition = await GetDefinitionAsync(instance.DefinitionName, cancellationToken)\n            ?? throw new InvalidOperationException($\"Runtime entity definition '{instance.DefinitionName}' was not found.\");\n\n        if (definition.Status != RuntimeEntityDefinitionStatus.Published)\n            throw new InvalidOperationException($\"Runtime entity definition '{definition.Name}' is not published.\");\n\n        validator.ValidateInstance(definition, instance);\n        instance.DefinitionVersion = definition.Version;\n\n        var existing = await LoadInstanceDocumentAsync(instance.DefinitionName, instance.Id, cancellationToken);\n        var now = DateTimeOffset.UtcNow;\n        instance.CreatedAt = existing?.Instance.CreatedAt ?? instance.CreatedAt;\n        instance.UpdatedAt = now;\n\n        var request = new SaveDocumentRequest(\n            RuntimeEntityPersistenceSchemaProvider.InstancesStorageUnit,\n            CreateInstanceDocumentId(instance.DefinitionName, instance.Id),\n            JsonSerializer.Serialize(instance, _jsonOptions),\n            CreateInstanceIndexValues(definition, instance),\n            existing?.Document.Version ?? 0);\n\n        await documentStore.SaveAsync(request, cancellationToken);\n        await AppendAuditAsync(\"RuntimeEntityInstance\", CreateInstanceDocumentId(instance.DefinitionName, instance.Id), existing is null ? \"Created\" : \"Updated\", null, cancellationToken);","sourceCodeStart":55,"sourceCodeEnd":91,"githubUrl":"https://github.com/elsa-workflows/elsa-core/blob/fe9217bdfa0e27f0e09e45006eb6898f616e513d/src/modules/Elsa.Persistence.VNext.Runtime/Services/RuntimeEntityManager.cs#L55-L91","documentation":"SaveInstanceAsync requires the referenced definition to be in Published status; Draft or Retired definitions reject writes. When the definition exists but its Status differs from Published, the manager throws InvalidOperationException naming the definition.","triggerScenarios":"Saving an instance while the definition is still Draft (SaveDraftAsync without PublishAsync), or after RetireAsync was called for the definition.","commonSituations":"Forgetting the publish step after editing a definition; retiring an old definition while background jobs still write instances; seeding data against a freshly created draft in tests.","solutions":["Call PublishAsync(definitionName) to move the definition to Published before saving instances.","If the definition was retired, publish a new version and update writers to use it.","Check definition.Status via GetDefinitionAsync in orchestration code and skip/park instance writes while not Published."],"exampleFix":"// before\nawait manager.SaveDraftAsync(definition);\nawait manager.SaveInstanceAsync(instance); // throws: not published\n// after\nawait manager.SaveDraftAsync(definition);\nawait manager.PublishAsync(definition.Name);\nawait manager.SaveInstanceAsync(instance);","handlingStrategy":"validation","validationCode":"var def = await manager.GetDefinitionAsync(instance.DefinitionName);\nif (def is not null && def.Status != RuntimeEntityDefinitionStatus.Published)\n    throw new InvalidOperationException($\"Definition '{def.Name}' must be Published before saving instances.\");","typeGuard":null,"tryCatchPattern":"try { await manager.SaveInstanceAsync(instance); }\ncatch (InvalidOperationException ex) when (ex.Message.Contains(\"is not published\")) { /* publish definition or queue the write */ }","preventionTips":["Make PublishAsync part of the definition deployment pipeline, never draft-only.","When retiring definitions, first stop or migrate all instance writers.","Assert definition.Status == Published in test fixtures before data seeding."],"tags":["persistence","invalid-state","csharp"],"backgroundTag":"invalid-state-transition","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"}