# Changelog

> **This is the PUBLIC form of this artifact. Findings are listed in full, but the details of SECURITY findings — which rule fired, in which file, on which line, and how to fix it — are deliberately withheld, and any secret-scanner results are excluded entirely. Where detail is absent here it was REMOVED FOR PUBLICATION; it is not missing from the analysis. The complete artifact is available from the repository owner.**

## Score

- CAI 50 → 50 (+0.6)
- Rubric changed (rubric-2026.08.17 → rubric-2026.08.18) — scores are not directly comparable.

## Lenses

- Code Health 74 → 89 (+14.9)
- Architecture 81 → 81 (-0.1)
- Maturity 58 → 64 (+5.5)
- Readiness 50 → 50 (+0.0)
- Security 43 → 43 (+0.0)
- Domain Modelling 57 → 57 (+0.0)
- Performance 60 → 60 (+0.0)

## Resolved (12)

- Concentrated knowledge decay
- High: security finding (details withheld)
- High: security finding (details withheld)
- Inconsistency in return type for retrieving an aggregate document. The interface and concrete implementations return `Task<Result<AggregateDocument?>>`, but the domain service layer (`InMemoryCosmosDomainService` and `CosmosDomainService`) exposes `GetAggregate<T>` which returns `Task<Result<T?>>` (the deserialized aggregate). While this is a layering pattern, the data store methods should ideally return the domain model or a consistent DTO, not a raw document type, creating a mismatch in abstraction levels.
- Inconsistent return type for messaging operations. All messaging providers return `Task<Result>`, but the `Result` type here is ambiguous. It should likely be `Task<Result<Unit>>` or `Task<Result<SendStatus>>` to indicate success/failure of the send operation. Currently, `Result` is used for both success and error states without a payload, which is acceptable but less explicit than using a specific success type.
- Inconsistent use of 'InMemory' in class names. Some classes use 'InMemory' as a prefix (e.g., 'InMemoryServiceBusMessagingProvider'), while others use it as a suffix or part of a longer name (e.g., 'InMemoryCosmosDomainService'). While not strictly an inconsistency in the same concept, the pattern of 'InMemory' placement varies.
- LLM evaluation failed
- Off-boarding risk: anonymized user #1
- Redundant/Confusing naming for in-memory aggregate retrieval. The method `GetInMemoryAggregate` is present on all domain service implementations. However, `InMemoryCosmosDomainService` also has `GetAggregate` and `GetInMemoryAggregate`. The naming `GetInMemoryAggregate` is misleading because it doesn't necessarily mean 'in-memory cache'; it likely means 'construct the aggregate from events in the store'. This conflicts with the `ReadMode.SnapshotOnly` parameter in `GetAggregate`, suggesting two ways to do the same thing.
- The interface for the dispatcher is named 'IDispatcher' (missing 'i' in Dispatcher), while the concrete implementation is named 'Dispatcher'. The standard convention for interfaces is to prefix with 'I', making 'IDispatcher' a typo or inconsistent naming compared to the implementation.
- TooManyMethods: IDomainDbContextExtensions (src/Memoria.EventSourcing.Store.EntityFrameworkCore/Extensions/DbContextExtensions/GetAggregate.cs)
- misleading comment (examples/Memoria.Examples.Caching.Memory/Program.cs)

## New (35)

- Boundary-crossing change coupling: CosmosDomainService.cs ↔ GetInMemoryAggregate.cs (src/Memoria.EventSourcing.Store.Cosmos/CosmosDomainService.cs)
- Boundary-crossing change coupling: FluentValidationProvider.cs ↔ ValidationService.cs (src/Memoria.Validation.FluentValidation/FluentValidationProvider.cs)
- Change coupling: CommandSender.cs ↔ Dispather.cs (src/Memoria/Commands/CommandSender.cs)
- Change coupling: CosmosDataStore.cs ↔ CosmosDomainService.cs (src/Memoria.EventSourcing.Store.Cosmos/CosmosDataStore.cs)
- Change coupling: EntityFrameworkCoreDomainService.cs ↔ GetInMemoryAggregate.cs (src/Memoria.EventSourcing.Store.EntityFrameworkCore/EntityFrameworkCoreDomainService.cs)
- Change coupling: ICommandSender.cs ↔ IDispatcher.cs (src/Memoria/Commands/ICommandSender.cs)
- High: security finding (details withheld)
- High: security finding (details withheld)
- Low XML-doc coverage: Memoria.EventSourcing.Store.Cosmos.InMemory (src/Memoria.EventSourcing.Store.Cosmos.InMemory/Memoria.EventSourcing.Store.Cosmos.InMemory.csproj)
- Low XML-doc coverage: Memoria.EventSourcing.Store.EntityFrameworkCore.Identity (src/Memoria.EventSourcing.Store.EntityFrameworkCore.Identity/Memoria.EventSourcing.Store.EntityFrameworkCore.Identity.csproj)
- Low XML-doc coverage: Memoria.Examples.Caching.Memory (examples/Memoria.Examples.Caching.Memory/Memoria.Examples.Caching.Memory.csproj)
- Low XML-doc coverage: Memoria.Examples.Caching.Redis (examples/Memoria.Examples.Caching.Redis/Memoria.Examples.Caching.Redis.csproj)
- Low XML-doc coverage: Memoria.Examples.EventSourcing.Cosmos (examples/Memoria.Examples.EventSourcing.Cosmos/Memoria.Examples.EventSourcing.Cosmos.csproj)
- Low XML-doc coverage: Memoria.Examples.EventSourcing.EntityFrameworkCore (examples/Memoria.Examples.EventSourcing.EntityFrameworkCore/Memoria.Examples.EventSourcing.EntityFrameworkCore.csproj)
- Low XML-doc coverage: Memoria.Examples.Messaging.RabbitMq (examples/Memoria.Examples.Messaging.RabbitMq/Memoria.Examples.Messaging.RabbitMq.csproj)
- Low XML-doc coverage: Memoria.Examples.Messaging.ServiceBus (examples/Memoria.Examples.Messaging.ServiceBus/Memoria.Examples.Messaging.ServiceBus.csproj)
- Off-boarding risk: anonymized user #1
- Secret passed as a command-line argument
- The Concepts section begins ('### Concepts') then is cut off in the middle of 'Providers' before covering the outlined topics (read modes, providers, roadmap). (docs/index.md)
- The interface `ICosmosDataStore` and its implementation `CosmosDataStore` both expose `GetEventDocuments`. However, the interface also exposes `GetAggregateEventDocuments`. The naming `GetEventDocuments` vs `GetAggregateEventDocuments` is slightly inconsistent in scope (all events vs aggregate-specific).
- …and 15 more

## Architecture

- Unchanged — 3 containers · 2 contexts · 1 edges
