Changelog
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_forspec 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.ymlrunsruby-headandjruby-headonly, andrspec-pending_foris 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/dependencyaction is a composite that builds license-eye from source on every run, and its own dependency cache is broken upstream:dependency/action.ymlpassescache-dependency-path: ${{ github.action_path }}/go.sum, butgo.sumlives at the action’s repository root rather than independency/(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-runsmake. Every run is consequently exposed to a transientproxy.golang.orgerror — one such run failed withstream error: stream ID 133; INTERNAL_ERROR; received from peerafter 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 independency_conflicts.resolvewhen 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.sqlite3on
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 fromBUNDLE_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-hooksto run without loading a discoverable Rakefile or
invoking theturbo_tests2:setupandturbo_tests2:cleanuphooks.
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_tests2no longer requires a Rakefile merely because the
rakegem 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 bykettle-test. -
kettle-jem-template-20260729-005 - Gemspec metadata now publishes this
project’s RubyForum tag asmailing_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
samegemfiles/vendor/bundletree 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 againstgem.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-lintdependency 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_IDis 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
TurboTestsnamespace from the
publishedturbo_tests2gem and executable names, and its Rake/SimpleCov
examples now useturbo_tests2task filenames while keeping SimpleCov’s
defaultcoverage/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_tests2executable startup header is now shown only when
--verboseis passed;-vand--versionstill print just the executable
version and exit. -
kettle-jem-template-20260725-002 - Generated gemspec templates now include
anonymous_loaderas a development dependency, and version specs use it to
execute generatedversion.rbfiles for coverage without redefining package
constants. Managed version specs are removed whenversion_gemis 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_tests2executable now supports-v/--versionand 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
releasedtree_sitter_language_packgem 1.13.3 or newer by default. - kettle-jem-template-20260720-003 - Generated StructuredMerge Git diff driver
config now uses the installedsmorg-rbRuby 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 withfeature/release,
so release CI monitoring does not report intentionally skipped engine
workflows as failures.
Fixed
- Worker commands now drop project
.rspecpresentation 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 runtimeis 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
-
--countis now accepted as an alias for-n, matching the
parallel_testsprocess-count option while keeping the existing
-w/--workersaliases. - Documented the supported
parallel_testsoption subset and clarified that
unsupported flags are not blindly passed through after--. - Added
--worker-output MODEandTURBO_TESTS2_WORKER_OUTPUTsupport for
selecting raw worker stdout/stderr handling:warnings,stream,buffered,
orquiet. -
--group-by runtime|filesize|foundis now parsed explicitly and mapped to
parallel_testsgrouping modes, including when supplied after the
compatibility--separator. -
--allowed-missing PERCENTand--unknown-runtime SECONDSare now parsed
explicitly and mapped toparallel_testsruntime 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, andengines/*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.ymlanddep-heads.ymlnow 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_tests2runs now refresh the default
tmp/turbo_rspec_runtime.logtiming log, and--runtime-logwrites 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-basedparallel_testsgroup index(es), using filesize
grouping by default for selected-group reruns. -
--pattern PATTERNis now parsed explicitly and mapped toparallel_tests
file discovery instead of being treated as a spec file when supplied after
--. -
--exclude-pattern PATTERNis now parsed explicitly and mapped to
parallel_testsfile 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.rspecoptions. File-discovery options such as
--patternare dropped afterturbo_tests2has 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:lineRSpec selectors are now supported when passed toturbo_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
spectree while still
honoring.rspecpattern 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--patternsettings, instead of assuming a top-levelspec/
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 onparallel_tests.
Fixed
- Fixed generated README metadata backticks around
turbo_tests2in 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-jemv7.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_FILEtoturbo_tests2 fanworker 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/CNAMEso 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_tests2now generates and reports a global random seed by default,
passes it to every worker process, and supports--order defined/
--no-randomfor ordered runs without a seed. - Worker PID cleanup now uses the
parallel_testspid 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:setupandturbo_tests2:cleanup
Rake hooks, while still falling back to legacyturbo_tests:*hooks. -
Worker processes now receive the full
parallel_testsenvironment 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-testthrough direct RSpec execution,
so hard coverage thresholds are checked against the complete suite result
while other gems can still useturbo_tests2underkettle-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/--workersaliases 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 withTEST_ENV_NUMBERandPARALLEL_TEST_GROUPSset. -
--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_tests2frames. -
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_hashAPI so CI passes
with RSpec versions where.newis 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-testto use its direct RSpec runner so coverage
aggregation remains stable while testingturbo_tests2itself. - GitHub Actions appraisal jobs now pass explicit parent-directory RSpec paths so direct RSpec
runs execute the real suite instead of finding zero examples fromgemfiles/. - Spawned-process coverage setup now locates
.simplecov_spawn.rbfrom the working directory
instead ofBundler.root, so appraisal gemfiles do not point it atgemfiles/. - 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.0release 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