Restructure solution layout by module
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Docs CI / lint-and-preview (push) Has been cancelled
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Docs CI / lint-and-preview (push) Has been cancelled
				
			This commit is contained in:
		| @@ -1,422 +1,422 @@ | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>StellaOps.Auth.Abstractions</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:StellaOps.Auth.AuthorityTelemetry"> | ||||
|             <summary> | ||||
|             Canonical telemetry metadata for the StellaOps Authority stack. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.ServiceName"> | ||||
|             <summary> | ||||
|             service.name resource attribute recorded by Authority components. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.ServiceNamespace"> | ||||
|             <summary> | ||||
|             service.namespace resource attribute aligning Authority with other StellaOps services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.ActivitySourceName"> | ||||
|             <summary> | ||||
|             Activity source identifier used by Authority instrumentation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.MeterName"> | ||||
|             <summary> | ||||
|             Meter name used by Authority instrumentation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.AuthorityTelemetry.BuildDefaultResourceAttributes(System.Reflection.Assembly)"> | ||||
|             <summary> | ||||
|             Builds the default set of resource attributes (service name/namespace/version). | ||||
|             </summary> | ||||
|             <param name="assembly">Optional assembly used to resolve the service version.</param> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.AuthorityTelemetry.ResolveServiceVersion(System.Reflection.Assembly)"> | ||||
|             <summary> | ||||
|             Resolves the service version string from the provided assembly (defaults to the Authority telemetry assembly). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.NetworkMask"> | ||||
|             <summary> | ||||
|             Represents an IP network expressed in CIDR notation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.#ctor(System.Net.IPAddress,System.Int32)"> | ||||
|             <summary> | ||||
|             Initialises a new <see cref="T:StellaOps.Auth.Abstractions.NetworkMask"/>. | ||||
|             </summary> | ||||
|             <param name="network">Canonical network address with host bits zeroed.</param> | ||||
|             <param name="prefixLength">Prefix length (0-32 for IPv4, 0-128 for IPv6).</param> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMask.Network"> | ||||
|             <summary> | ||||
|             Canonical network address with host bits zeroed. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMask.PrefixLength"> | ||||
|             <summary> | ||||
|             Prefix length. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.Parse(System.String)"> | ||||
|             <summary> | ||||
|             Attempts to parse the supplied value as CIDR notation or a single IP address. | ||||
|             </summary> | ||||
|             <exception cref="T:System.FormatException">Thrown when the input is not recognised.</exception> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.TryParse(System.String,StellaOps.Auth.Abstractions.NetworkMask@)"> | ||||
|             <summary> | ||||
|             Attempts to parse the supplied value as CIDR notation or a single IP address. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.Contains(System.Net.IPAddress)"> | ||||
|             <summary> | ||||
|             Determines whether the provided address belongs to this network. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.ToString"> | ||||
|             <inheritdoc /> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.NetworkMaskMatcher"> | ||||
|             <summary> | ||||
|             Evaluates remote addresses against configured network masks. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMaskMatcher.#ctor(System.Collections.Generic.IEnumerable{System.String})"> | ||||
|             <summary> | ||||
|             Creates a matcher from raw CIDR strings. | ||||
|             </summary> | ||||
|             <param name="values">Sequence of CIDR entries or IP addresses.</param> | ||||
|             <exception cref="T:System.FormatException">Thrown when a value cannot be parsed.</exception> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMaskMatcher.#ctor(System.Collections.Generic.IEnumerable{StellaOps.Auth.Abstractions.NetworkMask})"> | ||||
|             <summary> | ||||
|             Creates a matcher from already parsed masks. | ||||
|             </summary> | ||||
|             <param name="masks">Sequence of network masks.</param> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.AllowAll"> | ||||
|             <summary> | ||||
|             Gets a matcher that allows every address. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.DenyAll"> | ||||
|             <summary> | ||||
|             Gets a matcher that denies every address (no masks configured). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.IsEmpty"> | ||||
|             <summary> | ||||
|             Indicates whether this matcher has no masks configured and does not allow all. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.Masks"> | ||||
|             <summary> | ||||
|             Returns the configured masks. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMaskMatcher.IsAllowed(System.Net.IPAddress)"> | ||||
|             <summary> | ||||
|             Checks whether the provided address matches any of the configured masks. | ||||
|             </summary> | ||||
|             <param name="address">Remote address to test.</param> | ||||
|             <returns><c>true</c> when the address is allowed.</returns> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults"> | ||||
|             <summary> | ||||
|             Default authentication constants used by StellaOps resource servers and clients. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults.AuthenticationScheme"> | ||||
|             <summary> | ||||
|             Default authentication scheme for StellaOps bearer tokens. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults.AuthenticationType"> | ||||
|             <summary> | ||||
|             Logical authentication type attached to <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults.PolicyPrefix"> | ||||
|             <summary> | ||||
|             Policy prefix applied to named authorization policies. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsClaimTypes"> | ||||
|             <summary> | ||||
|             Canonical claim type identifiers used across StellaOps services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Subject"> | ||||
|             <summary> | ||||
|             Subject identifier claim (maps to <c>sub</c> in JWTs). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Tenant"> | ||||
|             <summary> | ||||
|             StellaOps tenant identifier claim (multi-tenant deployments). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.ClientId"> | ||||
|             <summary> | ||||
|             OAuth2/OIDC client identifier claim (maps to <c>client_id</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.TokenId"> | ||||
|             <summary> | ||||
|             Unique token identifier claim (maps to <c>jti</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.AuthenticationMethod"> | ||||
|             <summary> | ||||
|             Authentication method reference claim (<c>amr</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Scope"> | ||||
|             <summary> | ||||
|             Space separated scope list (<c>scope</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.ScopeItem"> | ||||
|             <summary> | ||||
|             Individual scope items (<c>scp</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Audience"> | ||||
|             <summary> | ||||
|             OAuth2 resource audiences (<c>aud</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.IdentityProvider"> | ||||
|             <summary> | ||||
|             Identity provider hint for downstream services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.SessionId"> | ||||
|             <summary> | ||||
|             Session identifier claim (<c>sid</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder"> | ||||
|             <summary> | ||||
|             Fluent helper used to construct <see cref="T:System.Security.Claims.ClaimsPrincipal"/> instances that follow StellaOps conventions. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithSubject(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the canonical subject identifier. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithClientId(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the canonical client identifier. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithTenant(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the tenant identifier claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithName(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the user display name claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithIdentityProvider(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the identity provider claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithSessionId(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the session identifier claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithTokenId(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the token identifier claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAuthenticationMethod(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the authentication method reference claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithNameClaimType(System.String)"> | ||||
|             <summary> | ||||
|             Sets the name claim type appended when building the <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithRoleClaimType(System.String)"> | ||||
|             <summary> | ||||
|             Sets the role claim type appended when building the <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAuthenticationType(System.String)"> | ||||
|             <summary> | ||||
|             Sets the authentication type stamped on the <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithScopes(System.Collections.Generic.IEnumerable{System.String})"> | ||||
|             <summary> | ||||
|             Registers the supplied scopes (normalised to lower-case, deduplicated, sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAudiences(System.Collections.Generic.IEnumerable{System.String})"> | ||||
|             <summary> | ||||
|             Registers the supplied audiences (trimmed, deduplicated, sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAudience(System.String)"> | ||||
|             <summary> | ||||
|             Adds a single audience. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.AddClaim(System.String,System.String,System.String)"> | ||||
|             <summary> | ||||
|             Adds an arbitrary claim (no deduplication is performed). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.AddClaims(System.Collections.Generic.IEnumerable{System.Security.Claims.Claim})"> | ||||
|             <summary> | ||||
|             Adds multiple claims (incoming claims are cloned to enforce value trimming). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithIssuedAt(System.DateTimeOffset)"> | ||||
|             <summary> | ||||
|             Adds an <c>iat</c> (issued at) claim using Unix time seconds. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithNotBefore(System.DateTimeOffset)"> | ||||
|             <summary> | ||||
|             Adds an <c>nbf</c> (not before) claim using Unix time seconds. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithExpires(System.DateTimeOffset)"> | ||||
|             <summary> | ||||
|             Adds an <c>exp</c> (expires) claim using Unix time seconds. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.NormalizedScopes"> | ||||
|             <summary> | ||||
|             Returns the normalised scope list (deduplicated + sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.Audiences"> | ||||
|             <summary> | ||||
|             Returns the normalised audience list (deduplicated + sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.Build"> | ||||
|             <summary> | ||||
|             Builds the immutable <see cref="T:System.Security.Claims.ClaimsPrincipal"/> instance based on the registered data. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory"> | ||||
|             <summary> | ||||
|             Factory helpers for returning RFC 7807 problem responses using StellaOps conventions. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.AuthenticationRequired(System.String,System.String)"> | ||||
|             <summary> | ||||
|             Produces a 401 problem response indicating authentication is required. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.InvalidToken(System.String,System.String)"> | ||||
|             <summary> | ||||
|             Produces a 401 problem response for invalid, expired, or revoked tokens. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.Forbidden(System.String,System.String)"> | ||||
|             <summary> | ||||
|             Produces a 403 problem response when access is denied. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.InsufficientScope(System.Collections.Generic.IReadOnlyCollection{System.String},System.Collections.Generic.IReadOnlyCollection{System.String},System.String)"> | ||||
|             <summary> | ||||
|             Produces a 403 problem response for insufficient scopes. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsScopes"> | ||||
|             <summary> | ||||
|             Canonical scope names supported by StellaOps services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.ConcelierJobsTrigger"> | ||||
|             <summary> | ||||
|             Scope required to trigger Concelier jobs. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.ConcelierMerge"> | ||||
|             <summary> | ||||
|             Scope required to manage Concelier merge operations. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AuthorityUsersManage"> | ||||
|             <summary> | ||||
|             Scope granting administrative access to Authority user management. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AuthorityClientsManage"> | ||||
|             <summary> | ||||
|             Scope granting administrative access to Authority client registrations. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AuthorityAuditRead"> | ||||
|             <summary> | ||||
|             Scope granting read-only access to Authority audit logs. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.Bypass"> | ||||
|             <summary> | ||||
|             Synthetic scope representing trusted network bypass. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AdvisoryRead"> | ||||
|             <summary> | ||||
|             Scope granting read-only access to raw advisory ingestion data. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AdvisoryIngest"> | ||||
|             <summary> | ||||
|             Scope granting write access for raw advisory ingestion. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.VexRead"> | ||||
|             <summary> | ||||
|             Scope granting read-only access to raw VEX ingestion data. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.VexIngest"> | ||||
|             <summary> | ||||
|             Scope granting write access for raw VEX ingestion. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AocVerify"> | ||||
|             <summary> | ||||
|             Scope granting permission to execute aggregation-only contract verification. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsScopes.Normalize(System.String)"> | ||||
|             <summary> | ||||
|             Normalises a scope string (trim/convert to lower case). | ||||
|             </summary> | ||||
|             <param name="scope">Scope raw value.</param> | ||||
|             <returns>Normalised scope or <c>null</c> when the input is blank.</returns> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsScopes.IsKnown(System.String)"> | ||||
|             <summary> | ||||
|             Checks whether the provided scope is registered as a built-in StellaOps scope. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.StellaOpsScopes.All"> | ||||
|             <summary> | ||||
|             Returns the full set of built-in scopes. | ||||
|             </summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>StellaOps.Auth.Abstractions</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:StellaOps.Auth.AuthorityTelemetry"> | ||||
|             <summary> | ||||
|             Canonical telemetry metadata for the StellaOps Authority stack. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.ServiceName"> | ||||
|             <summary> | ||||
|             service.name resource attribute recorded by Authority components. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.ServiceNamespace"> | ||||
|             <summary> | ||||
|             service.namespace resource attribute aligning Authority with other StellaOps services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.ActivitySourceName"> | ||||
|             <summary> | ||||
|             Activity source identifier used by Authority instrumentation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.AuthorityTelemetry.MeterName"> | ||||
|             <summary> | ||||
|             Meter name used by Authority instrumentation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.AuthorityTelemetry.BuildDefaultResourceAttributes(System.Reflection.Assembly)"> | ||||
|             <summary> | ||||
|             Builds the default set of resource attributes (service name/namespace/version). | ||||
|             </summary> | ||||
|             <param name="assembly">Optional assembly used to resolve the service version.</param> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.AuthorityTelemetry.ResolveServiceVersion(System.Reflection.Assembly)"> | ||||
|             <summary> | ||||
|             Resolves the service version string from the provided assembly (defaults to the Authority telemetry assembly). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.NetworkMask"> | ||||
|             <summary> | ||||
|             Represents an IP network expressed in CIDR notation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.#ctor(System.Net.IPAddress,System.Int32)"> | ||||
|             <summary> | ||||
|             Initialises a new <see cref="T:StellaOps.Auth.Abstractions.NetworkMask"/>. | ||||
|             </summary> | ||||
|             <param name="network">Canonical network address with host bits zeroed.</param> | ||||
|             <param name="prefixLength">Prefix length (0-32 for IPv4, 0-128 for IPv6).</param> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMask.Network"> | ||||
|             <summary> | ||||
|             Canonical network address with host bits zeroed. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMask.PrefixLength"> | ||||
|             <summary> | ||||
|             Prefix length. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.Parse(System.String)"> | ||||
|             <summary> | ||||
|             Attempts to parse the supplied value as CIDR notation or a single IP address. | ||||
|             </summary> | ||||
|             <exception cref="T:System.FormatException">Thrown when the input is not recognised.</exception> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.TryParse(System.String,StellaOps.Auth.Abstractions.NetworkMask@)"> | ||||
|             <summary> | ||||
|             Attempts to parse the supplied value as CIDR notation or a single IP address. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.Contains(System.Net.IPAddress)"> | ||||
|             <summary> | ||||
|             Determines whether the provided address belongs to this network. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMask.ToString"> | ||||
|             <inheritdoc /> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.NetworkMaskMatcher"> | ||||
|             <summary> | ||||
|             Evaluates remote addresses against configured network masks. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMaskMatcher.#ctor(System.Collections.Generic.IEnumerable{System.String})"> | ||||
|             <summary> | ||||
|             Creates a matcher from raw CIDR strings. | ||||
|             </summary> | ||||
|             <param name="values">Sequence of CIDR entries or IP addresses.</param> | ||||
|             <exception cref="T:System.FormatException">Thrown when a value cannot be parsed.</exception> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMaskMatcher.#ctor(System.Collections.Generic.IEnumerable{StellaOps.Auth.Abstractions.NetworkMask})"> | ||||
|             <summary> | ||||
|             Creates a matcher from already parsed masks. | ||||
|             </summary> | ||||
|             <param name="masks">Sequence of network masks.</param> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.AllowAll"> | ||||
|             <summary> | ||||
|             Gets a matcher that allows every address. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.DenyAll"> | ||||
|             <summary> | ||||
|             Gets a matcher that denies every address (no masks configured). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.IsEmpty"> | ||||
|             <summary> | ||||
|             Indicates whether this matcher has no masks configured and does not allow all. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.NetworkMaskMatcher.Masks"> | ||||
|             <summary> | ||||
|             Returns the configured masks. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.NetworkMaskMatcher.IsAllowed(System.Net.IPAddress)"> | ||||
|             <summary> | ||||
|             Checks whether the provided address matches any of the configured masks. | ||||
|             </summary> | ||||
|             <param name="address">Remote address to test.</param> | ||||
|             <returns><c>true</c> when the address is allowed.</returns> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults"> | ||||
|             <summary> | ||||
|             Default authentication constants used by StellaOps resource servers and clients. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults.AuthenticationScheme"> | ||||
|             <summary> | ||||
|             Default authentication scheme for StellaOps bearer tokens. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults.AuthenticationType"> | ||||
|             <summary> | ||||
|             Logical authentication type attached to <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsAuthenticationDefaults.PolicyPrefix"> | ||||
|             <summary> | ||||
|             Policy prefix applied to named authorization policies. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsClaimTypes"> | ||||
|             <summary> | ||||
|             Canonical claim type identifiers used across StellaOps services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Subject"> | ||||
|             <summary> | ||||
|             Subject identifier claim (maps to <c>sub</c> in JWTs). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Tenant"> | ||||
|             <summary> | ||||
|             StellaOps tenant identifier claim (multi-tenant deployments). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.ClientId"> | ||||
|             <summary> | ||||
|             OAuth2/OIDC client identifier claim (maps to <c>client_id</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.TokenId"> | ||||
|             <summary> | ||||
|             Unique token identifier claim (maps to <c>jti</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.AuthenticationMethod"> | ||||
|             <summary> | ||||
|             Authentication method reference claim (<c>amr</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Scope"> | ||||
|             <summary> | ||||
|             Space separated scope list (<c>scope</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.ScopeItem"> | ||||
|             <summary> | ||||
|             Individual scope items (<c>scp</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.Audience"> | ||||
|             <summary> | ||||
|             OAuth2 resource audiences (<c>aud</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.IdentityProvider"> | ||||
|             <summary> | ||||
|             Identity provider hint for downstream services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsClaimTypes.SessionId"> | ||||
|             <summary> | ||||
|             Session identifier claim (<c>sid</c>). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder"> | ||||
|             <summary> | ||||
|             Fluent helper used to construct <see cref="T:System.Security.Claims.ClaimsPrincipal"/> instances that follow StellaOps conventions. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithSubject(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the canonical subject identifier. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithClientId(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the canonical client identifier. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithTenant(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the tenant identifier claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithName(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the user display name claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithIdentityProvider(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the identity provider claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithSessionId(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the session identifier claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithTokenId(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the token identifier claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAuthenticationMethod(System.String)"> | ||||
|             <summary> | ||||
|             Adds or replaces the authentication method reference claim. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithNameClaimType(System.String)"> | ||||
|             <summary> | ||||
|             Sets the name claim type appended when building the <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithRoleClaimType(System.String)"> | ||||
|             <summary> | ||||
|             Sets the role claim type appended when building the <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAuthenticationType(System.String)"> | ||||
|             <summary> | ||||
|             Sets the authentication type stamped on the <see cref="T:System.Security.Claims.ClaimsIdentity"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithScopes(System.Collections.Generic.IEnumerable{System.String})"> | ||||
|             <summary> | ||||
|             Registers the supplied scopes (normalised to lower-case, deduplicated, sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAudiences(System.Collections.Generic.IEnumerable{System.String})"> | ||||
|             <summary> | ||||
|             Registers the supplied audiences (trimmed, deduplicated, sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithAudience(System.String)"> | ||||
|             <summary> | ||||
|             Adds a single audience. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.AddClaim(System.String,System.String,System.String)"> | ||||
|             <summary> | ||||
|             Adds an arbitrary claim (no deduplication is performed). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.AddClaims(System.Collections.Generic.IEnumerable{System.Security.Claims.Claim})"> | ||||
|             <summary> | ||||
|             Adds multiple claims (incoming claims are cloned to enforce value trimming). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithIssuedAt(System.DateTimeOffset)"> | ||||
|             <summary> | ||||
|             Adds an <c>iat</c> (issued at) claim using Unix time seconds. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithNotBefore(System.DateTimeOffset)"> | ||||
|             <summary> | ||||
|             Adds an <c>nbf</c> (not before) claim using Unix time seconds. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.WithExpires(System.DateTimeOffset)"> | ||||
|             <summary> | ||||
|             Adds an <c>exp</c> (expires) claim using Unix time seconds. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.NormalizedScopes"> | ||||
|             <summary> | ||||
|             Returns the normalised scope list (deduplicated + sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.Audiences"> | ||||
|             <summary> | ||||
|             Returns the normalised audience list (deduplicated + sorted). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsPrincipalBuilder.Build"> | ||||
|             <summary> | ||||
|             Builds the immutable <see cref="T:System.Security.Claims.ClaimsPrincipal"/> instance based on the registered data. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory"> | ||||
|             <summary> | ||||
|             Factory helpers for returning RFC 7807 problem responses using StellaOps conventions. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.AuthenticationRequired(System.String,System.String)"> | ||||
|             <summary> | ||||
|             Produces a 401 problem response indicating authentication is required. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.InvalidToken(System.String,System.String)"> | ||||
|             <summary> | ||||
|             Produces a 401 problem response for invalid, expired, or revoked tokens. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.Forbidden(System.String,System.String)"> | ||||
|             <summary> | ||||
|             Produces a 403 problem response when access is denied. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsProblemResultFactory.InsufficientScope(System.Collections.Generic.IReadOnlyCollection{System.String},System.Collections.Generic.IReadOnlyCollection{System.String},System.String)"> | ||||
|             <summary> | ||||
|             Produces a 403 problem response for insufficient scopes. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Abstractions.StellaOpsScopes"> | ||||
|             <summary> | ||||
|             Canonical scope names supported by StellaOps services. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.ConcelierJobsTrigger"> | ||||
|             <summary> | ||||
|             Scope required to trigger Concelier jobs. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.ConcelierMerge"> | ||||
|             <summary> | ||||
|             Scope required to manage Concelier merge operations. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AuthorityUsersManage"> | ||||
|             <summary> | ||||
|             Scope granting administrative access to Authority user management. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AuthorityClientsManage"> | ||||
|             <summary> | ||||
|             Scope granting administrative access to Authority client registrations. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AuthorityAuditRead"> | ||||
|             <summary> | ||||
|             Scope granting read-only access to Authority audit logs. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.Bypass"> | ||||
|             <summary> | ||||
|             Synthetic scope representing trusted network bypass. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AdvisoryRead"> | ||||
|             <summary> | ||||
|             Scope granting read-only access to raw advisory ingestion data. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AdvisoryIngest"> | ||||
|             <summary> | ||||
|             Scope granting write access for raw advisory ingestion. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.VexRead"> | ||||
|             <summary> | ||||
|             Scope granting read-only access to raw VEX ingestion data. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.VexIngest"> | ||||
|             <summary> | ||||
|             Scope granting write access for raw VEX ingestion. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="F:StellaOps.Auth.Abstractions.StellaOpsScopes.AocVerify"> | ||||
|             <summary> | ||||
|             Scope granting permission to execute aggregation-only contract verification. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsScopes.Normalize(System.String)"> | ||||
|             <summary> | ||||
|             Normalises a scope string (trim/convert to lower case). | ||||
|             </summary> | ||||
|             <param name="scope">Scope raw value.</param> | ||||
|             <returns>Normalised scope or <c>null</c> when the input is blank.</returns> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Abstractions.StellaOpsScopes.IsKnown(System.String)"> | ||||
|             <summary> | ||||
|             Checks whether the provided scope is registered as a built-in StellaOps scope. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Abstractions.StellaOpsScopes.All"> | ||||
|             <summary> | ||||
|             Returns the full set of built-in scopes. | ||||
|             </summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
|   | ||||
| @@ -1,233 +1,233 @@ | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>StellaOps.Auth.Client</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:StellaOps.Auth.Client.FileTokenCache"> | ||||
|             <summary> | ||||
|             File-based token cache suitable for CLI/offline usage. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.InMemoryTokenCache"> | ||||
|             <summary> | ||||
|             In-memory token cache suitable for service scenarios. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.IStellaOpsTokenCache"> | ||||
|             <summary> | ||||
|             Abstraction for caching StellaOps tokens. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenCache.GetAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Retrieves a cached token entry, if present. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenCache.SetAsync(System.String,StellaOps.Auth.Client.StellaOpsTokenCacheEntry,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Stores or updates a token entry for the specified key. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenCache.RemoveAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Removes the cached entry for the specified key. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.IStellaOpsTokenClient"> | ||||
|             <summary> | ||||
|             Abstraction for requesting tokens from StellaOps Authority. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.RequestPasswordTokenAsync(System.String,System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Requests an access token using the resource owner password credentials flow. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.RequestClientCredentialsTokenAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Requests an access token using the client credentials flow. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.GetJsonWebKeySetAsync(System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Retrieves the cached JWKS document. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.GetCachedTokenAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Retrieves a cached token entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.CacheTokenAsync(System.String,StellaOps.Auth.Client.StellaOpsTokenCacheEntry,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Persists a token entry in the cache. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.ClearCachedTokenAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Removes a cached entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.ServiceCollectionExtensions"> | ||||
|             <summary> | ||||
|             DI helpers for the StellaOps auth client. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.ServiceCollectionExtensions.AddStellaOpsAuthClient(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{StellaOps.Auth.Client.StellaOpsAuthClientOptions})"> | ||||
|             <summary> | ||||
|             Registers the StellaOps auth client with the provided configuration. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.ServiceCollectionExtensions.AddStellaOpsFileTokenCache(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.String)"> | ||||
|             <summary> | ||||
|             Registers a file-backed token cache implementation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsAuthClientOptions"> | ||||
|             <summary> | ||||
|             Options controlling the StellaOps authentication client. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.Authority"> | ||||
|             <summary> | ||||
|             Authority (issuer) base URL. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.ClientId"> | ||||
|             <summary> | ||||
|             OAuth client identifier (optional for password flow). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.ClientSecret"> | ||||
|             <summary> | ||||
|             OAuth client secret (optional for public clients). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.DefaultScopes"> | ||||
|             <summary> | ||||
|             Default scopes requested for flows that do not explicitly override them. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.RetryDelays"> | ||||
|             <summary> | ||||
|             Retry delays applied by HTTP retry policy (empty uses defaults). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.EnableRetries"> | ||||
|             <summary> | ||||
|             Gets or sets a value indicating whether HTTP retry policies are enabled. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.HttpTimeout"> | ||||
|             <summary> | ||||
|             Timeout applied to discovery and token HTTP requests. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.DiscoveryCacheLifetime"> | ||||
|             <summary> | ||||
|             Lifetime of cached discovery metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.JwksCacheLifetime"> | ||||
|             <summary> | ||||
|             Lifetime of cached JWKS metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.ExpirationSkew"> | ||||
|             <summary> | ||||
|             Buffer applied when determining cache expiration (default: 30 seconds). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.AllowOfflineCacheFallback"> | ||||
|             <summary> | ||||
|             Gets or sets a value indicating whether cached discovery/JWKS responses may be served when the Authority is unreachable. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.OfflineCacheTolerance"> | ||||
|             <summary> | ||||
|             Additional tolerance window during which stale cache entries remain valid if offline fallback is allowed. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.AuthorityUri"> | ||||
|             <summary> | ||||
|             Parsed Authority URI (populated after validation). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.NormalizedScopes"> | ||||
|             <summary> | ||||
|             Normalised scope list (populated after validation). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.NormalizedRetryDelays"> | ||||
|             <summary> | ||||
|             Normalised retry delays (populated after validation). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsAuthClientOptions.Validate"> | ||||
|             <summary> | ||||
|             Validates required values and normalises scope entries. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsDiscoveryCache"> | ||||
|             <summary> | ||||
|             Caches Authority discovery metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.OpenIdConfiguration"> | ||||
|             <summary> | ||||
|             Minimal OpenID Connect configuration representation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.OpenIdConfiguration.#ctor(System.Uri,System.Uri)"> | ||||
|             <summary> | ||||
|             Minimal OpenID Connect configuration representation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsJwksCache"> | ||||
|             <summary> | ||||
|             Caches JWKS documents for Authority. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsTokenCacheEntry"> | ||||
|             <summary> | ||||
|             Represents a cached token entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenCacheEntry.#ctor(System.String,System.String,System.DateTimeOffset,System.Collections.Generic.IReadOnlyList{System.String},System.String,System.String,System.Collections.Generic.IReadOnlyDictionary{System.String,System.String})"> | ||||
|             <summary> | ||||
|             Represents a cached token entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenCacheEntry.IsExpired(System.TimeProvider,System.Nullable{System.TimeSpan})"> | ||||
|             <summary> | ||||
|             Determines whether the token is expired given the provided <see cref="T:System.TimeProvider"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenCacheEntry.NormalizeScopes"> | ||||
|             <summary> | ||||
|             Creates a copy with scopes normalised. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsTokenClient"> | ||||
|             <summary> | ||||
|             Default implementation of <see cref="T:StellaOps.Auth.Client.IStellaOpsTokenClient"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsTokenResult"> | ||||
|             <summary> | ||||
|             Represents an issued token with metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenResult.#ctor(System.String,System.String,System.DateTimeOffset,System.Collections.Generic.IReadOnlyList{System.String},System.String,System.String,System.String)"> | ||||
|             <summary> | ||||
|             Represents an issued token with metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenResult.ToCacheEntry"> | ||||
|             <summary> | ||||
|             Converts the result to a cache entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
| <?xml version="1.0"?> | ||||
| <doc> | ||||
|     <assembly> | ||||
|         <name>StellaOps.Auth.Client</name> | ||||
|     </assembly> | ||||
|     <members> | ||||
|         <member name="T:StellaOps.Auth.Client.FileTokenCache"> | ||||
|             <summary> | ||||
|             File-based token cache suitable for CLI/offline usage. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.InMemoryTokenCache"> | ||||
|             <summary> | ||||
|             In-memory token cache suitable for service scenarios. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.IStellaOpsTokenCache"> | ||||
|             <summary> | ||||
|             Abstraction for caching StellaOps tokens. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenCache.GetAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Retrieves a cached token entry, if present. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenCache.SetAsync(System.String,StellaOps.Auth.Client.StellaOpsTokenCacheEntry,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Stores or updates a token entry for the specified key. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenCache.RemoveAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Removes the cached entry for the specified key. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.IStellaOpsTokenClient"> | ||||
|             <summary> | ||||
|             Abstraction for requesting tokens from StellaOps Authority. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.RequestPasswordTokenAsync(System.String,System.String,System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Requests an access token using the resource owner password credentials flow. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.RequestClientCredentialsTokenAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Requests an access token using the client credentials flow. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.GetJsonWebKeySetAsync(System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Retrieves the cached JWKS document. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.GetCachedTokenAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Retrieves a cached token entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.CacheTokenAsync(System.String,StellaOps.Auth.Client.StellaOpsTokenCacheEntry,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Persists a token entry in the cache. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.IStellaOpsTokenClient.ClearCachedTokenAsync(System.String,System.Threading.CancellationToken)"> | ||||
|             <summary> | ||||
|             Removes a cached entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.ServiceCollectionExtensions"> | ||||
|             <summary> | ||||
|             DI helpers for the StellaOps auth client. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.ServiceCollectionExtensions.AddStellaOpsAuthClient(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.Action{StellaOps.Auth.Client.StellaOpsAuthClientOptions})"> | ||||
|             <summary> | ||||
|             Registers the StellaOps auth client with the provided configuration. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.ServiceCollectionExtensions.AddStellaOpsFileTokenCache(Microsoft.Extensions.DependencyInjection.IServiceCollection,System.String)"> | ||||
|             <summary> | ||||
|             Registers a file-backed token cache implementation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsAuthClientOptions"> | ||||
|             <summary> | ||||
|             Options controlling the StellaOps authentication client. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.Authority"> | ||||
|             <summary> | ||||
|             Authority (issuer) base URL. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.ClientId"> | ||||
|             <summary> | ||||
|             OAuth client identifier (optional for password flow). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.ClientSecret"> | ||||
|             <summary> | ||||
|             OAuth client secret (optional for public clients). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.DefaultScopes"> | ||||
|             <summary> | ||||
|             Default scopes requested for flows that do not explicitly override them. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.RetryDelays"> | ||||
|             <summary> | ||||
|             Retry delays applied by HTTP retry policy (empty uses defaults). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.EnableRetries"> | ||||
|             <summary> | ||||
|             Gets or sets a value indicating whether HTTP retry policies are enabled. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.HttpTimeout"> | ||||
|             <summary> | ||||
|             Timeout applied to discovery and token HTTP requests. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.DiscoveryCacheLifetime"> | ||||
|             <summary> | ||||
|             Lifetime of cached discovery metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.JwksCacheLifetime"> | ||||
|             <summary> | ||||
|             Lifetime of cached JWKS metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.ExpirationSkew"> | ||||
|             <summary> | ||||
|             Buffer applied when determining cache expiration (default: 30 seconds). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.AllowOfflineCacheFallback"> | ||||
|             <summary> | ||||
|             Gets or sets a value indicating whether cached discovery/JWKS responses may be served when the Authority is unreachable. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.OfflineCacheTolerance"> | ||||
|             <summary> | ||||
|             Additional tolerance window during which stale cache entries remain valid if offline fallback is allowed. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.AuthorityUri"> | ||||
|             <summary> | ||||
|             Parsed Authority URI (populated after validation). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.NormalizedScopes"> | ||||
|             <summary> | ||||
|             Normalised scope list (populated after validation). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="P:StellaOps.Auth.Client.StellaOpsAuthClientOptions.NormalizedRetryDelays"> | ||||
|             <summary> | ||||
|             Normalised retry delays (populated after validation). | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsAuthClientOptions.Validate"> | ||||
|             <summary> | ||||
|             Validates required values and normalises scope entries. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsDiscoveryCache"> | ||||
|             <summary> | ||||
|             Caches Authority discovery metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.OpenIdConfiguration"> | ||||
|             <summary> | ||||
|             Minimal OpenID Connect configuration representation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.OpenIdConfiguration.#ctor(System.Uri,System.Uri)"> | ||||
|             <summary> | ||||
|             Minimal OpenID Connect configuration representation. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsJwksCache"> | ||||
|             <summary> | ||||
|             Caches JWKS documents for Authority. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsTokenCacheEntry"> | ||||
|             <summary> | ||||
|             Represents a cached token entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenCacheEntry.#ctor(System.String,System.String,System.DateTimeOffset,System.Collections.Generic.IReadOnlyList{System.String},System.String,System.String,System.Collections.Generic.IReadOnlyDictionary{System.String,System.String})"> | ||||
|             <summary> | ||||
|             Represents a cached token entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenCacheEntry.IsExpired(System.TimeProvider,System.Nullable{System.TimeSpan})"> | ||||
|             <summary> | ||||
|             Determines whether the token is expired given the provided <see cref="T:System.TimeProvider"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenCacheEntry.NormalizeScopes"> | ||||
|             <summary> | ||||
|             Creates a copy with scopes normalised. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsTokenClient"> | ||||
|             <summary> | ||||
|             Default implementation of <see cref="T:StellaOps.Auth.Client.IStellaOpsTokenClient"/>. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="T:StellaOps.Auth.Client.StellaOpsTokenResult"> | ||||
|             <summary> | ||||
|             Represents an issued token with metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenResult.#ctor(System.String,System.String,System.DateTimeOffset,System.Collections.Generic.IReadOnlyList{System.String},System.String,System.String,System.String)"> | ||||
|             <summary> | ||||
|             Represents an issued token with metadata. | ||||
|             </summary> | ||||
|         </member> | ||||
|         <member name="M:StellaOps.Auth.Client.StellaOpsTokenResult.ToCacheEntry"> | ||||
|             <summary> | ||||
|             Converts the result to a cache entry. | ||||
|             </summary> | ||||
|         </member> | ||||
|     </members> | ||||
| </doc> | ||||
|   | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -1,4 +1,4 @@ | ||||
| scenario,iterations,observations,aliases,linksets,mean_total_ms,p95_total_ms,max_total_ms,mean_insert_ms,mean_correlation_ms,mean_throughput_per_sec,min_throughput_per_sec,mean_mongo_throughput_per_sec,min_mongo_throughput_per_sec,max_allocated_mb | ||||
| lnm_ingest_baseline,5,5000,500,6000,555.1984,823.4957,866.6236,366.2635,188.9349,9877.7916,5769.5175,15338.0851,8405.1257,62.4477 | ||||
| lnm_ingest_fanout_medium,5,10000,800,14800,785.8909,841.6247,842.8815,453.5087,332.3822,12794.9550,11864.0639,22086.0320,20891.0579,145.8328 | ||||
| lnm_ingest_fanout_high,5,15000,1200,17400,1299.3458,1367.0934,1369.9430,741.6265,557.7193,11571.0991,10949.3607,20232.5180,19781.6762,238.3450 | ||||
| scenario,iterations,observations,aliases,linksets,mean_total_ms,p95_total_ms,max_total_ms,mean_insert_ms,mean_correlation_ms,mean_throughput_per_sec,min_throughput_per_sec,mean_mongo_throughput_per_sec,min_mongo_throughput_per_sec,max_allocated_mb | ||||
| lnm_ingest_baseline,5,5000,500,6000,555.1984,823.4957,866.6236,366.2635,188.9349,9877.7916,5769.5175,15338.0851,8405.1257,62.4477 | ||||
| lnm_ingest_fanout_medium,5,10000,800,14800,785.8909,841.6247,842.8815,453.5087,332.3822,12794.9550,11864.0639,22086.0320,20891.0579,145.8328 | ||||
| lnm_ingest_fanout_high,5,15000,1200,17400,1299.3458,1367.0934,1369.9430,741.6265,557.7193,11571.0991,10949.3607,20232.5180,19781.6762,238.3450 | ||||
|   | ||||
| 
 | 
| @@ -1,84 +1,84 @@ | ||||
| { | ||||
|   "schemaVersion": "linknotmerge-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T21:09:17.6345283+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "lnm_ingest_baseline", | ||||
|       "label": "5k observations, 500 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 5000, | ||||
|       "aliases": 500, | ||||
|       "linksets": 6000, | ||||
|       "meanTotalMs": 555.1983600000001, | ||||
|       "p95TotalMs": 823.49568, | ||||
|       "maxTotalMs": 866.6236, | ||||
|       "meanInsertMs": 366.2635, | ||||
|       "meanCorrelationMs": 188.93486000000001, | ||||
|       "meanThroughputPerSecond": 9877.791561756272, | ||||
|       "minThroughputPerSecond": 5769.517469868118, | ||||
|       "meanMongoThroughputPerSecond": 15338.085148262326, | ||||
|       "minMongoThroughputPerSecond": 8405.1257146248, | ||||
|       "maxAllocatedMb": 62.44767761230469, | ||||
|       "thresholdMs": 900, | ||||
|       "minThroughputThresholdPerSecond": 5500, | ||||
|       "minMongoThroughputThresholdPerSecond": 8000, | ||||
|       "maxAllocatedThresholdMb": 160, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "lnm_ingest_fanout_medium", | ||||
|       "label": "10k observations, 800 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 10000, | ||||
|       "aliases": 800, | ||||
|       "linksets": 14800, | ||||
|       "meanTotalMs": 785.89092, | ||||
|       "p95TotalMs": 841.6247, | ||||
|       "maxTotalMs": 842.8815, | ||||
|       "meanInsertMs": 453.50868, | ||||
|       "meanCorrelationMs": 332.38224, | ||||
|       "meanThroughputPerSecond": 12794.954951406156, | ||||
|       "minThroughputPerSecond": 11864.063928322072, | ||||
|       "meanMongoThroughputPerSecond": 22086.032034175576, | ||||
|       "minMongoThroughputPerSecond": 20891.057937797712, | ||||
|       "maxAllocatedMb": 145.83282470703125, | ||||
|       "thresholdMs": 1300, | ||||
|       "minThroughputThresholdPerSecond": 8000, | ||||
|       "minMongoThroughputThresholdPerSecond": 13000, | ||||
|       "maxAllocatedThresholdMb": 220, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "lnm_ingest_fanout_high", | ||||
|       "label": "15k observations, 1200 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 15000, | ||||
|       "aliases": 1200, | ||||
|       "linksets": 17400, | ||||
|       "meanTotalMs": 1299.3458, | ||||
|       "p95TotalMs": 1367.09344, | ||||
|       "maxTotalMs": 1369.943, | ||||
|       "meanInsertMs": 741.62654, | ||||
|       "meanCorrelationMs": 557.71926, | ||||
|       "meanThroughputPerSecond": 11571.099129140825, | ||||
|       "minThroughputPerSecond": 10949.360666830664, | ||||
|       "meanMongoThroughputPerSecond": 20232.5179777937, | ||||
|       "minMongoThroughputPerSecond": 19781.676233305086, | ||||
|       "maxAllocatedMb": 238.34496307373047, | ||||
|       "thresholdMs": 2200, | ||||
|       "minThroughputThresholdPerSecond": 7000, | ||||
|       "minMongoThroughputThresholdPerSecond": 13000, | ||||
|       "maxAllocatedThresholdMb": 300, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| { | ||||
|   "schemaVersion": "linknotmerge-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T21:09:17.6345283+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "lnm_ingest_baseline", | ||||
|       "label": "5k observations, 500 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 5000, | ||||
|       "aliases": 500, | ||||
|       "linksets": 6000, | ||||
|       "meanTotalMs": 555.1983600000001, | ||||
|       "p95TotalMs": 823.49568, | ||||
|       "maxTotalMs": 866.6236, | ||||
|       "meanInsertMs": 366.2635, | ||||
|       "meanCorrelationMs": 188.93486000000001, | ||||
|       "meanThroughputPerSecond": 9877.791561756272, | ||||
|       "minThroughputPerSecond": 5769.517469868118, | ||||
|       "meanMongoThroughputPerSecond": 15338.085148262326, | ||||
|       "minMongoThroughputPerSecond": 8405.1257146248, | ||||
|       "maxAllocatedMb": 62.44767761230469, | ||||
|       "thresholdMs": 900, | ||||
|       "minThroughputThresholdPerSecond": 5500, | ||||
|       "minMongoThroughputThresholdPerSecond": 8000, | ||||
|       "maxAllocatedThresholdMb": 160, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "lnm_ingest_fanout_medium", | ||||
|       "label": "10k observations, 800 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 10000, | ||||
|       "aliases": 800, | ||||
|       "linksets": 14800, | ||||
|       "meanTotalMs": 785.89092, | ||||
|       "p95TotalMs": 841.6247, | ||||
|       "maxTotalMs": 842.8815, | ||||
|       "meanInsertMs": 453.50868, | ||||
|       "meanCorrelationMs": 332.38224, | ||||
|       "meanThroughputPerSecond": 12794.954951406156, | ||||
|       "minThroughputPerSecond": 11864.063928322072, | ||||
|       "meanMongoThroughputPerSecond": 22086.032034175576, | ||||
|       "minMongoThroughputPerSecond": 20891.057937797712, | ||||
|       "maxAllocatedMb": 145.83282470703125, | ||||
|       "thresholdMs": 1300, | ||||
|       "minThroughputThresholdPerSecond": 8000, | ||||
|       "minMongoThroughputThresholdPerSecond": 13000, | ||||
|       "maxAllocatedThresholdMb": 220, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "lnm_ingest_fanout_high", | ||||
|       "label": "15k observations, 1200 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 15000, | ||||
|       "aliases": 1200, | ||||
|       "linksets": 17400, | ||||
|       "meanTotalMs": 1299.3458, | ||||
|       "p95TotalMs": 1367.09344, | ||||
|       "maxTotalMs": 1369.943, | ||||
|       "meanInsertMs": 741.62654, | ||||
|       "meanCorrelationMs": 557.71926, | ||||
|       "meanThroughputPerSecond": 11571.099129140825, | ||||
|       "minThroughputPerSecond": 10949.360666830664, | ||||
|       "meanMongoThroughputPerSecond": 20232.5179777937, | ||||
|       "minMongoThroughputPerSecond": 19781.676233305086, | ||||
|       "maxAllocatedMb": 238.34496307373047, | ||||
|       "thresholdMs": 2200, | ||||
|       "minThroughputThresholdPerSecond": 7000, | ||||
|       "minMongoThroughputThresholdPerSecond": 13000, | ||||
|       "maxAllocatedThresholdMb": 300, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -1,60 +1,60 @@ | ||||
| # HELP linknotmerge_bench_total_ms Link-Not-Merge benchmark total duration metrics (milliseconds). | ||||
| # TYPE linknotmerge_bench_total_ms gauge | ||||
| # HELP linknotmerge_bench_correlation_ms Link-Not-Merge benchmark correlation duration metrics (milliseconds). | ||||
| # TYPE linknotmerge_bench_correlation_ms gauge | ||||
| # HELP linknotmerge_bench_insert_ms Link-Not-Merge benchmark Mongo insert duration metrics (milliseconds). | ||||
| # TYPE linknotmerge_bench_insert_ms gauge | ||||
| # HELP linknotmerge_bench_throughput_per_sec Link-Not-Merge benchmark throughput metrics (observations per second). | ||||
| # TYPE linknotmerge_bench_throughput_per_sec gauge | ||||
| # HELP linknotmerge_bench_mongo_throughput_per_sec Link-Not-Merge benchmark Mongo throughput metrics (operations per second). | ||||
| # TYPE linknotmerge_bench_mongo_throughput_per_sec gauge | ||||
| # HELP linknotmerge_bench_allocated_mb Link-Not-Merge benchmark allocation metrics (megabytes). | ||||
| # TYPE linknotmerge_bench_allocated_mb gauge | ||||
| linknotmerge_bench_mean_total_ms{scenario="lnm_ingest_baseline"} 555.19836000000009 | ||||
| linknotmerge_bench_p95_total_ms{scenario="lnm_ingest_baseline"} 823.49567999999999 | ||||
| linknotmerge_bench_max_total_ms{scenario="lnm_ingest_baseline"} 866.62360000000001 | ||||
| linknotmerge_bench_threshold_ms{scenario="lnm_ingest_baseline"} 900 | ||||
| linknotmerge_bench_mean_correlation_ms{scenario="lnm_ingest_baseline"} 188.93486000000001 | ||||
| linknotmerge_bench_mean_insert_ms{scenario="lnm_ingest_baseline"} 366.26350000000002 | ||||
| linknotmerge_bench_mean_throughput_per_sec{scenario="lnm_ingest_baseline"} 9877.7915617562721 | ||||
| linknotmerge_bench_min_throughput_per_sec{scenario="lnm_ingest_baseline"} 5769.5174698681176 | ||||
| linknotmerge_bench_throughput_floor_per_sec{scenario="lnm_ingest_baseline"} 5500 | ||||
| linknotmerge_bench_mean_mongo_throughput_per_sec{scenario="lnm_ingest_baseline"} 15338.085148262326 | ||||
| linknotmerge_bench_min_mongo_throughput_per_sec{scenario="lnm_ingest_baseline"} 8405.1257146248008 | ||||
| linknotmerge_bench_mongo_throughput_floor_per_sec{scenario="lnm_ingest_baseline"} 8000 | ||||
| linknotmerge_bench_max_allocated_mb{scenario="lnm_ingest_baseline"} 62.447677612304688 | ||||
| linknotmerge_bench_max_allocated_threshold_mb{scenario="lnm_ingest_baseline"} 160 | ||||
| linknotmerge_bench_regression_limit{scenario="lnm_ingest_baseline"} 1.1499999999999999 | ||||
| linknotmerge_bench_regression_breached{scenario="lnm_ingest_baseline"} 0 | ||||
| linknotmerge_bench_mean_total_ms{scenario="lnm_ingest_fanout_medium"} 785.89092000000005 | ||||
| linknotmerge_bench_p95_total_ms{scenario="lnm_ingest_fanout_medium"} 841.62469999999996 | ||||
| linknotmerge_bench_max_total_ms{scenario="lnm_ingest_fanout_medium"} 842.88149999999996 | ||||
| linknotmerge_bench_threshold_ms{scenario="lnm_ingest_fanout_medium"} 1300 | ||||
| linknotmerge_bench_mean_correlation_ms{scenario="lnm_ingest_fanout_medium"} 332.38224000000002 | ||||
| linknotmerge_bench_mean_insert_ms{scenario="lnm_ingest_fanout_medium"} 453.50868000000003 | ||||
| linknotmerge_bench_mean_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 12794.954951406156 | ||||
| linknotmerge_bench_min_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 11864.063928322072 | ||||
| linknotmerge_bench_throughput_floor_per_sec{scenario="lnm_ingest_fanout_medium"} 8000 | ||||
| linknotmerge_bench_mean_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 22086.032034175576 | ||||
| linknotmerge_bench_min_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 20891.057937797712 | ||||
| linknotmerge_bench_mongo_throughput_floor_per_sec{scenario="lnm_ingest_fanout_medium"} 13000 | ||||
| linknotmerge_bench_max_allocated_mb{scenario="lnm_ingest_fanout_medium"} 145.83282470703125 | ||||
| linknotmerge_bench_max_allocated_threshold_mb{scenario="lnm_ingest_fanout_medium"} 220 | ||||
| linknotmerge_bench_regression_limit{scenario="lnm_ingest_fanout_medium"} 1.1499999999999999 | ||||
| linknotmerge_bench_regression_breached{scenario="lnm_ingest_fanout_medium"} 0 | ||||
| linknotmerge_bench_mean_total_ms{scenario="lnm_ingest_fanout_high"} 1299.3458000000001 | ||||
| linknotmerge_bench_p95_total_ms{scenario="lnm_ingest_fanout_high"} 1367.0934400000001 | ||||
| linknotmerge_bench_max_total_ms{scenario="lnm_ingest_fanout_high"} 1369.943 | ||||
| linknotmerge_bench_threshold_ms{scenario="lnm_ingest_fanout_high"} 2200 | ||||
| linknotmerge_bench_mean_correlation_ms{scenario="lnm_ingest_fanout_high"} 557.71925999999996 | ||||
| linknotmerge_bench_mean_insert_ms{scenario="lnm_ingest_fanout_high"} 741.62653999999998 | ||||
| linknotmerge_bench_mean_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 11571.099129140825 | ||||
| linknotmerge_bench_min_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 10949.360666830664 | ||||
| linknotmerge_bench_throughput_floor_per_sec{scenario="lnm_ingest_fanout_high"} 7000 | ||||
| linknotmerge_bench_mean_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 20232.517977793701 | ||||
| linknotmerge_bench_min_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 19781.676233305086 | ||||
| linknotmerge_bench_mongo_throughput_floor_per_sec{scenario="lnm_ingest_fanout_high"} 13000 | ||||
| linknotmerge_bench_max_allocated_mb{scenario="lnm_ingest_fanout_high"} 238.34496307373047 | ||||
| linknotmerge_bench_max_allocated_threshold_mb{scenario="lnm_ingest_fanout_high"} 300 | ||||
| linknotmerge_bench_regression_limit{scenario="lnm_ingest_fanout_high"} 1.1499999999999999 | ||||
| linknotmerge_bench_regression_breached{scenario="lnm_ingest_fanout_high"} 0 | ||||
| # HELP linknotmerge_bench_total_ms Link-Not-Merge benchmark total duration metrics (milliseconds). | ||||
| # TYPE linknotmerge_bench_total_ms gauge | ||||
| # HELP linknotmerge_bench_correlation_ms Link-Not-Merge benchmark correlation duration metrics (milliseconds). | ||||
| # TYPE linknotmerge_bench_correlation_ms gauge | ||||
| # HELP linknotmerge_bench_insert_ms Link-Not-Merge benchmark Mongo insert duration metrics (milliseconds). | ||||
| # TYPE linknotmerge_bench_insert_ms gauge | ||||
| # HELP linknotmerge_bench_throughput_per_sec Link-Not-Merge benchmark throughput metrics (observations per second). | ||||
| # TYPE linknotmerge_bench_throughput_per_sec gauge | ||||
| # HELP linknotmerge_bench_mongo_throughput_per_sec Link-Not-Merge benchmark Mongo throughput metrics (operations per second). | ||||
| # TYPE linknotmerge_bench_mongo_throughput_per_sec gauge | ||||
| # HELP linknotmerge_bench_allocated_mb Link-Not-Merge benchmark allocation metrics (megabytes). | ||||
| # TYPE linknotmerge_bench_allocated_mb gauge | ||||
| linknotmerge_bench_mean_total_ms{scenario="lnm_ingest_baseline"} 555.19836000000009 | ||||
| linknotmerge_bench_p95_total_ms{scenario="lnm_ingest_baseline"} 823.49567999999999 | ||||
| linknotmerge_bench_max_total_ms{scenario="lnm_ingest_baseline"} 866.62360000000001 | ||||
| linknotmerge_bench_threshold_ms{scenario="lnm_ingest_baseline"} 900 | ||||
| linknotmerge_bench_mean_correlation_ms{scenario="lnm_ingest_baseline"} 188.93486000000001 | ||||
| linknotmerge_bench_mean_insert_ms{scenario="lnm_ingest_baseline"} 366.26350000000002 | ||||
| linknotmerge_bench_mean_throughput_per_sec{scenario="lnm_ingest_baseline"} 9877.7915617562721 | ||||
| linknotmerge_bench_min_throughput_per_sec{scenario="lnm_ingest_baseline"} 5769.5174698681176 | ||||
| linknotmerge_bench_throughput_floor_per_sec{scenario="lnm_ingest_baseline"} 5500 | ||||
| linknotmerge_bench_mean_mongo_throughput_per_sec{scenario="lnm_ingest_baseline"} 15338.085148262326 | ||||
| linknotmerge_bench_min_mongo_throughput_per_sec{scenario="lnm_ingest_baseline"} 8405.1257146248008 | ||||
| linknotmerge_bench_mongo_throughput_floor_per_sec{scenario="lnm_ingest_baseline"} 8000 | ||||
| linknotmerge_bench_max_allocated_mb{scenario="lnm_ingest_baseline"} 62.447677612304688 | ||||
| linknotmerge_bench_max_allocated_threshold_mb{scenario="lnm_ingest_baseline"} 160 | ||||
| linknotmerge_bench_regression_limit{scenario="lnm_ingest_baseline"} 1.1499999999999999 | ||||
| linknotmerge_bench_regression_breached{scenario="lnm_ingest_baseline"} 0 | ||||
| linknotmerge_bench_mean_total_ms{scenario="lnm_ingest_fanout_medium"} 785.89092000000005 | ||||
| linknotmerge_bench_p95_total_ms{scenario="lnm_ingest_fanout_medium"} 841.62469999999996 | ||||
| linknotmerge_bench_max_total_ms{scenario="lnm_ingest_fanout_medium"} 842.88149999999996 | ||||
| linknotmerge_bench_threshold_ms{scenario="lnm_ingest_fanout_medium"} 1300 | ||||
| linknotmerge_bench_mean_correlation_ms{scenario="lnm_ingest_fanout_medium"} 332.38224000000002 | ||||
| linknotmerge_bench_mean_insert_ms{scenario="lnm_ingest_fanout_medium"} 453.50868000000003 | ||||
| linknotmerge_bench_mean_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 12794.954951406156 | ||||
| linknotmerge_bench_min_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 11864.063928322072 | ||||
| linknotmerge_bench_throughput_floor_per_sec{scenario="lnm_ingest_fanout_medium"} 8000 | ||||
| linknotmerge_bench_mean_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 22086.032034175576 | ||||
| linknotmerge_bench_min_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_medium"} 20891.057937797712 | ||||
| linknotmerge_bench_mongo_throughput_floor_per_sec{scenario="lnm_ingest_fanout_medium"} 13000 | ||||
| linknotmerge_bench_max_allocated_mb{scenario="lnm_ingest_fanout_medium"} 145.83282470703125 | ||||
| linknotmerge_bench_max_allocated_threshold_mb{scenario="lnm_ingest_fanout_medium"} 220 | ||||
| linknotmerge_bench_regression_limit{scenario="lnm_ingest_fanout_medium"} 1.1499999999999999 | ||||
| linknotmerge_bench_regression_breached{scenario="lnm_ingest_fanout_medium"} 0 | ||||
| linknotmerge_bench_mean_total_ms{scenario="lnm_ingest_fanout_high"} 1299.3458000000001 | ||||
| linknotmerge_bench_p95_total_ms{scenario="lnm_ingest_fanout_high"} 1367.0934400000001 | ||||
| linknotmerge_bench_max_total_ms{scenario="lnm_ingest_fanout_high"} 1369.943 | ||||
| linknotmerge_bench_threshold_ms{scenario="lnm_ingest_fanout_high"} 2200 | ||||
| linknotmerge_bench_mean_correlation_ms{scenario="lnm_ingest_fanout_high"} 557.71925999999996 | ||||
| linknotmerge_bench_mean_insert_ms{scenario="lnm_ingest_fanout_high"} 741.62653999999998 | ||||
| linknotmerge_bench_mean_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 11571.099129140825 | ||||
| linknotmerge_bench_min_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 10949.360666830664 | ||||
| linknotmerge_bench_throughput_floor_per_sec{scenario="lnm_ingest_fanout_high"} 7000 | ||||
| linknotmerge_bench_mean_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 20232.517977793701 | ||||
| linknotmerge_bench_min_mongo_throughput_per_sec{scenario="lnm_ingest_fanout_high"} 19781.676233305086 | ||||
| linknotmerge_bench_mongo_throughput_floor_per_sec{scenario="lnm_ingest_fanout_high"} 13000 | ||||
| linknotmerge_bench_max_allocated_mb{scenario="lnm_ingest_fanout_high"} 238.34496307373047 | ||||
| linknotmerge_bench_max_allocated_threshold_mb{scenario="lnm_ingest_fanout_high"} 300 | ||||
| linknotmerge_bench_regression_limit{scenario="lnm_ingest_fanout_high"} 1.1499999999999999 | ||||
| linknotmerge_bench_regression_breached{scenario="lnm_ingest_fanout_high"} 0 | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| scenario,iterations,observations,statements,events,mean_total_ms,p95_total_ms,max_total_ms,mean_insert_ms,mean_correlation_ms,mean_observation_throughput_per_sec,min_observation_throughput_per_sec,mean_event_throughput_per_sec,min_event_throughput_per_sec,max_allocated_mb | ||||
| vex_ingest_baseline,5,4000,24000,21326,842.8191,1319.3038,1432.7675,346.7277,496.0915,5349.8940,2791.7998,48942.4901,24653.0556,138.6365 | ||||
| vex_ingest_medium,5,8000,64000,56720,1525.9929,1706.8900,1748.9056,533.3378,992.6552,5274.5883,4574.2892,57654.9190,48531.7353,326.8638 | ||||
| vex_ingest_high,5,12000,120000,106910,2988.5094,3422.1728,3438.9364,903.3927,2085.1167,4066.2300,3489.4510,52456.9493,42358.0556,583.9903 | ||||
| scenario,iterations,observations,statements,events,mean_total_ms,p95_total_ms,max_total_ms,mean_insert_ms,mean_correlation_ms,mean_observation_throughput_per_sec,min_observation_throughput_per_sec,mean_event_throughput_per_sec,min_event_throughput_per_sec,max_allocated_mb | ||||
| vex_ingest_baseline,5,4000,24000,21326,842.8191,1319.3038,1432.7675,346.7277,496.0915,5349.8940,2791.7998,48942.4901,24653.0556,138.6365 | ||||
| vex_ingest_medium,5,8000,64000,56720,1525.9929,1706.8900,1748.9056,533.3378,992.6552,5274.5883,4574.2892,57654.9190,48531.7353,326.8638 | ||||
| vex_ingest_high,5,12000,120000,106910,2988.5094,3422.1728,3438.9364,903.3927,2085.1167,4066.2300,3489.4510,52456.9493,42358.0556,583.9903 | ||||
|   | ||||
| 
 | 
| @@ -1,84 +1,84 @@ | ||||
| { | ||||
|   "schemaVersion": "linknotmerge-vex-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T21:29:34.4007212+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "vex_ingest_baseline", | ||||
|       "label": "4k observations, 400 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 4000, | ||||
|       "statements": 24000, | ||||
|       "events": 21326, | ||||
|       "meanTotalMs": 842.81914, | ||||
|       "p95TotalMs": 1319.3037799999997, | ||||
|       "maxTotalMs": 1432.7675, | ||||
|       "meanInsertMs": 346.72766, | ||||
|       "meanCorrelationMs": 496.09147999999993, | ||||
|       "meanObservationThroughputPerSecond": 5349.894040882909, | ||||
|       "minObservationThroughputPerSecond": 2791.7997860783416, | ||||
|       "meanEventThroughputPerSecond": 48942.49008943273, | ||||
|       "minEventThroughputPerSecond": 24653.055581276763, | ||||
|       "maxAllocatedMb": 138.63648986816406, | ||||
|       "thresholdMs": 2300, | ||||
|       "minObservationThroughputThresholdPerSecond": 1800, | ||||
|       "minEventThroughputThresholdPerSecond": 2000, | ||||
|       "maxAllocatedThresholdMb": 220, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "vex_ingest_medium", | ||||
|       "label": "8k observations, 700 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 8000, | ||||
|       "statements": 64000, | ||||
|       "events": 56720, | ||||
|       "meanTotalMs": 1525.99294, | ||||
|       "p95TotalMs": 1706.89, | ||||
|       "maxTotalMs": 1748.9056, | ||||
|       "meanInsertMs": 533.3377800000001, | ||||
|       "meanCorrelationMs": 992.6551599999999, | ||||
|       "meanObservationThroughputPerSecond": 5274.588273225903, | ||||
|       "minObservationThroughputPerSecond": 4574.289201201025, | ||||
|       "meanEventThroughputPerSecond": 57654.91903920916, | ||||
|       "minEventThroughputPerSecond": 48531.73532270095, | ||||
|       "maxAllocatedMb": 326.8638000488281, | ||||
|       "thresholdMs": 3200, | ||||
|       "minObservationThroughputThresholdPerSecond": 2200, | ||||
|       "minEventThroughputThresholdPerSecond": 2500, | ||||
|       "maxAllocatedThresholdMb": 400, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "vex_ingest_high", | ||||
|       "label": "12k observations, 1100 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 12000, | ||||
|       "statements": 120000, | ||||
|       "events": 106910, | ||||
|       "meanTotalMs": 2988.50936, | ||||
|       "p95TotalMs": 3422.1728, | ||||
|       "maxTotalMs": 3438.9364, | ||||
|       "meanInsertMs": 903.3926800000002, | ||||
|       "meanCorrelationMs": 2085.11668, | ||||
|       "meanObservationThroughputPerSecond": 4066.2299506870645, | ||||
|       "minObservationThroughputPerSecond": 3489.450982577055, | ||||
|       "meanEventThroughputPerSecond": 52456.94928323016, | ||||
|       "minEventThroughputPerSecond": 42358.05564361166, | ||||
|       "maxAllocatedMb": 583.9903411865234, | ||||
|       "thresholdMs": 4200, | ||||
|       "minObservationThroughputThresholdPerSecond": 2200, | ||||
|       "minEventThroughputThresholdPerSecond": 2500, | ||||
|       "maxAllocatedThresholdMb": 700, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| { | ||||
|   "schemaVersion": "linknotmerge-vex-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T21:29:34.4007212+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "vex_ingest_baseline", | ||||
|       "label": "4k observations, 400 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 4000, | ||||
|       "statements": 24000, | ||||
|       "events": 21326, | ||||
|       "meanTotalMs": 842.81914, | ||||
|       "p95TotalMs": 1319.3037799999997, | ||||
|       "maxTotalMs": 1432.7675, | ||||
|       "meanInsertMs": 346.72766, | ||||
|       "meanCorrelationMs": 496.09147999999993, | ||||
|       "meanObservationThroughputPerSecond": 5349.894040882909, | ||||
|       "minObservationThroughputPerSecond": 2791.7997860783416, | ||||
|       "meanEventThroughputPerSecond": 48942.49008943273, | ||||
|       "minEventThroughputPerSecond": 24653.055581276763, | ||||
|       "maxAllocatedMb": 138.63648986816406, | ||||
|       "thresholdMs": 2300, | ||||
|       "minObservationThroughputThresholdPerSecond": 1800, | ||||
|       "minEventThroughputThresholdPerSecond": 2000, | ||||
|       "maxAllocatedThresholdMb": 220, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "vex_ingest_medium", | ||||
|       "label": "8k observations, 700 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 8000, | ||||
|       "statements": 64000, | ||||
|       "events": 56720, | ||||
|       "meanTotalMs": 1525.99294, | ||||
|       "p95TotalMs": 1706.89, | ||||
|       "maxTotalMs": 1748.9056, | ||||
|       "meanInsertMs": 533.3377800000001, | ||||
|       "meanCorrelationMs": 992.6551599999999, | ||||
|       "meanObservationThroughputPerSecond": 5274.588273225903, | ||||
|       "minObservationThroughputPerSecond": 4574.289201201025, | ||||
|       "meanEventThroughputPerSecond": 57654.91903920916, | ||||
|       "minEventThroughputPerSecond": 48531.73532270095, | ||||
|       "maxAllocatedMb": 326.8638000488281, | ||||
|       "thresholdMs": 3200, | ||||
|       "minObservationThroughputThresholdPerSecond": 2200, | ||||
|       "minEventThroughputThresholdPerSecond": 2500, | ||||
|       "maxAllocatedThresholdMb": 400, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "vex_ingest_high", | ||||
|       "label": "12k observations, 1100 aliases", | ||||
|       "iterations": 5, | ||||
|       "observations": 12000, | ||||
|       "statements": 120000, | ||||
|       "events": 106910, | ||||
|       "meanTotalMs": 2988.50936, | ||||
|       "p95TotalMs": 3422.1728, | ||||
|       "maxTotalMs": 3438.9364, | ||||
|       "meanInsertMs": 903.3926800000002, | ||||
|       "meanCorrelationMs": 2085.11668, | ||||
|       "meanObservationThroughputPerSecond": 4066.2299506870645, | ||||
|       "minObservationThroughputPerSecond": 3489.450982577055, | ||||
|       "meanEventThroughputPerSecond": 52456.94928323016, | ||||
|       "minEventThroughputPerSecond": 42358.05564361166, | ||||
|       "maxAllocatedMb": 583.9903411865234, | ||||
|       "thresholdMs": 4200, | ||||
|       "minObservationThroughputThresholdPerSecond": 2200, | ||||
|       "minEventThroughputThresholdPerSecond": 2500, | ||||
|       "maxAllocatedThresholdMb": 700, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -1,50 +1,50 @@ | ||||
| # HELP linknotmerge_vex_bench_total_ms Link-Not-Merge VEX benchmark total duration (milliseconds). | ||||
| # TYPE linknotmerge_vex_bench_total_ms gauge | ||||
| # HELP linknotmerge_vex_bench_throughput_per_sec Link-Not-Merge VEX benchmark observation throughput (observations per second). | ||||
| # TYPE linknotmerge_vex_bench_throughput_per_sec gauge | ||||
| # HELP linknotmerge_vex_bench_event_throughput_per_sec Link-Not-Merge VEX benchmark event throughput (events per second). | ||||
| # TYPE linknotmerge_vex_bench_event_throughput_per_sec gauge | ||||
| # HELP linknotmerge_vex_bench_allocated_mb Link-Not-Merge VEX benchmark max allocations (megabytes). | ||||
| # TYPE linknotmerge_vex_bench_allocated_mb gauge | ||||
| linknotmerge_vex_bench_mean_total_ms{scenario="vex_ingest_baseline"} 842.81913999999995 | ||||
| linknotmerge_vex_bench_p95_total_ms{scenario="vex_ingest_baseline"} 1319.3037799999997 | ||||
| linknotmerge_vex_bench_max_total_ms{scenario="vex_ingest_baseline"} 1432.7674999999999 | ||||
| linknotmerge_vex_bench_threshold_ms{scenario="vex_ingest_baseline"} 2300 | ||||
| linknotmerge_vex_bench_mean_observation_throughput_per_sec{scenario="vex_ingest_baseline"} 5349.8940408829094 | ||||
| linknotmerge_vex_bench_min_observation_throughput_per_sec{scenario="vex_ingest_baseline"} 2791.7997860783416 | ||||
| linknotmerge_vex_bench_observation_throughput_floor_per_sec{scenario="vex_ingest_baseline"} 1800 | ||||
| linknotmerge_vex_bench_mean_event_throughput_per_sec{scenario="vex_ingest_baseline"} 48942.490089432729 | ||||
| linknotmerge_vex_bench_min_event_throughput_per_sec{scenario="vex_ingest_baseline"} 24653.055581276763 | ||||
| linknotmerge_vex_bench_event_throughput_floor_per_sec{scenario="vex_ingest_baseline"} 2000 | ||||
| linknotmerge_vex_bench_max_allocated_mb{scenario="vex_ingest_baseline"} 138.63648986816406 | ||||
| linknotmerge_vex_bench_max_allocated_threshold_mb{scenario="vex_ingest_baseline"} 220 | ||||
| linknotmerge_vex_bench_regression_limit{scenario="vex_ingest_baseline"} 1.1499999999999999 | ||||
| linknotmerge_vex_bench_regression_breached{scenario="vex_ingest_baseline"} 0 | ||||
| linknotmerge_vex_bench_mean_total_ms{scenario="vex_ingest_medium"} 1525.9929400000001 | ||||
| linknotmerge_vex_bench_p95_total_ms{scenario="vex_ingest_medium"} 1706.8900000000001 | ||||
| linknotmerge_vex_bench_max_total_ms{scenario="vex_ingest_medium"} 1748.9056 | ||||
| linknotmerge_vex_bench_threshold_ms{scenario="vex_ingest_medium"} 3200 | ||||
| linknotmerge_vex_bench_mean_observation_throughput_per_sec{scenario="vex_ingest_medium"} 5274.5882732259033 | ||||
| linknotmerge_vex_bench_min_observation_throughput_per_sec{scenario="vex_ingest_medium"} 4574.2892012010252 | ||||
| linknotmerge_vex_bench_observation_throughput_floor_per_sec{scenario="vex_ingest_medium"} 2200 | ||||
| linknotmerge_vex_bench_mean_event_throughput_per_sec{scenario="vex_ingest_medium"} 57654.919039209162 | ||||
| linknotmerge_vex_bench_min_event_throughput_per_sec{scenario="vex_ingest_medium"} 48531.735322700952 | ||||
| linknotmerge_vex_bench_event_throughput_floor_per_sec{scenario="vex_ingest_medium"} 2500 | ||||
| linknotmerge_vex_bench_max_allocated_mb{scenario="vex_ingest_medium"} 326.86380004882812 | ||||
| linknotmerge_vex_bench_max_allocated_threshold_mb{scenario="vex_ingest_medium"} 400 | ||||
| linknotmerge_vex_bench_regression_limit{scenario="vex_ingest_medium"} 1.1499999999999999 | ||||
| linknotmerge_vex_bench_regression_breached{scenario="vex_ingest_medium"} 0 | ||||
| linknotmerge_vex_bench_mean_total_ms{scenario="vex_ingest_high"} 2988.50936 | ||||
| linknotmerge_vex_bench_p95_total_ms{scenario="vex_ingest_high"} 3422.1727999999998 | ||||
| linknotmerge_vex_bench_max_total_ms{scenario="vex_ingest_high"} 3438.9364 | ||||
| linknotmerge_vex_bench_threshold_ms{scenario="vex_ingest_high"} 4200 | ||||
| linknotmerge_vex_bench_mean_observation_throughput_per_sec{scenario="vex_ingest_high"} 4066.2299506870645 | ||||
| linknotmerge_vex_bench_min_observation_throughput_per_sec{scenario="vex_ingest_high"} 3489.4509825770551 | ||||
| linknotmerge_vex_bench_observation_throughput_floor_per_sec{scenario="vex_ingest_high"} 2200 | ||||
| linknotmerge_vex_bench_mean_event_throughput_per_sec{scenario="vex_ingest_high"} 52456.949283230162 | ||||
| linknotmerge_vex_bench_min_event_throughput_per_sec{scenario="vex_ingest_high"} 42358.05564361166 | ||||
| linknotmerge_vex_bench_event_throughput_floor_per_sec{scenario="vex_ingest_high"} 2500 | ||||
| linknotmerge_vex_bench_max_allocated_mb{scenario="vex_ingest_high"} 583.99034118652344 | ||||
| linknotmerge_vex_bench_max_allocated_threshold_mb{scenario="vex_ingest_high"} 700 | ||||
| linknotmerge_vex_bench_regression_limit{scenario="vex_ingest_high"} 1.1499999999999999 | ||||
| linknotmerge_vex_bench_regression_breached{scenario="vex_ingest_high"} 0 | ||||
| # HELP linknotmerge_vex_bench_total_ms Link-Not-Merge VEX benchmark total duration (milliseconds). | ||||
| # TYPE linknotmerge_vex_bench_total_ms gauge | ||||
| # HELP linknotmerge_vex_bench_throughput_per_sec Link-Not-Merge VEX benchmark observation throughput (observations per second). | ||||
| # TYPE linknotmerge_vex_bench_throughput_per_sec gauge | ||||
| # HELP linknotmerge_vex_bench_event_throughput_per_sec Link-Not-Merge VEX benchmark event throughput (events per second). | ||||
| # TYPE linknotmerge_vex_bench_event_throughput_per_sec gauge | ||||
| # HELP linknotmerge_vex_bench_allocated_mb Link-Not-Merge VEX benchmark max allocations (megabytes). | ||||
| # TYPE linknotmerge_vex_bench_allocated_mb gauge | ||||
| linknotmerge_vex_bench_mean_total_ms{scenario="vex_ingest_baseline"} 842.81913999999995 | ||||
| linknotmerge_vex_bench_p95_total_ms{scenario="vex_ingest_baseline"} 1319.3037799999997 | ||||
| linknotmerge_vex_bench_max_total_ms{scenario="vex_ingest_baseline"} 1432.7674999999999 | ||||
| linknotmerge_vex_bench_threshold_ms{scenario="vex_ingest_baseline"} 2300 | ||||
| linknotmerge_vex_bench_mean_observation_throughput_per_sec{scenario="vex_ingest_baseline"} 5349.8940408829094 | ||||
| linknotmerge_vex_bench_min_observation_throughput_per_sec{scenario="vex_ingest_baseline"} 2791.7997860783416 | ||||
| linknotmerge_vex_bench_observation_throughput_floor_per_sec{scenario="vex_ingest_baseline"} 1800 | ||||
| linknotmerge_vex_bench_mean_event_throughput_per_sec{scenario="vex_ingest_baseline"} 48942.490089432729 | ||||
| linknotmerge_vex_bench_min_event_throughput_per_sec{scenario="vex_ingest_baseline"} 24653.055581276763 | ||||
| linknotmerge_vex_bench_event_throughput_floor_per_sec{scenario="vex_ingest_baseline"} 2000 | ||||
| linknotmerge_vex_bench_max_allocated_mb{scenario="vex_ingest_baseline"} 138.63648986816406 | ||||
| linknotmerge_vex_bench_max_allocated_threshold_mb{scenario="vex_ingest_baseline"} 220 | ||||
| linknotmerge_vex_bench_regression_limit{scenario="vex_ingest_baseline"} 1.1499999999999999 | ||||
| linknotmerge_vex_bench_regression_breached{scenario="vex_ingest_baseline"} 0 | ||||
| linknotmerge_vex_bench_mean_total_ms{scenario="vex_ingest_medium"} 1525.9929400000001 | ||||
| linknotmerge_vex_bench_p95_total_ms{scenario="vex_ingest_medium"} 1706.8900000000001 | ||||
| linknotmerge_vex_bench_max_total_ms{scenario="vex_ingest_medium"} 1748.9056 | ||||
| linknotmerge_vex_bench_threshold_ms{scenario="vex_ingest_medium"} 3200 | ||||
| linknotmerge_vex_bench_mean_observation_throughput_per_sec{scenario="vex_ingest_medium"} 5274.5882732259033 | ||||
| linknotmerge_vex_bench_min_observation_throughput_per_sec{scenario="vex_ingest_medium"} 4574.2892012010252 | ||||
| linknotmerge_vex_bench_observation_throughput_floor_per_sec{scenario="vex_ingest_medium"} 2200 | ||||
| linknotmerge_vex_bench_mean_event_throughput_per_sec{scenario="vex_ingest_medium"} 57654.919039209162 | ||||
| linknotmerge_vex_bench_min_event_throughput_per_sec{scenario="vex_ingest_medium"} 48531.735322700952 | ||||
| linknotmerge_vex_bench_event_throughput_floor_per_sec{scenario="vex_ingest_medium"} 2500 | ||||
| linknotmerge_vex_bench_max_allocated_mb{scenario="vex_ingest_medium"} 326.86380004882812 | ||||
| linknotmerge_vex_bench_max_allocated_threshold_mb{scenario="vex_ingest_medium"} 400 | ||||
| linknotmerge_vex_bench_regression_limit{scenario="vex_ingest_medium"} 1.1499999999999999 | ||||
| linknotmerge_vex_bench_regression_breached{scenario="vex_ingest_medium"} 0 | ||||
| linknotmerge_vex_bench_mean_total_ms{scenario="vex_ingest_high"} 2988.50936 | ||||
| linknotmerge_vex_bench_p95_total_ms{scenario="vex_ingest_high"} 3422.1727999999998 | ||||
| linknotmerge_vex_bench_max_total_ms{scenario="vex_ingest_high"} 3438.9364 | ||||
| linknotmerge_vex_bench_threshold_ms{scenario="vex_ingest_high"} 4200 | ||||
| linknotmerge_vex_bench_mean_observation_throughput_per_sec{scenario="vex_ingest_high"} 4066.2299506870645 | ||||
| linknotmerge_vex_bench_min_observation_throughput_per_sec{scenario="vex_ingest_high"} 3489.4509825770551 | ||||
| linknotmerge_vex_bench_observation_throughput_floor_per_sec{scenario="vex_ingest_high"} 2200 | ||||
| linknotmerge_vex_bench_mean_event_throughput_per_sec{scenario="vex_ingest_high"} 52456.949283230162 | ||||
| linknotmerge_vex_bench_min_event_throughput_per_sec{scenario="vex_ingest_high"} 42358.05564361166 | ||||
| linknotmerge_vex_bench_event_throughput_floor_per_sec{scenario="vex_ingest_high"} 2500 | ||||
| linknotmerge_vex_bench_max_allocated_mb{scenario="vex_ingest_high"} 583.99034118652344 | ||||
| linknotmerge_vex_bench_max_allocated_threshold_mb{scenario="vex_ingest_high"} 700 | ||||
| linknotmerge_vex_bench_regression_limit{scenario="vex_ingest_high"} 1.1499999999999999 | ||||
| linknotmerge_vex_bench_regression_breached{scenario="vex_ingest_high"} 0 | ||||
|   | ||||
| @@ -1,4 +1,4 @@ | ||||
| scenario,iterations,events,deliveries,mean_ms,p95_ms,max_ms,mean_throughput_per_sec,min_throughput_per_sec,max_allocated_mb | ||||
| notify_dispatch_density_05,5,5000,20000,3.4150,4.1722,4.3039,6053938.5172,4646948.1168,0.0000 | ||||
| notify_dispatch_density_20,5,7500,675000,24.2274,25.8517,26.0526,27923335.5855,25909122.3141,0.0000 | ||||
| notify_dispatch_density_40,5,10000,4000080,138.7387,147.7174,149.1124,28916602.9214,26825938.0172,0.0000 | ||||
| scenario,iterations,events,deliveries,mean_ms,p95_ms,max_ms,mean_throughput_per_sec,min_throughput_per_sec,max_allocated_mb | ||||
| notify_dispatch_density_05,5,5000,20000,3.4150,4.1722,4.3039,6053938.5172,4646948.1168,0.0000 | ||||
| notify_dispatch_density_20,5,7500,675000,24.2274,25.8517,26.0526,27923335.5855,25909122.3141,0.0000 | ||||
| notify_dispatch_density_40,5,10000,4000080,138.7387,147.7174,149.1124,28916602.9214,26825938.0172,0.0000 | ||||
|   | ||||
| 
 | 
| @@ -1,84 +1,84 @@ | ||||
| { | ||||
|   "schemaVersion": "notify-dispatch-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T20:28:56.3603045+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "notify_dispatch_density_05", | ||||
|       "label": "50 rules / 5% fanout", | ||||
|       "iterations": 5, | ||||
|       "totalEvents": 5000, | ||||
|       "totalRules": 50, | ||||
|       "actionsPerRule": 2, | ||||
|       "averageMatchesPerEvent": 2, | ||||
|       "minMatchesPerEvent": 2, | ||||
|       "maxMatchesPerEvent": 2, | ||||
|       "averageDeliveriesPerEvent": 4, | ||||
|       "totalDeliveries": 20000, | ||||
|       "meanMs": 3.41498, | ||||
|       "p95Ms": 4.17216, | ||||
|       "maxMs": 4.3039, | ||||
|       "meanThroughputPerSecond": 6053938.51717893, | ||||
|       "minThroughputPerSecond": 4646948.116824276, | ||||
|       "maxAllocatedMb": 0, | ||||
|       "thresholdMs": 400, | ||||
|       "minThroughputThresholdPerSecond": 15000, | ||||
|       "maxAllocatedThresholdMb": 128, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "notify_dispatch_density_20", | ||||
|       "label": "150 rules / 20% fanout", | ||||
|       "iterations": 5, | ||||
|       "totalEvents": 7500, | ||||
|       "totalRules": 150, | ||||
|       "actionsPerRule": 3, | ||||
|       "averageMatchesPerEvent": 30, | ||||
|       "minMatchesPerEvent": 30, | ||||
|       "maxMatchesPerEvent": 30, | ||||
|       "averageDeliveriesPerEvent": 90, | ||||
|       "totalDeliveries": 675000, | ||||
|       "meanMs": 24.2274, | ||||
|       "p95Ms": 25.85172, | ||||
|       "maxMs": 26.0526, | ||||
|       "meanThroughputPerSecond": 27923335.585545264, | ||||
|       "minThroughputPerSecond": 25909122.314087655, | ||||
|       "maxAllocatedMb": 0, | ||||
|       "thresholdMs": 650, | ||||
|       "minThroughputThresholdPerSecond": 30000, | ||||
|       "maxAllocatedThresholdMb": 192, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "notify_dispatch_density_40", | ||||
|       "label": "300 rules / 40% fanout", | ||||
|       "iterations": 5, | ||||
|       "totalEvents": 10000, | ||||
|       "totalRules": 300, | ||||
|       "actionsPerRule": 4, | ||||
|       "averageMatchesPerEvent": 100.002, | ||||
|       "minMatchesPerEvent": 60, | ||||
|       "maxMatchesPerEvent": 120, | ||||
|       "averageDeliveriesPerEvent": 400.008, | ||||
|       "totalDeliveries": 4000080, | ||||
|       "meanMs": 138.73866, | ||||
|       "p95Ms": 147.71738000000002, | ||||
|       "maxMs": 149.1124, | ||||
|       "meanThroughputPerSecond": 28916602.921385907, | ||||
|       "minThroughputPerSecond": 26825938.017227273, | ||||
|       "maxAllocatedMb": 0, | ||||
|       "thresholdMs": 900, | ||||
|       "minThroughputThresholdPerSecond": 45000, | ||||
|       "maxAllocatedThresholdMb": 256, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| { | ||||
|   "schemaVersion": "notify-dispatch-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T20:28:56.3603045+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "notify_dispatch_density_05", | ||||
|       "label": "50 rules / 5% fanout", | ||||
|       "iterations": 5, | ||||
|       "totalEvents": 5000, | ||||
|       "totalRules": 50, | ||||
|       "actionsPerRule": 2, | ||||
|       "averageMatchesPerEvent": 2, | ||||
|       "minMatchesPerEvent": 2, | ||||
|       "maxMatchesPerEvent": 2, | ||||
|       "averageDeliveriesPerEvent": 4, | ||||
|       "totalDeliveries": 20000, | ||||
|       "meanMs": 3.41498, | ||||
|       "p95Ms": 4.17216, | ||||
|       "maxMs": 4.3039, | ||||
|       "meanThroughputPerSecond": 6053938.51717893, | ||||
|       "minThroughputPerSecond": 4646948.116824276, | ||||
|       "maxAllocatedMb": 0, | ||||
|       "thresholdMs": 400, | ||||
|       "minThroughputThresholdPerSecond": 15000, | ||||
|       "maxAllocatedThresholdMb": 128, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "notify_dispatch_density_20", | ||||
|       "label": "150 rules / 20% fanout", | ||||
|       "iterations": 5, | ||||
|       "totalEvents": 7500, | ||||
|       "totalRules": 150, | ||||
|       "actionsPerRule": 3, | ||||
|       "averageMatchesPerEvent": 30, | ||||
|       "minMatchesPerEvent": 30, | ||||
|       "maxMatchesPerEvent": 30, | ||||
|       "averageDeliveriesPerEvent": 90, | ||||
|       "totalDeliveries": 675000, | ||||
|       "meanMs": 24.2274, | ||||
|       "p95Ms": 25.85172, | ||||
|       "maxMs": 26.0526, | ||||
|       "meanThroughputPerSecond": 27923335.585545264, | ||||
|       "minThroughputPerSecond": 25909122.314087655, | ||||
|       "maxAllocatedMb": 0, | ||||
|       "thresholdMs": 650, | ||||
|       "minThroughputThresholdPerSecond": 30000, | ||||
|       "maxAllocatedThresholdMb": 192, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     }, | ||||
|     { | ||||
|       "id": "notify_dispatch_density_40", | ||||
|       "label": "300 rules / 40% fanout", | ||||
|       "iterations": 5, | ||||
|       "totalEvents": 10000, | ||||
|       "totalRules": 300, | ||||
|       "actionsPerRule": 4, | ||||
|       "averageMatchesPerEvent": 100.002, | ||||
|       "minMatchesPerEvent": 60, | ||||
|       "maxMatchesPerEvent": 120, | ||||
|       "averageDeliveriesPerEvent": 400.008, | ||||
|       "totalDeliveries": 4000080, | ||||
|       "meanMs": 138.73866, | ||||
|       "p95Ms": 147.71738000000002, | ||||
|       "maxMs": 149.1124, | ||||
|       "meanThroughputPerSecond": 28916602.921385907, | ||||
|       "minThroughputPerSecond": 26825938.017227273, | ||||
|       "maxAllocatedMb": 0, | ||||
|       "thresholdMs": 900, | ||||
|       "minThroughputThresholdPerSecond": 45000, | ||||
|       "maxAllocatedThresholdMb": 256, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -1,39 +1,39 @@ | ||||
| # HELP notify_dispatch_bench_duration_ms Notify dispatch benchmark duration metrics (milliseconds). | ||||
| # TYPE notify_dispatch_bench_duration_ms gauge | ||||
| # HELP notify_dispatch_bench_throughput_per_sec Notify dispatch benchmark throughput metrics (deliveries per second). | ||||
| # TYPE notify_dispatch_bench_throughput_per_sec gauge | ||||
| # HELP notify_dispatch_bench_allocation_mb Notify dispatch benchmark allocation metrics (megabytes). | ||||
| # TYPE notify_dispatch_bench_allocation_mb gauge | ||||
| notify_dispatch_bench_mean_ms{scenario="notify_dispatch_density_05"} 3.4149799999999999 | ||||
| notify_dispatch_bench_p95_ms{scenario="notify_dispatch_density_05"} 4.1721599999999999 | ||||
| notify_dispatch_bench_max_ms{scenario="notify_dispatch_density_05"} 4.3038999999999996 | ||||
| notify_dispatch_bench_threshold_ms{scenario="notify_dispatch_density_05"} 400 | ||||
| notify_dispatch_bench_mean_throughput_per_sec{scenario="notify_dispatch_density_05"} 6053938.5171789303 | ||||
| notify_dispatch_bench_min_throughput_per_sec{scenario="notify_dispatch_density_05"} 4646948.1168242758 | ||||
| notify_dispatch_bench_min_throughput_threshold_per_sec{scenario="notify_dispatch_density_05"} 15000 | ||||
| notify_dispatch_bench_max_allocated_mb{scenario="notify_dispatch_density_05"} 0 | ||||
| notify_dispatch_bench_max_allocated_threshold_mb{scenario="notify_dispatch_density_05"} 128 | ||||
| notify_dispatch_bench_regression_limit{scenario="notify_dispatch_density_05"} 1.1499999999999999 | ||||
| notify_dispatch_bench_regression_breached{scenario="notify_dispatch_density_05"} 0 | ||||
| notify_dispatch_bench_mean_ms{scenario="notify_dispatch_density_20"} 24.227399999999999 | ||||
| notify_dispatch_bench_p95_ms{scenario="notify_dispatch_density_20"} 25.85172 | ||||
| notify_dispatch_bench_max_ms{scenario="notify_dispatch_density_20"} 26.052600000000002 | ||||
| notify_dispatch_bench_threshold_ms{scenario="notify_dispatch_density_20"} 650 | ||||
| notify_dispatch_bench_mean_throughput_per_sec{scenario="notify_dispatch_density_20"} 27923335.585545264 | ||||
| notify_dispatch_bench_min_throughput_per_sec{scenario="notify_dispatch_density_20"} 25909122.314087655 | ||||
| notify_dispatch_bench_min_throughput_threshold_per_sec{scenario="notify_dispatch_density_20"} 30000 | ||||
| notify_dispatch_bench_max_allocated_mb{scenario="notify_dispatch_density_20"} 0 | ||||
| notify_dispatch_bench_max_allocated_threshold_mb{scenario="notify_dispatch_density_20"} 192 | ||||
| notify_dispatch_bench_regression_limit{scenario="notify_dispatch_density_20"} 1.1499999999999999 | ||||
| notify_dispatch_bench_regression_breached{scenario="notify_dispatch_density_20"} 0 | ||||
| notify_dispatch_bench_mean_ms{scenario="notify_dispatch_density_40"} 138.73866000000001 | ||||
| notify_dispatch_bench_p95_ms{scenario="notify_dispatch_density_40"} 147.71738000000002 | ||||
| notify_dispatch_bench_max_ms{scenario="notify_dispatch_density_40"} 149.11240000000001 | ||||
| notify_dispatch_bench_threshold_ms{scenario="notify_dispatch_density_40"} 900 | ||||
| notify_dispatch_bench_mean_throughput_per_sec{scenario="notify_dispatch_density_40"} 28916602.921385907 | ||||
| notify_dispatch_bench_min_throughput_per_sec{scenario="notify_dispatch_density_40"} 26825938.017227273 | ||||
| notify_dispatch_bench_min_throughput_threshold_per_sec{scenario="notify_dispatch_density_40"} 45000 | ||||
| notify_dispatch_bench_max_allocated_mb{scenario="notify_dispatch_density_40"} 0 | ||||
| notify_dispatch_bench_max_allocated_threshold_mb{scenario="notify_dispatch_density_40"} 256 | ||||
| notify_dispatch_bench_regression_limit{scenario="notify_dispatch_density_40"} 1.1499999999999999 | ||||
| notify_dispatch_bench_regression_breached{scenario="notify_dispatch_density_40"} 0 | ||||
| # HELP notify_dispatch_bench_duration_ms Notify dispatch benchmark duration metrics (milliseconds). | ||||
| # TYPE notify_dispatch_bench_duration_ms gauge | ||||
| # HELP notify_dispatch_bench_throughput_per_sec Notify dispatch benchmark throughput metrics (deliveries per second). | ||||
| # TYPE notify_dispatch_bench_throughput_per_sec gauge | ||||
| # HELP notify_dispatch_bench_allocation_mb Notify dispatch benchmark allocation metrics (megabytes). | ||||
| # TYPE notify_dispatch_bench_allocation_mb gauge | ||||
| notify_dispatch_bench_mean_ms{scenario="notify_dispatch_density_05"} 3.4149799999999999 | ||||
| notify_dispatch_bench_p95_ms{scenario="notify_dispatch_density_05"} 4.1721599999999999 | ||||
| notify_dispatch_bench_max_ms{scenario="notify_dispatch_density_05"} 4.3038999999999996 | ||||
| notify_dispatch_bench_threshold_ms{scenario="notify_dispatch_density_05"} 400 | ||||
| notify_dispatch_bench_mean_throughput_per_sec{scenario="notify_dispatch_density_05"} 6053938.5171789303 | ||||
| notify_dispatch_bench_min_throughput_per_sec{scenario="notify_dispatch_density_05"} 4646948.1168242758 | ||||
| notify_dispatch_bench_min_throughput_threshold_per_sec{scenario="notify_dispatch_density_05"} 15000 | ||||
| notify_dispatch_bench_max_allocated_mb{scenario="notify_dispatch_density_05"} 0 | ||||
| notify_dispatch_bench_max_allocated_threshold_mb{scenario="notify_dispatch_density_05"} 128 | ||||
| notify_dispatch_bench_regression_limit{scenario="notify_dispatch_density_05"} 1.1499999999999999 | ||||
| notify_dispatch_bench_regression_breached{scenario="notify_dispatch_density_05"} 0 | ||||
| notify_dispatch_bench_mean_ms{scenario="notify_dispatch_density_20"} 24.227399999999999 | ||||
| notify_dispatch_bench_p95_ms{scenario="notify_dispatch_density_20"} 25.85172 | ||||
| notify_dispatch_bench_max_ms{scenario="notify_dispatch_density_20"} 26.052600000000002 | ||||
| notify_dispatch_bench_threshold_ms{scenario="notify_dispatch_density_20"} 650 | ||||
| notify_dispatch_bench_mean_throughput_per_sec{scenario="notify_dispatch_density_20"} 27923335.585545264 | ||||
| notify_dispatch_bench_min_throughput_per_sec{scenario="notify_dispatch_density_20"} 25909122.314087655 | ||||
| notify_dispatch_bench_min_throughput_threshold_per_sec{scenario="notify_dispatch_density_20"} 30000 | ||||
| notify_dispatch_bench_max_allocated_mb{scenario="notify_dispatch_density_20"} 0 | ||||
| notify_dispatch_bench_max_allocated_threshold_mb{scenario="notify_dispatch_density_20"} 192 | ||||
| notify_dispatch_bench_regression_limit{scenario="notify_dispatch_density_20"} 1.1499999999999999 | ||||
| notify_dispatch_bench_regression_breached{scenario="notify_dispatch_density_20"} 0 | ||||
| notify_dispatch_bench_mean_ms{scenario="notify_dispatch_density_40"} 138.73866000000001 | ||||
| notify_dispatch_bench_p95_ms{scenario="notify_dispatch_density_40"} 147.71738000000002 | ||||
| notify_dispatch_bench_max_ms{scenario="notify_dispatch_density_40"} 149.11240000000001 | ||||
| notify_dispatch_bench_threshold_ms{scenario="notify_dispatch_density_40"} 900 | ||||
| notify_dispatch_bench_mean_throughput_per_sec{scenario="notify_dispatch_density_40"} 28916602.921385907 | ||||
| notify_dispatch_bench_min_throughput_per_sec{scenario="notify_dispatch_density_40"} 26825938.017227273 | ||||
| notify_dispatch_bench_min_throughput_threshold_per_sec{scenario="notify_dispatch_density_40"} 45000 | ||||
| notify_dispatch_bench_max_allocated_mb{scenario="notify_dispatch_density_40"} 0 | ||||
| notify_dispatch_bench_max_allocated_threshold_mb{scenario="notify_dispatch_density_40"} 256 | ||||
| notify_dispatch_bench_regression_limit{scenario="notify_dispatch_density_40"} 1.1499999999999999 | ||||
| notify_dispatch_bench_regression_breached{scenario="notify_dispatch_density_40"} 0 | ||||
|   | ||||
| @@ -1,2 +1,2 @@ | ||||
| scenario,iterations,findings,mean_ms,p95_ms,max_ms,mean_throughput_per_sec,min_throughput_per_sec,max_allocated_mb | ||||
| policy_eval_baseline,3,1000000,1109.3542,1257.7493,1280.1721,912094.5581,781144.9726,563.6901 | ||||
| scenario,iterations,findings,mean_ms,p95_ms,max_ms,mean_throughput_per_sec,min_throughput_per_sec,max_allocated_mb | ||||
| policy_eval_baseline,3,1000000,1109.3542,1257.7493,1280.1721,912094.5581,781144.9726,563.6901 | ||||
|   | ||||
| 
 | 
| @@ -1,25 +1,25 @@ | ||||
| { | ||||
|   "schemaVersion": "policy-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T19:57:27.4363234+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "policy_eval_baseline", | ||||
|       "label": "Policy evaluation (100k components, 1M findings)", | ||||
|       "iterations": 3, | ||||
|       "findingCount": 1000000, | ||||
|       "meanMs": 1109.3542333333335, | ||||
|       "p95Ms": 1257.74929, | ||||
|       "maxMs": 1280.1721, | ||||
|       "meanThroughputPerSecond": 912094.5580512757, | ||||
|       "minThroughputPerSecond": 781144.9726173537, | ||||
|       "maxAllocatedMb": 563.6900634765625, | ||||
|       "thresholdMs": 20000, | ||||
|       "minThroughputThresholdPerSecond": 60000, | ||||
|       "maxAllocatedThresholdMb": 900, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| { | ||||
|   "schemaVersion": "policy-bench/1.0", | ||||
|   "capturedAt": "2025-10-26T19:57:27.4363234+00:00", | ||||
|   "scenarios": [ | ||||
|     { | ||||
|       "id": "policy_eval_baseline", | ||||
|       "label": "Policy evaluation (100k components, 1M findings)", | ||||
|       "iterations": 3, | ||||
|       "findingCount": 1000000, | ||||
|       "meanMs": 1109.3542333333335, | ||||
|       "p95Ms": 1257.74929, | ||||
|       "maxMs": 1280.1721, | ||||
|       "meanThroughputPerSecond": 912094.5580512757, | ||||
|       "minThroughputPerSecond": 781144.9726173537, | ||||
|       "maxAllocatedMb": 563.6900634765625, | ||||
|       "thresholdMs": 20000, | ||||
|       "minThroughputThresholdPerSecond": 60000, | ||||
|       "maxAllocatedThresholdMb": 900, | ||||
|       "regression": { | ||||
|         "limit": 1.15, | ||||
|         "breached": false | ||||
|       } | ||||
|     } | ||||
|   ] | ||||
| } | ||||
| @@ -1,17 +1,17 @@ | ||||
| # HELP policy_engine_bench_duration_ms Policy Engine benchmark duration metrics (milliseconds). | ||||
| # TYPE policy_engine_bench_duration_ms gauge | ||||
| # HELP policy_engine_bench_throughput_per_sec Policy Engine benchmark throughput metrics (findings per second). | ||||
| # TYPE policy_engine_bench_throughput_per_sec gauge | ||||
| # HELP policy_engine_bench_allocation_mb Policy Engine benchmark allocation metrics (megabytes). | ||||
| # TYPE policy_engine_bench_allocation_mb gauge | ||||
| policy_engine_bench_mean_ms{scenario="policy_eval_baseline"} 1109.3542333333335 | ||||
| policy_engine_bench_p95_ms{scenario="policy_eval_baseline"} 1257.74929 | ||||
| policy_engine_bench_max_ms{scenario="policy_eval_baseline"} 1280.1721 | ||||
| policy_engine_bench_threshold_ms{scenario="policy_eval_baseline"} 20000 | ||||
| policy_engine_bench_mean_throughput_per_sec{scenario="policy_eval_baseline"} 912094.55805127567 | ||||
| policy_engine_bench_min_throughput_per_sec{scenario="policy_eval_baseline"} 781144.97261735366 | ||||
| policy_engine_bench_min_throughput_threshold_per_sec{scenario="policy_eval_baseline"} 60000 | ||||
| policy_engine_bench_max_allocated_mb{scenario="policy_eval_baseline"} 563.6900634765625 | ||||
| policy_engine_bench_max_allocated_threshold_mb{scenario="policy_eval_baseline"} 900 | ||||
| policy_engine_bench_regression_limit{scenario="policy_eval_baseline"} 1.1499999999999999 | ||||
| policy_engine_bench_regression_breached{scenario="policy_eval_baseline"} 0 | ||||
| # HELP policy_engine_bench_duration_ms Policy Engine benchmark duration metrics (milliseconds). | ||||
| # TYPE policy_engine_bench_duration_ms gauge | ||||
| # HELP policy_engine_bench_throughput_per_sec Policy Engine benchmark throughput metrics (findings per second). | ||||
| # TYPE policy_engine_bench_throughput_per_sec gauge | ||||
| # HELP policy_engine_bench_allocation_mb Policy Engine benchmark allocation metrics (megabytes). | ||||
| # TYPE policy_engine_bench_allocation_mb gauge | ||||
| policy_engine_bench_mean_ms{scenario="policy_eval_baseline"} 1109.3542333333335 | ||||
| policy_engine_bench_p95_ms{scenario="policy_eval_baseline"} 1257.74929 | ||||
| policy_engine_bench_max_ms{scenario="policy_eval_baseline"} 1280.1721 | ||||
| policy_engine_bench_threshold_ms{scenario="policy_eval_baseline"} 20000 | ||||
| policy_engine_bench_mean_throughput_per_sec{scenario="policy_eval_baseline"} 912094.55805127567 | ||||
| policy_engine_bench_min_throughput_per_sec{scenario="policy_eval_baseline"} 781144.97261735366 | ||||
| policy_engine_bench_min_throughput_threshold_per_sec{scenario="policy_eval_baseline"} 60000 | ||||
| policy_engine_bench_max_allocated_mb{scenario="policy_eval_baseline"} 563.6900634765625 | ||||
| policy_engine_bench_max_allocated_threshold_mb{scenario="policy_eval_baseline"} 900 | ||||
| policy_engine_bench_regression_limit{scenario="policy_eval_baseline"} 1.1499999999999999 | ||||
| policy_engine_bench_regression_breached{scenario="policy_eval_baseline"} 0 | ||||
|   | ||||
| @@ -1,32 +1,32 @@ | ||||
| [ | ||||
|   { | ||||
|     "ScenarioName": "baseline", | ||||
|     "Success": true, | ||||
|     "ChangedCount": 2, | ||||
|     "Failures": [], | ||||
|     "ActualStatuses": { | ||||
|       "library:pkg/openssl@1.1.1w": "Blocked", | ||||
|       "library:pkg/internal-runtime@1.0.0": "Warned" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "ScenarioName": "internal-only", | ||||
|     "Success": true, | ||||
|     "ChangedCount": 2, | ||||
|     "Failures": [], | ||||
|     "ActualStatuses": { | ||||
|       "library:pkg/internal-app@2.0.0": "RequiresVex", | ||||
|       "library:pkg/kev-component@3.1.4": "RequiresVex" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "ScenarioName": "serverless", | ||||
|     "Success": true, | ||||
|     "ChangedCount": 2, | ||||
|     "Failures": [], | ||||
|     "ActualStatuses": { | ||||
|       "library:pkg/aws-lambda@1.0.0": "Blocked", | ||||
|       "image:sha256:untrusted-base": "Blocked" | ||||
|     } | ||||
|   } | ||||
| [ | ||||
|   { | ||||
|     "ScenarioName": "baseline", | ||||
|     "Success": true, | ||||
|     "ChangedCount": 2, | ||||
|     "Failures": [], | ||||
|     "ActualStatuses": { | ||||
|       "library:pkg/openssl@1.1.1w": "Blocked", | ||||
|       "library:pkg/internal-runtime@1.0.0": "Warned" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "ScenarioName": "internal-only", | ||||
|     "Success": true, | ||||
|     "ChangedCount": 2, | ||||
|     "Failures": [], | ||||
|     "ActualStatuses": { | ||||
|       "library:pkg/internal-app@2.0.0": "RequiresVex", | ||||
|       "library:pkg/kev-component@3.1.4": "RequiresVex" | ||||
|     } | ||||
|   }, | ||||
|   { | ||||
|     "ScenarioName": "serverless", | ||||
|     "Success": true, | ||||
|     "ChangedCount": 2, | ||||
|     "Failures": [], | ||||
|     "ActualStatuses": { | ||||
|       "library:pkg/aws-lambda@1.0.0": "Blocked", | ||||
|       "image:sha256:untrusted-base": "Blocked" | ||||
|     } | ||||
|   } | ||||
| ] | ||||
| @@ -1,4 +1,4 @@ | ||||
| using System; | ||||
| using CycloneDX.Models; | ||||
|  | ||||
| Console.WriteLine(string.Join(", ", Enum.GetNames(typeof(Component.Classification)))); | ||||
| using System; | ||||
| using CycloneDX.Models; | ||||
|  | ||||
| Console.WriteLine(string.Join(", ", Enum.GetNames(typeof(Component.Classification)))); | ||||
|   | ||||
		Reference in New Issue
	
	Block a user