From ee5824b4454c8611964a2d294ca8a6638a6b77f1 Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Sun, 4 Oct 2026 13:57:26 -0600 Subject: [PATCH 1/4] Names the forged float's path-segment detail The fragment for the forged non-finite float refusal named the new refusals but not one more answer only such an object sees: used as a contextPut path segment, it is now carried in the error's details as the absence, where it was carried as itself, because the details read the segment through the value boundary that now refuses it. The location text and the message are unchanged. One clause is added to the fragment ahead of the 0.6.0 promotion, so the promoted bullet carries it. The change touches no TypeScript and no gated path, so it has no gate to run. Refs: pts-h572 --- changelog.d/pts-ztsx.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/pts-ztsx.md b/changelog.d/pts-ztsx.md index f0a2428..4ca49fd 100644 --- a/changelog.d/pts-ztsx.md +++ b/changelog.d/pts-ztsx.md @@ -1,3 +1,3 @@ ### Changed -- An object a host built to the float class's shape whose field is NaN or an infinity is refused with `non_finite_number` wherever a host's value enters (a context, a `contextPut` value, a value a host function answers) and in a literal operand, where it was admitted and compared unequal to itself; a float built with `float()` or by the package is never affected. +- An object a host built to the float class's shape whose field is NaN or an infinity is refused with `non_finite_number` wherever a host's value enters (a context, a `contextPut` value, a value a host function answers) and in a literal operand, where it was admitted and compared unequal to itself; such an object used as a `contextPut` path segment is carried in the error's details as the absence, where it was carried as itself, with the location text and the message unchanged; a float built with `float()` or by the package is never affected. From 8b2f6018e12f08458706799848fc2a6f6ed4d7c6 Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Sun, 4 Oct 2026 13:57:38 -0600 Subject: [PATCH 2/4] Names the ordering that answered the absence The fragment for the date-against-datetime member change said an ordering that reaches such a pair now puts the date member first where it ordered the two by instant. Some such orderings answered the absence instead: a pair at the same instant was stepped past as equal and a later member that does not order decided the answer. Those now answer a boolean too, as the reference does. The fragment says so, ahead of the 0.6.0 promotion, so the promoted bullet carries it. The change touches no TypeScript and no gated path, so it has no gate to run. Refs: pts-h572 --- changelog.d/pts-5u1q.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/pts-5u1q.md b/changelog.d/pts-5u1q.md index eeb0d83..0b28c3c 100644 --- a/changelog.d/pts-5u1q.md +++ b/changelog.d/pts-5u1q.md @@ -1,3 +1,3 @@ ### Changed -- Inside a list or a map, a date member against a datetime member is unequal whatever instants the two name, as the reference compares it: `==`, `in` and `contains` answer false where they answered true for such a pair at the same instant, `!=` answers true, and an ordering of two lists whose walk reaches such a pair puts the date member first where it ordered the two by instant; a date and a datetime compared at the top level answer as before, and two datetimes written to different precision stay one value here (a declared divergence). +- Inside a list or a map, a date member against a datetime member is unequal whatever instants the two name, as the reference compares it: `==`, `in` and `contains` answer false where they answered true for such a pair at the same instant, `!=` answers true, and an ordering of two lists whose walk reaches such a pair puts the date member first where it ordered the two by instant or answered the absence; a date and a datetime compared at the top level answer as before, and two datetimes written to different precision stay one value here (a declared divergence). From 7bd8baf625a27c905a47ea4caf48e9b948795c95 Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Sun, 4 Oct 2026 13:57:46 -0600 Subject: [PATCH 3/4] Scopes the integer rendering to outside a duration The fragment for the out-of-range integer rendering said an integer literal past the safe-integer bound now decompiles with the digits it was written with. That holds for an integer literal outside a duration; a duration's component past the bound still renders the host's rounded value (holds == 99999999999999999999d decompiles as holds == 100000000000000000000d on this head), which a follow-up covers. The fragment is scoped to match, ahead of the 0.6.0 promotion, so the promoted bullet carries it. The change touches no TypeScript and no gated path, so it has no gate to run. Refs: pts-h572 --- changelog.d/pts-7w7e.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/changelog.d/pts-7w7e.md b/changelog.d/pts-7w7e.md index 2966883..95e6175 100644 --- a/changelog.d/pts-7w7e.md +++ b/changelog.d/pts-7w7e.md @@ -1,3 +1,3 @@ ### Changed -- `decompile` renders an integer literal past the safe-integer bound with the digits it was written with, leading zeros dropped, as the reference renders its exact integer, where it rendered the host's rounded value (`99999999999999999999` as `100000000000000000000`, a longer run as `Infinity` or in exponent form); `compile` still refuses such a source with `number_out_of_range`, and a decimal literal past the finite range still renders as `Infinity.0`, a declared divergence, since the reference raises while parsing it. +- `decompile` renders an integer literal outside a duration past the safe-integer bound with the digits it was written with, leading zeros dropped, as the reference renders its exact integer, where it rendered the host's rounded value (`99999999999999999999` as `100000000000000000000`, a longer run as `Infinity` or in exponent form); `compile` still refuses such a source with `number_out_of_range`, and a decimal literal past the finite range still renders as `Infinity.0`, a declared divergence, since the reference raises while parsing it. From e09bf0b44aeb6bf09641263df8c42842d6eab4d0 Mon Sep 17 00:00:00 2001 From: JohnnyT Date: Sun, 4 Oct 2026 13:58:52 -0600 Subject: [PATCH 4/4] Prepares the 0.6.0 release A minor: ProjectedEvaluation is new on the ./tagged subpath, naming what evaluateTagged answers, and some answers change, each named in a Changed or Fixed bullet: a host Date's type name, a date member against a datetime member, a list ordering over a member holding the null value, the rendering of an out-of-range integer literal outside a duration, the place budget on the plain projection and the JSON builtin, the boundary refusal of a forged non-finite float, a revoked proxy as a contextPut path segment, and the article in two location refusal messages. No public name is removed or renamed. The version moves in package.json, its only carrier. Every changelog fragment is promoted byte for byte under a 0.6.0 section dated from the local clock and placed above 0.5.0's, grouped under Added, Changed and Fixed in that order and in fragment-name order within each, and is deleted here; changelog.d keeps only its README. The README's install pin moves to the new version. Those are every file a release commit here may touch. Run: the full pnpm gate green on this exact tree under node v24.21.0, and npm pack --dry-run built through the publish guard, which passed all three of its properties and listed 50 files for @riddler/predicator@0.6.0. The tag and the publish are not done here. Refs: pts-h572 --- CHANGELOG.md | 31 +++++++++++++++++++++++++++++++ README.md | 2 +- changelog.d/pts-1wd.md | 3 --- changelog.d/pts-50hb.md | 3 --- changelog.d/pts-5u1q.md | 3 --- changelog.d/pts-5uod.md | 3 --- changelog.d/pts-7w7e.md | 3 --- changelog.d/pts-9jds.md | 3 --- changelog.d/pts-av9e.md | 3 --- changelog.d/pts-r69a.md | 3 --- changelog.d/pts-ztsx.md | 3 --- package.json | 2 +- 12 files changed, 33 insertions(+), 29 deletions(-) delete mode 100644 changelog.d/pts-1wd.md delete mode 100644 changelog.d/pts-50hb.md delete mode 100644 changelog.d/pts-5u1q.md delete mode 100644 changelog.d/pts-5uod.md delete mode 100644 changelog.d/pts-7w7e.md delete mode 100644 changelog.d/pts-9jds.md delete mode 100644 changelog.d/pts-av9e.md delete mode 100644 changelog.d/pts-r69a.md delete mode 100644 changelog.d/pts-ztsx.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 1eed638..a6dec68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,37 @@ A version section here is written when that release is prepared, which is before it is published. A section records what its version carries; whether that version is on the registry is a question for the registry. +## [0.6.0] 2026-10-04 + +A minor release. `ProjectedEvaluation` on the `./tagged` subpath names what +`evaluateTagged` answers. Some answers change: a host `Date` is named a +datetime; a date member against a datetime member, and a list ordering that +meets a member holding the null value, answer as the reference does; +`decompile` renders an out-of-range integer literal outside a duration as +written; a result, a context or a `JSON.stringify` argument past the place +budget is refused; and a forged float whose field is not finite is refused +where it enters. A revoked proxy as a `contextPut` path segment answers a +`LocationError` where it threw, and two location refusal messages take the +right article. No public name is removed or renamed. + +### Added + +- `ProjectedEvaluation` on the `./tagged` subpath names what `evaluateTagged` answers; it is the main entry point's `EvaluateResult` without the `ParseError` arm, so every value of it is also an `EvaluateResult`, and no answer changes. + +### Changed + +- `typeName` answers `"datetime"` for a host `Date`, the member `fromHost` admits it as, where it answered `"map"`; so the `JSON.stringify` builtin, handed a host `Date` in a literal operand (as the operand or inside a list or map it holds), refuses with "JSON.stringify has no JSON form for a datetime" where its refusal named a map. A `Map`, a `Set` or a class instance still answers `"map"`, and a `Date` that comes in through the context is unaffected. +- Inside a list or a map, a date member against a datetime member is unequal whatever instants the two name, as the reference compares it: `==`, `in` and `contains` answer false where they answered true for such a pair at the same instant, `!=` answers true, and an ordering of two lists whose walk reaches such a pair puts the date member first where it ordered the two by instant or answered the absence; a date and a datetime compared at the top level answer as before, and two datetimes written to different precision stay one value here (a declared divergence). +- An ordering of two lists that meets a member holding the null value answers a boolean, as the reference orders it, where it answered the absence: two such members at the same place are stepped past, and one against another member orders after a number and after false and before every other value; where the walk met an unbound name against such a member it answers a boolean where it answered an `unbound_variable` error, and an ordering of the null value at the top level still answers the absence. +- `decompile` renders an integer literal outside a duration past the safe-integer bound with the digits it was written with, leading zeros dropped, as the reference renders its exact integer, where it rendered the host's rounded value (`99999999999999999999` as `100000000000000000000`, a longer run as `Infinity` or in exponent form); `compile` still refuses such a source with `number_out_of_range`, and a decimal literal past the finite range still renders as `Infinity.0`, a declared divergence, since the reference raises while parsing it. +- A program whose plain result, statement-run context or value, or `JSON.stringify` argument has more places than the place budget (one million, each place counted once for each path that reaches it) is refused with `place_budget_exceeded`, where it answered after work that doubled with every shared level; `evaluate`, `execute`, `executeValue`, `evaluateTagged`'s default and the `JSON.stringify` builtin count before they project or write, and a failed statement run keeps its own error and leaves a context past the budget off. +- An object a host built to the float class's shape whose field is NaN or an infinity is refused with `non_finite_number` wherever a host's value enters (a context, a `contextPut` value, a value a host function answers) and in a literal operand, where it was admitted and compared unequal to itself; such an object used as a `contextPut` path segment is carried in the error's details as the absence, where it was carried as itself, with the location text and the message unchanged; a float built with `float()` or by the package is never affected. + +### Fixed + +- `contextPut` answers a `LocationError` for a revoked proxy as a path segment, where it threw: `not_a_container` against a list and `invalid_index` elsewhere, as for any segment that is neither a string nor a safe integer, the segment described in `location` and carried as the absence. +- A `LocationError` message writes its noun with the article it is said with: "not an arithmetic expression" and "not an undefined", where it wrote "not a"; the reason and the details are unchanged. + ## [0.5.0] 2026-10-02 A minor release. The location surface is new: `contextLocation` resolves an diff --git a/README.md b/README.md index 0ae921f..bb890e9 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ version can be deprecated but not recalled. A registry is live: read it yourself rather than trusting this paragraph's date. ```bash -pnpm add @riddler/predicator@^0.5.0 +pnpm add @riddler/predicator@^0.6.0 ``` The version is named because a bare install resolves to whatever the registry diff --git a/changelog.d/pts-1wd.md b/changelog.d/pts-1wd.md deleted file mode 100644 index 9adc4c2..0000000 --- a/changelog.d/pts-1wd.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- `typeName` answers `"datetime"` for a host `Date`, the member `fromHost` admits it as, where it answered `"map"`; so the `JSON.stringify` builtin, handed a host `Date` in a literal operand (as the operand or inside a list or map it holds), refuses with "JSON.stringify has no JSON form for a datetime" where its refusal named a map. A `Map`, a `Set` or a class instance still answers `"map"`, and a `Date` that comes in through the context is unaffected. diff --git a/changelog.d/pts-50hb.md b/changelog.d/pts-50hb.md deleted file mode 100644 index 4b5a549..0000000 --- a/changelog.d/pts-50hb.md +++ /dev/null @@ -1,3 +0,0 @@ -### Fixed - -- `contextPut` answers a `LocationError` for a revoked proxy as a path segment, where it threw: `not_a_container` against a list and `invalid_index` elsewhere, as for any segment that is neither a string nor a safe integer, the segment described in `location` and carried as the absence. diff --git a/changelog.d/pts-5u1q.md b/changelog.d/pts-5u1q.md deleted file mode 100644 index 0b28c3c..0000000 --- a/changelog.d/pts-5u1q.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- Inside a list or a map, a date member against a datetime member is unequal whatever instants the two name, as the reference compares it: `==`, `in` and `contains` answer false where they answered true for such a pair at the same instant, `!=` answers true, and an ordering of two lists whose walk reaches such a pair puts the date member first where it ordered the two by instant or answered the absence; a date and a datetime compared at the top level answer as before, and two datetimes written to different precision stay one value here (a declared divergence). diff --git a/changelog.d/pts-5uod.md b/changelog.d/pts-5uod.md deleted file mode 100644 index f8bc88e..0000000 --- a/changelog.d/pts-5uod.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- An ordering of two lists that meets a member holding the null value answers a boolean, as the reference orders it, where it answered the absence: two such members at the same place are stepped past, and one against another member orders after a number and after false and before every other value; where the walk met an unbound name against such a member it answers a boolean where it answered an `unbound_variable` error, and an ordering of the null value at the top level still answers the absence. diff --git a/changelog.d/pts-7w7e.md b/changelog.d/pts-7w7e.md deleted file mode 100644 index 95e6175..0000000 --- a/changelog.d/pts-7w7e.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- `decompile` renders an integer literal outside a duration past the safe-integer bound with the digits it was written with, leading zeros dropped, as the reference renders its exact integer, where it rendered the host's rounded value (`99999999999999999999` as `100000000000000000000`, a longer run as `Infinity` or in exponent form); `compile` still refuses such a source with `number_out_of_range`, and a decimal literal past the finite range still renders as `Infinity.0`, a declared divergence, since the reference raises while parsing it. diff --git a/changelog.d/pts-9jds.md b/changelog.d/pts-9jds.md deleted file mode 100644 index 6a5aec5..0000000 --- a/changelog.d/pts-9jds.md +++ /dev/null @@ -1,3 +0,0 @@ -### Fixed - -- A `LocationError` message writes its noun with the article it is said with: "not an arithmetic expression" and "not an undefined", where it wrote "not a"; the reason and the details are unchanged. diff --git a/changelog.d/pts-av9e.md b/changelog.d/pts-av9e.md deleted file mode 100644 index 8d27857..0000000 --- a/changelog.d/pts-av9e.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- A program whose plain result, statement-run context or value, or `JSON.stringify` argument has more places than the place budget (one million, each place counted once for each path that reaches it) is refused with `place_budget_exceeded`, where it answered after work that doubled with every shared level; `evaluate`, `execute`, `executeValue`, `evaluateTagged`'s default and the `JSON.stringify` builtin count before they project or write, and a failed statement run keeps its own error and leaves a context past the budget off. diff --git a/changelog.d/pts-r69a.md b/changelog.d/pts-r69a.md deleted file mode 100644 index cf4c952..0000000 --- a/changelog.d/pts-r69a.md +++ /dev/null @@ -1,3 +0,0 @@ -### Added - -- `ProjectedEvaluation` on the `./tagged` subpath names what `evaluateTagged` answers; it is the main entry point's `EvaluateResult` without the `ParseError` arm, so every value of it is also an `EvaluateResult`, and no answer changes. diff --git a/changelog.d/pts-ztsx.md b/changelog.d/pts-ztsx.md deleted file mode 100644 index 4ca49fd..0000000 --- a/changelog.d/pts-ztsx.md +++ /dev/null @@ -1,3 +0,0 @@ -### Changed - -- An object a host built to the float class's shape whose field is NaN or an infinity is refused with `non_finite_number` wherever a host's value enters (a context, a `contextPut` value, a value a host function answers) and in a literal operand, where it was admitted and compared unequal to itself; such an object used as a `contextPut` path segment is carried in the error's details as the absence, where it was carried as itself, with the location text and the message unchanged; a float built with `float()` or by the package is never affected. diff --git a/package.json b/package.json index df79715..7190ca5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@riddler/predicator", - "version": "0.5.0", + "version": "0.6.0", "description": "A conformant TypeScript sibling of the Predicator reference implementation: the expression language, its instruction set architecture, and the shared conformance corpus.", "license": "MIT", "type": "module",