Sprint 4 — Sidebar restructure (S4-T01+T02):
5 groups: Release Control, Security, Operations, Audit & Evidence, Setup & Admin
Groups 4+5 collapsed by default for new users
Operations extracted from Release Control into own group
Audit extracted from Security into own group
groupOrder and resolveMenuGroupLabel updated
Approvals badge moved to section-level
Sprint 2 — Demo data badges (S2-T04+T05):
Backend: isDemo=true on all compatibility/seed responses in
PackAdapterEndpoints, QuotaCompatibilityEndpoints, VulnerabilitiesController
Frontend: "(Demo)" badges on Usage & Limits page quotas
Frontend: "(Demo)" badges on triage artifact list when seed data
New PlatformItemResponse/PlatformListResponse with IsDemo field
Sprint 6 — Audit emission infrastructure (S6-T01+T02):
New shared library: src/__Libraries/StellaOps.Audit.Emission/
- AuditActionAttribute: [AuditAction("module", "action")] endpoint tag
- AuditActionFilter: IEndpointFilter that auto-emits UnifiedAuditEvent
- HttpAuditEventEmitter: POSTs to Timeline /api/v1/audit/ingest
- Single-line DI: services.AddAuditEmission(configuration)
Timeline service: POST /api/v1/audit/ingest ingestion endpoint
- IngestAuditEventStore: 10k-event ring buffer
- CompositeUnifiedAuditEventProvider: merges HTTP-polled + ingested
Documentation: docs/modules/audit/AUDIT_EMISSION_GUIDE.md
Angular build: 0 errors. .NET builds: 0 errors.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
42 lines
1.5 KiB
C#
42 lines
1.5 KiB
C#
// Copyright (c) StellaOps. Licensed under the BUSL-1.1.
|
|
|
|
namespace StellaOps.Audit.Emission;
|
|
|
|
/// <summary>
|
|
/// Lightweight DTO that mirrors the <c>UnifiedAuditEvent</c> structure from the
|
|
/// Timeline service. This avoids a compile-time dependency on the Timeline
|
|
/// assembly while remaining wire-compatible for JSON serialization.
|
|
/// </summary>
|
|
public sealed record AuditEventPayload
|
|
{
|
|
public required string Id { get; init; }
|
|
public required DateTimeOffset Timestamp { get; init; }
|
|
public required string Module { get; init; }
|
|
public required string Action { get; init; }
|
|
public required string Severity { get; init; }
|
|
public required AuditActorPayload Actor { get; init; }
|
|
public required AuditResourcePayload Resource { get; init; }
|
|
public required string Description { get; init; }
|
|
public required IReadOnlyDictionary<string, object?> Details { get; init; }
|
|
public string? CorrelationId { get; init; }
|
|
public string? TenantId { get; init; }
|
|
public required IReadOnlyList<string> Tags { get; init; }
|
|
}
|
|
|
|
public sealed record AuditActorPayload
|
|
{
|
|
public required string Id { get; init; }
|
|
public required string Name { get; init; }
|
|
public string? Email { get; init; }
|
|
public required string Type { get; init; }
|
|
public string? IpAddress { get; init; }
|
|
public string? UserAgent { get; init; }
|
|
}
|
|
|
|
public sealed record AuditResourcePayload
|
|
{
|
|
public required string Type { get; init; }
|
|
public required string Id { get; init; }
|
|
public string? Name { get; init; }
|
|
}
|