Skip to content
CAI
Software that uses CAICheck a score

charlessolar/TodoMVC-DDD-CQRS-EventSourcing

39.4

Weak · 20 September 2026

1.3k

lines of production code

C#

with JavaScript

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Todo application built on a CQRS and Event Sourcing architecture, separating concerns into Domain, Application, Infrastructure, and Web layers. It manages task lifecycles through commands and events, utilizing NServiceBus for messaging and EventStore for persistence, while supporting optimistic concurrency and query paging. The frontend is a React-based client that interacts with the backend API to create, update, and filter todos, with the entire stack containerized via Docker Compose.

Features

Added Todo domain model and command/query structure

This change introduces the core domain components for the Todo feature within the Language application. It adds command classes (Add, Edit, MarkActive, MarkComplete, Remove) and their corresponding event interfaces (Added, Edited, MarkedActive, MarkedComplete, Removed) to define the system's behavior. It also includes the Todo state aggregate, which handles event logic to update the active status and message, along with query classes for retrieving active, all, and complete todos. Additionally, validators are provided to ensure TodoId and Message fields are not empty for add and edit operations, and a TodoResponse model is defined for data transfer.

src/Language · high confidence

Added domain logic and message handlers for Todo items

The Todo domain now includes a new Handler class that processes commands to add, edit, remove, mark active, and mark complete tasks, and a Todo entity that implements the corresponding state transitions and events.

src/Domain/Todo · high confidence

Initial project scaffolding and Docker configuration

This change introduces the foundational structure for the TodoDDD application, establishing a CQRS and Event Sourcing architecture with distinct Domain, Application, Infrastructure, and Web layers. It includes the solution file, source code for the Todo aggregate and handlers, and a complete Docker Compose setup to run the application alongside RabbitMQ and EventStore services. The entry also adds standard repository configuration files such as .gitignore, .gitattributes, and the README documentation.

(repo-wide) · high confidence

New infrastructure support for stamped commands, query paging, and pipeline behaviors

The Infrastructure layer now includes foundational types and behaviors for command/query handling. Stamped commands and events (IStampedEvent, StampedCommand) are introduced to support optimistic concurrency. Query handling is enhanced with Paged/Query types and a Paged response wrapper, while BusExtensions provide helpers for sending commands to the Domain and requesting paged queries with a 10-second timeout. Validation is integrated via a FluentValidation pipeline behavior that intercepts incoming commands, and logging is standardized with Serilog-based message behaviors for incoming/outgoing NServiceBus messages.

src/Infrastructure · high confidence

Behavioural changes

Introduce in-memory unit of work and NServiceBus integration for application endpoints

The application now includes a basic Unit of Work implementation that persists data in memory, enabling end-to-end testing of application endpoints. This change integrates NServiceBus for message transport and adds a mutator to handle stamping of commands and events, ensuring consistent message metadata across the system.

src/Application · medium confidence

Replace legacy web project with a React-based TodoMVC client

The web client application has been replaced with a new React-based TodoMVC implementation. This change introduces a full client-side stack including a Redux store for state management, React components for the UI, and a local service layer that proxies API calls to the backend. The new client supports creating, reading, updating, and deleting todos, filtering by status, and end-to-end testing via Cypress. Configuration files for ESLint, Prettier, and HTTPS development are also included to support the new development workflow.

src/Web · high confidence

Todo application logic now uses a Unit of Work for state management

The Todo application handler has been refactored to use a Unit of Work pattern for managing todo items. This change introduces support for handling 'Edited' events, allowing users to modify existing todo messages while preserving their active status. The handler now processes queries for all, active, and completed todos, as well as events for adding, removing, marking active, and marking complete, ensuring consistent state updates through the new Unit of Work abstraction.

src/Application/Todo · high confidence

Test coverage

Added unit tests for Todo domain and application handlers

Added unit tests in the \src/Test\ directory to verify the behavior of the Todo domain and application handlers. The new test suite covers domain commands including adding, editing, removing, and marking todos as active or complete, ensuring correct event raising and exception handling for invalid states. It also includes tests for application-level event handlers to confirm that TodoResponse models are correctly created, updated, and deleted in response to domain events.

src/Test · high confidence

Dependencies

Upgrade to .NET 6 and React 18 with updated NServiceBus and Aggregates.NET

The application has been upgraded to the .NET 6 runtime across all projects (Application, Domain, Infrastructure, Language, Web, and Test). The frontend client application has been updated to React 18, along with corresponding updates to React Router, Redux, and related tooling. Backend dependencies have been updated to Aggregates.NET 0.18.7.112 and NServiceBus 8.0.0, ensuring compatibility with the new .NET version and leveraging the latest features in the messaging and event sourcing libraries.

(dependencies) · high confidence

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

How this codebase got here

Score

  • CAI 43 → 39 (-3.4)
  • Rubric changed (rubric-2026.08.18 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 67 → 48 (-19.4)
  • Architecture 70 → 84 (+13.9)
  • Maturity 51 → 51 (+0.0)
  • Readiness 32 → 29 (-3.3)
  • Security 44 → 43 (-0.9)
  • Accessibility 56 → 56 (+0.0)

Resolved (54)

  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Duplicated block (10 lines × 3) (src/Application/Endpoint.cs)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • …and 34 more

New (107)

  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Critical CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (10 lines × 3) (src/Application/Endpoint.cs)
  • Duplicated block (6 lines × 2) (src/Application/Endpoint.cs)
  • End-of-life runtime: .NET net6.0
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • High CVE: [GHSA redacted] (src/Web/ClientApp/yarn.lock)
  • …and 87 more

API surface

  • Unchanged — 8 HTTP endpoints

Written by watchdog.canine.dev from the codebase's own history, inside the signed delivery this page is composed from.

Survey your own repository

charlessolar/TodoMVC-DDD-CQRS-EventSourcing was measured the same way every project in this corpus was: the same rubric, at a pinned commit, with the result published in full. Point a surveyor at a repository you know and see whether you agree with it.

About this page

  • The score is its most recent published measurement, taken on 20 September 2026 at a pinned commit. It is not a live figure and does not change until the project is measured again.
  • Measured at commit 94e21980ba21937ea9a9324fcb00811c7d8d3e2d — the exact code this score is about.
  • Scored under rubric-2026.09.15 — the same rubric and the same method as every other entry in this index.
  • Measured by watchdog.canine.dev using codehealth-analyzer preprod-28e75b8e3254.