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
Linux wheels target a manylinux_2_28 (glibc 2.28) baseline instead of manylinux_2_35. The
previous tag came from whichever glibc the build runner happened to ship, and it excluded RHEL 9
and Amazon Linux 2023 by 0.01 of a glibc version; both fell back to the source distribution,
which requires a Rust toolchain the installing user rarely has. The baseline is now an explicit
build input, produced with the same pinned Zig the npm platform packages already use, and the
resulting platform tag is asserted during release verification rather than assumed.
Dependency requirements of the published cellrune crate are caret ranges instead of = pins.
An exact pin made the crate unresolvable alongside any dependent needing a newer patch of the
same dependency, with no remedy available to that dependent. Build reproducibility continues to
come from the committed Cargo.lock. Two new scheduled gates bound the ranges: one runs the test
suite against the declared floors on the minimum supported Rust version, and one runs it against
the newest compatible graph. Both resolve live rather than from the lockfile, so they are
scheduled alongside the advisory tier rather than gating pull requests: a failure there means
upstream moved, not that the commit under test did.
Fixed
Quoted external-workbook references such as '[1]Sheet1'!A1 were reported as supported and
evaluated to #REF!. Because that is a spreadsheet error value rather than an engine issue, IFERROR could hide it, so a workbook could return a plausible number for a formula the engine
cannot evaluate. Both the capability scan and evaluation now reject the external prefix. The
unquoted spelling was already rejected, as the formula lexer has no bracket token. A reference
built at run time by INDIRECT is the deliberate exception: the scan cannot read inside the
text argument, so it reports the cell as supported, and evaluation answers #REF! there as
Excel does rather than an engine issue the scan never predicted and no caller could recover
from. An external prefix written as a saved path keeps its drive letter and is reported once,
not also as a 3-D sheet range the formula does not contain.
Calculated zeros could be negative. Iterator::sum for f64 folds from -0.0, f64::min and f64::max may return either operand when both compare equal, and Iterator::product inherits
the sign of an odd number of negative factors, so SUM, MIN, MAX, PRODUCT, and the *A
variants could each report -0 where Excel reports 0. The boundary every calculated value
crosses now normalizes negative zero, rather than each kernel being expected to.
Formula parse-error details labelled every position as token N, but a lexing failure has no
token stream and was reporting a character offset under that label. Lexing failures now report character N and parsing failures continue to report token N.
The lambda function group dispatched without inspecting the normalized function name, unlike
every sibling group. A second function in that group would have silently evaluated as MAP.
A release version bump had to be repeated by hand in more places than the release checklist
listed, and the ones it missed — a pnpm lockfile, a generated loader shim, the packaged-consumer
lockfile, and the release verification scripts — fail only during a release run. Every version
is now derived from the workspace manifest where possible, and a new gate asserts that the
remaining declarations agree, including the install commands and the supported-version statement
that ship on the registry project pages. Every check in that gate fails when its pattern matches
nothing, so a moved file or a regenerated shim cannot report the same green result as a correct
bump, and the gate has its own tests.
A Linux wheel could declare a compressed platform-tag set whose first component was a legacy
alias, which hid a newer glibc requirement behind it from the release verification. Every
component of the set is now checked against the supported baseline.
The nightly fuzz tier could not install its fuzzer. taiki-e/install-action has no cargo-fuzz
manifest, the job deliberately disables the binstall fallback, and the schedule had never fired
since the repository went public, so the defect surfaced only on the tier's first manual
dispatch. cargo-fuzz is now built from crates.io with cargo install --locked, which keeps the
exact-version pin and the registry checksum verification.
The npm publish job could not authenticate. Trusted publishing requires npm 11.5.1 to exchange
the job's OIDC identity for a registry credential, and Node 22 bundles npm 10, which publishes
without credentials and receives the rejection masked as E404. The nine-package dry-run gate
cannot catch this because a dry run never authenticates, so the failure surfaced on the first
real upload — before any package was published, leaving the retry clean. The job now upgrades
to a pinned npm 11 before publishing.
Documentation
The 0.1.0 entry claimed capability detection for unsupported external, structured, and
spill-postfix formula forms. Only 3-D and data-table forms have dedicated detection; the other
three surface as calculation.parse_error, and structured references and spill-postfix
references still do after this release. The entry has been corrected.
Added docs/NUMERICS.md, which records where calculated values deliberately differ from Excel,
the Excel build each statement was measured against, and which function families are unmeasured.
It is linked absolutely: both published READMEs are also the long description crates.io, PyPI,
and npm render, none of which resolve a repository-relative path, and a gate now enforces that.
Installation instructions no longer describe the registry artifacts as pending.