Skip to content
CAI
Software that uses CAICheck a score

sloshy/fs2-es

49.7

Weak · 21 September 2026

2.4k

lines of production code

Scala

primary language

4

measurements over time

CAI band scale
CAI trend line
CAI lens gauges

What this system is

This system is a Scala library for managing event-sourced state, providing abstractions for applying events to update state and caching strategies for persistence. It includes concurrency primitives like LRU caches and deferred maps to support efficient state management. The project also offers testing utilities, such as a replayable event state for debugging and verifying event streams.

Features

Added ReplayableEventState for debugging and testing event streams

A new \ReplayableEventState\ implementation has been added to the testing package, providing a debuggable event state that stores an internal log of events. This allows users to seek forward and backward through the event history, reset the state, or manually construct the state for testing purposes.

testing/src/main · high confidence

Introduces new typeclasses and abstractions for event-driven state management

The library introduces a new set of typeclasses and abstractions for managing event-sourced state. \Driven\ and \DrivenNonEmpty\ typeclasses define how events modify state, with \Driven\ supporting optional states (initialization/removal) and \DrivenNonEmpty\ requiring a known state value. These are extended by \KeyedState\ and \KeyedStateNonEmpty\ to support keyed event streams. The \EventState\ trait and its variants (\EventStateTopic\, \SignallingEventState\) provide interfaces for applying events and subscribing to state changes. \EventLog\ and \EventStateCache\ offer abstractions for persisting and caching event-sourced state, with \EventStateCache\ supporting bounded and timed caching strategies. The \EmptyState\ ADT represents states that do not exist or have been removed.

core/src/main/scala/dev/rpeters/fs2/es · high confidence

New concurrency primitives and data structures for state management

Added new concurrent data structures: a \DeferredMap\ for managing deferred values, an \LRU\ cache implementation, and an \ExpiringRef\ (renamed from \EphemeralResource\) that supports timed or use-count based expiration. Also added \modify\ and \upsertOpt\ operations to \MapRef\ to support atomic map updates, and moved these components into the \core\ package.

core/src/main/scala/dev/rpeters/fs2/es/data · high confidence

Removals

Removed EventState and EventStateManager abstractions

The \EventState\ and \EventStateManager\ traits and their implementations have been removed from the codebase. This eliminates the previous mechanism for managing keyed event-driven state with automatic rehydration and expiration, requiring users to adopt alternative patterns for state management.

src/main · medium confidence

Behavioural changes

FS2-ES project marked as unmaintained with migration guidance

The README has been replaced with a notice stating the project is no longer actively maintained as of October 2021, and users are directed to use \edomata\ instead. Additionally, the \version.sbt\ file was deleted, and the \.gitignore\ was updated to include \.vscode/\ and \.bsp/\ directories.

(repo-wide) · high confidence

Test coverage

Added comprehensive tests for core event sourcing components; Added tests for core data structures; Added unit tests for ReplayableEventState; Refactored test suite with shared base spec.

Dependencies

Upgrade to Cats Effect 3 and Scala 3 support

The project has been upgraded to Cats Effect 3 (specifically 3.2.9) and now supports Scala 3 alongside Scala 2.12 and 2.13. This update replaces the previous Cats Effect 2 dependencies with Cats Effect 3 equivalents (e.g., \cats-effect-kernel\, \cats-effect-testkit\) and updates the testing framework to Munit with \munit-cats-effect-3\. Additionally, the build configuration has been restructured to include a \core\ module for the main library, a \testing\ module, and several integration modules (\files\, \kafka\, \postgres-skunk\), while also adding ScalaJS support and a microsite for documentation.

(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

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

Lenses

  • Code Health 100 → 87 (-12.7)
  • Architecture 100 → 91 (-9.1)
  • Maturity 30 → 35 (+4.8)
  • Readiness 57 → 50 (-7.0)
  • Security 48 → 64 (+16.9)

Resolved (16)

  • 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)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • High: security finding (details withheld)
  • LLM evaluation failed
  • No exposed public API
  • Test reliability not included
  • complexity unreadable for .scala — churn × complexity hotspots could not be measured
  • dormant codebase — no living knowledge left to concentrate

New (54)

  • DeferredMapPartiallyApplied.construct (cyclomatic 27) (core/src/main/scala/dev/rpeters/fs2/es/data/DeferredMap.scala)
  • Documentation: no installation or build instructions (README.md)
  • Documentation: no usage examples (README.md)
  • Duplicated block (11 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (12 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventLog.scala)
  • Duplicated block (14 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (2–8 lines × 3) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (3–12 lines × 4) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (3–6 lines × 4) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (4–19 lines × 4) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (5 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventLog.scala)
  • Duplicated block (5 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (5 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (5 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (5 lines × 2) (testing/src/main/scala/dev/rpeters/fs2/es/testing/ReplayableEventState.scala)
  • Duplicated block (6 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventLog.scala)
  • Duplicated block (6 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (6 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (7 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • Duplicated block (7 lines × 2) (core/src/main/scala/dev/rpeters/fs2/es/EventStateCache.scala)
  • …and 34 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

sloshy/fs2-es 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 d5190e3d90098aecc30665b3d8bbededdc4e3bc2 — 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.