Skip to content
CAI
Software that uses CAICheck a score

odrotbohm/tactical-ddd-workshop

54.2

Adequate · 21 September 2026

1.1k

lines of production code

Java

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Java-based educational workshop demonstrating Domain-Driven Design (DDD) principles using Spring Modulith and jMolecules. It provides concrete implementations of DDD building blocks, such as value objects and aggregates, alongside structural verification tests to enforce architectural rules. The codebase also includes a complete example of an order and inventory management system that utilizes event-driven communication between modules.

Features

Added Maven wrapper and project scaffolding

The project now includes a Maven wrapper (mvnw/mvnw.cmd) to ensure consistent build environments, alongside a .gitignore file and a readme.adoc that outlines the structure of the 'Tactical DDD with Java' workshop, describing four modules covering DDD building blocks, jMolecules integrations, and Spring Modulith usage.

(repo-wide) · high confidence

Introduce EmailAddress value object and serialization tests

Added a new EmailAddress value object in the integration module, implemented as a Java record with basic validation. Included corresponding integration tests (EmailAddressSerializationTests) that verify how the object serializes via Jackson, alongside a test utility class (TestUtils) to check for ValueObject markers. Also added the main application class and a logback configuration for console output.

02-integration · high confidence

Introduce a complete DDD-based order and inventory management module

The 04-modulith area now contains a full example of a Spring Modulith application implementing Domain-Driven Design. It includes a Catalog module for managing products, an Inventory module for tracking stock levels, and an Orders module for processing and completing orders. The implementation uses jMolecules for DDD building blocks and Spring Modulith for module boundaries and event-driven communication. The example demonstrates how modules interact via domain events, such as the InventoryListener reacting to product creation and order completion events. Additionally, the change includes comprehensive integration and unit tests for each module, ensuring that event publication and consumption work correctly across module boundaries.

04-modulith · high confidence

Behavioural changes

Updated Maven Wrapper to version 3.9.12

The Maven Wrapper configuration has been updated to use version 3.3.4 of the wrapper script and to download Apache Maven 3.9.12. This ensures that the project uses a consistent, pre-configured version of Maven for builds, eliminating potential discrepancies between developers' local environments.

.mvn, 03-boilerplate · high confidence

Test coverage

Add DDD aggregate structure verification tests

Added structural verification tests for the 01-verification module that enforce Domain-Driven Design rules using ArchUnit. The test suite ensures that aggregate roots declare identifiers and that aggregate references are made via IDs or associations rather than full object references. The implementation includes new Java classes for Address, Customer, and Order, utilizing Java records for value objects and identifiers, alongside a test utility and logback configuration to support these checks.

01-verification · high confidence

Dependencies

Upgrade to Spring Boot 4.1 RC1 and Java 25

The project's root \pom.xml\ has been updated to use Spring Boot 4.1.0-RC1 as the parent, and the Java version has been upgraded to 25. Additionally, the build configuration now includes the Spring Milestones and Snapshots repositories to resolve dependencies like Spring Modulith 2.1.0-RC1 and jMolecules 2025.0.2.

(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

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 62 → 54 (-7.4)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 100 → 84 (-16.4)
  • Architecture 100 → 86 (-14.5)
  • Maturity 57 → 39 (-18.8)
  • Readiness 47 → 49 (+2.5)
  • Security 85 → 100 (+14.7)

Resolved (8)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • Scanner failed to run — not a clean result
  • Test reliability not included
  • single-maintainer — knowledge-concentration (bus factor) risk

New (58)

  • Dependency hygiene PARTLY measured — Maven/Gradle declarations read, no dependency graph resolved
  • Documentation: no installation or build instructions (README.adoc)
  • Documentation: no usage examples (README.adoc)
  • Duplicated block (36 lines × 2) (01-verification/src/main/java/de/odrotbohm/examples/ddd/verification/Address.java)
  • Duplicated block (6 lines × 2) (04-modulith/src/main/java/de/odrotbohm/examples/ddd/modulith/inventory/InventoryItem.java)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No assertions: completingAnOrderPublishesOrderCompletedEvent (04-modulith/src/test/java/de/odrotbohm/examples/ddd/modulith/orders/OrderManagementIntegrationTests.java)
  • No assertions: createsDocumentation (04-modulith/src/test/java/de/odrotbohm/examples/ddd/modulith/DocumentationTests.java)
  • No assertions: publishesEventOnProductCreation (04-modulith/src/test/java/de/odrotbohm/examples/ddd/modulith/catalog/CatalogIntegrationTests.java)
  • No dependency advisory monitoring
  • Scanner failed to run — not a clean result
  • Scanner failed to run — not a clean result
  • Skipped (documented): serializesEmailAddressAsNestedValue (02-integration/src/test/java/de/odrotbohm/examples/ddd/integration/EmailAddressSerializationTests.java)
  • Skipped (documented): serializesEmailAddressValueObjectAsSimpleValue (02-integration/src/test/java/de/odrotbohm/examples/ddd/integration/EmailAddressSerializationTests.java)
  • TodoComment (03-boilerplate/src/main/java/de/odrotbohm/examples/ddd/persistence/Address.java)
  • TodoComment (03-boilerplate/src/main/java/de/odrotbohm/examples/ddd/persistence/Address.java)
  • TodoComment (03-boilerplate/src/main/java/de/odrotbohm/examples/ddd/persistence/Address.java)
  • TodoComment (03-boilerplate/src/main/java/de/odrotbohm/examples/ddd/persistence/Address.java)
  • TodoComment (03-boilerplate/src/main/java/de/odrotbohm/examples/ddd/persistence/Address.java)
  • …and 38 more

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

Survey your own repository

odrotbohm/tactical-ddd-workshop 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 21 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 ecee869bb448f054becb56fa778ba499b5f86809 — 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-fa71c66cabd8.