v0.1.2
-
Recorded why eleven
FileWrappermethods are excluded from mutation, next to
the exclusion itself. The text is the one written when the list was
introduced and dropped later with the gate's rationale block; a silent
exclusion cannot be told apart from one made to get the gate green. -
AGENTS.mdnow carries the perf ritual: re-measureperf/on the commit the
current figures came from before comparing a release candidate, because
nothing in CI defends those numbers. -
The release workflow waits for the matrix build instead of judging it
mid-flight. A tag pushed right after the merge arrived while master's own
build was still running, and the guard read anullconclusion as a failed
one — sov0.1.1published to Packagist but its GitHub Release had to be
created by re-running the workflow. No effect on the package itself. -
Arg::allOf()andArg::anyOf(). The matcher algebra had negation and
nothing to negate against:not()composed, but two conditions on one
argument needed a hand-writtensatisfies()closure, which then had to carry
its own description or render assatisfies(…)in every failure message. An
operand is a matcher or a literal, the same pairnot()takes, so
anyOf('draft', 'review')reads as a set and
allOf(instanceOf(Book::class), which('getTitle', 'Dune'))reads as a
conjunction — both describing themselves in full when an expectation fails.
A combinator with no operands, and one holding a tail matcher, are refused
with the reason rather than silently matching everything.