Files
KArtSell.Aegis/Directory.Build.props
T
kjh2064 fc1abd3ad9 Downstream Event Consumers: Shadow Run Completion Notifications
Implements event-driven async notification pattern per AGENTS.md v16.0:

1. Domain Events:
   - ShadowRunCompletedEvent: Immutable contract with idempotency key
   - Payload: RunId, ModelId, gates (PBO, DSR), metrics, correlation for tracing

2. Consumer Interface:
   - IInboxConsumer<TEvent>: Generic, stateless, idempotent handlers
   - Safe to retry: same event → same result (deduplication by UNIQUE constraint)

3. Three Consumer Implementations:
   - ShadowRunCompletedConsumer: SignalR push (group: model-{modelId})
   - ApprovalQueueConsumer: Create approval queue on gate passage
   - AuditLogConsumer: Compliance logging (PASS/FAIL with details)

4. Architecture:
   - ShadowRunJob (Phase 5) → Outbox event insert (transactional)
   - Hangfire OutboxPoller (30s) → Inbox fanout (UNIQUE constraint)
   - Hangfire InboxConsumers → Parallel handler execution
   - CorrelationId tracking for distributed tracing

5. Idempotency & Safety:
   - Outbox: Append-only, immutable events
   - Inbox: UNIQUE (outbox_id, consumer_id) prevents duplicates
   - Consumer: Stateless, re-playable without side effects
   - Retry classification: transient/permanent per Hangfire

Files:
- src/KArtSell.Modules.ModelOperations/ShadowRun/Events/ShadowRunCompletedEvent.cs
- src/KArtSell.Host/Consumers/IInboxConsumer.cs (interface)
- src/KArtSell.Host/Consumers/ShadowRunCompletedConsumer.cs (SignalR)
- src/KArtSell.Host/Consumers/ApprovalQueueConsumer.cs (approval workflow)
- src/KArtSell.Host/Consumers/AuditLogConsumer.cs (compliance logging)
- src/KArtSell.Host/Features/ShadowRun/DOWNSTREAM_CONSUMERS_CONTRACT.md
- tests/KArtSell.Integration.Tests/DownstreamConsumersTests.cs (8 tests)

Test Status: 84/84 PASSING (Integration: 44/44 including 8 new)

AGENTS.md v16.0:
 Contract First: Full event schema + consumer patterns defined
 Test First: 8 tests for idempotency, deduplication, fanout
 Safety: Transactional outbox, idempotent consumers
 Traceability: CorrelationId in event, audit logging
 Pattern: Event-driven async (Outbox/Inbox)
 Maturity: Ready for ShadowRunJob integration

Next: Wire consumer registrations in Program.cs, Hangfire job integration.

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-08-02 12:20:43 +09:00

14 lines
553 B
XML

<Project>
<PropertyGroup>
<RootNamespace>KArtSell.Aegis</RootNamespace>
<TargetFramework>net10.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
<AnalysisLevel>latest-recommended</AnalysisLevel>
<NoWarn>$(NoWarn);CA1305;CA1707;CA1861;CA1848;CA1873;xUnit2031</NoWarn>
<Deterministic>true</Deterministic>
<ContinuousIntegrationBuild Condition="'$(CI)' == 'true'">true</ContinuousIntegrationBuild>
</PropertyGroup>
</Project>