v1.41.0 ✅

  • TagKey<T> — typed accessor into ImmutableDictionary<string, object> Tags; abstract record TagKey(string Name) + sealed record TagKey<T>(string Name) : TagKey(Name); record equality and value semantics
  • DomainTags — predefined typed domain tag keys: Entity, EntityId, Field, Value, Operation; used by NotFoundError, ConflictError, ValidationError auto-tags
  • SystemTags — predefined typed integration tag keys: HttpStatus, ErrorCode, RetryAfter, Service; shared contract between core and Http/AspNetCore packages
  • WithTag<T>(TagKey<T>, T) — typed fluent tag overload on all Reason<T> subclasses; writes using key.Name as string key; null guard included
  • ReasonTagExtensionsTryGet<T>(this IReason, TagKey<T>, out T?) + Has<T>(this IReason, TagKey<T>) typed tag reads on any IReason; null-safe
  • IErrorFactory<TSelf> — C# 11 static abstract interface (static abstract TSelf Create(string message)); enables Result<T>.Fail<NotFoundError>("not found") syntax
  • Result.Fail<TError>(string) — typed factory overload on both Result and Result<TValue>; dual constraint where TError : IError, IErrorFactory<TError>
  • ReasonMetadata.PipelineStep + NodeId — new fields for runtime → diagram correlation; PipelineStep = step method name, NodeId = stable node identity (e.g. "N0_FindUser")
  • REslava.Result.Flow Gap 1 — lambda body method name extraction: .Bind(x => SaveUser(x)) now renders step label "SaveUser" instead of "Bind" in generated diagrams
  • REslava.Result.Flow Gap 3 — variable initializer resolution: var r = FindUser(); return r.Bind(...) now correctly seeds the chain root from FindUser instead of failing to detect the pipeline
  • REslava.Result.Flow — Mermaid node correlation block%% --- Node correlation (ReasonMetadata.NodeId / PipelineStep) --- block emitted at the end of every generated diagram; pairs diagram nodes with runtime ReasonMetadata.NodeId values
  • 169 features, >4,300 tests