xprt64/dudulina
59.6
Adequate · 21 September 2026
4.4k
lines of production code
PHP
primary language
4
measurements over time
What this system is
Dudulina is a PHP framework for implementing CQRS and Event Sourcing architectures. It provides core infrastructure for command dispatching, event handling, and state management, alongside automated code generation tools to streamline development workflows. The system includes comprehensive test coverage for its components, ensuring reliability in areas like event stores, sagas, and read models.
Features
New code-generation scripts for CQRS components
Added a suite of new PHP scripts in the bin directory to automate the generation of mapping files for the CQRS architecture. The new scripts include create\_bindings.php, create\_cqrs\_command\_handlers\_map.php, create\_cqrs\_command\_validators\_map.php, create\_cqrs\_event\_listeners\_map.php, create\_cqrs\_query\_askers\_map.php, create\_cqrs\_query\_handlers\_map.php, create\_cqrs\_readmodels\_map.php, and create\_cqrs\_saga\_event\_processors\_map.php. Additionally, a validation script validate\_aggregate\_event\_appliers.php was added to verify aggregate event appliers. These tools streamline the development workflow by automatically generating necessary mapping files based on source code analysis.
bin · high confidence
Behavioural changes
Refactored command dispatching to use an AggregateDescriptor for aggregate identity
The framework now uses an AggregateDescriptor class to bundle an aggregate's ID and class, replacing the previous approach of passing separate $aggregateId and $aggregateClass parameters. This change is visible in the new AggregateDescriptor class and its usage in the DefaultCommandDispatcher and EventSourcedAggregateRepository, allowing the system to handle different types of repositories (e.g., non-event-sourced) more cleanly.
src/Dudulina · high confidence
Test coverage
Added PHPUnit configuration and test result cache; Added comprehensive test coverage for command handling and validation; Added tests for InMemoryStateManager; Added tests for ReadModelRecreator, ReadModelTail, and ListSerializer; Added tests for aggregate repository and listener class validation; Added tests for event dispatching and BDD aggregate testing helpers; Added tests for the Dudulina code generation and query handling systems; Added tests for the Dudulina event store and saga execution; Added unit tests for EventClassDetector and MetaData; Added unit tests for ScheduledCommandsDispatcher; Added unit tests for event subscriber implementations.
Dependencies
Initial release of the Dudulina PHP framework
Introduced the Dudulina package, a PHP framework for CQRS and Event Sourcing. The package requires PHP 8.0+ and integrates several dependencies including psr/container, psr/log, xprt64/types, xprt64/iterator, xprt64/code-analysis, and xprt64/selector.
(dependencies) · medium 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 64 → 60 (-4.1)
- Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.
Lenses
- Code Health 99 → 97 (-1.8)
- Architecture 100 → 100 (+0.0)
- Maturity 48 → 48 (+0.0)
- Readiness 57 → 45 (-12.3)
- Security 100 → 100 (+0.0)
Resolved (8)
- Coverage not included — suite not readable by the collector
- Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
- Duplicated block (11 lines × 2) (src/Dudulina/ReadModel/ReadModelRecreator.php)
- Duplicated block (9 lines × 3) (src/Dudulina/Command/CommandTester/DefaultCommandTester.php)
- LLM evaluation failed
- No exposed public API
- Test reliability not included
- dormant codebase — no living knowledge left to concentrate
New (32)
- Dependency hygiene PARTLY measured — Composer dependencies read, no committed lock to grade for currency
- Duplicated block (10 lines × 2) (src/Dudulina/ReadModel/ReadModelRecreator.php)
- Duplicated block (12 lines × 3) (src/Dudulina/Command/CommandTester/DefaultCommandTester.php)
- Duplicated block (5 lines × 3) (src/Dudulina/CodeGeneration/Command/AggregateCommandHandlerDetector.php)
- Duplicated block (6 lines × 2) (src/Dudulina/CodeGeneration/Command/CommandHandlersMapCodeGenerator.php)
- Duplicated block (6 lines × 3) (src/Dudulina/Command/CommandTester/DefaultCommandTester.php)
- Duplicated block (9 lines × 3) (src/Dudulina/Command/CommandTester/DefaultCommandTester.php)
- No assertions: test (tests/Dudulina/Event/EventDispatcher/CompositeEventDispatcherTest.php)
- No assertions: test (tests/Dudulina/Event/EventDispatcher/EventDispatcherBySubscriberTest.php)
- No assertions: test (tests/Dudulina/EventStore/Debug/DumpEventsByClassTest.php)
- No assertions: test (tests/Dudulina/Scheduling/ScheduledCommandsDispatcherTest.php)
- No assertions: testValidateCommand (tests/Dudulina/Command/CommandValidation/CommandValidatorBySubscriberTest.php)
- No assertions: test_dispatchEvent_ConcurentModificationException (tests/Dudulina/Saga/SagasOnlyOnceEventDispatcherTest.php)
- No assertions: test_dispatchEvent_already_parsed (tests/Dudulina/Saga/SagasOnlyOnceEventDispatcherTest.php)
- No assertions: test_dispatchEvent_not_isEventProcessingAlreadyStarted (tests/Dudulina/Saga/SagasOnlyOnceEventDispatcherTest.php)
- No assertions: test_dispatchEvent_with_error_in_saga (tests/Dudulina/Saga/SagasOnlyOnceEventDispatcherTest.php)
- No assertions: test_exception_is_catched (tests/Dudulina/Event/EventDispatcher/EventDispatcherBySubscriberTest.php)
- No assertions: test_withException_withLogger (tests/Dudulina/Scheduling/ScheduledCommandsDispatcherTest.php)
- No assertions: test_withException_without (tests/Dudulina/Scheduling/ScheduledCommandsDispatcherTest.php)
- No dependency advisory monitoring
- …and 12 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
xprt64/dudulina 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 8bb8203aa8add66a1225a975aac9cb08e675b192 — 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.