From 997ea146dde3593daca6f2c14f6d19624e7c7798 Mon Sep 17 00:00:00 2001 From: Rafael Vuijk Date: Fri, 14 Aug 2026 17:27:23 +0000 Subject: [PATCH] Name the release 2.2.0, and say what the pinned AssemblyVersion does not cover Version and FileVersion move to 2.2.0; BREAKING-CHANGES.md's "Unreleased" section becomes "2.2.0 -- since 2.1.0". AssemblyVersion stays 2.0.0.0, as it has for the whole of 2.x. The comment on that pin said holding it at 2.0.0.0 "makes every 2.x release a drop-in replacement". That is true of binding and not of compatibility, and this release is where the difference shows: 2.2.0 renames two members that shipped in 2.1.0, so a consumer that swaps the assembly without recompiling still binds and then throws MissingMethodException when the call is reached. The comment now says which of the two it guarantees, and the BREAKING-CHANGES entry says the same thing from the caller's side rather than claiming the rename can only surface as a build error. The number is checked against https://github.com/asc-community/AngouriMath/issues/746: 2.2.0 advances tier 1 and completes none of it, and the note recording that is on the issue. Measured on this tree: suite 7117 passed / 0 failed. Against a build of the merge commit: casbench 116/119 with 0 wrong, 0 error, 0 timeout; canoncheck idempotence 0/834 and order 0/2738 for the canonical form, matching the committed baseline exactly; rulecheck 30 sets, 1365 applications, 0 that never settle, 0 value changes. Co-authored-by: Claude Opus 5 --- BREAKING-CHANGES.md | 17 ++++++++++++----- Sources/Package.Build.props | 10 +++++++--- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/BREAKING-CHANGES.md b/BREAKING-CHANGES.md index eef32bedd..881918d2e 100644 --- a/BREAKING-CHANGES.md +++ b/BREAKING-CHANGES.md @@ -15,7 +15,7 @@ read first. --- -## Unreleased — since 2.1.0 +## 2.2.0 — since 2.1.0 ### At a glance @@ -326,10 +326,17 @@ one a caller reached for: | `RewriteRules.RationaliseDenominator` | `RewriteRules.RationalizeDenominator` | | `Patterns.RationaliseDenominator` (internal) | `Patterns.RationalizeDenominator` | -**This one breaks a build rather than an answer** — the compiler names the missing member, so there -is nothing to discover at runtime. The rule set's `Name` comes from `nameof`, so a caller that -matched on the string `"RationaliseDenominator"` gets `"RationalizeDenominator"` instead; that part -*is* silent, and it is the only part that is. +**If you recompile, this breaks a build rather than an answer** — the compiler names the missing +member. Two ways it can reach you later than that: + +- `AssemblyVersion` is pinned at `2.0.0.0` for the whole of 2.x precisely so that a consumer can + drop a new DLL in without a binding redirect. Do that without recompiling, and a call to + `Transformation.Rationalisation` throws `MissingMethodException` when it is *reached*, not when + the assembly loads. That is the one path on which this behaves like a silent change. +- The rule set's `Name` comes from `nameof`, so a caller matching on the string + `"RationaliseDenominator"` now sees `"RationalizeDenominator"` and simply stops matching. + +Recompiling against 2.2.0 turns both into compile errors, except the string. Documentation prose keeps British spelling throughout — `Factorize` has always sat beside the word "factorisation" and still does. The convention is about identifiers. diff --git a/Sources/Package.Build.props b/Sources/Package.Build.props index bfe553ae2..0b5272fa2 100644 --- a/Sources/Package.Build.props +++ b/Sources/Package.Build.props @@ -17,17 +17,21 @@ release tag, so what ships is named by the tag; this is what a local build and the assembly metadata carry. --> - 2.1.0 + 2.2.0 2.0.0.0 - 2.1.0.0 + 2.2.0.0 WhiteBlackGoose and contributors Angouri