You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
"Maybe an issue on pending breakages would be appropriate. Remember to note to yourself to follow through on the next major version. Also, maybe noting down to promote experimentals and removing obsoletions would be appropriate."
— @Happypig375, #1009
This is that issue: the list of changes that are agreed or arguable but cannot ship in a minor, so that 3.0 has a docket rather than a memory. Nothing here is scheduled and nothing here is a defect report.
A change belongs on this list when it moves the value of existing user input, or removes a published member. A changed answer has gone in a minor here before, on the stated principle that correctness outranks compatibility — but every one of those was a wrong answer becoming right. Everything below is a deliberate convention change, which is a different thing and should not borrow that licence.
1. implies becomes right-associative
Raised on #1009. The grammar folds implies to the left; mathematics, Lean, Coq, Agda, Haskell and CSharpMath.Evaluation all read → to the right. Ours is the outlier, and CSharpMath reading it differently from us is a live inconsistency across a boundary we do not control.
It cannot go in a minor because it re-values existing text:
"false implies true implies false" today False after True
Nothing fails to compile; answers move silently. #1009 makes the printer state the grouping the grammar actually has, so the change is a one-line flip in ToString.Discrete.Classes.cs (from <=-on-the-right to <=-on-the-left) plus the grammar, and the round-trip tests written there keep it honest.
Also decide provided at the same time. It folds right today, which #1009 documents and tests. If implies moves to the right, the two agree and Syntax.md's rule becomes "^, implies and provided group to the right"; that is worth settling in one go rather than twice.
2. FreeVariables, VarsAndConsts, and a property that does not exist
"VarAndConsts is what it says: free variables and constants (pi and e). "Used variables" looks like another property." — @Happypig375
Measured on master at 6b93b401, against that definition. The documented example is Lambda(x, x * 2 + sin(y * pi)):
today
by the definition above
Vars
x, y
—
VarsAndConsts
x, y, pi
y, pi — x is bound
FreeVariables
y
y
So VarsAndConsts returns bound names, and its XML example pins that. It is wrong for lambda, which is the one binder the library already honours elsewhere — and wrong for the other five (sum, product, integral, limit, derivative, set-builder) in the same way:
sum(k, k, 1, 3) Vars = k VarsAndConsts = k FreeVariables = k
sum(k, k, 1, 3) is 6. Nothing about that value depends on k, and all three properties say it does.
The shape of the fix, which is three published properties moving at once:
FreeVariables — extend "bound" from lambda to every binder. Its own doc comment currently defines bound as "a parameter of some outer lambda", which was accurate when written and is not now that CalculusOperator and ConditionalSet both declare a Var (Let a binder bind i, in every binder there is (#976) #986).
VarsAndConsts — free variables and constants, per the definition above.
A new property for "used variables" — every name that occurs, bound ones included. That is what Vars/VarsAndConsts do today, so the behaviour is not lost, it is renamed to something that describes it.
Part 1 of #989 — the %1 placeholder escaping — was a defect on any definition and is already fixed (#1000). This is part 2, which was always a design call.
3. Promote or retire the experimental features
MathS.ExperimentalFeatures (Sources/AngouriMath/Convenience/Experimental/) is 11 public members, documented as "features that might become stable in the future, but are not guaranteed to do anything useful or correctly at the current moment":
Each wants one of three verdicts, and the third is why this is on a breakage list:
promote — move to the stable surface under its proper name, and commit to the answer;
keep — it is still not guaranteed, and say what would settle it;
remove — it has not earned a place, and deleting a published member is a major-version act.
Worth doing as one pass rather than one member at a time, because "experimental" is a promise about the whole namespace and it decays if it is never spent.
Note also that Experimental is a folder inside the kernel package, not a separate package as #746 describes it — see #1008.
4. Removing obsoletions — a standing practice, not a backlog
There are currently zero[Obsolete] members in the tree: 2.0.0 removed the lot. So there is nothing to schedule, and the note to keep is the rule:
Anything marked [Obsolete] during 2.x is removed at 3.0. An obsoletion that survives a major stops meaning anything, and 1.x accumulated a set precisely by never spending them.
5. Already-known decisions that belong on the same docket
AGENTS.md names three under "Decisions only a major version may take", all still open:
Roots vs fractioned powers? #204 — roots versus fractional powers. SimplificationContract.md calls it "open and deliberately a major-version question".
Complex Infinity #217 — complex infinity. It changes 1/0 from NaN, and every consumer branching on NaN is blast radius.
What this issue is for
To be read before the next major version is named, in the same way #746 is read before any version is named. It is not a plan and it does not commit anyone.
Anything added here should say what moves, what the old and new values are, and why a minor cannot carry it.
This is that issue: the list of changes that are agreed or arguable but cannot ship in a minor, so that 3.0 has a docket rather than a memory. Nothing here is scheduled and nothing here is a defect report.
A change belongs on this list when it moves the value of existing user input, or removes a published member. A changed answer has gone in a minor here before, on the stated principle that correctness outranks compatibility — but every one of those was a wrong answer becoming right. Everything below is a deliberate convention change, which is a different thing and should not borrow that licence.
1.
impliesbecomes right-associativeRaised on #1009. The grammar folds
impliesto the left; mathematics, Lean, Coq, Agda, Haskell and CSharpMath.Evaluation all read→to the right. Ours is the outlier, and CSharpMath reading it differently from us is a live inconsistency across a boundary we do not control.It cannot go in a minor because it re-values existing text:
Nothing fails to compile; answers move silently. #1009 makes the printer state the grouping the grammar actually has, so the change is a one-line flip in
ToString.Discrete.Classes.cs(from<=-on-the-right to<=-on-the-left) plus the grammar, and the round-trip tests written there keep it honest.Also decide
providedat the same time. It folds right today, which #1009 documents and tests. Ifimpliesmoves to the right, the two agree andSyntax.md's rule becomes "^,impliesandprovidedgroup to the right"; that is worth settling in one go rather than twice.2.
FreeVariables,VarsAndConsts, and a property that does not existRaised on #989.
Measured on
masterat6b93b401, against that definition. The documented example isLambda(x, x * 2 + sin(y * pi)):Varsx, yVarsAndConstsx, y, piy, pi—xis boundFreeVariablesyySo
VarsAndConstsreturns bound names, and its XML example pins that. It is wrong forlambda, which is the one binder the library already honours elsewhere — and wrong for the other five (sum,product,integral,limit,derivative, set-builder) in the same way:sum(k, k, 1, 3)is6. Nothing about that value depends onk, and all three properties say it does.The shape of the fix, which is three published properties moving at once:
FreeVariables— extend "bound" from lambda to every binder. Its own doc comment currently defines bound as "a parameter of some outer lambda", which was accurate when written and is not now thatCalculusOperatorandConditionalSetboth declare aVar(Let a binder bindi, in every binder there is (#976) #986).VarsAndConsts— free variables and constants, per the definition above.Vars/VarsAndConstsdo today, so the behaviour is not lost, it is renamed to something that describes it.Part 1 of #989 — the
%1placeholder escaping — was a defect on any definition and is already fixed (#1000). This is part 2, which was always a design call.3. Promote or retire the experimental features
MathS.ExperimentalFeatures(Sources/AngouriMath/Convenience/Experimental/) is 11 public members, documented as "features that might become stable in the future, but are not guaranteed to do anything useful or correctly at the current moment":SolveDiophantineEquation·DecomposeRational×2 ·GetSineOfHalvedAngle·GetCosineOfHalvedAngle·ExpandSineArgumentMultiplied·ExpandCosineArgumentMultiplied·ExpandSineOfSum·ExpandCosineOfSum·SymbolicFormOfSine·SymbolicFormOfCosineEach wants one of three verdicts, and the third is why this is on a breakage list:
Worth doing as one pass rather than one member at a time, because "experimental" is a promise about the whole namespace and it decays if it is never spent.
Note also that
Experimentalis a folder inside the kernel package, not a separate package as #746 describes it — see #1008.4. Removing obsoletions — a standing practice, not a backlog
There are currently zero
[Obsolete]members in the tree: 2.0.0 removed the lot. So there is nothing to schedule, and the note to keep is the rule:Anything marked
[Obsolete]during 2.x is removed at 3.0. An obsoletion that survives a major stops meaning anything, and 1.x accumulated a set precisely by never spending them.5. Already-known decisions that belong on the same docket
AGENTS.mdnames three under "Decisions only a major version may take", all still open:SimplificationContract.mdcalls it "open and deliberately a major-version question".piecewise. Simplification pattern for Piecewise #327's simplification half shipped; the syntax was never touched and no design is recorded.Codomainwith aprovided … in RRcondition. Named on Goal: Math OS — a ten-year vision for AngouriMath as an open mathematical reasoning platform #746 as a consumer of the retired expression-metadata item, and still open.And one more that is breaking by construction:
1/0fromNaN, and every consumer branching onNaNis blast radius.What this issue is for
To be read before the next major version is named, in the same way #746 is read before any version is named. It is not a plan and it does not commit anyone.
Anything added here should say what moves, what the old and new values are, and why a minor cannot carry it.