Skip to content
CAI
Software that uses CAICheck a score

biberlabs/ddd-embeddables

63.5

Adequate · 22 September 2026

2k

lines of production code

PHP

primary language

7

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a PHP-based application that manages domain-specific value objects, including color representations, personal information, geographic coordinates, and network addresses. It enforces strict type safety and robust validation for these entities, ensuring they handle empty or null states gracefully. The codebase has been modernized to PHP 8.0 standards, utilizing contemporary testing practices with PHPUnit to verify the behavior of these value objects.

Behavioural changes

Introduce Color value object and modernize existing value objects

Added a new Color value object that provides hexadecimal, RGB, and human-readable name representations. Updated existing value objects (FullName, DateRange, EmailAddress, GeoPoint, IpAddress, and IpRange) to use strict PHP 8 type hints, nullable types, and modernized constructors to allow empty/null states, improving robustness and reducing noise.

src · high confidence

Test coverage

Modernized and expanded test suite for value objects

The test suite for value objects (Color, FullName, GeoPoint, DateRange, EmailAddress, IpAddress, and IpRange) has been modernized to use PHPUnit 6+ syntax, including explicit return types, strict type hints, and the \TestCase\ base class. Invalid inputs now explicitly assert \InvalidArgumentException\ via \expectException\ rather than relying on annotations. New tests cover empty states for all value objects, and the \IpRange\ tests now include a \/32\ CIDR case.

tests · high confidence

Dependencies

Upgrade PHP 8 and modernize dependencies

The project now requires PHP 8.0 or higher, replacing the previous support for PHP 5.6 and 7.1. Additionally, the dependency on doctrine/orm has been updated to version 2.11, and the development dependency phpunit/phpunit has been upgraded to version 9.5 to align with modern testing standards.

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

Lenses

  • Code Health 100 → 100 (+0.0)
  • Architecture 100 → 100 (+0.0)
  • Maturity 61 → 61 (+0.0)
  • Readiness 50 → 45 (-5.2)
  • Security 98 → 99 (+0.8)

Resolved (11)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • High CVE: [GHSA redacted] (composer.lock)
  • No exposed public API
  • Test reliability not included
  • The README does not mention tests, contributing, or further reading (the outline sections are present but unshown content hides this gap). (README.md)
  • The README mentions Martin Fowler's P of EAA page 486 but never actually cites it in text or links to it. (README.md)
  • early-stage repository — too few commits for a meaningful bus factor
  • early-stage repository — too little history to judge knowledge freshness
  • git history depth insufficient
  • git history depth insufficient

New (7)

  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • High CVE: [GHSA redacted] (composer.lock)
  • Inconsistent naming convention for value conversion methods. Some use 'to' prefix (toHex, toRGB, toRGBString, toArray), while others use 'get' prefix (getName). Additionally, 'toRGB' returns an array while 'toRGBString' returns a string, suggesting a potential split in intent that could be unified or clarified.
  • Inconsistent presence of isEmpty() method. Color, DateRange, and IpRange have isEmpty(), but FullName, EmailAddress, GeoPoint, and IpAddress do not. While some types might logically not be 'empty', the inconsistency in exposing this utility method across similar embeddable types is notable.
  • Inconsistent signature for toArray. DateRange.toArray accepts an optional format parameter, while FullName, GeoPoint, and IpRange do not. This creates an inconsistent API surface for what appears to be the same operation (converting to an array representation).
  • No dependency advisory monitoring

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

Survey your own repository

biberlabs/ddd-embeddables 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 22 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 f308856c3491dae52e6ce46a8c463ea375938273 — 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-821afab8930d.