< Summary

Information
Class: AsiBackbone.Core.Audit.AuditResidue
Assembly: AsiBackbone.Core
File(s): /home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Audit/AuditResidue.cs
Line coverage
100%
Covered lines: 227
Uncovered lines: 0
Coverable lines: 227
Total lines: 534
Line coverage: 100%
Branch coverage
100%
Covered branches: 42
Total branches: 42
Branch coverage: 100%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
.cctor()100%11100%
.ctor(...)100%11100%
get_EventId()100%11100%
get_AuditResidueId()100%11100%
get_SchemaVersion()100%11100%
get_OccurredUtc()100%11100%
get_ActorId()100%11100%
get_ActorType()100%11100%
get_ActorDisplayName()100%11100%
get_OperationName()100%11100%
get_Outcome()100%11100%
get_ReasonCodes()100%11100%
get_CorrelationId()100%11100%
get_TraceId()100%11100%
get_SpanId()100%11100%
get_ParentSpanId()100%11100%
get_DecisionLatencyMs()100%11100%
get_ConstraintSetHash()100%11100%
get_ConstraintCount()100%11100%
get_RiskScore()100%11100%
get_PolicyScope()100%11100%
get_TenantHash()100%11100%
get_OrganizationHash()100%11100%
get_EmitterStatus()100%11100%
get_EmitterProvider()100%11100%
get_OutboxSequence()100%11100%
get_GatewayExecutionId()100%11100%
get_DecisionStage()100%11100%
get_PolicyVersion()100%11100%
get_PolicyHash()100%11100%
get_Metadata()100%11100%
get_HasReasonCodes()100%11100%
get_HasMetadata()100%11100%
Create(...)100%44100%
FromDecision(...)100%11100%
FromConstraint(...)100%11100%
NormalizeIdentifier(...)100%22100%
NormalizeAuditResidueId(...)100%22100%
NormalizeOptional(...)100%22100%
NormalizeNonNegative(...)100%22100%
NormalizeNonNegative(...)100%22100%
NormalizeRiskScore(...)100%88100%
NormalizeReasonCodes(...)100%66100%
NormalizeMetadata(...)100%1414100%

File(s)

/home/runner/work/AsiBackbone/AsiBackbone/src/AsiBackbone.Core/Audit/AuditResidue.cs

#LineLine coverage
 1using System.Collections.ObjectModel;
 2using AsiBackbone.Core.Actors;
 3using AsiBackbone.Core.Constraints;
 4using AsiBackbone.Core.Decisions;
 5using AsiBackbone.Core.Serialization;
 6
 7namespace AsiBackbone.Core.Audit;
 8
 9/// <summary>
 10/// Represents the framework-neutral audit residue produced by an AsiBackbone operation.
 11/// </summary>
 12public sealed class AuditResidue : IAsiBackboneAuditResidue
 13{
 714    private static readonly ReadOnlyCollection<string> EmptyReasonCodes =
 715        Array.AsReadOnly(Array.Empty<string>());
 16
 717    private static readonly IReadOnlyDictionary<string, string> EmptyMetadata =
 718        new ReadOnlyDictionary<string, string>(
 719            new Dictionary<string, string>(StringComparer.Ordinal));
 20
 10121    private AuditResidue(
 10122        string eventId,
 10123        string auditResidueId,
 10124        string schemaVersion,
 10125        DateTimeOffset occurredUtc,
 10126        string actorId,
 10127        AsiBackboneActorType actorType,
 10128        string? actorDisplayName,
 10129        string operationName,
 10130        string outcome,
 10131        IReadOnlyList<string> reasonCodes,
 10132        string? correlationId,
 10133        string? traceId,
 10134        string? spanId,
 10135        string? parentSpanId,
 10136        long? decisionLatencyMs,
 10137        string? constraintSetHash,
 10138        int? constraintCount,
 10139        double? riskScore,
 10140        string? policyScope,
 10141        string? tenantHash,
 10142        string? organizationHash,
 10143        string? emitterStatus,
 10144        string? emitterProvider,
 10145        long? outboxSequence,
 10146        string? gatewayExecutionId,
 10147        string? decisionStage,
 10148        string? policyVersion,
 10149        string? policyHash,
 10150        IReadOnlyDictionary<string, string> metadata)
 51    {
 10152        ArgumentException.ThrowIfNullOrWhiteSpace(eventId);
 10153        ArgumentException.ThrowIfNullOrWhiteSpace(auditResidueId);
 10154        ArgumentException.ThrowIfNullOrWhiteSpace(actorId);
 10155        ArgumentException.ThrowIfNullOrWhiteSpace(operationName);
 9856        ArgumentException.ThrowIfNullOrWhiteSpace(outcome);
 57
 9558        EventId = eventId.Trim();
 9559        AuditResidueId = auditResidueId.Trim();
 9560        SchemaVersion = AsiBackboneSchemaVersions.Normalize(schemaVersion);
 9561        OccurredUtc = occurredUtc.ToUniversalTime();
 9562        ActorId = actorId.Trim();
 9563        ActorType = actorType;
 9564        ActorDisplayName = NormalizeOptional(actorDisplayName);
 9565        OperationName = operationName.Trim();
 9566        Outcome = outcome.Trim();
 9567        ReasonCodes = reasonCodes;
 9568        CorrelationId = NormalizeOptional(correlationId);
 9569        TraceId = NormalizeOptional(traceId);
 9570        SpanId = NormalizeOptional(spanId);
 9571        ParentSpanId = NormalizeOptional(parentSpanId);
 9572        DecisionLatencyMs = NormalizeNonNegative(decisionLatencyMs, nameof(decisionLatencyMs));
 9373        ConstraintSetHash = NormalizeOptional(constraintSetHash);
 9374        ConstraintCount = NormalizeNonNegative(constraintCount, nameof(constraintCount));
 9175        RiskScore = NormalizeRiskScore(riskScore);
 8776        PolicyScope = NormalizeOptional(policyScope);
 8777        TenantHash = NormalizeOptional(tenantHash);
 8778        OrganizationHash = NormalizeOptional(organizationHash);
 8779        EmitterStatus = NormalizeOptional(emitterStatus);
 8780        EmitterProvider = NormalizeOptional(emitterProvider);
 8781        OutboxSequence = NormalizeNonNegative(outboxSequence, nameof(outboxSequence));
 8582        GatewayExecutionId = NormalizeOptional(gatewayExecutionId);
 8583        DecisionStage = NormalizeOptional(decisionStage);
 8584        PolicyVersion = NormalizeOptional(policyVersion);
 8585        PolicyHash = NormalizeOptional(policyHash);
 8586        Metadata = metadata;
 8587    }
 88
 89    /// <inheritdoc />
 6790    public string EventId { get; }
 91
 92    /// <inheritdoc />
 5693    public string AuditResidueId { get; }
 94
 95    /// <inheritdoc />
 5296    public string SchemaVersion { get; }
 97
 98    /// <inheritdoc />
 5699    public DateTimeOffset OccurredUtc { get; }
 100
 101    /// <inheritdoc />
 54102    public string ActorId { get; }
 103
 104    /// <inheritdoc />
 51105    public AsiBackboneActorType ActorType { get; }
 106
 107    /// <inheritdoc />
 52108    public string? ActorDisplayName { get; }
 109
 110    /// <inheritdoc />
 58111    public string OperationName { get; }
 112
 113    /// <inheritdoc />
 62114    public string Outcome { get; }
 115
 116    /// <inheritdoc />
 69117    public IReadOnlyList<string> ReasonCodes { get; }
 118
 119    /// <inheritdoc />
 68120    public string? CorrelationId { get; }
 121
 122    /// <inheritdoc />
 65123    public string? TraceId { get; }
 124
 125    /// <inheritdoc />
 54126    public string? SpanId { get; }
 127
 128    /// <inheritdoc />
 54129    public string? ParentSpanId { get; }
 130
 131    /// <inheritdoc />
 52132    public long? DecisionLatencyMs { get; }
 133
 134    /// <inheritdoc />
 52135    public string? ConstraintSetHash { get; }
 136
 137    /// <inheritdoc />
 52138    public int? ConstraintCount { get; }
 139
 140    /// <inheritdoc />
 52141    public double? RiskScore { get; }
 142
 143    /// <inheritdoc />
 52144    public string? PolicyScope { get; }
 145
 146    /// <inheritdoc />
 52147    public string? TenantHash { get; }
 148
 149    /// <inheritdoc />
 52150    public string? OrganizationHash { get; }
 151
 152    /// <inheritdoc />
 54153    public string? EmitterStatus { get; }
 154
 155    /// <inheritdoc />
 54156    public string? EmitterProvider { get; }
 157
 158    /// <inheritdoc />
 54159    public long? OutboxSequence { get; }
 160
 161    /// <inheritdoc />
 54162    public string? GatewayExecutionId { get; }
 163
 164    /// <inheritdoc />
 54165    public string? DecisionStage { get; }
 166
 167    /// <inheritdoc />
 60168    public string? PolicyVersion { get; }
 169
 170    /// <inheritdoc />
 59171    public string? PolicyHash { get; }
 172
 173    /// <inheritdoc />
 92174    public IReadOnlyDictionary<string, string> Metadata { get; }
 175
 176    /// <summary>
 177    /// Gets a value indicating whether this audit residue contains reason codes.
 178    /// </summary>
 6179    public bool HasReasonCodes => ReasonCodes.Count > 0;
 180
 181    /// <summary>
 182    /// Gets a value indicating whether this audit residue contains metadata.
 183    /// </summary>
 8184    public bool HasMetadata => Metadata.Count > 0;
 185
 186    /// <summary>
 187    /// Creates audit residue from a host-defined operation outcome.
 188    /// </summary>
 189    /// <param name="actor">The actor associated with the operation.</param>
 190    /// <param name="operationName">The operation name.</param>
 191    /// <param name="outcome">The governance, constraint, or host-defined outcome.</param>
 192    /// <param name="reasonCodes">Optional machine-readable reason codes.</param>
 193    /// <param name="eventId">Optional audit event identifier. When omitted, a new identifier is generated.</param>
 194    /// <param name="occurredUtc">Optional event timestamp. When omitted, the current UTC timestamp is used.</param>
 195    /// <param name="correlationId">Optional correlation identifier.</param>
 196    /// <param name="traceId">Optional trace identifier.</param>
 197    /// <param name="policyVersion">Optional policy version.</param>
 198    /// <param name="policyHash">Optional policy hash.</param>
 199    /// <param name="metadata">Optional host-provided audit metadata.</param>
 200    /// <param name="auditResidueId">Optional audit residue identifier. When omitted, the normalized event identifier is
 201    /// <param name="spanId">Optional span identifier.</param>
 202    /// <param name="parentSpanId">Optional parent span identifier.</param>
 203    /// <param name="decisionLatencyMs">Optional decision latency in milliseconds.</param>
 204    /// <param name="constraintSetHash">Optional evaluated constraint-set hash.</param>
 205    /// <param name="constraintCount">Optional evaluated constraint count.</param>
 206    /// <param name="riskScore">Optional host-defined risk score.</param>
 207    /// <param name="policyScope">Optional host-defined policy scope.</param>
 208    /// <param name="tenantHash">Optional privacy-preserving tenant hash.</param>
 209    /// <param name="organizationHash">Optional privacy-preserving organization hash.</param>
 210    /// <param name="emitterStatus">Optional provider-neutral emitter status.</param>
 211    /// <param name="emitterProvider">Optional provider-neutral emitter provider name.</param>
 212    /// <param name="outboxSequence">Optional outbox sequence.</param>
 213    /// <param name="gatewayExecutionId">Optional gateway execution identifier.</param>
 214    /// <param name="decisionStage">Optional provider-neutral decision stage.</param>
 215    /// <param name="schemaVersion">Optional schema version. When omitted, the stable artifact schema version is used.</
 216    /// <returns>An audit residue value.</returns>
 217    public static AuditResidue Create(
 218        IAsiBackboneActorContext actor,
 219        string operationName,
 220        string outcome,
 221        IEnumerable<string>? reasonCodes = null,
 222        string? eventId = null,
 223        DateTimeOffset? occurredUtc = null,
 224        string? correlationId = null,
 225        string? traceId = null,
 226        string? policyVersion = null,
 227        string? policyHash = null,
 228        IReadOnlyDictionary<string, string>? metadata = null,
 229        string? auditResidueId = null,
 230        string? spanId = null,
 231        string? parentSpanId = null,
 232        long? decisionLatencyMs = null,
 233        string? constraintSetHash = null,
 234        int? constraintCount = null,
 235        double? riskScore = null,
 236        string? policyScope = null,
 237        string? tenantHash = null,
 238        string? organizationHash = null,
 239        string? emitterStatus = null,
 240        string? emitterProvider = null,
 241        long? outboxSequence = null,
 242        string? gatewayExecutionId = null,
 243        string? decisionStage = null,
 244        string? schemaVersion = null)
 245    {
 102246        ArgumentNullException.ThrowIfNull(actor);
 247
 101248        string normalizedEventId = NormalizeIdentifier(eventId);
 249
 101250        return new AuditResidue(
 101251            normalizedEventId,
 101252            NormalizeAuditResidueId(auditResidueId, normalizedEventId),
 101253            schemaVersion ?? AsiBackboneSchemaVersions.StableArtifactsV1,
 101254            occurredUtc ?? DateTimeOffset.UtcNow,
 101255            actor.ActorId,
 101256            actor.ActorType,
 101257            actor.DisplayName,
 101258            operationName,
 101259            outcome,
 101260            NormalizeReasonCodes(reasonCodes),
 101261            correlationId,
 101262            traceId,
 101263            spanId,
 101264            parentSpanId,
 101265            decisionLatencyMs,
 101266            constraintSetHash,
 101267            constraintCount,
 101268            riskScore,
 101269            policyScope,
 101270            tenantHash,
 101271            organizationHash,
 101272            emitterStatus,
 101273            emitterProvider,
 101274            outboxSequence,
 101275            gatewayExecutionId,
 101276            decisionStage,
 101277            policyVersion,
 101278            policyHash,
 101279            NormalizeMetadata(metadata));
 280    }
 281
 282    /// <summary>
 283    /// Creates audit residue from a governance decision.
 284    /// </summary>
 285    /// <param name="actor">The actor associated with the operation.</param>
 286    /// <param name="operationName">The operation name.</param>
 287    /// <param name="decision">The governance decision to audit.</param>
 288    /// <param name="eventId">Optional audit event identifier. When omitted, a new identifier is generated.</param>
 289    /// <param name="occurredUtc">Optional event timestamp. When omitted, the current UTC timestamp is used.</param>
 290    /// <param name="metadata">Optional host-provided audit metadata.</param>
 291    /// <param name="auditResidueId">Optional audit residue identifier. When omitted, the normalized event identifier is
 292    /// <param name="spanId">Optional span identifier.</param>
 293    /// <param name="parentSpanId">Optional parent span identifier.</param>
 294    /// <param name="decisionLatencyMs">Optional decision latency in milliseconds.</param>
 295    /// <param name="constraintSetHash">Optional evaluated constraint-set hash.</param>
 296    /// <param name="constraintCount">Optional evaluated constraint count.</param>
 297    /// <param name="riskScore">Optional host-defined risk score.</param>
 298    /// <param name="policyScope">Optional host-defined policy scope.</param>
 299    /// <param name="tenantHash">Optional privacy-preserving tenant hash.</param>
 300    /// <param name="organizationHash">Optional privacy-preserving organization hash.</param>
 301    /// <param name="emitterStatus">Optional provider-neutral emitter status.</param>
 302    /// <param name="emitterProvider">Optional provider-neutral emitter provider name.</param>
 303    /// <param name="outboxSequence">Optional outbox sequence.</param>
 304    /// <param name="gatewayExecutionId">Optional gateway execution identifier.</param>
 305    /// <param name="decisionStage">Optional provider-neutral decision stage.</param>
 306    /// <param name="schemaVersion">Optional schema version. When omitted, the stable artifact schema version is used.</
 307    /// <returns>An audit residue value.</returns>
 308    public static AuditResidue FromDecision(
 309        IAsiBackboneActorContext actor,
 310        string operationName,
 311        GovernanceDecision decision,
 312        string? eventId = null,
 313        DateTimeOffset? occurredUtc = null,
 314        IReadOnlyDictionary<string, string>? metadata = null,
 315        string? auditResidueId = null,
 316        string? spanId = null,
 317        string? parentSpanId = null,
 318        long? decisionLatencyMs = null,
 319        string? constraintSetHash = null,
 320        int? constraintCount = null,
 321        double? riskScore = null,
 322        string? policyScope = null,
 323        string? tenantHash = null,
 324        string? organizationHash = null,
 325        string? emitterStatus = null,
 326        string? emitterProvider = null,
 327        long? outboxSequence = null,
 328        string? gatewayExecutionId = null,
 329        string? decisionStage = null,
 330        string? schemaVersion = null)
 331    {
 6332        ArgumentNullException.ThrowIfNull(decision);
 333
 5334        return Create(
 5335            actor,
 5336            operationName,
 5337            decision.Outcome.ToString(),
 5338            decision.ReasonCodes,
 5339            eventId,
 5340            occurredUtc,
 5341            decision.CorrelationId,
 5342            decision.TraceId,
 5343            decision.PolicyVersion,
 5344            decision.PolicyHash,
 5345            metadata,
 5346            auditResidueId,
 5347            spanId,
 5348            parentSpanId,
 5349            decisionLatencyMs,
 5350            constraintSetHash,
 5351            constraintCount,
 5352            riskScore,
 5353            policyScope,
 5354            tenantHash,
 5355            organizationHash,
 5356            emitterStatus,
 5357            emitterProvider,
 5358            outboxSequence,
 5359            gatewayExecutionId,
 5360            decisionStage,
 5361            schemaVersion);
 362    }
 363
 364    /// <summary>
 365    /// Creates audit residue from a constraint evaluation result.
 366    /// </summary>
 367    /// <param name="actor">The actor associated with the operation.</param>
 368    /// <param name="operationName">The operation name.</param>
 369    /// <param name="constraintResult">The constraint evaluation result to audit.</param>
 370    /// <param name="eventId">Optional audit event identifier. When omitted, a new identifier is generated.</param>
 371    /// <param name="occurredUtc">Optional event timestamp. When omitted, the current UTC timestamp is used.</param>
 372    /// <param name="correlationId">Optional correlation identifier.</param>
 373    /// <param name="traceId">Optional trace identifier.</param>
 374    /// <param name="policyVersion">Optional policy version.</param>
 375    /// <param name="policyHash">Optional policy hash.</param>
 376    /// <param name="metadata">Optional host-provided audit metadata.</param>
 377    /// <param name="auditResidueId">Optional audit residue identifier. When omitted, the normalized event identifier is
 378    /// <param name="spanId">Optional span identifier.</param>
 379    /// <param name="parentSpanId">Optional parent span identifier.</param>
 380    /// <param name="decisionLatencyMs">Optional decision latency in milliseconds.</param>
 381    /// <param name="constraintSetHash">Optional evaluated constraint-set hash.</param>
 382    /// <param name="constraintCount">Optional evaluated constraint count.</param>
 383    /// <param name="riskScore">Optional host-defined risk score.</param>
 384    /// <param name="policyScope">Optional host-defined policy scope.</param>
 385    /// <param name="tenantHash">Optional privacy-preserving tenant hash.</param>
 386    /// <param name="organizationHash">Optional privacy-preserving organization hash.</param>
 387    /// <param name="emitterStatus">Optional provider-neutral emitter status.</param>
 388    /// <param name="emitterProvider">Optional provider-neutral emitter provider name.</param>
 389    /// <param name="outboxSequence">Optional outbox sequence.</param>
 390    /// <param name="gatewayExecutionId">Optional gateway execution identifier.</param>
 391    /// <param name="decisionStage">Optional provider-neutral decision stage.</param>
 392    /// <param name="schemaVersion">Optional schema version. When omitted, the stable artifact schema version is used.</
 393    /// <returns>An audit residue value.</returns>
 394    public static AuditResidue FromConstraint(
 395        IAsiBackboneActorContext actor,
 396        string operationName,
 397        ConstraintEvaluationResult constraintResult,
 398        string? eventId = null,
 399        DateTimeOffset? occurredUtc = null,
 400        string? correlationId = null,
 401        string? traceId = null,
 402        string? policyVersion = null,
 403        string? policyHash = null,
 404        IReadOnlyDictionary<string, string>? metadata = null,
 405        string? auditResidueId = null,
 406        string? spanId = null,
 407        string? parentSpanId = null,
 408        long? decisionLatencyMs = null,
 409        string? constraintSetHash = null,
 410        int? constraintCount = null,
 411        double? riskScore = null,
 412        string? policyScope = null,
 413        string? tenantHash = null,
 414        string? organizationHash = null,
 415        string? emitterStatus = null,
 416        string? emitterProvider = null,
 417        long? outboxSequence = null,
 418        string? gatewayExecutionId = null,
 419        string? decisionStage = null,
 420        string? schemaVersion = null)
 421    {
 4422        ArgumentNullException.ThrowIfNull(constraintResult);
 423
 3424        return Create(
 3425            actor,
 3426            operationName,
 3427            constraintResult.Outcome.ToString(),
 3428            constraintResult.ReasonCodes,
 3429            eventId,
 3430            occurredUtc,
 3431            correlationId,
 3432            traceId,
 3433            policyVersion,
 3434            policyHash,
 3435            metadata,
 3436            auditResidueId,
 3437            spanId,
 3438            parentSpanId,
 3439            decisionLatencyMs,
 3440            constraintSetHash,
 3441            constraintCount,
 3442            riskScore,
 3443            policyScope,
 3444            tenantHash,
 3445            organizationHash,
 3446            emitterStatus,
 3447            emitterProvider,
 3448            outboxSequence,
 3449            gatewayExecutionId,
 3450            decisionStage,
 3451            schemaVersion);
 452    }
 453
 454    private static string NormalizeIdentifier(string? identifier)
 455    {
 101456        return string.IsNullOrWhiteSpace(identifier)
 101457            ? Guid.NewGuid().ToString("N")
 101458            : identifier.Trim();
 459    }
 460
 461    private static string NormalizeAuditResidueId(string? auditResidueId, string eventId)
 462    {
 101463        return string.IsNullOrWhiteSpace(auditResidueId)
 101464            ? eventId
 101465            : auditResidueId.Trim();
 466    }
 467
 468    private static string? NormalizeOptional(string? value)
 469    {
 1343470        return string.IsNullOrWhiteSpace(value)
 1343471            ? null
 1343472            : value.Trim();
 473    }
 474
 475    private static long? NormalizeNonNegative(long? value, string parameterName)
 476    {
 182477        return value < 0
 182478            ? throw new ArgumentOutOfRangeException(parameterName, value, "Value must be greater than or equal to zero."
 182479            : value;
 480    }
 481
 482    private static int? NormalizeNonNegative(int? value, string parameterName)
 483    {
 93484        return value < 0
 93485            ? throw new ArgumentOutOfRangeException(parameterName, value, "Value must be greater than or equal to zero."
 93486            : value;
 487    }
 488
 489    private static double? NormalizeRiskScore(double? riskScore)
 490    {
 91491        return riskScore is null
 91492            ? null
 91493            : double.IsNaN(riskScore.Value) || double.IsInfinity(riskScore.Value) || riskScore.Value < 0
 91494            ? throw new ArgumentOutOfRangeException(nameof(riskScore), riskScore, "Risk score must be a finite value gre
 91495            : riskScore;
 496    }
 497
 498    private static ReadOnlyCollection<string> NormalizeReasonCodes(IEnumerable<string>? reasonCodes)
 499    {
 101500        string[] normalizedReasonCodes = reasonCodes?
 58501            .Where(reasonCode => !string.IsNullOrWhiteSpace(reasonCode))
 52502            .Select(reasonCode => reasonCode.Trim())
 101503            .ToArray() ?? [];
 504
 101505        return normalizedReasonCodes.Length == 0
 101506            ? EmptyReasonCodes
 101507            : Array.AsReadOnly(normalizedReasonCodes);
 508    }
 509
 510    private static IReadOnlyDictionary<string, string> NormalizeMetadata(
 511        IReadOnlyDictionary<string, string>? metadata)
 512    {
 101513        if (metadata is null || metadata.Count == 0)
 514        {
 64515            return EmptyMetadata;
 516        }
 517
 37518        Dictionary<string, string> normalizedMetadata = new(StringComparer.Ordinal);
 519
 198520        foreach (KeyValuePair<string, string> item in metadata)
 521        {
 62522            if (string.IsNullOrWhiteSpace(item.Key))
 523            {
 524                continue;
 525            }
 526
 58527            normalizedMetadata[item.Key.Trim()] = item.Value?.Trim() ?? string.Empty;
 528        }
 529
 37530        return normalizedMetadata.Count == 0
 37531            ? EmptyMetadata
 37532            : new ReadOnlyDictionary<string, string>(normalizedMetadata);
 533    }
 534}

Methods/Properties

.cctor()
.ctor(System.String,System.String,System.String,System.DateTimeOffset,System.String,AsiBackbone.Core.Actors.AsiBackboneActorType,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyList`1<System.String>,System.String,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.Nullable`1<System.Int32>,System.Nullable`1<System.Double>,System.String,System.String,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)
get_EventId()
get_AuditResidueId()
get_SchemaVersion()
get_OccurredUtc()
get_ActorId()
get_ActorType()
get_ActorDisplayName()
get_OperationName()
get_Outcome()
get_ReasonCodes()
get_CorrelationId()
get_TraceId()
get_SpanId()
get_ParentSpanId()
get_DecisionLatencyMs()
get_ConstraintSetHash()
get_ConstraintCount()
get_RiskScore()
get_PolicyScope()
get_TenantHash()
get_OrganizationHash()
get_EmitterStatus()
get_EmitterProvider()
get_OutboxSequence()
get_GatewayExecutionId()
get_DecisionStage()
get_PolicyVersion()
get_PolicyHash()
get_Metadata()
get_HasReasonCodes()
get_HasMetadata()
Create(AsiBackbone.Core.Actors.IAsiBackboneActorContext,System.String,System.String,System.Collections.Generic.IEnumerable`1<System.String>,System.String,System.Nullable`1<System.DateTimeOffset>,System.String,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.Nullable`1<System.Int32>,System.Nullable`1<System.Double>,System.String,System.String,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.String,System.String)
FromDecision(AsiBackbone.Core.Actors.IAsiBackboneActorContext,System.String,AsiBackbone.Core.Decisions.GovernanceDecision,System.String,System.Nullable`1<System.DateTimeOffset>,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.Nullable`1<System.Int32>,System.Nullable`1<System.Double>,System.String,System.String,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.String,System.String)
FromConstraint(AsiBackbone.Core.Actors.IAsiBackboneActorContext,System.String,AsiBackbone.Core.Constraints.ConstraintEvaluationResult,System.String,System.Nullable`1<System.DateTimeOffset>,System.String,System.String,System.String,System.String,System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.Nullable`1<System.Int32>,System.Nullable`1<System.Double>,System.String,System.String,System.String,System.String,System.String,System.Nullable`1<System.Int64>,System.String,System.String,System.String)
NormalizeIdentifier(System.String)
NormalizeAuditResidueId(System.String,System.String)
NormalizeOptional(System.String)
NormalizeNonNegative(System.Nullable`1<System.Int64>,System.String)
NormalizeNonNegative(System.Nullable`1<System.Int32>,System.String)
NormalizeRiskScore(System.Nullable`1<System.Double>)
NormalizeReasonCodes(System.Collections.Generic.IEnumerable`1<System.String>)
NormalizeMetadata(System.Collections.Generic.IReadOnlyDictionary`2<System.String,System.String>)