Skip to content
CAI
Software that uses CAICheck a score

palkan/active_event_store

65.6

Adequate · 22 September 2026

710

lines of production code

Ruby

primary language

7

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Ruby gem that provides a Rails integration layer for Ruby Event Store, enabling the configuration of event clients, repositories, and mappers. It facilitates asynchronous event processing by allowing users to schedule subscribers with delays via Active Job and offers comprehensive testing utilities, including RSpec matchers and Minitest helpers, to verify event publication and job enqueuing.

Features

ActiveEventStore 1.4.0 release with Rails integration and async subscriber support

This release introduces the ActiveEventStore gem (version 1.4.0) as a Rails integration layer for Ruby Event Store. It provides an Engine that configures the event store client, repository, and mappers, including support for asynchronous subscribers via ActiveJob. The gem includes a custom Event class with attribute validation, a DomainEvent mapper for serialization, and a SubscriberJob base class for handling async events. It also adds RSpec matchers and a TestHelper for asserting event publication and async job enqueuing.

_lib/active\_event\store · high confidence

Add event publication assertion matcher for tests

The test helper now includes an EventPublishedMatcher class, enabling users to assert that specific events were published during test execution. This matcher supports verifying event types and attributes, and allows for flexible count expectations such as exactly, at least, or at most a certain number of events, as well as refuting publication.

_lib/active\_event\_store/test\helper · high confidence

New RSpec matchers for async subscribers and published events

Added two new RSpec matchers to the testing library: \have\_enqueued\_async\_subscriber\_for\ and \have\_published\_event\. The former allows verifying that an async subscriber job was enqueued with specific event data, integrating with \rspec-rails\ and respecting the configured serializer. The latter enables assertions on the number and attributes of events published to the event store within a block, supporting flexible count expectations (exactly, at least, at most).

_lib/active\_event\store/rspec · high confidence

Behavioural changes

Async subscription scheduling with wait and wait\_until options

The library now supports scheduling async event subscribers using the \wait:\ and \wait\_until:\ options on \subscribe\. When these options are provided, they are forwarded to Active Job's \.set\ method, allowing users to delay job execution by a specific duration or until a specific time. The implementation includes validation to ensure \wait:\ is a numeric value or ActiveSupport::Duration and \wait\_until:\ is a time-like object, raising an error if used with synchronous subscribers or invalid values.

lib · high confidence

Support delayed async subscriptions and Rails Event Store 3.0 compatibility

Users can now schedule asynchronous event subscribers to run after a delay by passing \wait:\ or \wait\_until:\ options to \subscribe\, which are forwarded to Active Job. The gem also adds support for Rails Event Store 3.0 by adapting to its renamed dispatcher and repository classes, ensuring compatibility with the latest RES versions while maintaining fallbacks for older releases.

(repo-wide) · high confidence

Test coverage

Added test suite for ActiveEventStore core components; Added test suite for event subscription behaviors; Added test support infrastructure for Rails and Event Store specs; Added tests for ActiveEventStore test helper assertions; Introduce centralized test helper for Minitest suite.

Dependencies

Expanded CI support for Rails 7.1, Rails 8, and Rails Event Store master

The CI configuration now tests against Rails 7.1 and Rails 8 (using sqlite3 \~\> 2.0 for Rails 8), in addition to existing Rails 5, 6, and 7 versions. Support for Rails Event Store (RES) master has been added, and the Rails 6 gemfile now pins RES to versions below 2.18.0. The \railsmaster\ gemfile has been updated to use sqlite3 \~\> 2.0 and includes \activerecord-import\. Rubocop linting tools have been upgraded to \standard \~\> 1.0\ and \rubocop-md \~\> 2.0\.

gemfiles · high confidence

Update Ruby and Rails requirements; switch to debug gem and minitest

The gem now requires Ruby 2.7 or higher (dropping support for 2.5) and defaults to Rails 7.0 instead of 6.0. The development dependency on pry-byebug has been replaced with the debug gem, and the test suite has shifted from RSpec to Minitest (with rspec-rails retained as a dependency). Additionally, the gem now explicitly depends on rails\_event\_store version 2.11.0 or later.

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

Lenses

  • Code Health 100 → 100 (+0.0)
  • Architecture 69 → 69 (+0.0)
  • Maturity 50 → 58 (+7.6)
  • Readiness 63 → 70 (+6.2)
  • Security 47 → 77 (+29.4)

Resolved (11)

  • 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)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • No exposed public API
  • Test reliability not included
  • The Usage section describes event-class identifiers (optional) but does not explain what happens when identifier is omitted or defaults to a non-descriptive value, which can be a subtle bug for new readers. (README.md)
  • dormant codebase — no living knowledge left to concentrate

New (17)

  • Ambiguous access pattern. The type lists both a Property and a Method with the same name. In Ruby, this usually means the method is the accessor, but listing both explicitly suggests confusion between attribute readers and method calls.
  • Duplication of assertion logic. The TestHelper method appears to be a procedural wrapper that likely instantiates and runs the HavePublishedEvent matcher, creating two ways to assert the same condition (one procedural, one RSpec-style DSL).
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • Low CVE: [GHSA redacted] (Gemfile)
  • No dependency advisory monitoring
  • Off-boarding risk: anonymized user #1
  • Redundant factory methods with identical signatures and likely identical implementation intent. 'from' and 'for' are semantically ambiguous in this context and offer no distinct behavior.

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

Survey your own repository

palkan/active_event_store 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 ddc03251f9e09dc537e8b530ad3f708ec87f875a — 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.