Skip to content
CAI
Software that uses CAICheck a score

tarfin-labs/event-machine

77.9

Strong · 21 September 2026

27.9k

lines of production code

PHP

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a PHP-based event machine library that implements a state engine for managing complex, persistent workflows with support for parallel regions, child machine delegation, and scheduled timers. It provides a comprehensive infrastructure for defining state transitions, handling asynchronous job dispatch via Laravel queues, and persisting machine events with automatic archival and restoration capabilities. The framework includes a built-in HTTP routing layer to expose machine states as REST endpoints, along with extensive tooling for static analysis, path coverage tracking, and scenario-based testing.

How it got here

2023 — EventMachine package initial release

31 changes.

This period focused on the initial release of the EventMachine package, establishing the core actor model, state validation, and context management infrastructure. It introduced comprehensive persistence models, database migrations, and a robust configuration system for archival and parallel execution. The work also included extensive test stubs and a migration to Pest to ensure thorough coverage of the new state machine logic.

2024–2026 — Async infrastructure and test expansion

73 changes.

This period focused on implementing asynchronous execution for child machines, parallel regions, and listeners, alongside introducing HTTP routing and explicit scheduling mechanisms. A massive expansion of test coverage accompanied these features, adding comprehensive suites for parallel states, typed delegation, and scenario execution to ensure stability.

Features

Add EventMachine facade for service container access

A new EventMachine facade has been introduced in the src/Facades directory, providing a static interface to the underlying Tarfinlabs\\EventMachine service. This allows users to interact with the Event Machine functionality through a convenient facade pattern, including support for resetting all fake invocations via the resetAllFakes method.

src/Facades · high confidence

Add MachineEventFactory for test data generation

A new MachineEventFactory has been introduced to generate realistic test data for the MachineEvent model. This factory creates instances with populated fields including a ULID-based ID, sequence number, machine ID, machine value, source type, event type, payload, version, context, meta, and root event ID, enabling developers to easily seed tests with valid machine event records.

database/factories · high confidence

Add ModelTransformer for extracting IDs from DataProperty values

A new ModelTransformer class has been added to the Transformers module. It implements the Spatie LaravelData Transformer interface and, when invoked, extracts and returns the 'id' property from the provided value, supporting the TransformationContext parameter.

src/Transformers · high confidence

Add doctest bootstrap profiles for state machine scenarios

New bootstrap files have been added to the .doctest directory to support running documentation tests against specific state machine configurations. These include a database setup (db.php) that initializes an in-memory SQLite database with required migration stubs, a Laravel Testbench configuration (laravel.php) wiring up the EventMachine and LaravelData service providers, and specific state machine definitions for parallel states (editor-setup.php), multi-region context management (multi-region-setup.php), and deeply nested parallel states (deep-nesting-setup.php).

.doctest · high confidence

Async job infrastructure for child machines, parallel regions, and event listeners

The library now supports asynchronous execution for child machines, parallel regions, and listener actions via dedicated queue jobs. Child machines can be invoked with a \queue\ configuration, enabling fire-and-forget execution or tracked delegation with typed output/failure reconstruction via \ChildMachineJob\ and \ChildMachineCompletionJob\. Parallel regions are processed concurrently using \ParallelRegionJob\, which includes context conflict detection, deep merging, and stall/timeout handling via \ParallelRegionTimeoutJob\. Listener actions can now be deferred to the queue via \ListenerJob\ with re-entrant locking to prevent lost updates. Cross-machine events are sent asynchronously via \SendToMachineJob\, which handles lock contention and missing targets gracefully. All jobs include configurable retry/backoff, unique locking, and idempotency guards.

src/Jobs · high confidence

Initial release of the EventMachine package with state validation and context management

This change introduces the core \event-machine\ package, replacing the previous skeleton template. It provides a \ContextManager\ for handling machine state and identity, a \StateConfigValidator\ to enforce strict rules on machine configuration (including state types, transitions, and typed contracts), and an \EventCollection\ extending Laravel's Eloquent collection. The package also registers a suite of artisan commands (such as \machine:coverage\, \machine:paths\, and \machine:cache\) and migrations for managing machine events, locks, and archival.

src · high confidence

Introduce Actor package with Machine and State classes

Added the \src/Actor\ package containing the core \Machine\ and \State\ classes, which implement the event machine's lifecycle, state management, and persistence logic. The \Machine\ class provides static entry points (\create\, \query\, \withDefinition\) and handles event dispatching, locking, and parallel region jobs, while the \State\ class manages the current state definition, history, and context. This change establishes the foundational actor model for the library.

src/Actor · high confidence

Introduce MachineCast for serializing event machines to model attributes

A new MachineCast class has been added to handle the conversion between Event Machine objects and their underlying string representations in database models. This cast allows models using the HasMachines trait to store machine state by extracting the root event ID during serialization (set) and reconstructing the machine instance with the correct context during deserialization (get).

src/Casts · high confidence

Introduce definition value objects and event behavior classes

The \src/Definition\ area now includes new value objects and behavior classes to support richer state machine configuration. \EventDefinition\ extends \EventBehavior\ to represent event definitions with a standardized type. \MachineInvokeDefinition\ acts as a value object for machine and job delegation, handling context resolution and event forwarding. \ScheduleDefinition\ and \TimerDefinition\ parse schedule and timer configurations into structured objects. These additions complement the existing \MachineDefinition\, \StateDefinition\, \TransitionDefinition\, and \TransitionBranch\ classes, providing a more structured foundation for defining machine behaviors, transitions, and asynchronous operations.

src/Definition · high confidence

Introduce machine configuration for archival, parallel dispatch, and timers

The application now includes a new \config/machine.php\ file that centralizes settings for the state machine engine. This configuration enables users to control event archival behavior (including compression levels and thresholds), manage parallel region execution via queue-based dispatch (with job timeouts and lock settings), and tune timer sweep performance (batch size and backpressure). It also introduces scenario toggles for staging environments and a configurable maximum transition depth to prevent infinite loops. The previous \config/skeleton.php\ placeholder has been removed.

config · high confidence

Introduce machine event archival service with optimized eligibility queries

Added ArchiveService to handle archiving and restoring of machine events, including a new getEligibleInstances method that uses a GROUP BY + HAVING query pattern to significantly improve performance (reducing query time from \~400s to \~100ms) for identifying inactive machines eligible for archival.

src/Services · high confidence

Introduces persistent models for machine state, events, and concurrency control

This change adds a suite of Eloquent models to the \src/Models\ directory to support the event machine's persistence layer. \MachineEvent\ and \MachineEventArchive\ handle event storage and compressed archival with auto-restore capabilities, while \MachineCurrentState\ tracks active machine states. Concurrency and lifecycle management are supported by \MachineStateLock\ for locking, \MachineTimerFire\ for timer deduplication, and \MachineChild\ for tracking async parent-child machine delegation.

src/Models · high confidence

Introduces typed behavior base classes and child-machine communication events

This change adds a set of new abstract base classes and typed event classes to the behavior layer to standardize machine interactions. New base classes include ActionBehavior, GuardBehavior, CalculatorBehavior, and OutputBehavior (all extending InvokableBehavior), alongside dedicated contracts for data exchange: MachineInput, MachineOutput, and MachineFailure. To support child-to-parent communication, the system now provides ChildMachineDoneEvent and ChildMachineFailEvent, which offer typed accessors for results, errors, and machine identity, replacing raw payload access. EventBehavior is also updated to use Spatie Laravel Data for validation and includes self-validation capabilities.

src/Behavior · high confidence

New HTTP routing layer for machine endpoints and read projections

The src/Routing directory introduces a new HTTP routing layer that exposes machine state machines as REST endpoints. MachineRouter automatically registers Laravel routes based on machine definitions, supporting model-bound, machineId-bound, and stateless endpoints, along with read-only projections (GET snapshots) and forwarded child-machine endpoints. EndpointDefinition and ReadDefinition value objects normalize configuration formats (string shorthands, arrays, event classes) into consistent structures, while MachineController handles the request lifecycle, including event resolution, validation, scenario continuation, and consistent JSON response envelopes. The routing system also includes validation for endpoint filtering (only/except), model binding, and forwarded endpoint inheritance, ensuring type-safe and secure access to machine states.

src/Routing · high confidence

New build and quality-assurance scripts for skill distribution and code coverage

Added three new scripts to the project root: \build-skill.sh\ materializes the \skills/event-machine/docs\ directory by copying markdown files from the main \docs\ folder, replacing the development symlink to create a self-contained, distribution-ready skill package; \restore-skill-symlink.sh\ reverses this process by removing the materialized copy and restoring the symlink for local development; and \crap.php\ acts as a quality gate that parses the PHPUnit Clover XML report to fail the build if any method with a complexity of 5 or higher has zero test coverage, while also reporting methods exceeding a CRAP score of 30.

scripts · high confidence

New contract interfaces for failure handling, output passing, and schedule resolution

Three new interfaces have been added to the contracts layer to define how child machines communicate with their parents and how scheduled events are routed. The \ProvidesFailure\ interface allows jobs to map exceptions to typed \MachineFailure\ objects, enabling parent machines to receive structured failure data via \ChildMachineFailEvent\. The \ReturnsOutput\ interface defines how jobs return data to the parent, supporting both simple arrays and typed \MachineOutput\ objects passed through \ChildMachineDoneEvent\. Finally, the \ScheduleResolver\ interface provides a mechanism for resolving which machine instances should receive scheduled events by returning a collection of root event IDs, keeping the event system decoupled from specific model implementations.

src/Contracts · high confidence

New database schema for machine lifecycle, state, and archival

This change introduces a comprehensive set of database migrations to support the machine execution engine. It creates the \machine\_events\ table for event sourcing, \machine\_current\_states\ to track active machine states (including new \scenario\_class\ and \scenario\_params\ columns), and \machine\_locks\ for concurrency control. It also adds \machine\_children\ to track async child machine delegation, \machine\_timer\_fires\ for scheduled events, and \machine\_event\_archives\ for storing compressed historical data. Additionally, an archival index is added to \machine\_events\ to optimize cleanup queries.

database/migrations · high confidence

New development tooling and configuration infrastructure

The repository now includes a comprehensive set of configuration files to standardize code quality and development workflows. A new \CLAUDE.md\ file provides detailed architecture and workflow guidance for AI coding agents, while \pint.json\ and \rector.php\ configure code style and automated refactoring rules. Static analysis is hardened by upgrading PHPStan to level 6 in \phpstan.neon.dist\. The testing infrastructure is expanded with \infection.json5\ for mutation testing, \doctest.php\ for documentation examples, and a new \tests/LocalQA/\ directory for integration tests against real MySQL, Redis, and Horizon. Additionally, the legacy \configure.php\ scaffolding script has been removed, and \.gitignore\ and \.mailmap\ have been updated to manage local artifacts and normalize author identities.

(repo-wide) · high confidence

New fluent query builder for filtering machine instances by state

Introduces the MachineQueryBuilder class in src/Query, providing a fluent API to filter machine instances based on their current state (e.g., inState, inAnyState, notInFinalState, active) and scenarios (whereHasScenario, whereScenario). The builder handles complex state resolution, including parallel state deduplication and subquery intersections for AND/OR logic. It also includes terminal methods like get, first, count, and paginate to retrieve results, which are wrapped in a new MachineQueryResult value object that decouples query results from the internal Machine model and supports lazy restoration of the full machine instance.

src/Query · high confidence

New machine:archive-events command for automated event archival

Added the \machine:archive-events\ command to automate the archival of inactive machine events. It identifies eligible machine instances based on a configurable inactivity period and dispatches \ArchiveSingleMachineJob\ jobs for each, supporting a fan-out pattern for performance on large datasets. The command includes a \--dispatch-limit\ option to control batch size, a \--dry-run\ mode for previewing actions, and a \--sync\ flag for testing. It also introduces the \machine:archive-status\ command to view archive summaries and restore archived events.

src/Commands · high confidence

New scenario execution engine with static validation and scaffolding

This change introduces a complete scenario system for the Event Machine, allowing users to define, validate, and execute multi-step journeys through state machines. It adds a \MachineScenario\ base class for defining scenarios with source/target states, triggering events, and parameter validation, alongside a \ScenarioPlayer\ runtime engine that handles execution, behavior overrides, and a new \@continue\ loop for interactive, multi-request flows. The system includes \ScenarioValidator\ for static structural checks (e.g., ensuring paths exist and targets are non-transient), \ScenarioDiscovery\ for automatic filesystem scanning of scenario classes, and \ScenarioScaffolder\ to generate starter scenario files from machine definitions.

src/Scenarios · high confidence

New static analysis and path coverage infrastructure for state machines

The Analysis module now includes a comprehensive set of classes to enumerate, classify, and track paths through state machine definitions. This introduces a PathEnumerator for DFS-based path enumeration with depth and path limits, a MachineGraph for shared graph navigation and state classification, and a ScenarioPathResolver for finding paths between states. It also adds a PathCoverageTracker to record runtime execution paths during tests and a PathCoverageReport to compare them against static analysis results, enabling users to verify that their tests cover all possible machine behaviors.

src/Analysis · high confidence

New support utilities for array manipulation, behavior parsing, compression, timers, and wiring inspection

This update introduces several new classes in the Support namespace to enhance the framework's capabilities. ArrayUtils provides recursive merge and diff operations for configuration arrays. BehaviorTupleParser now strictly rejects @-prefixed keys in non-listener tuples to prevent silent failures where reserved keys like @queue were previously dropped. CompressionManager handles data archival with configurable thresholds and levels, including null safety for unpack operations. Timer offers a value object for defining duration-based events. WiringInspector performs static checks to detect incompatible context types, unsatisfiable required context keys, and event type collisions, helping users identify configuration errors early.

src/Support · high confidence

New testing utilities for event machines

The testing package now includes several new components to improve testability and coverage. A new \TestMachine\ class provides a fluent wrapper for machine-level testing, including helpers for timers, faking behaviors, and assertions. A \CommunicationRecorder\ allows tracking of cross-machine communication during tests. An \EventBuilder\ abstract base class and \HasBuilder\ trait offer a composable way to generate test data for events. Additionally, an \InlineBehaviorFake\ class enables test-time interception of closure-based behaviors, and a \TracksPathCoverage\ trait provides parallel-safe path coverage tracking for test suites.

src/Testing · high confidence

New traits for behavior resolution, machine initialization, and test faking

This change introduces three new traits to the \src/Traits\ directory. \ResolvesBehaviors\ adds methods (\getBehavior\, \getCalculator\, \getGuard\, \getAction\, \getEvent\) to retrieve specific behavior definitions from a class's definition structure. \HasMachines\ provides functionality to automatically initialize machine states for Eloquent model attributes during model creation and attribute retrieval, supporting configuration via a \machines()\ method or property. \Fakeable\ introduces a comprehensive testing utility that allows behaviors to be mocked or spied using Mockery, with methods to set expectations (\shouldRun\, \shouldReturn\, \mayReturn\), assert invocation (\assertRan\, \assertNotRan\), and manage cleanup to prevent cross-test leakage.

src/Traits · high confidence

Behavioural changes

Centralized enum definitions for state machine behaviors, events, and types

The \src/Enums\ directory now contains the canonical definitions for the state machine's core types, consolidating previously scattered or implicit definitions into explicit PHP enums. \BehaviorType\ enumerates supported behavior kinds (Calculator, Guard, Action, Output, Event, Context) and maps them to their corresponding classes and configuration keys. \InternalEvent\ defines the full set of internal lifecycle events, including new cases for parallel state regions (enter/exit, timeout, stall, conflict), child machine lifecycle, and listener queue operations, providing a structured way to generate event names. \StateDefinitionType\ explicitly lists state kinds (Atomic, Compound, Parallel, Final), while \SourceType\ distinguishes between internal and external events. \TransitionProperty\ currently defines the \Always\ transition condition. This change establishes a single source of truth for these enumerations within the Enums namespace.

src/Enums · high confidence

Comprehensive exception hierarchy for state machine validation and runtime errors

The \src/Exceptions\ directory has been replaced with a comprehensive set of specialized exception classes to replace generic \InvalidArgumentException\ throws. This introduces granular error handling for configuration validation (e.g., \InvalidStateConfigException\, \InvalidRouterConfigException\, \InvalidEndpointDefinitionException\), state machine structure (e.g., \InvalidParallelStateDefinitionException\, \MaxTransitionDepthExceededException\), and runtime scenarios (e.g., \ScenarioFailedException\, \ScenarioTargetMismatchException\). It also adds specific exceptions for input/output resolution (\MachineInputValidationException\, \MachineOutputResolutionException\), scheduling (\ScheduleResolverFailedException\), and locking (\MachineLockTimeoutException\), providing clearer, actionable error messages for developers.

src/Exceptions · high confidence

Introduce explicit machine scheduling and timer registration

The scheduling infrastructure has been replaced with explicit registration classes. Users can now define scheduled events for specific machine types using MachineScheduler::register(), which validates that the requested event type exists in the machine's definition and throws InvalidScheduleDefinitionException if it does not. Additionally, MachineTimer::register() provides a standardized way to register periodic timer sweeps for machines, defaulting to every-minute execution without overlapping. The previous automatic timer discovery and resolution configuration have been removed in favor of this explicit approach.

src/Scheduling · high confidence

Introduce process-local re-entrancy tracking for machine state locks

The lock infrastructure now tracks held locks within the current process execution context to prevent deadlocks during nested lock acquisitions. When a lock is acquired via MachineLockManager, it is registered in a process-local registry (Machine::$heldLockIds), allowing nested callers to detect that the lock is already held by the same stack and skip redundant acquisition attempts. The corresponding MachineLockHandle automatically deregisters the lock from this registry upon release, ensuring the re-entrancy state remains consistent with the actual lock state.

src/Locks · high confidence

Test coverage

Added CompletionScenario stub for endpoint machine tests; Added IsEvenGuard test stub for TrafficLights machine; Added ModelA stub for testing machine integration; Added QA stub machines for typed delegation testing; Added Qwerty stub machine for testing; Added XyzMachine stub for testing event machine definitions; Added YEvent stub for Xyz machine tests; Added calculator stub classes for unit testing; Added compound state machine stubs for testing event priority and conditional transitions; Added comprehensive test coverage for machine management commands; Added comprehensive test coverage for parallel state behaviors; Added comprehensive test coverage for typed contracts and machine behaviors; Added comprehensive test suite for EventBuilder and HasBuilder; Added comprehensive test suite for the Machine Query Builder; Added event stubs for testing event behavior and validation; Added fixture for testing broken scenario discovery; Added invalid machine fixtures to test CLI validation robustness; Added job stubs for comprehensive test coverage; Added lock contention test stubs for endpoint machines; Added parallel state machine stubs for comprehensive E2E testing; Added scenario fixtures to test edge cases in scenario restoration and hydration; Added stub actions for event processing order tests; Added stub event builders for testing; Added stub machine for testing incremental context diff restoration; Added stub machines and resolver for scheduled event testing; Added test coverage for CompressionManager, WiringInspector, and path enumeration; Added test stub actions and behaviors for event machine testing; Added test stub for AsdMachine state machine; Added test stub for event resolution behavior; Added test stub for raising multiple events in a single action; Added test stub guards for event machine validation; Added test stub listeners for queued actions and retry scenarios; Added test stub machines for behavior verification; Added test stubs for @always event preservation edge cases; Added test stubs for ASD machine actions and events; Added test stubs for AlwaysRtcEdgeCases machine actions; Added test stubs for ContextManager scenarios; Added test stubs for GET endpoint state machines and events; Added test stubs for MachineFailure scenarios; Added test stubs for MachineInput contract shapes; Added test stubs for TrafficLights machine actions; Added test stubs for TrafficLights state machine; Added test stubs for always-before-raise transition ordering; Added test stubs for behavior coverage; Added test stubs for endpoint machine scenarios; Added test stubs for forward-aware endpoint machines; Added test stubs for infinite loop protection scenarios; Added test stubs for internal event processing order in child delegation; Added test stubs for job actor state machine patterns; Added test stubs for listener lifecycle and isolation scenarios; Added test stubs for output behaviors and machine outputs; Added test stubs for parallel machine guard scenarios; Added test stubs for read-only machine scenarios; Added test stubs for typed delegation machine scenarios; Added test stubs for validation guard edge cases; Added test stubs for wiring shape validation; Added tests for ArchiveService archival and restoration logic; Added tests for ArchiveSingleMachineJob; Added tests for the static path coverage tracking and reporting system; Added timer machine stubs for testing; Added unit tests for MachineEventArchive; Comprehensive LocalQA test suite for real Horizon integration; Comprehensive test coverage for behavior execution, dependency injection, and event handling; Comprehensive test coverage for routing, endpoints, and forwarded interactions; Expanded E2E test coverage for parallel dispatch, timers, and scheduled events; Expanded integration test coverage for event machine archival, context, and validation; Expanded parallel region test stubs for state, event, and failure scenarios; Expanded suite of state machine stubs for testing; Expanded test coverage for state machine core behaviors and edge cases; Expanded test coverage for state machine definition and actor behavior; Expanded test coverage for the testing infrastructure; Expanded test stubs for scenario analysis and delegation edge cases; Migrate test suite to Pest and configure comprehensive test infrastructure; Test stubs for parent-child delegation scenarios.

Dependencies

Upgrade to PHP 8.3+ and Laravel 11-13 with Pest 4 and Larastan 3

The package now requires PHP 8.3 or higher and supports Laravel 11, 12, and 13, dropping support for older versions. The testing stack has been upgraded to Pest 4 and Larastan 3, with the deprecated \nunomaduro/larastan\ package replaced by \larastan/larastan\. New dependencies include \nikic/php-parser\ and \spatie/laravel-data\, while \ext-zlib\ is now a required extension. The documentation site has been initialized with VitePress 2.0-alpha, Mermaid 11.13, and LLM-friendly plugins.

(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 65 → 78 (+12.9)
  • Rubric changed (rubric-2026.08.19 → rubric-2026.09.15) — scores are not directly comparable.

Lenses

  • Code Health 74 → 82 (+8.1)
  • Architecture 100 → 99 (-0.7)
  • Maturity 69 → 79 (+10.1)
  • Readiness 63 → 73 (+11.0)
  • Security 60 → 81 (+20.4)

Resolved (64)

  • Coverage not included — suite not readable by the collector
  • Dependency hygiene not measured — dependency manifest found but not parsed for hygiene
  • Duplicated block (10 lines × 2) (src/Analysis/PathEnumerator.php)
  • Duplicated block (11 lines × 2) (src/Scenarios/ScenarioPlayer.php)
  • Duplicated block (12 lines × 2) (src/Definition/MachineDefinition.php)
  • Duplicated block (12 lines × 2) (src/Routing/MachineController.php)
  • Duplicated block (12 lines × 2) (src/Routing/MachineRouter.php)
  • Duplicated block (12 lines × 2) (src/Scenarios/ScenarioValidator.php)
  • Duplicated block (13 lines × 2) (src/Definition/MachineDefinition.php)
  • Duplicated block (14 lines × 2) (src/Actor/State.php)
  • Duplicated block (14 lines × 2) (src/Analysis/PathEnumerationResult.php)
  • Duplicated block (14 lines × 2) (src/Definition/MachineDefinition.php)
  • Duplicated block (14 lines × 2) (src/Jobs/ParallelRegionJob.php)
  • Duplicated block (14 lines × 2) (src/Jobs/ParallelRegionTimeoutJob.php)
  • Duplicated block (14 lines × 2) (src/Testing/TestMachine.php)
  • Duplicated block (14 lines × 2) (src/Testing/TestMachine.php)
  • Duplicated block (15 lines × 2) (src/Commands/MachineCoverageCommand.php)
  • Duplicated block (16 lines × 2) (src/Actor/Machine.php)
  • Duplicated block (16 lines × 2) (src/Commands/MachineCoverageCommand.php)
  • Duplicated block (16 lines × 2) (src/Definition/MachineDefinition.php)
  • …and 44 more

New (97)

  • ClassTooLong: Machine (src/Actor/Machine.php)
  • ClassTooLong: MachineController (src/Routing/MachineController.php)
  • ClassTooLong: MachineDefinition (src/Definition/MachineDefinition.php)
  • ClassTooLong: PathEnumerator (src/Analysis/PathEnumerator.php)
  • ClassTooLong: ScenarioPlayer (src/Scenarios/ScenarioPlayer.php)
  • Dependency hygiene PARTLY measured — Composer dependencies read, no committed lock to grade for currency
  • Documentation: written for insiders (docs/testing/localqa.md)
  • Duplicated block (10 lines × 2) (src/Routing/MachineRouter.php)
  • Duplicated block (10–11 lines × 2) (src/Analysis/PathEnumerator.php)
  • Duplicated block (10–12 lines × 2) (src/Analysis/ScenarioPathResolver.php)
  • Duplicated block (11 lines × 2) (src/Definition/MachineDefinition.php)
  • Duplicated block (11 lines × 2) (src/Scenarios/ScenarioValidator.php)
  • Duplicated block (11 lines × 3) (src/Analysis/PathEnumerator.php)
  • Duplicated block (12–13 lines × 2) (src/Analysis/PathEnumerator.php)
  • Duplicated block (13–14 lines × 2) (src/Definition/MachineDefinition.php)
  • Duplicated block (13–15 lines × 2) (src/Scenarios/ScenarioPlayer.php)
  • Duplicated block (14 lines × 2) (src/Behavior/MachineInput.php)
  • Duplicated block (14 lines × 2) (src/Scenarios/ScenarioValidator.php)
  • Duplicated block (14 lines × 2) (src/Testing/TestMachine.php)
  • Duplicated block (14–15 lines × 2) (src/Definition/MachineDefinition.php)
  • …and 77 more

Changes since last survey

  • 300 commits — 248 feature/other, 52 fixes

By area

  • tests/Analysis — 43 commits
  • src/Analysis — 37 commits
  • src/Commands — 35 commits
  • spec/upcoming-parallel-path-analysis-termination.md — 19 commits
  • tests/Commands — 19 commits
  • docs/getting-started — 16 commits
  • tests/Stubs — 12 commits
  • docs/advanced — 10 commits
  • (root) — 9 commits
  • docs/laravel-integration — 8 commits
  • tests/Features — 8 commits
  • spec/9.20.0-weighted-path-resolution-release-notes.md — 7 commits
  • spec/9.20.0-weighted-path-resolution.md — 7 commits
  • docs/testing — 6 commits
  • skills/event-machine — 6 commits
  • src/Actor — 6 commits
  • fixtures/InvalidMachines — 5 commits
  • fixtures/ScenarioDrift — 5 commits
  • .github/workflows — 4 commits
  • src/Scenarios — 4 commits

Notable commits

  • fix: fix(actor): name an unresolvable output definition instead of resolving it
  • fix: fix(actor): never let a stored scenario stop a machine from loading
  • fix: fix(analysis): continue the scenario search past a final state
  • fix: fix(analysis): follow transitions inherited by a final state
  • fix: fix(analysis): gate the path ceiling on the shared total
  • fix: fix(analysis): guard the child machine definition lookup
  • fix: fix(analysis): keep the deferral signal on the plain-transition arm
  • fix: fix(analysis): let a guarded @done leave the final state reachable
  • fix: fix(analysis): let a harness drop half-walked coverage paths
  • fix: fix(analysis): match the enumerator's compound guard in the resolver
  • fix: fix(analysis): merge a nested parallel's groups into the result
  • fix: fix(analysis): record one group per parallel state on merge
  • fix: fix(analysis): report observations no enumerated path matches
  • fix: fix(analysis): require an EventBehavior before calling getType() on it
  • fix: fix(analysis): reset the region spend when enumerating again
  • fix: fix(analysis): restore the export directory on reset and own the boot flag
  • fix: fix(analysis): stop charging the ceiling for discarded region work
  • fix: fix(cast): drop a redundant string cast on getCasts()
  • fix: fix(commands): disclose unmatched observations in coverage output
  • fix: fix(commands): fail cleanly when definition() throws anything else
  • …and 280 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

tarfin-labs/event-machine 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 99c0abe6cce2505bfe856d868471b34fddcda4cb — 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.