Changelog

SemVer 2.0.0 Keep-A-Changelog 1.0.0

All notable changes to this project will be documented in this file.

The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning,
and yes, platform and engine support are part of the public API.
Please file a bug if you notice a violation of semantic versioning.

Unreleased

Added

Changed

Deprecated

Removed

Fixed

Security

4.0.0 - 2026-10-15

  • TAG: v4.0.0
  • COVERAGE: 96.01% – 1034/1077 lines in 12 files
  • BRANCH COVERAGE: 82.42% – 272/330 branches in 12 files
  • 37.39% documented

Changed

  • Breaking: replace the parallel_tests runtime dependency with runtime_groups (~> 0.1, >= 0.1.2) for process counts, pid bookkeeping, options-file discovery, and runtime-weighted grouping; turbo_tests2 now owns a TurboTests::RuntimeLogger RSpec formatter and reimplements the Rails db:create bootstrap directly on Process.spawn

  • Breaking: the stall watchdog is now ON by default (TURBO_TESTS2_WATCHDOG_SECONDS defaults to 900, killing silent workers and failing the run with a stall report); set TURBO_TESTS2_WATCHDOG_SECONDS=0 to restore the 3.x wait-forever behavior. The 3.x deprecation notice is replaced by a provider-neutral one-time warning when the watchdog is disabled and workers go silent 900s, naming the most common cause of total silence in a parallel lane (silently OOM-killed workers) and the fix (cap workers x per-worker memory)

Fixed

  • –allowed-missing now actually bounds the share of files allowed to miss the runtime log when grouping (parallel_tests silently ignored the option); runtime log is now written by the first-party TurboTests::RuntimeLogger through RuntimeGroups::RuntimeLog, and the watchdog’s tracked-pid fallback reads the read-before-write pid ledger correctly

3.2.17 - 2026-10-14

  • TAG: v3.2.17
  • COVERAGE: 95.94% – 993/1035 lines in 11 files
  • BRANCH COVERAGE: 83.86% – 265/316 branches in 11 files
  • 39.42% documented

Changed

  • README: document the spawn-based (fork-free) worker architecture that makes parallel workers engine-portable to JRuby and TruffleRuby, and add a Resource-Constrained CI (JVM Engines) section with the canonical 2-worker + capped-heap + raised-watchdog setup, matching the kettle-jem CI templates

  • Stall diagnostics and in-code docs now explain silent worker death: the 900s silence warning and the watchdog stall path point at the OOM killer as the most common cause of total silence in a parallel lane (spawned workers, JVM engines defaulting to 1/4 RAM heap each), with the fix inline (TURBO_TESTS2_MAX_PROCESSES=2 + capped heap); start_subprocess and max_processes_from_environment document the spawn-based engine-portable architecture

3.2.16 - 2026-10-14

  • TAG: v3.2.16
  • COVERAGE: 95.94% – 993/1035 lines in 11 files
  • BRANCH COVERAGE: 83.86% – 265/316 branches in 11 files
  • 39.42% documented

Fixed

  • Watchdog kills now actually end the run: kill_remaining_workers takes pids from the live wait_threads (the parallel_tests pid file was unreliable — each track/untrack built a fresh Pids instance, so any normal worker exit wiped the file and the watchdog killed nothing), handle_messages stops at the watchdog sentinel instead of waiting for per-worker exits that can never arrive, and post-kill joins are bounded so a wedged worker can no longer hold the run past the watchdog (observed: CI job printed the stall report, then hung 14 more minutes until cancellation)

Changed

  • [kc] kettle-jem/template: updated 32 project files:
    • code and tests (1)
    • dependencies (3)
    • other (1)
    • workflows (27)

3.2.15 - 2026-10-13

  • TAG: v3.2.15
  • COVERAGE: 96.67% – 988/1022 lines in 11 files
  • BRANCH COVERAGE: 85.06% – 262/308 branches in 11 files
  • 39.42% documented

Changed

  • [kc] kettle-jem/prepare: updated 13 project files:
    • configuration (1)
    • dependencies (12)
  • [kc] kettle-jem/template: updated 12 project files:
    • code and tests (2)
    • documentation (1)
    • other (2)
    • workflows (7)

Fixed

  • The “Runtime and Platform Support” table in the README listed TruffleRuby 22.3, 23.0 and TruffleRuby-head as covered by CI, and described rspec-pending_for spec exclusions for 22.3/23.0. No workflow runs those engines (CI covers TruffleRuby 23.1, 24.2, 25.0, 33.0 and current), heads.yml runs ruby-head and jruby-head only, and rspec-pending_for is neither a dependency nor referenced by any spec. The badge rows for 22.3/23.0 had already been removed by templating, leaving the prose table describing CI that no longer runs.

  • Watchdog on the worker message queue: if no worker message arrives within TURBO_TESTS2_WATCHDOG_SECONDS (default 900), remaining workers are killed, unfinished groups reported, and the run fails — instead of blocking forever when a worker dies without an exit message (the parallel-worker CI hang class on 4-core runners)

3.2.14 - 2026-10-08

  • TAG: v3.2.14
  • COVERAGE: 96.93% – 947/977 lines in 11 files
  • BRANCH COVERAGE: 85.57% – 255/298 branches in 11 files
  • 39.42% documented

Changed

  • [kc] kettle-jem/prepare: updated 6 project files:
    • dependencies (6)
  • [kc] kettle-jem/template: updated 4 project files:
    • code and tests (1)
    • documentation (1)
    • other (1)
    • workflows (1)

Fixed

  • rspec_configured_files_to_run: normalize discovered spec paths against the root cwd instead of the nearest ancestor .rspec. In stacked monorepos (root .rspec aggregating gems/*/spec via –pattern, where each gem also has its own .rspec), the nearest-ancestor walk stripped aggregated specs to bare member-relative spec/… paths that do not exist at the root, crashing parallel_tests File.stat during group sizing and aborting the whole run. Regression introduced in 3.2.13.

  • Fix a teardown race that intermittently dropped a worker’s results. The exit-watcher thread previously signaled process exit as soon as the child was reaped, before the stdout/stderr readers had drained the pipe. Under CI contention handle_messages could reach process_count exits and stop while that worker’s rows were still queued behind the exit signal, so they were never reported. Symptom was a nested run reporting “1 example, 0 failures” instead of “4 examples, 0 failures, 3 pending”, with which worker vanished varying run to run (spec/integration/multi_process_spec.rb failed at :46 on one run and :52-54 on the next). Readers are now drained to EOF before the watcher signals exit, and the exit/error messages are a deduped fallback for a reader force-stopped before EOF. Drain uses one shared monotonic deadline across both streams (READER_DRAIN_TIMEOUT) so a wedged pipe whose write end stays open cannot double teardown time or hang; force-stop still closes the pipe and kills the reader as before.

  • Fix spec discovery returning absolute paths on Windows, which crashed parallel_tests’ File.stat during group sizing. rspec_configured_files_to_run made discovered paths relative to the cwd with a string prefix check. On Windows the cwd and the discovered files can name the same directory with two different spellings: Dir.pwd and ENV[“TEMP”] report the 8.3 short name (C:/Users/RUNNER~1/AppData/Local/Temp) while Dir.glob, which RSpec uses to expand –pattern, reports the long name (C:/Users/runneradmin/AppData/Local/Temp). The prefix therefore never matched and the absolute temp path leaked through. File.realpath does not expand 8.3 short names, so canonicalizing first cannot reconcile the two spellings, and Pathname#relative_path_from returns nonsense such as “../../../../../runneradmin/…”. The same class of mismatch arises from a symlinked ancestor on any platform, e.g. a Dir.pwd of /var/home/u/proj against a path spelled /home/u/proj/… Discovered paths are now made relative by walking up from the file and comparing each ancestor with File.identical?, which compares by filesystem identity (inode on Unix, file index on Windows) and so treats every spelling of one directory as equal. Extracted as TurboTests::Utils::Paths.relative_from/.within?.

  • [kc] license-eye-workflow-retry: The Apache SkyWalking Eyes workflow retries the license check once before failing. The pinned apache/skywalking-eyes/dependency action is a composite that builds license-eye from source on every run, and its own dependency cache is broken upstream: dependency/action.yml passes cache-dependency-path: ${{ github.action_path }}/go.sum, but go.sum lives at the action’s repository root rather than in dependency/ (404 versus 200). setup-go therefore logs “Restore cache failed: Some specified paths were not resolved”, the module cache never restores, and each run re-downloads roughly 35 Go modules and re-runs make. Every run is consequently exposed to a transient proxy.golang.org error — one such run failed with stream error: stream ID 133; INTERNAL_ERROR; received from peer after eleven consecutive successes. The retry follows the existing [Attempt 1]/[Attempt 2] idiom used by the Ruby matrix workflows.

3.2.13 - 2026-10-01

  • TAG: v3.2.13
  • COVERAGE: 96.83% – 917/947 lines in 10 files
  • BRANCH COVERAGE: 84.59% – 247/292 branches in 10 files
  • 36.36% documented

Changed

  • [kc] kettle-jem/prepare: updated 15 project files:
    • dependencies (15)
  • [kc] kettle-jem/template: updated 35 project files:
    • code and tests (2)
    • dependencies (1)
    • other (3)
    • workflows (29)
  • Documented runtime and platform support tiers, including the TruffleRuby single-worker CI exception and skipped process-spec groups.

Fixed

  • Cap the TruffleRuby 23.0 compatibility workflow at one test worker after an intermittent parallel-run hang; maintained runtimes retain parallel test coverage.

3.2.12 - 2026-09-26

  • TAG: v3.2.12
  • COVERAGE: 96.83% – 917/947 lines in 10 files
  • BRANCH COVERAGE: 84.59% – 247/292 branches in 10 files
  • 36.36% documented

Changed

  • [kc] kettle-jem/prepare: updated 7 project files:
    • dependencies (7)
  • [kc] kettle-jem/template: updated 33 project files:
    • code and tests (2)
    • other (1)
    • workflows (30)

Fixed

  • Windows runs use size-based worker grouping and skip the runtime logger that requires file locking.

3.2.11 - 2026-09-23

  • TAG: v3.2.11
  • COVERAGE: 96.83% – 916/946 lines in 10 files
  • BRANCH COVERAGE: 84.83% – 246/290 branches in 10 files
  • 36.36% documented

Changed

  • Current MRI CI now exercises turbo_tests2 through kettle-test on Ubuntu, macOS, and Windows.

  • [kc] kettle-jem/prepare: updated 11 project files:
    • dependencies (11)
  • [kc] kettle-jem/template: updated 5 project files:
    • code and tests (1)
    • dependencies (2)
    • other (1)
    • workflows (1)

Added

  • kettle-jem-template-20260913-001 - Templating now also surfaces a review
    entry in dependency_conflicts.resolve when a direct development
    dependency doesn’t support one or more of this project’s declared
    engines: and has no template-managed modular home (e.g. sqlite3 on
    jruby). Review each entry and pick a resolution per the project’s own
    engine support needs.

Fixed

  • The multi-process integration summary assertion now supports RSpec’s Ruby 3.0-compatible pending-example totals.

  • Windows turbo_tests2 workers now invoke Bundler through RubyGems using the
    Ruby executable and Bundler’s resolved executable path, avoiding direct
    execution of the Windows command shim from BUNDLE_BIN_PATH.

3.2.10 - 2026-09-15

  • TAG: v3.2.10
  • COVERAGE: 96.79% – 906/936 lines in 10 files
  • BRANCH COVERAGE: 84.86% – 241/284 branches in 10 files
  • 36.73% documented

3.2.9 - 2026-09-13

  • TAG: v3.2.9
  • COVERAGE: 96.79% – 905/935 lines in 10 files
  • BRANCH COVERAGE: 84.75% – 239/282 branches in 10 files
  • 36.73% documented

Fixed

  • Workers that exit unsuccessfully before reporting any results (for example
    after crashing while loading) are now reported as errors outside of examples,
    instead of silently dropping out of the summary.
  • JSON rows are serialized with JSON.generate, so ActiveSupport’s #to_json
    override (which fails for ActiveSupport < 8.1 with json >= 3.0) can no longer
    crash workers.

3.2.8 - 2026-09-11

  • TAG: v3.2.8
  • COVERAGE: 96.75% – 892/922 lines in 10 files
  • BRANCH COVERAGE: 84.98% – 232/273 branches in 10 files
  • 36.73% documented

Added

  • Support TURBO_TESTS2_MAX_PROCESSES as an orchestration process ceiling.

Changed

  • [kc] kettle-jem/prepare: updated 8 project files:
    • dependencies (8)
  • [kc] kettle-jem/template: updated 5 project files:
    • code and tests (1)
    • dependencies (3)
    • other (1)

3.2.7 - 2026-08-29

  • TAG: v3.2.7
  • COVERAGE: 96.83% – 885/914 lines in 10 files
  • BRANCH COVERAGE: 85.50% – 230/269 branches in 10 files
  • 36.73% documented

Added

  • Added --no-rake-hooks to run without loading a discoverable Rakefile or
    invoking the turbo_tests2:setup and turbo_tests2:cleanup hooks.

Changed

  • [kc] kettle-jem/prepare: updated 40 project files:
    • configuration (1)
    • dependencies (35)
    • other (4)
  • [kc] kettle-jem/template: updated 6 project files:
    • code and tests (1)
    • dependencies (2)
    • other (2)
    • workflows (1)

Fixed

  • Running turbo_tests2 no longer requires a Rakefile merely because the
    rake gem is installed; Rake hooks are skipped when no Rakefile is
    discoverable.

3.2.6 - 2026-08-13

  • TAG: v3.2.6
  • COVERAGE: 96.81% – 880/909 lines in 10 files
  • BRANCH COVERAGE: 85.17% – 224/263 branches in 10 files
  • 36.73% documented

Changed

  • [kc] kettle-jem/prepare: updated 11 project files:
    • dependencies (11)
  • [kc] kettle-jem/template: updated 7 project files:
    • code and tests (1)
    • configuration (1)
    • dependencies (1)
    • documentation (1)
    • other (3)

3.2.5 - 2026-08-08

  • TAG: v3.2.5
  • COVERAGE: 96.81% – 880/909 lines in 10 files
  • BRANCH COVERAGE: 85.17% – 224/263 branches in 10 files
  • 36.73% documented

Changed

  • kettle-jem-template-20260801-001 - Generated README gem dashboard links now
    use ClickGems instead of BestGems.

Fixed

  • kettle-jem-template-20260801-002 - Generated RSpec helpers now normalize
    managed configuration block bindings structurally, preventing mixed block
    parameter names from producing invalid configuration after a merge.
  • kettle-jem-template-20260801-003 - Generated project metadata and
    documentation now normalize configured underscore hostnames to valid
    hyphenated hostnames.
  • kettle-jem-template-20260801-004 - Generated organization README logos now
    use GitHub’s stable organization avatar endpoint instead of assuming a
    matching Galtzo-hosted asset exists.

  • kettle-jem-template-20260802-001 - Devcontainer JSON files now merge as JSONC,
    preserving comments and trailing commas during template updates.

3.2.4 - 2026-07-31

  • TAG: v3.2.4
  • COVERAGE: 96.81% – 880/909 lines in 10 files
  • BRANCH COVERAGE: 85.17% – 224/263 branches in 10 files
  • 36.73% documented

Added

  • kettle-jem-template-20260727-001 - Spec harness documentation now lists the
    RSpec helpers provided by kettle-test.

  • kettle-jem-template-20260729-005 - Gemspec metadata now publishes this
    project’s RubyForum tag as mailing_list_uri, and support docs link to the
    tagged RubyForum community alongside Discord.

Changed

  • kettle-jem-template-20260728-001 - Generated Ruby workflows now use clearer
    setup-ruby-flash planning and can prepare appraisal-only jobs without
    installing the main Gemfile bundle.

Fixed

  • kettle-jem-template-20260728-002 - Generated RuboCop configs now ignore the
    same gemfiles/vendor/bundle tree as .gitignore, so vendored dependency
    installs are not reported as project lint debt.
  • kettle-jem-template-20260728-003 - Generated dep-heads workflows now run
    TruffleRuby jobs with current RubyGems and Bundler, avoiding setup failures
    before the test suite starts.

  • kettle-jem-template-20260728-004 - Generated dep-heads workflows now use the
    setup-ruby Bundler install path for direct appraisal Gemfiles, avoiding rv
    lockfile parser failures on Git and path dependencies.

  • kettle-jem-template-20260728-005 - VersionGem bootstrap now creates the
    missing canonical version spec when a project only has shim namespace version
    specs.

  • kettle-jem-template-20260729-001 - Generated JRuby 9.4 workflows now use the
    legacy manual bundle install path, avoiding setup-time Bundler full-index
    failures against gem.coop.

  • kettle-jem-template-20260730-001 - Gemspec package file enumeration now runs
    relative to the gemspec directory, so packaged template assets are included
    even when the gemspec is loaded from another working directory.

3.2.3 - 2026-07-26

  • TAG: v3.2.3
  • COVERAGE: 96.81% – 880/909 lines in 10 files
  • BRANCH COVERAGE: 85.17% – 224/263 branches in 10 files
  • 36.73% documented

Added

  • Documentation linting now has its generated yard-lint dependency and severity config available in the local bundle.

  • kettle-jem-template-20260726-001 - Projects now include YARD lint
    configuration and documentation dependencies so documentation issues fail
    before generated docs are refreshed.

Fixed

  • Worker stdout that happens to contain RSPEC_FORMATTER_OUTPUT_ID is now kept
    as ordinary output instead of being parsed as an internal formatter message.
  • kettle-jem-template-20260726-002 - Generated version files now document their
    version namespace and constants, reducing warning-only YARD lint output.

  • kettle-jem-template-20260726-003 - Coverage upload steps now treat Coveralls,
    QLTY, and Codecov as optional, so provider outages do not fail CI when local
    coverage thresholds still pass.

Changed

  • README guidance now distinguishes the TurboTests namespace from the
    published turbo_tests2 gem and executable names, and its Rake/SimpleCov
    examples now use turbo_tests2 task filenames while keeping SimpleCov’s
    default coverage/ base directory.

3.2.2 - 2026-07-25

  • TAG: v3.2.2
  • COVERAGE: 96.88% – 869/897 lines in 10 files
  • BRANCH COVERAGE: 84.44% – 217/257 branches in 10 files
  • 34.69% documented

Changed

  • The turbo_tests2 executable startup header is now shown only when
    --verbose is passed; -v and --version still print just the executable
    version and exit.

  • kettle-jem-template-20260725-002 - Generated gemspec templates now include
    anonymous_loader as a development dependency, and version specs use it to
    execute generated version.rb files for coverage without redefining package
    constants. Managed version specs are removed when version_gem is disabled
    or incompatible with the project’s runtime Ruby floor.

3.2.1 - 2026-07-25

  • TAG: v3.2.1
  • COVERAGE: 96.88% – 869/897 lines in 10 files
  • BRANCH COVERAGE: 84.44% – 217/257 branches in 10 files
  • 34.69% documented

Changed

  • The turbo_tests2 executable now supports -v / --version and prints a
    standard startup header on normal runs.

  • kettle-jem-template-20260716-002 - Generated gemspec manifests now ship fewer
    repository-only files by default to reduce downstream distro packaging churn.
  • kettle-jem-template-20260720-002 - Generated development Gemfiles now use the
    released tree_sitter_language_pack gem 1.13.3 or newer by default.
  • kettle-jem-template-20260720-003 - Generated StructuredMerge Git diff driver
    config now uses the installed smorg-rb Ruby driver name.
  • kettle-jem-template-20260720-005 - Generated README Support & Community rows
    now include a RubyForum help badge.
  • kettle-jem-template-20260725-001 - Generated JRuby and TruffleRuby workflow
    files now run when pull request head branches start with feature/release,
    so release CI monitoring does not report intentionally skipped engine
    workflows as failures.

Fixed

  • Worker commands now drop project .rspec presentation formatter and output
    options after preserving the behavioral options needed by each shard,
    preventing direct-RSpec formatter output from being replayed alongside the
    turbo summary.
  • Runtime-based runs now silence the preliminary sizing probe, so
    Using recorded test runtime is printed once by the actual grouping pass.

3.2.0 - 2026-07-18

  • TAG: v3.2.0
  • COVERAGE: 96.88% – 869/897 lines in 10 files
  • BRANCH COVERAGE: 84.44% – 217/257 branches in 10 files
  • 34.69% documented

Added

  • --count is now accepted as an alias for -n, matching the
    parallel_tests process-count option while keeping the existing
    -w / --workers aliases.
  • Documented the supported parallel_tests option subset and clarified that
    unsupported flags are not blindly passed through after --.
  • Added --worker-output MODE and TURBO_TESTS2_WORKER_OUTPUT support for
    selecting raw worker stdout/stderr handling: warnings, stream, buffered,
    or quiet.
  • --group-by runtime|filesize|found is now parsed explicitly and mapped to
    parallel_tests grouping modes, including when supplied after the
    compatibility -- separator.
  • --allowed-missing PERCENT and --unknown-runtime SECONDS are now parsed
    explicitly and mapped to parallel_tests runtime grouping tuning options,
    including when supplied after the compatibility -- separator.

Changed

  • Pull request engine workflows now keep JRuby and TruffleRuby coverage
    available via branch opt-in prefixes: jruby/* runs JRuby workflows,
    truffleruby/* runs TruffleRuby workflows, and engines/* runs all engine
    workflows. Other pull request branches continue to run MRI checks without the
    alternate engine jobs.
  • The delayed documentation formatter spec now lives under fixtures so the
    normal suite does not pay its fixed load-time delay.

Fixed

  • Successful non-verbose runs now surface warning and deprecation lines emitted
    as raw worker stdout/stderr without dumping all buffered worker output.
  • heads.yml and dep-heads.yml now gate JRuby and TruffleRuby PR coverage
    at the job level, so non-matching PR branches skip those engine jobs before a
    runner is provisioned.
  • Direct turbo_tests2 runs now refresh the default
    tmp/turbo_rspec_runtime.log timing log, and --runtime-log writes the
    requested timing log even when the run groups by filesize.
  • --only-group GROUP_INDEX[,GROUP_INDEX] is now parsed explicitly and runs
    only the selected 1-based parallel_tests group index(es), using filesize
    grouping by default for selected-group reruns.
  • --pattern PATTERN is now parsed explicitly and mapped to parallel_tests
    file discovery instead of being treated as a spec file when supplied after
    --.
  • --exclude-pattern PATTERN is now parsed explicitly and mapped to
    parallel_tests file discovery instead of being treated as a spec file when
    supplied after --.

3.1.14 - 2026-07-17

  • TAG: v3.1.14
  • COVERAGE: 97.30% – 758/779 lines in 10 files
  • BRANCH COVERAGE: 88.26% – 188/213 branches in 10 files
  • 35.11% documented

Fixed

  • Worker commands now override RSpec’s default options file, then explicitly
    pass filtered project .rspec options. File-discovery options such as
    --pattern are dropped after turbo_tests2 has already selected each shard,
    preventing aggregate suite patterns from making every worker run the full
    suite while preserving options like --require spec_helper.

3.1.13 - 2026-07-16

  • TAG: v3.1.13
  • COVERAGE: 97.50% – 741/760 lines in 10 files
  • BRANCH COVERAGE: 88.35% – 182/206 branches in 10 files
  • 35.87% documented

Fixed

  • Duplicate RSpec Run options: messages from parallel workers are now
    collapsed so they no longer interrupt progress formatter output repeatedly.

3.1.12 - 2026-07-16

  • TAG: v3.1.12
  • COVERAGE: 97.04% – 722/744 lines in 10 files
  • BRANCH COVERAGE: 85.50% – 171/200 branches in 10 files
  • 35.87% documented

Fixed

  • file:line RSpec selectors are now supported when passed to turbo_tests2;
    files are grouped by real path and workers receive the original line-filtered
    selectors.

3.1.11 - 2026-07-16

  • TAG: v3.1.11
  • COVERAGE: 97.37% – 704/723 lines in 10 files
  • BRANCH COVERAGE: 88.42% – 168/190 branches in 10 files
  • 36.67% documented

Fixed

  • No-argument runs once again discover the default spec tree while still
    honoring .rspec pattern overrides.

  • Default RSpec file discovery now uses Ruby 2.4-compatible path handling.

3.1.10 - 2026-07-15

  • TAG: v3.1.10
  • COVERAGE: 97.65% – 706/723 lines in 10 files
  • BRANCH COVERAGE: 88.95% – 169/190 branches in 10 files
  • 36.67% documented

Fixed

  • No-argument runs now use RSpec configuration for file discovery, including
    .rspec --pattern settings, instead of assuming a top-level spec/
    directory.

3.1.9 - 2026-07-14

  • TAG: v3.1.9
  • COVERAGE: 97.60% – 692/709 lines in 10 files
  • BRANCH COVERAGE: 89.13% – 164/184 branches in 10 files
  • 37.08% documented

Fixed

  • Buffered non-RSpec worker stdout/stderr so successful parallel runs no longer
    leak interleaved coverage formatter output, while still reporting a single
    concise coverage summary.
  • Prevented invalid UTF-8 bytes in worker output from crashing the parent
    runner on JRuby after the underlying RSpec examples pass.

3.1.8 - 2026-07-14

  • TAG: v3.1.8
  • COVERAGE: 97.40% – 636/653 lines in 10 files
  • BRANCH COVERAGE: 89.47% – 136/152 branches in 10 files
  • 37.08% documented

3.1.7 - 2026-07-11

  • TAG: v3.1.7
  • COVERAGE: 97.40% – 636/653 lines in 10 files
  • BRANCH COVERAGE: 89.47% – 136/152 branches in 10 files
  • 37.08% documented

Changed

  • Clarified project metadata, README, and CLI help to describe turbo_tests2
    as an RSpec parallel runner built on parallel_tests.

Fixed

  • Fixed generated README metadata backticks around turbo_tests2 in the
    package description.

3.1.6 - 2026-07-02

  • TAG: v3.1.6
  • COVERAGE: 97.40% – 636/653 lines in 10 files
  • BRANCH COVERAGE: 89.47% – 136/152 branches in 10 files
  • 37.08% documented

Fixed

  • Package configured license files in gem release file lists.

3.1.5 - 2026-06-23

  • TAG: v3.1.5
  • COVERAGE: 97.09% – 634/653 lines in 10 files
  • BRANCH COVERAGE: 88.82% – 135/152 branches in 10 files
  • 37.08% documented

Added

  • Added support for JRuby 10.1 and TruffleRuby 34.0.

Changed

  • Retemplated project metadata and CI/development automation with kettle-jem v7.0.0.

Fixed

  • Fixed subprocess coverage setup for SimpleCov v1 by starting coverage
    explicitly in the spawn shim and detecting active coverage via Ruby’s
    Coverage.running? API.
  • Fixed SimpleCov boot order so kettle-soup-cover formatter configuration loads
    after SimpleCov finishes requiring its defaults.

  • Added PARALLEL_PID_FILE to turbo_tests2 fan worker environments so
    SimpleCov parallel result collation does not fail when workers inherit
    PARALLEL_TEST_GROUPS.
  • Made CLI integration specs assert combined stdout/stderr output so older
    Ruby engines that emit warnings or RSpec load errors on stderr are covered.
  • Relaxed CLI load-error detail expectations only on TruffleRuby, where some
    supported versions exit nonzero but omit the RSpec load-error summary.

3.1.4 - 2026-06-17

  • TAG: v3.1.4
  • COVERAGE: 94.33% – 666/706 lines in 16 files
  • BRANCH COVERAGE: 79.11% – 125/158 branches in 16 files
  • 37.08% documented

Fixed

  • Prevented parallel test runs from hanging when a worker process exits but its
    stdout or stderr pipe remains open, a failure mode observed on JRuby
    current/head jobs.

  • Ensured worker stdout/stderr reader threads are force-stopped after worker
    process exit if an engine keeps them blocked after pipe closure, fixing
    TruffleRuby 25.0 CI failures in the worker pipe cleanup regression spec.

3.1.3 - 2026-06-14

  • TAG: v3.1.3
  • COVERAGE: 94.62% – 651/688 lines in 16 files
  • BRANCH COVERAGE: 79.33% – 119/150 branches in 16 files
  • 37.08% documented

Fixed

  • Restored docs/CNAME so the generated documentation site keeps its custom domain.

3.1.2 - 2026-06-08

  • TAG: v3.1.2
  • COVERAGE: 94.62% – 651/688 lines in 16 files
  • BRANCH COVERAGE: 79.33% – 119/150 branches in 16 files
  • 37.08% documented

Fixed

  • turbo_tests2 now generates and reports a global random seed by default,
    passes it to every worker process, and supports --order defined /
    --no-random for ordered runs without a seed.
  • Worker PID cleanup now uses the parallel_tests pid file path captured when the subprocess starts, avoiding JRuby failures after the pid-file environment is restored.

3.1.1 - 2026-06-02

  • TAG: v3.1.1
  • COVERAGE: 94.63% – 634/670 lines in 16 files
  • BRANCH COVERAGE: 78.17% – 111/142 branches in 16 files
  • 36.78% documented

Fixed

  • The CLI now honors documented turbo_tests2:setup and turbo_tests2:cleanup
    Rake hooks, while still falling back to legacy turbo_tests:* hooks.
  • Worker processes now receive the full parallel_tests environment metadata, so SimpleCov
    defers minimum coverage enforcement to the combined final result instead of checking each
    shard independently.

  • Restored Ruby 2.4 compatibility for worker wait-thread cleanup.
  • The coverage workflow now runs kettle-test through direct RSpec execution,
    so hard coverage thresholds are checked against the complete suite result
    while other gems can still use turbo_tests2 under kettle-test.

3.1.0 - 2026-05-28

  • TAG: v3.1.0
  • COVERAGE: 95.01% – 609/641 lines in 16 files
  • BRANCH COVERAGE: 77.54% – 107/138 branches in 16 files
  • 36.78% documented

Added

  • -w / --workers aliases for -n, matching the worker-count terminology used by other
    parallel test runners.
  • turbo_tests2 fan, a generic worker fan-out command that runs an arbitrary command once per
    worker with TEST_ENV_NUMBER and PARALLEL_TEST_GROUPS set.
  • --example-status-log FILE, which converts RSpec example-status persistence data into a
    parallel_tests-compatible runtime log so grouping can use example-level timing history.

Changed

  • Worker subprocess JSON now forwards RSpec deprecation notifications to the parent reporter.
  • Worker subprocess JSON now forwards RSpec profile output to the parent reporter.
  • Fail-fast runs now report spec groups that were stopped before execution.
  • Interrupted runs now report spec groups that had not finished before shutdown.

Fixed

  • Reconstructed failure backtraces now filter internal turbo_tests2 frames.
  • Coverage was refreshed by adding focused specs for the new CLI, reporting, formatter, and
    grouping behaviors.

  • RSpec deprecation notification reconstruction now uses the public from_hash API so CI passes
    with RSpec versions where .new is private.
  • The shim command result object no longer depends on Struct#keyword_init, restoring Ruby 2.4
    compatibility.
  • Backtrace output specs now accept JRuby 9.2’s legacy block in <main> frame wording.
  • GitHub Actions test jobs now force kettle-test to use its direct RSpec runner so coverage
    aggregation remains stable while testing turbo_tests2 itself.
  • GitHub Actions appraisal jobs now pass explicit parent-directory RSpec paths so direct RSpec
    runs execute the real suite instead of finding zero examples from gemfiles/.
  • Spawned-process coverage setup now locates .simplecov_spawn.rb from the working directory
    instead of Bundler.root, so appraisal gemfiles do not point it at gemfiles/.
  • The coverage workflow now uses the same hard coverage thresholds as local development.
  • The dedicated coverage workflow now runs RSpec directly so coverage artifacts are written under
    the repository root for upload steps.
  • Removed the advanced CodeQL workflow because GitHub CodeQL default setup is enabled and rejects
    SARIF uploads from advanced configurations.

Security

  • Refreshed pinned GitHub Action SHAs.
  • Added checksums for the v3.0.0 release artifacts.

3.0.0 - 2026-05-22

  • TAG: v3.0.0
  • COVERAGE: 96.94% – 538/555 lines in 17 files
  • BRANCH COVERAGE: 90.35% – 103/114 branches in 17 files
  • 37.97% documented

Added

  • Initial release