CHANGELOG
Changelog
v0.9.4 ā 2026-07-15
Added
A precompile pass before parallel discovery, building every spec file's module precompilation in one
--compile-onlysubprocess so a single process writes the whole dependency graph and discovery and the workers only read itRecovery from a cache left inconsistent by earlier runs: a precompile pass that dies clears the project's reported
.precompdirectories and rebuilds--no-precompileto skip the precompile pass--compile-onlyto load the given spec files, writing their precompilation, and exit without running examples or printing
Fixed
A worker or the discovery subprocess killed by a signal such as SIGSEGV no longer reads as exit 0 and "0 examples" success. Signal deaths fold to the 128+N convention across the lpt, queue, isolated, and serial worker paths and fail the run with a message naming the signal
v0.9.3 ā 2026-07-10
Fixed
Parallel discovery no longer hangs when a spec file fails to load in a worker
Failure reasons now reach the JSON formatter, so parallel runs report full failure detail instead of an empty failure record
JSON event attributes emit in a stable order
Stray non-object lines in a worker's JSON stream are no longer treated as valid events
Temporary paths are created before workers write to them
Mocked time no longer drifts backward between reads
v0.9.2 ā 2026-06-24
Added
Live coverage progress line when filtering the raw log on a terminal, with a percent, a bar, and a rough ETA
Fallback content on a coverage HTML file page when the source is unavailable
Changed
Coverage now defaults to the lighter
MVM_COVERAGE_CONTROL=0line-hit mode; pass--coverage-countsfor the heavier per-line execution counts
Fixed
Environment variable propagation to parallel workers
v0.9.1 ā 2026-06-01
Added
Bareword slang for
let, so blocks can reference fixtures asownerin addition to:ownerraiseandthrowaliases for theraise-errorexception matcher--versionflag on thebehaveCLI
Removed
Per-example memory profiling.
Fixed
Parallel worker distribution and a
requirefailure under--parallelLine number rendering in spec failure output
v0.9.0 ā 2026-05-25
Spec-tree runner with hooks, mocks, custom matchers, and parallel execution.
Added
Documentation
mkdocs site under
docs-src/, published to thegh-pagesbranch at https://gdonald.github.io/BDD-Behave/Spec-driven doc extraction
Core DSL
describe/it/specifywith arbitrary nesting on a spec treebefore/after/aroundhooks, including metadata-keyed and inherited variantslet/let!(eager) /subject/is-expectedone-liner syntaxShared contexts and shared examples
Tags, focus, and skip
Example filtering by name or metadata
Pending examples, dry-run, and example listing
Run by file, directory, line number, or a single block
Expectations
Custom and composable matcher DSL
Matchers for equality, comparison,
be-between/be-within, boolean, nil, type checking,respond-to,have-attributes,include,all, sequence,match, string content,change/change-by/change-from-to, junctions, exceptions (raise-errorwith attribute matching), promises, supplies/channels, andeventuallyfor asyncaggregate_failuresblock plus auto-aggregation
Mocks
Doubles, method stubbing, spies with call verification, and partial mocking
Runner & CLI
Parallel execution with queue distribution, a discovery subprocess, per-shard retry on worker crash, and aggregated memory / profile / benchmark output
--fail-fast,--watch,--progress-total, retry, seed control, and bisect for flaky specsCode coverage metrics, compatible with
--parallel
Formatters
Progress (default), TAP, JUnit, JSON, JsonEvents, HTML, Tree, and Documentation
Diagnostics
Junction-aware, shape-detecting diffs
Timing profiling, memory profiling, and benchmarking with baselines
Time mocking
Configuration
File-based configuration with CLI precedence
Changed
Migrated files from Perl 6 file extensions to Raku throughout
Reworked expectations to accept actual values
Replaced the grammar-driven core with an in-memory spec tree (
SuiteāExampleGroupāExample/Hook) walked by the runnerRegrouped
lib/,t/, andspecs/by feature area (core/,expectations/,parallel/, etc.)Default formatter is now Progress
v0.0.3 ā 2019-09-14
Grammar-driven runner with a small DSL.
Added
describe/context/itblocks with nestinglet(:name) => { ... }with block-scoped overridesexpect(x).to.be(y)equality matcher, with.to.notfor negationVariable interpolation in expectations (
expect(:foo).to.be(42),expect(42).to.be(:foo))CLI
behave [path]runner; auto-discoversspecs/*spec.p6when no path is givenColorized output and failure reporting with file and line numbers