Skip to content
CAI
Software that uses CAICheck a score

splitrb/split

60.7

Adequate · 19 September 2026

2.4k

lines of production code

Ruby

primary language

1

measurement over time

CAI band scale
CAI lens gauges

What this system is

This system is a Ruby-based A/B testing library that manages experiment allocation, user variant assignment, and goal tracking. It provides a configurable, Redis-backed persistence layer with support for multiple storage adapters and various traffic-splitting algorithms, including block randomization and multi-armed bandits. The system also includes a Sinatra-powered dashboard for monitoring experiment metrics, managing cohorts, and visualizing statistical confidence.

How it got here

2011 — Split library v4 rewrite and dashboard modernization

8 changes.

The project underwent a major architectural rewrite of the Split A/B testing library, introducing a modernized core with pluggable persistence adapters and a redesigned Sinatra-based dashboard. This period also focused on standardizing the development environment with comprehensive linting, configuration files, and an expanded test suite to support the new v4.0.5 release.

2012–2018 — Persistence and algorithm expansion

7 changes.

This period focused on expanding the Split library's capabilities by introducing new persistence adapters, including Cookie, Redis, and Dual storage backends, alongside new experiment allocation algorithms like Block Randomization and Whiplash. The dashboard was modernized with configurable pagination and improved data handling, supported by comprehensive test coverage for the new persistence and algorithm modules.

Features

Add String\#constantize extension to lib/split/extensions

The lib/split/extensions directory now includes a new string.rb file that adds a constantize method to the String class. This method allows splitting a string by '::' and resolving the corresponding Ruby constant, providing functionality typically found in ActiveSupport without requiring it as a dependency.

lib/split/extensions · high confidence

Initial release of Split A/B testing library

This change introduces the core Split library for A/B testing, replacing the previous placeholder multivariate module. It provides a configurable Redis-backed persistence layer, multiple algorithm implementations (block randomization, weighted sample, whiplash), and a Rails engine integration that initializes configuration before the application starts. Users can now define experiments, track goals, and manage user variants through a unified API.

lib · high confidence

New block randomization and whiplash bandit algorithms added

The Split library now includes two new experiment allocation algorithms: Block Randomization, which distributes participants evenly by selecting the alternative with the fewest current participants, and Whiplash, a multi-armed bandit implementation that uses participant and completion counts to dynamically favor better-performing alternatives. These new modules are available alongside the existing Weighted Sample algorithm, giving users more options for how traffic is split in their experiments.

lib/split/algorithms · high confidence

The persistence layer now supports multiple storage backends. A new CookieAdapter stores split test data in browser cookies (with configurable length and domain) to persist results for return visitors, while a RedisAdapter enables external, persistent storage with configurable namespaces and TTL. A DualAdapter allows different persistence strategies for logged-in versus logged-out users, and the existing SessionAdapter has been refactored to use this new adapter interface.

lib/split/persistence · high confidence

Removals

Removed version constant file

The file defining the library's version constant has been deleted, removing the explicit version string from the codebase.

lib/multivariate · high confidence

Behavioural changes

Dashboard modernization with configurable pagination and improved confidence calculations

The dashboard now supports configurable pagination, allowing users to set the default number of experiments per page via the \dashboard\_pagination\_default\_per\_page\ configuration option. The interface has been modernized by replacing internal structs with dedicated view objects (\DashboardExperiment\, \DashboardAlternative\) for cleaner data presentation. Additionally, the confidence level helper has been updated to handle edge cases like tiny z-scores and numeric strings more robustly, and experiment names are now properly escaped to prevent misnaming issues in winner determination.

lib/split/dashboard · high confidence

Modernized Split dashboard with dark mode and filtering

The Split dashboard has been redesigned with a modern UI that includes a light/dark theme toggle (persisted in localStorage), a text-based filter to search experiments by name, and toggles to show/hide active or completed experiments. The visual presentation now features a responsive layout, rounded corners, and distinct styling for headers and experiment cards, improving readability and user interaction.

lib/split/dashboard/public · high confidence

Redesigned Split dashboard with modern UI, cohorting controls, and probability metrics

The Split dashboard has been completely rewritten to provide a modern, responsive interface. Users can now manage experiment lifecycle directly from the UI, including enabling/disabling cohorting, resetting data, reopening finished experiments, and deleting experiments. The view displays detailed metrics for each alternative, including participants, conversion rates, and a new 'Probability of being Winner' calculation alongside the traditional confidence level. The dashboard also supports multiple goals per experiment, allows forcing alternatives for the current user, and displays active browser overrides. A new layout includes a theme toggle and environment indicator.

lib/split/dashboard/views · high confidence

Split A/B testing library rewritten for version 4.0.5

The Split library has been completely rewritten and upgraded to version 4.0.5, introducing a modernized architecture with pluggable persistence adapters (Session, Cookie, Redis, and Dual), a new ExperimentCatalog for centralized experiment management, and a redesigned dashboard built on Sinatra. This major update adds support for combined experiments, configurable algorithms (including a new beta distribution RNG via Rubystats), and enhanced metrics tracking with multiple goals per experiment. The internal storage layer has been refactored into distinct ConfigStorage and RedisStorage components, and the helper methods have been encapsulated to safely mix into Rails controllers and models without polluting the namespace.

lib/split · high confidence

Standardizes development environment with new linting and configuration files

The project now includes dedicated configuration files for code quality and testing, specifically \.rubocop.yml\ (targeting Ruby 3.1), \.codeclimate.yml\, \.csslintrc\, and \eslint.config.js\, alongside a \.rspec\ file to enable profiling. The \Rakefile\ has been updated to include a shebang and \frozen\_string\_literal\ comment, and \.gitignore\ has been expanded to exclude common development artifacts like \coverage/\, \node\_modules/\, and IDE files.

(repo-wide) · high confidence

Test coverage

Added comprehensive test suite for Split core components; Added test coverage for new persistence adapter implementations; Added tests for block randomization, weighted sample, and whiplash algorithms; Added tests for dashboard view objects and pagination helpers.

Dependencies

Modernize Ruby dependencies and add ESLint tooling

The project has updated its Ruby dependency requirements to enforce a minimum Ruby version of 3.1.0 and upgraded core libraries including Redis (\>= 4.2), Sinatra (\>= 1.2.6), and Rubystats (\>= 0.3.0), while removing the legacy \multivariate\ gemspec. Development tooling has been refreshed with newer versions of RSpec (\~\> 3.7), Rack-test (\~\> 2.0), and Rake (\~\> 13), and the Gemfile now explicitly includes Rubocop, Codeclimate-test-reporter, and Concurrent-ruby (\< 1.3.9). Additionally, a new \package.json\ introduces ESLint 10.8.0 and related JavaScript linting dependencies for the first time.

(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

Baseline

  • First survey — no prior run to compare against. CAI 61.

Lenses

  • Code Health 96
  • Architecture 88
  • Maturity 54
  • Readiness 73
  • Security 81
  • Accessibility 53

Changes since last survey

  • 300 commits — 243 feature/other, 57 fixes

By area

  • lib/split — 104 commits
  • (repo) — 89 commits
  • (root) — 72 commits
  • .github/workflows — 12 commits
  • lib/split.rb — 3 commits
  • spec/persistence — 3 commits
  • spec/encapsulated_helper_spec.rb — 2 commits
  • spec/helper_spec.rb — 2 commits
  • spec/spec_helper.rb — 2 commits
  • .github/FUNDING.yml — 1 commit
  • .github/dependabot.yml — 1 commit
  • gemfiles/6.0.gemfile — 1 commit
  • gemfiles/6.1.gemfile — 1 commit
  • gemfiles/7.0.gemfile — 1 commit
  • spec/combined_experiments_helper_spec.rb — 1 commit
  • spec/dashboard_spec.rb — 1 commit
  • spec/experiment_catalog_spec.rb — 1 commit
  • spec/experiment_spec.rb — 1 commit
  • spec/experiment_storage_spec.rb — 1 commit
  • spec/trial_spec.rb — 1 commit

Notable commits

  • fix: (fix): Fixed CROSSSLOT keys issue when using redis cluster
  • fix: Fix #max_experiments_reached? when using allow_multiple_experiments=control
  • fix: Fix Layout/CommentIndentation
  • fix: Fix Layout/ElseAlignment
  • fix: Fix Layout/EmptyLinesAroundAccessModifier
  • fix: Fix Layout/EmptyLinesAroundClassBody
  • fix: Fix Layout/EmptyLinesAroundMethodBody
  • fix: Fix Layout/EmptyLinesAroundModuleBody
  • fix: Fix Layout/EndAlignment
  • fix: Fix Layout/IndentationWidth
  • fix: Fix Layout/SpaceAfterComma offenses
  • fix: Fix Layout/SpaceAroundEqualsInParameterDefault
  • fix: Fix Layout/SpaceBeforeBlockBraces
  • fix: Fix Layout/SpaceInsideBlockBraces
  • fix: Fix Layout/SpaceInsideHashLiteralBraces
  • fix: Fix Layout/TrailingEmptyLines
  • fix: Fix Layout/TrailingWhitespace
  • fix: Fix Lint/UselessAssignment
  • fix: Fix RuboCop to inherit default Exclude patterns
  • fix: Fix Rubocop offense Layout/EmptyLineAfterMagicComment
  • …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

splitrb/split 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 19 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 fa42fc0eeebd69cfaeb4e2cd7242cbacbe17714e — 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-13a154b7f5d1.