cl-weave v0.8.0
Runtime hardening and concurrency safety harvested from the development
worktrees. Behavior-preserving for well-formed input; the changes bound
pathological input, remove quadratic hot paths, and make shared state
thread-safe.
Fixed
- mocks: O(n²) call recording → amortized O(1);
copy-treeon recorded
arguments (infinite loop on cyclic/shared structure) → cycle-safe graph copy;
a clear/register race that corrupted result slots → generation-guarded writes;
nested/overlapping spies restored out of order → proper LIFO spy stacks. - snapshots: non-atomic
:supersedewrites (file corruption on crash) →
temp-file + atomic rename under a lock; O(n²) diff → O(n). - watch: change detection keyed on write-date alone (missed same-second
edits, false-fired ontouch) → existence+mtime+size+content-hash signature;
O(n²)assocscans → hash; dependency specs resolved via
resolve-dependency-spec. - concurrency: worker pool defaulted to one OS thread per test (resource
exhaustion on large suites) → bounded pool; cooperative cancellation and
guaranteed thread cleanup on error. - reporters/matchers: improper/circular-list safety in
one-of-candidates
and run-result normalization;*print-circle*bound around cyclic failure
printing; shrinker errors no longer double-wrapped.
Changed
- DoS caps on retry / timeout / worker / shard / bail / candidate counts and
close-to precision; numeric-token length guard; CPU-based default worker
count. logic, shrinking, and tag/dependency normalizers rewritten recursion →
iterative with explicit cycle rejection.- Registry locking for concurrent registration; string-name validation on
register-suite/register-test. - Test selection/collection rebuilt from per-node subtree walks to precomputed
O(1) hash indexes. - CI: hardened workflows (SHA-pinned actions,
concurrencycancel-in-progress,
least-privilege permissions, fork-PR secret gating) and per-check
validationCommandsasserting each artifact's schema/shape.
Notes
normalize-bailnow returnst(re-mapped downstream to bail-limit 1);
register-suite/register-testrequire string names.- The subprocess-isolation rewrite is not in this release — it triggered a
Linux-onlysb-cover"Recursive lock attempt" cascade and is deferred to its
own PR after Linux-side debugging.
Full Changelog: v0.7.0...v0.8.0