Skip to content

Release 0.9.0: the 1.0 candidate - #114

Merged
rasuvaeff merged 1 commit into
masterfrom
release/0.9.0
Sep 5, 2026
Merged

Release 0.9.0: the 1.0 candidate#114
rasuvaeff merged 1 commit into
masterfrom
release/0.9.0

Conversation

@rasuvaeff

Copy link
Copy Markdown
Owner

What

The 1.0 candidate: every decision of the 1.0-readiness review (docs/reviews/review-understudy-2026-09-05-release-1.0.md, «Принятые решения») lands here, so the tag after this one can be 1.0.0 without a change to the surface. A minor rather than a patch — two of the changes are breaking on 0.x, and the compatibility job tolerates them because the CHANGELOG heading declares the boundary.

  • forget() answers ForgottenDouble for a double that is gone (A-1). Called twice, or after a reset(), it said «expects an understudy created by Understudy::for(). This object is not one» — an InvalidCallSpecification about an object that was one. It goes through stateOf() now, like every other facade.
  • One rule for the two specification exceptions (A-2): InvalidCallSpecification is about the shape of a specification, InvalidSpecificationArgument about a value inside it. invertedBounds() and invalidPattern() move to InvalidSpecificationArgument beside unknownType(); a catch (InvalidCallSpecification) around those two paths becomes catch (InvalidSpecificationArgument) or catch (UnderstudyError).
  • Outcome and Cardinality are @internal (A-4, A-5): no public path accepted or returned either. Invocation::recordOutcome() and __construct() are @internal (A-3). WhenBuilder is closed by contract in its docblock (A-6 — a @final tag makes Psalm refuse ExpectBuilder, verified). How FailureKind grows is written down (A-7): a new case may arrive in a minor, so match with a default arm.
  • Docblocks the API reference renders (A-8, A-9, A-12): checkpoint() spans every live context; verify() documents $never; expectSequence() loses its lone @api tag; summaries for Arg::bool(), WhenBuilder::throws(), the Invocation readers and seven exception factories. docs/src/api/** regenerated (the Outcome and Cardinality pages are gone); completeness budgets lowered to the new measurement.
  • Five parity idioms in bin/consumer-smoke (B-2): CardinalityAfterVerb and VoidReturnsChain must be reported, NamedBoundsSwapped, HelperReceiver and FirstClassCallable must be silent. VoidReturnsChain needs understudy-phpstan 0.5.1 (Release 0.5.1: chain-aware understudy.returns, bridge to the 0.9 engine understudy-phpstan#32) — merge that first, or the extension's next CI run against core master goes red on exactly the row that exists to catch it.
  • SKILL.md caught up with the engine (R-4): nullable returns, four free functions, allOf/anyOf/rest/captor, expectSequence(), lean(), delegate().
  • Documentation catch-ups (D-1…D-13): README ×2 (shouldNotHaveReceived() row, the Arg::rest() analyser note, the stability sentence), llms.txt (Outcome, Cardinality, the exception table), eight site pages that had missed the 0.8.0/0.3.0/0.2.0 corrections.
  • Hygiene: rector green again (red since v0.7.0, H-1/R-1), infection/infection ^0.35 (H-2), rasuvaeff/property-testing-testo ^0.9 (H-3), .vale.ini export-ignore (H-4). Mutation gate stays 92 (H-6): the run measures 94.1 %, three mutants above 94 — less than the CI count moves between runs; the reason is beside the number.

Not in this PR, by design

  • docs/.api-workspace pins (R-3): they need the satellites' ^0.9-capable releases on Packagist first — follow-up after the four bridge releases.
  • 1.0.0 itself: this is 0.9.0, to be driven by the monorepo's real consumers (bulkhead, circuit-breaker, openapi-contract, property-testing-openapi, yii3-correlation-id, yii3-filestorage, yii3-idempotency, yii3-metrics, yii3-metrics-prometheus) before the freeze.

Verification

composer build green (Unit 993 + Integration 27, examples), composer rector green, docs/scripts/check-claims.php 66 claims, npm run docs:check passed (34 @api types, every page reachable), make mutation: 3093 mutants, Covered Code MSI 94 %.

…s catch-up

Every decision of the 1.0-readiness review lands here, so the tag after this
one can be 1.0.0 without a change to the surface. Breaking on 0.x, and a minor
for that reason:

- forget() on a retired or reset double answers ForgottenDouble, like every
  other facade (it went through stateOf() now); it said the object "is not one".
- One rule for the two specification exceptions: shape -> InvalidCallSpecification,
  value -> InvalidSpecificationArgument. invertedBounds() and invalidPattern()
  move to InvalidSpecificationArgument beside unknownType(); tests, docs and
  check-claims follow.
- Outcome and Cardinality are @internal (no public path accepts or returns
  either); Invocation::recordOutcome() and __construct() are @internal;
  WhenBuilder is closed by contract in its docblock (a @Final tag would make
  Psalm refuse ExpectBuilder); FailureKind growth policy written down.
- Docblocks the API reference renders: checkpoint() spans every live context,
  verify() documents $never, expectSequence() loses its lone @api tag,
  Arg::bool(), WhenBuilder::throws(), Invocation readers and seven exception
  factories get summaries. docs/src/api/** regenerated; completeness budgets
  lowered to the new measurement.
- bin/consumer-smoke: five parity idioms (CardinalityAfterVerb, VoidReturnsChain
  reported; NamedBoundsSwapped, HelperReceiver, FirstClassCallable silent).
- SKILL.md caught up with the engine (nullable returns, four functions, allOf/
  anyOf/rest/captor, expectSequence, lean, delegate); README ×2, llms.txt and
  eight site pages carry the 0.8.0/0.3.0/0.2.0 corrections they had missed.
- Rector green again (red since v0.7.0); infection ^0.35; property-testing-testo
  ^0.9; .vale.ini export-ignore; mutation gate stays 92 with the measurement
  (94.1%, three mutants above 94) recorded beside the number.
@coderabbitai

coderabbitai Bot commented Sep 5, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Team

Run ID: 72162c8a-dbde-48b6-ac42-099ec3fe8e90

Warning

Your free Security trial is over. An organization admin can upgrade to Advanced for continuous pull request security review or dismiss this notice.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@rasuvaeff
rasuvaeff merged commit 9ac32c6 into master Sep 5, 2026
21 checks passed
@rasuvaeff
rasuvaeff deleted the release/0.9.0 branch September 5, 2026 13:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant