Repository navigation
Releases
yamaa v0.8.0
yamaa 0.8.0
Choose your download
Python
Install from PyPI with python -m pip install yamaa==0.8.0. pip selects a compatible wheel. Building the source package requires Rust and a C compiler.
- Python wheel for Linux x86_64
- Python wheel for macOS arm64
- Python wheel for Windows x64
- Python wheel for Linux aarch64
- Python source archive
R
Choose a binary for your operating system and R series; binaries need no Rust or Rtools. The source package requires compilation. See the R installation instructions.
- R source package
- R binary package for macOS arm64, R 4.6
- R binary package for macOS arm64, R 4.5
- R binary package for Windows x64, R 4.6
- R binary package for Windows x64, R 4.5
CLI
Unzip the archive for your operating system and architecture, then run yamaa (yamaa.exe on Windows). No Python, R or Rust installation is needed.
- Command-line binary for Linux x86_64
- Command-line binary for macOS arm64
- Command-line binary for Windows x64
- Command-line binary for Linux aarch64
Developer resources
Grammars and conformance cases for language implementers.
0.8.0 adds calculated history through backward row reads and improves execution
of large datasets with column operations and concurrent partitions. The
specification language remains 1.0. Like 0.7.0, this release precedes the
stability contract that starts at yamaa 1.0.0; the saved-output change is
listed under Upgrading. The
0.7.0 notes
cover the previous release.
After publication, 0.8.0 is available on GitHub and PyPI. It is not submitted
to CRAN; R users install the source package or a binary from the GitHub release.
Install
Install the Python package from PyPI with python -m pip install yamaa (#3030
D57). The wheels cover CPython 3.12 to 3.15 on Linux x86_64 and aarch64 with
glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip builds the
source archive, which needs Rust 1.82 or later and a C compiler. Each GitHub
release carries the same Python files, and also R binary packages for Windows
x64 and macOS arm64, for R 4.6 and R 4.5, which install without Rust, Rtools or
a network; the R source package, for Linux and any other R from 4.2.0; and the
standalone yamaa command line for Linux, Windows and macOS, which needs no
Python, R or Rust and ships unsigned (#3030 D52). Install the R package from
the GitHub release. The
Python
and
R
package pages give the commands, Supported platforms
lists every platform, and Installing in a restricted
environment
covers machines without internet access.
Supported platforms
Each cell names the CPython or R series that native qualification installs and
tests the package with, the oldest glibc a Linux wheel needs, or the Rust
target of the command-line binary; no means the release has no such package.
| Platform | Python wheel | Python source archive | R source package | R binary package | Command-line binary |
|---|---|---|---|---|---|
| Linux x86_64 | CPython 3.12 to 3.15 on glibc 2.28 or later | CPython 3.12 to 3.15 | R 4.2 or later | no | x86_64-unknown-linux-musl |
| Linux aarch64 | CPython 3.12 to 3.15 on glibc 2.28 or later | CPython 3.12 to 3.15 | R 4.6 | no | aarch64-unknown-linux-musl |
| macOS arm64 | CPython 3.12 to 3.15 | CPython 3.12 to 3.15 | R 4.2 or later | R 4.5 and 4.6 | aarch64-apple-darwin |
| Windows x64 | CPython 3.12 to 3.15 | CPython 3.12 to 3.15 | R 4.2 or later | R 4.5 and 4.6 | x86_64-pc-windows-msvc |
- The Linux wheels are
manylinux_2_28, for RHEL 8, Ubuntu 20.04, Debian 10
or later; older systems build the Python source archive. - The source packages carry their crates and build offline with Rust 1.82 or
later, Cargo and a C compiler. For an offline Python build, first install
maturin==1.9.6from carried files, then run
python -m pip install --no-index --no-build-isolation --no-deps ./yamaa-0.8.0.tar.gz.
A Windows R build needs the Rtools of its R series and the
x86_64-pc-windows-gnutarget. - Each R binary package serves one R series, R-release or R-oldrel
(#3030 D48), and installs without Rust, Rtools or a network; the macOS
ones need macOS 11. Other R series and Linux use the R source package. - The command-line binaries are static on Linux (musl) and Windows, need
macOS 11 on macOS, and ship unsigned (#3030 D52). - macOS x86_64, free-threaded Python and the Python and R packages on musl
systems such as Alpine Linux are not supported (#3030 D49).
Saved files are qualified with these readers at these minimums, which the
Python test extra and the R package's Suggests declare: Polars 1.35.2
(2.0.0 on CPython 3.15) and PyArrow 23.0.1 (26.0.0 on CPython 3.15) for CSV
and Parquet; R arrow 23.0.1 for CSV and Parquet; Python's standard library and
R jsonlite 2.0.0, with bigint_as_char = TRUE, for Dataset-JSON 1.1; and lxml
6.1.3 for Define-XML 2.1.
Upgrading
- Break: Parquet output bytes change; values do not. Saved Parquet files
use Zstandard compression and dictionary encoding, with row groups of
131,072 rows; fields, row order, nulls and values are preserved, including
every floating-point bit (PARQUET-4, #4198).
Changes
- Calculated values can use earlier calculated rows. Strictly backward
row_valuereads can carry calculated history through causal column groups
in one independently ordered window. Current-row dependencies remain
acyclic; the stored, converted and handled value, including a missing value,
is what later rows read. The dosing-weight benchmark demonstrates this
without a project function (WINDOW-12, #4233, #4234, #4236). - Partitioned runs can read other inputs through lookups. A CSV or Parquet
driver can be read by partition while the other inputs are read whole for
keyed lookups, qualified source reads or intermediates without derivations.
The row and cell limits then bound each driver partition, allowing a driver
beyond 10,000,000 records when its operations stay within partitions
(LIMIT-3, #4203). - The hosts and command line expose a thread limit. Every Python and R
call that takesprogressalso takesthreads; thecheck,runand
submissioncommands take--threads N. The default is the fewer of four
and the cores the process may use; one requests serial execution. A project
builds independent specifications concurrently, and specifications and
partitions share that limit. Output, diagnostics, reports and progress-event
order are preserved; concurrent work delivers its events when the partition
or specification finishes (#4206, #4216, #4226). - Column operations and shared grouping reduce repeated work. Source
copying, expressions, filters, row construction, joins, aggregates, windows,
output access and report serialization operate on typed columns and reuse
grouping or lookup results. Partitioned execution checks and publishes
partitions in order without merging their rows into one frame (#4194,
#4197, #4202, #4204, #4205, #4215, #4221, #4224, #4225, #4229, #4231, #4232). - Parquet reading and writing use the run's threads. Inputs decode into
typed columns and retain the first scanned partition for reuse. Driver
row-group scans and output row-group encoding share the configured worker
limit (#4207, #4222, #4235). - Selecting one project specification avoids preparing every listing.
A listing whose own file writes its domain is named from that file alone;
selecting it by name prepares the selected specification (#4217). - Host packages negotiate boundary version 9. The native calls group
engine settings together and refuse mixed host/native builds (#4223).
Known issues
The command-line binaries are unsigned and not notarized. The YAML reader
remains a vendored copy of saphyr-parser 0.2.1 with reviewed fixes (#3969),
as described in the
0.7.0 notes.
Qualified native arti...
yamaa v0.7.0
yamaa 0.7.0
Choose your download
Python
Install from PyPI with python -m pip install yamaa==0.7.0. pip selects a compatible wheel. Building the source package requires Rust and a C compiler.
- Python wheel for Linux x86_64
- Python wheel for macOS arm64
- Python wheel for Windows x64
- Python wheel for Linux aarch64
- Python source archive
R
Choose a binary for your operating system and R series; binaries need no Rust or Rtools. The source package requires compilation. See the R installation instructions.
- R source package
- R binary package for macOS arm64, R 4.6
- R binary package for macOS arm64, R 4.5
- R binary package for Windows x64, R 4.6
- R binary package for Windows x64, R 4.5
CLI
Unzip the archive for your operating system and architecture, then run yamaa (yamaa.exe on Windows). No Python, R or Rust installation is needed.
- Command-line binary for Linux x86_64
- Command-line binary for macOS arm64
- Command-line binary for Windows x64
- Command-line binary for Linux aarch64
Developer resources
Grammars and conformance cases for language implementers.
0.7.0 comes between 0.6.x and 1.0.0. It fixes defects, settles the interface
questions that 1.0.0 would otherwise freeze as they stand, and adds features;
1.0.0 follows it and the feedback on it (#4064 D294). Like 0.6.x, 0.7.0 is
outside the stability contract, which starts at 1.0.0 (#3030 D1), so it breaks
some 0.6.x files and calls, and each break has one line under
Upgrading. The 0.6.0
notes
describe the 1.0 interface that 0.6 releases for testing and every change up to
0.6.0, and the
0.6.1
and 0.6.2
notes
the patches since. Report what you find through the issue
forms: the 0.6/0.7
feedback form for what you tried and how the interface felt, the bug report for
a defect.
Install
Install the Python package from PyPI with python -m pip install yamaa (#3030
D57). The wheels cover CPython 3.12 to 3.15 on Linux x86_64 and aarch64 with
glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip builds the
source archive, which needs Rust 1.82 or later and a C compiler. Each GitHub
release carries the same Python files, and also R binary packages for Windows
x64 and macOS arm64, for R 4.6 and R 4.5, which install without Rust, Rtools or
a network; the R source package, for Linux and any other R from 4.2.0; and the
standalone yamaa command line for Linux, Windows and macOS, which needs no
Python, R or Rust and ships unsigned (#3030 D52). Install the R package from
the GitHub release. The
Python
and
R
package pages give the commands, Supported platforms
lists every platform, and Installing in a restricted
environment
covers machines without internet access.
Supported platforms
Each cell names the CPython or R series that native qualification installs and
tests the package with, the oldest glibc a Linux wheel needs, or the Rust
target of the command-line binary; no means the release has no such package.
| Platform | Python wheel | Python source archive | R source package | R binary package | Command-line binary |
|---|---|---|---|---|---|
| Linux x86_64 | CPython 3.12 to 3.15 on glibc 2.28 or later | CPython 3.12 to 3.15 | R 4.2 or later | no | x86_64-unknown-linux-musl |
| Linux aarch64 | CPython 3.12 to 3.15 on glibc 2.28 or later | CPython 3.12 to 3.15 | R 4.6 | no | aarch64-unknown-linux-musl |
| macOS arm64 | CPython 3.12 to 3.15 | CPython 3.12 to 3.15 | R 4.2 or later | R 4.5 and 4.6 | aarch64-apple-darwin |
| Windows x64 | CPython 3.12 to 3.15 | CPython 3.12 to 3.15 | R 4.2 or later | R 4.5 and 4.6 | x86_64-pc-windows-msvc |
- The Linux wheels are
manylinux_2_28, for RHEL 8, Ubuntu 20.04, Debian 10
or later; older systems build the Python source archive. - The source packages carry their crates and build offline with Rust 1.82 or
later, Cargo and a C compiler; an offline Python build needsmaturin
installed (pip install --no-build-isolation --no-index), and a Windows R
build the Rtools of its R series and thex86_64-pc-windows-gnutarget. - Each R binary package serves one R series, R-release or R-oldrel
(#3030 D48), and installs without Rust, Rtools or a network; the macOS
ones need macOS 11. Other R series and Linux use the R source package. - The command-line binaries are static on Linux (musl) and Windows, need
macOS 11 on macOS, and ship unsigned (#3030 D52). - macOS x86_64, free-threaded Python and the Python and R packages on musl
systems such as Alpine Linux are not supported (#3030 D49).
Saved files are qualified with these readers at these minimums, which the
Python test extra and the R package's Suggests declare: Polars 1.35.2
(2.0.0 on CPython 3.15) and PyArrow 23.0.1 (26.0.0 on CPython 3.15) for CSV
and Parquet; R arrow 23.0.1 for CSV and Parquet; Python's standard library and
R jsonlite 2.0.0, with bigint_as_char = TRUE, for Dataset-JSON 1.1; and lxml
6.1.3 for Define-XML 2.1.
Known issues
The known issues of 0.6.0
still apply: the command-line binaries are unsigned and not notarized, and
the YAML reader is a vendored copy of saphyr-parser 0.2.1 with reviewed
fixes (#3969).
zstd advisories in 0.6.2 and earlier. Those releases link zstd 0.13.3 and
zstd-safe 7.3.0, which RUSTSEC-2026-0391 and RUSTSEC-2026-0395 to 0406 name; this
release links zstd 0.14.3 and zstd-safe 8.2.0, which fix them. yamaa decodes a
ZSTD Parquet page with a new DCtx and its one-shot DCtx::decompress alone,
with no dictionary and no stream. Every advisory but RUSTSEC-2026-0400 names
functions that yamaa does not call, and RUSTSEC-2026-0400, which names
DCtx::decompress, needs a stream left open on the same context and a
dictionary, so the earlier releases are not known to be exposed (#4066).
Changes since 0.6.2
Each change since 0.6.2 that users can observe has one line below.
Upgrading comes first, then the other changes by area: the
language, inputs, submission metadata, diagnostics, files and saving, the
lint and the command line, the packages and platforms, and the Rust facade.
Upgrading
Each change that breaks a file, call or saved output that works with 0.6.2
has one line here, starting with Break, which says what to change. The
other lines are steps an upgrade needs although nothing broke. A file that
0.6.2 already refuses may now report another diagnostic: code that matches
diagnostics finds each such change, with the diagnostic it replaces, under
Diagnostics and Submission metadata.
-
Break: lint returns a result. Read
result.findingsin Python or
result$findingsin R;statusfails while findings remain,pathslists
rewritten files, and printing gives the summary (#4064 D300, #4078). -
Break: invalid ODM limits carry a diagnostic. Catch the package refusal
for negative, fractional, Boolean and missing limits, and read
value_not_permittedat the argument in its issues table (#4064 D299,
#4077). -
Break: operation, state and argument refusals share one error hierarchy.
Update Python handlers that catchRuntimeError,TypeErroror
NotImplementedErrorfrom yamaa calls to catchyamaa.Erroror its
StateErrorsubclass, and R handlers to catchyamaa_erroror its
yamaa_state_errorsubclass (#4077). -
Break: a refusal always carries an issues table. Handle an empty R data
frame instead ofNULLissues, including for conversion failures and calls
before negotiation (reverses D258, #4077). -
Break: a
Submissionsection declares a transport. Composing Define-XML
undercontext: Submission, the default, now fails with
missing_required_fieldat ...
yamaa v0.6.2
yamaa 0.6.2
yamaa 0.6.2 fixes the build of the R source package on Windows with Rust
1.86 to 1.95, among them the Rust that CRAN's Windows machines use, and is
the release submitted to CRAN after that build failed CRAN's checks of
0.6.1. Its interface is 0.6.0's: the language, the Python, R and
command-line calls, the diagnostics and the saved files are unchanged, so
upgrading from 0.6.0 or 0.6.1 needs no change. A change that CRAN asks for
after a release moves every host to the same patch version, so the Python
packages and the command line are 0.6.2 too, and the 0.6.1 GitHub release
stays as published (#3030 D51).
The 0.6.0 notes
describe the 1.0 interface that 0.6 releases for testing, the break from
0.5.0 and every change up to 0.6.0, and the
0.6.1 notes
the changes in 0.6.1. Like 0.6.0, 0.6.2 is outside the stability contract,
which starts at 1.0.0 (#3673 D289). Report what you find through the
issue forms: the
0.6.0 feedback form, which covers 0.6.2, for what you tried and how the
interface felt, the bug report for a defect.
Install
Install the Python package from PyPI with python -m pip install yamaa
(#3030 D57). The wheels cover CPython 3.12 and later on Linux x86_64 and
aarch64 with glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip
builds the source archive, which needs Rust 1.82 or later and a C compiler.
Each GitHub release carries the same Python files, and also R binary packages
for Windows x64 and macOS arm64, for R 4.6 and R 4.5, which install without
Rust, Rtools or a network; the R source package, for Linux and any other R
from 4.2.0; and the standalone yamaa command line for Linux, Windows and
macOS, which needs no Python, R or Rust and ships unsigned (#3030 D52). The R
source package also goes to CRAN, and once CRAN accepts it,
install.packages("yamaa") installs it from there (#3673 D289). The
Python
and R
package pages give the commands,
Supported platforms
lists every platform, and
Installing in a restricted environment
covers machines without internet access.
Known issues
The known issues of 0.6.0
still apply: the command-line binaries are unsigned and not notarized, and
the YAML reader is a vendored copy of saphyr-parser 0.2.1 with reviewed
fixes.
Changes since 0.6.1
Packages
- On Windows, the R source package builds with Rust 1.86 to 1.95. Their
standard library forx86_64-pc-windows-gnucarries an empty split-DWARF
member,*.rcgu.dwo, in each of its archives, and the Rust static library
that R links bundles them. The build removes the static library's export
directives with GNU objcopy, which refuses a member without sections, so
the installation stopped there. The build now deletes those empty members
first (#4012). Rust 1.82 to 1.85 and 1.96 onward ship none and were not
affected, nor were the R binary packages.
Qualified native artifacts
Native qualification run: https://github.com/elong0527/yamaa/actions/runs/40293890522/attempts/1.
native-python-ubuntu-24.04-3.14(artifact 12637836913)native-python-macos-15-3.14(artifact 12637602500)native-python-windows-2025-3.14(artifact 12637732565)native-python-ubuntu-24.04-arm-3.14(artifact 12637177936)native-r-ubuntu-24.04(artifact 12637318158)native-r-binary-macos-15-4.6.1(artifact 12639196332)native-r-binary-macos-15-4.5.3(artifact 12638946583)native-r-binary-windows-2025-4.6.1(artifact 12638587956)native-r-binary-windows-2025-4.5.3(artifact 12639071974)native-cli-x86_64-unknown-linux-musl(artifact 12636783724)native-cli-aarch64-apple-darwin(artifact 12637257840)native-cli-x86_64-pc-windows-msvc(artifact 12637113057)native-cli-aarch64-unknown-linux-musl(artifact 12637127744)native-conformance-ubuntu-24.04(artifact 12637302225)
yamaa v0.6.1
yamaa 0.6.1
yamaa 0.6.1 fixes the build of the R source package on Windows with a Rust
toolchain for the GNU host, which CRAN's Windows machines use, and is the
first release submitted to CRAN after that build failed CRAN's checks of
0.6.0. Its interface is 0.6.0's: the language, the Python, R and
command-line calls, the diagnostics and the saved files are unchanged, so
upgrading from 0.6.0 needs no change. A change that CRAN asks for after a
release moves every host to the same patch version, so the Python packages
and the command line are 0.6.1 too, and the 0.6.0 GitHub release stays as
published (#3030 D51).
The 0.6.0 notes
describe the 1.0 interface that 0.6 releases for testing, the break from
0.5.0 and every change up to 0.6.0. Like 0.6.0, 0.6.1 is outside the
stability contract, which starts at 1.0.0 (#3673 D289). Report what you find
through the issue forms:
the 0.6.0 feedback form, which covers 0.6.1, for what you tried and how the
interface felt, the bug report for a defect.
Install
Install the Python package from PyPI with python -m pip install yamaa
(#3030 D57). The wheels cover CPython 3.12 and later on Linux x86_64 and
aarch64 with glibc 2.28 or later, macOS arm64 and Windows x64; elsewhere pip
builds the source archive, which needs Rust 1.82 or later and a C compiler.
Each GitHub release carries the same Python files, and also R binary packages
for Windows x64 and macOS arm64, for R 4.6 and R 4.5, which install without
Rust, Rtools or a network; the R source package, for Linux and any other R
from 4.2.0; and the standalone yamaa command line for Linux, Windows and
macOS, which needs no Python, R or Rust and ships unsigned (#3030 D52). The R
source package also goes to CRAN, and once CRAN accepts it,
install.packages("yamaa") installs it from there (#3673 D289). The
Python
and R
package pages give the commands,
Supported platforms
lists every platform, and
Installing in a restricted environment
covers machines without internet access.
Known issues
The known issues of 0.6.0
still apply: the command-line binaries are unsigned and not notarized, and
the YAML reader is a vendored copy of saphyr-parser 0.2.1 with reviewed
fixes.
Changes since 0.6.0
Packages
- On Windows, the R source package builds with a Rust toolchain for the GNU
host,x86_64-pc-windows-gnu, as CRAN's Windows machines have it. Its
Makevars gave Cargo R's C compiler command as the linker, and R's Windows
CCends in a space, so Cargo found no linkergccfor the build scripts
and procedural macros that it links on that host. It now gives Cargo the
compiler's program alone (#4005). A toolchain for the MSVC host with the
GNU target added, asrustup target add x86_64-pc-windows-gnusets it up,
links them with MSVC's linker and was not affected, nor were the R binary
packages. - Native qualification's CRAN checks on Windows build the R source package
with the minimum Rust for the GNU host, as CRAN's Windows check does
(#4006).
Qualified native artifacts
Native qualification run: https://github.com/elong0527/yamaa/actions/runs/40256761575/attempts/1.
native-python-ubuntu-24.04-3.14(artifact 12623196732)native-python-macos-15-3.14(artifact 12623261173)native-python-windows-2025-3.14(artifact 12622772969)native-python-ubuntu-24.04-arm-3.14(artifact 12623385651)native-r-ubuntu-24.04(artifact 12623366351)native-r-binary-macos-15-4.6.1(artifact 12624486597)native-r-binary-macos-15-4.5.3(artifact 12624601685)native-r-binary-windows-2025-4.6.1(artifact 12624636029)native-r-binary-windows-2025-4.5.3(artifact 12623812871)native-cli-x86_64-unknown-linux-musl(artifact 12623236226)native-cli-aarch64-apple-darwin(artifact 12622278640)native-cli-x86_64-pc-windows-msvc(artifact 12623395757)native-cli-aarch64-unknown-linux-musl(artifact 12622647832)native-conformance-ubuntu-24.04(artifact 12622986669)
yamaa v0.6.0
yamaa 0.6.0
yamaa 0.6.0 is the 1.0 interface, released for you to test before it
freezes: the language that specification files declare as yamaa: "1.0",
the Python, R and command-line calls, the diagnostics and the saved files
that 1.0.0 is planned to keep. The freeze starts at 1.0.0, so 0.6.0 is
outside the stability contract and 1.0.0 may still change what your
feedback shows is wrong, as Stability says (#3030 D1, D20,
#3673 D289). Report what you find through the
issue forms: the 0.6.0
feedback form for what you tried and how the interface felt, the bug report
for a defect.
0.6.0 breaks with 0.5.0, so read The break from 0.5.0
before you upgrade.
The break from 0.5.0
Every file written for 0.5.0 must be rewritten. A 1.0 file starts with
yamaa: "1.0" and type:, and some fields and values are spelled
differently, but the language still means what it meant: a rewritten
specification builds the datasets that 0.5.0 built, apart from the changes
that this section and Changes since 0.5.0 list.
Python's tables and lint, the issues table, some condition names and the Rust
facade change too.
The approved rename table lists every changed spelling:
tools/migrate/renames.yaml
at the 0.6.0 tag. For every field, keyword and enumerated value of the 0.5.0
schemas it gives the 1.0 spelling, or the reason the item was removed, and it
lists the fields that 1.0 adds and the conditions, diagnostic paths and
issues-table columns that change (#3030 D27, D58). There is no migration
guide and no converter for users (#3030 D35): rewrite each file with the
table. The converter that moved this repository's own files was internal,
shipped in no package and left the repository before 0.6.0 (#3443).
Files
- Header. Every file starts with
yamaa: "1.0", the oldest language
version that it needs, quoted, andtype:, one ofspec,project,
codelistsandfunction, in place ofschema_version(SCHEMA-2,
#3030 D4). - Functions. A project function is one
type: functionfile, listed in
the project'sfunctions, with each host's callable under
implementations. The project'senvironmentsholds each host's lock, as
python: {lock: uv.lock}, and the two environment files are gone (#3030
D8). - Expressions. An expression field takes one grammar: a bare name reads a
variable, text is quoted, as inderivation: "'DM'", and a YAML number or
Boolean is a literal, soliteral,computeand the string form of
sourceare gone. YAMLnullis the missing value, and a child layer
clears an inherited field by listing its path underclear:, not by
setting it to null. Value fields, such as handlers,dictvalues andcut
labels, keep bare text (#3030 D18, D31). - Inheritance. A child that restates an inherited
input,
intermediatesorrowsmember, or a named window, merges with it as in
0.5.0: a mapping key by key, so an entry the child leaves out comes back
from the parent. Listing the mapping inclearbeside it, as
clear: [rows.scores.derivations], replaces it instead, and the lint
reports a restatement that leaves entries out aspartial_restatement
(LAYER-6, LAYER-8, LAYER-9, #3689). - Fragments. A layer lists reusable spec fragments under
include:. At
each layer its parent chain contributes first, then its fragments in list
order, then its own fields, so one fragment file serves every template that
lists it. A fragment names neitherparentnorinclude
(prohibited_construct), anincludethat leads back to a layer still
being composed is aninheritance_cycle, and a file reached twice in one
composition fails as the newduplicate_layer(LAYER-3, LAYER-4, #3688).
check(parent = ), andyamaa check PATH --parent PATH, check a fragment
as if a template you name were its parent, as it would compose in a file
that names the template as itsparent, includes the fragment and writes
nothing else, so a fragment is checked before any file lists it; a
parentgiven for a file that declaresparentorincludeis refused as
value_not_permittedatparent(LAYER-4, #3694). - Lookups. A named intermediate declares its
key, unless it drives a
row template, and an implicit join, or a qualified aggregate without its
ownkey, matches on thekeythat its input declares instead of on
same-named columns.absentanswers only a lookup that finds no record: a
read of a variable that does not exist fails asunknown_field(#3030
D23, D63, D67). - CDISC metadata. A project section lists
standards, and a column or
value-level entry listsorigins, as Define-XML allows several. A
specification with submission metadata names itsmodel,SDTM,SEND
orADaM, and acopyentry takes columns from a producer linked through
schema, with the type and label that the producer declares and a
Predecessor origin (#3030 D16, D19, D25, D70). - Renamed fields. Some operands, handlers and bindings are renamed, such
asstudy_day'sdatetosource, an intermediate'sno_matchto
absent, an aggregate'sderivelist to aderivationsmap,diff's
boundstoclosed, and a project section'sdatasetstotransport,
withjsonspelleddataset_json(#3030 D58). - A specification alone. A specification checked or run without its
project file fails validation at each codelist and inventory vocabulary
that it binds and each project function that it calls; 0.5.0 skipped or
deferred those checks (CT-13, #3030 D32).
Python, R and diagnostics
- Python tables. Every table is a
yamaa.Table, which implements the
Arrow PyCapsule stream interface and converts withto_polars(),
to_pandas(),to_arrow()orto_pylist(). The package has no runtime
dependencies, so install Polars, pandas or PyArrow to convert to their
tables;to_pandas()keeps each column's Arrow type (#3030 D11, D43, D190).
R's tables stay data frames. - Saving.
save()returns the paths that it wrote, and a refused save's
yamaa.Error, or R'syamaa_errorcondition, carriespaths(#3030 D38,
D69). - Status and printing. Every result has a
status:succeeded,
failed, orskippedfor a project run's specification whose producer did
not complete. A result, and a specification or project object, prints the
summary that the engine renders, the same words in both hosts and on the
command line: Python'srepr()returns it, and R'sformat()returns its
lines andprint()writes them, where R printed a bare environment (#3030
D36, D37, D103, #3401). - Engine information.
yamaa.info()and R'syamaa_info()return the
engine version, the language versions that it reads, its features, the
host, the host's version and the platform, as a dict or a named list: the
record that a selftest'sinfoholds and thatyamaa --versionprints.
__version__andpackageVersion("yamaa")stay the package versions
(#3030 D41, #3404). - Project names and creation time. A project's
nameslists its
specifications in the order that a run of every section builds them,
without reading study data, and a submission'screatedgives the creation
time that its documents carry: the one given, or the time it read once for
every section (#3030 D45, D69, D129, D180, #3405). - R names and length.
names()of an R result lists its fields and
methods, starting withstatus, where it listed its hidden handle, and
length()counts them; a project run'snames()are its specifications'
names. Python'slen()of a project run counts them too (#3030 D44,
#3406). - Lint.
yamaa.lint()and R'syamaa_lint()replace
python -m yamaa.styleand the Python package'sstyleextra, and a
suppression comment is spelled# yamaa-lint: allow(#3030 D40, D58). - Issues. The issues table has twelve columns, in a new order that begins
withseverity.rulereplacesrequirementand cites a rule card, such as
CHECK-7, as the run report'sRULEcolumn now does, instead of a
REQ-NNNNID;severity,file,line,columnandmessageare new
(#3030 D28, D59). - Conditions and paths. Four conditions are renamed, such as
schema_version_mismatchtounsupported_language_version, seven retire,
and new ones arrive, such asproject_binding_missing. Spec paths follow the
renamed fields and name a row template or an intermediate by itsid, as
inintermediates.<id>instead ofintermediates[0]. The rename table's
conditionsandpathsblocks list these (#3030 D58, D69), and the changes
below name each refusal that now reports a more specific condition, path or
contextkey.
The Rust facade
The yamaa crate, the Rust facade that both packages and the command line
call, changes throughout. Its public items, which
rust/crates/yamaa/public-api.txt
lists, freeze at 1.0.0. It keeps the 1.0 use cases and removes the pre-1.0
entry points: a specification's and a project's operations are requests that
Engine::spec(path) and Engine::project(path) return, every operation fails
with one Failure, the crate root re-exports only what configures an engine
or comes back from one, and the two host ports move under yamaa::host.
Rust facade below names each change (#3030 D22, D192, #3415,
#3765, #3766).
Install
Install the Python package from PyPI with python -m pip install yamaa
(#3030 D57). The wheels cover CPython 3.12 and lat...
yamaa v0.5.0
yamaa 0.5.0
yamaa 0.5.0 runs every specification on one executor over a resolved plan
(rewrite 1), consolidates the rules and the language, and redesigns the
Python and R interface around a specification and a project
(yamaa.spec() and yamaa.project(); yamaa_spec() and yamaa_project()
in R). It is published on PyPI and as GitHub release assets ahead of the 1.0.0
release candidates (#3030 D1, amended for 0.5.0 on #2848), which may still
change the interface. Most 0.4.0 specifications and every 0.4.0 Python and R call need
changes: read Migration before you upgrade.
Install
Install the Python package from PyPI:
python -m pip install --upgrade yamaa==0.5.0The GitHub release tagged yamaa-v0.5.0 also provides one Python wheel each
for Linux x86_64 and aarch64, macOS arm64 and Windows x64, the Python source
archive yamaa-0.5.0.tar.gz and the R source package yamaa_0.5.0.tar.gz.
The owner requested the PyPI upload on 2026-10-20, updating the earlier
GitHub-only plan on #2848.
PyPI serves this release's five Python packages unchanged. CRAN receives
1.0.0 only.
python -m pip install ./yamaa-0.5.0-<wheel-tags>.whl
python -m pip install ./yamaa-0.5.0.tar.gz # Python source buildinstall.packages("yamaa_0.5.0.tar.gz", repos = NULL, type = "source")The Linux wheels are manylinux_2_28 and need glibc 2.28 or later, for
example RHEL 8, Ubuntu 20.04 or Debian 10, instead of manylinux_2_34 and
glibc 2.34; older systems build from yamaa-0.5.0.tar.gz. Each is built in
the manylinux_2_28 container of its architecture, and native qualification
runs the conformance corpus on AlmaLinux 8. A Linux aarch64 wheel joins the
x86_64 one (#3030 D49).
Source packages
- The installed R package carries only the test inputs that its installed
suites read, so it is about 5 MB smaller on Linux and its source tarball
about 1 MB smaller (#2937). It leaves out inputs that only the Python suites
or no suite read, including four of its five copies of the Python packaging
lock. Each third-party SAS test file now has its license beside it. - The R source package builds offline, as CRAN's policy for packages that
use Rust asks (#3058). It carries the locked crates.io crates in
src/rust/vendor.tar.xz, with the script that wrote it, and builds them
withcargo build --offline -j 2and a Cargo home inside the build tree, so
installation needs no network, runs at most two jobs and writes nothing to
the user's Cargo home. The tarball grows by about 11 MB.inst/AUTHORS
names the authors and license of every bundled crate, andDESCRIPTION
credits them and the authors of the bundled ReadStat sources as
contributors and copyright holders. - The R package's
configurefinds Cargo and rustc on the PATH or in
~/.cargo/bin, requires both to be at least the workspace's
rust-version, 1.82, instead of checking rustc alone, and reports them
before compiling; it stops with installation advice otherwise and never
lets rustup install a toolchain. Cargo keeps to two jobs under a parallel
make too (#3058). - The R build uses the caller's default Rust toolchain, 1.82 or later, and
reports its version first; rustup no longer selects or installs Rust 1.99.1
from the bundledrust-toolchain.toml.DESCRIPTIONstates
SystemRequirementsin CRAN's wording, and GNU make is no longer required.
The toolchain file no longer lists Clippy or rustfmt. - Native qualification installs the Linux-built Python and R source archives,
the ones a release publishes, on macOS and Windows as well, instead of
archives built on each host.
License notices
LICENSE-THIRD-PARTY.txtalso carries the notices of the Rust standard
library that the native extension links (#3009). It reproduces the notice
that Rust 1.99.1 ships asshare/doc/rust/COPYRIGHT-library.html: the
licenses and copyright holders of the standard library's own files, with
their license texts, and each out-of-tree crate with its notice texts.- The packages also link zlib-rs, the GZIP backend that Parquet 55 selects,
under the Zlib license, so the notices accept Zlib and the Python
License-Expression addsZlib(#3111). - The
alloc-stdlibentry names Dropbox's BSD-3-Clause license, which its
repository ships inalloc-no-stdlib. It no longer names the canonical text
with its placeholders unfilled.
Supported platforms and dependencies
- The Python runtime requires only Polars and packaging; the style checker
requires thestyleextra, and independent readers live in thetestextra. - CPython 3.15 joins the supported interpreters, with wheels and source builds
on Linux x86_64, macOS arm64 and Windows x64. The supported range is CPython
3.12 through 3.15. - On CPython 3.15, three Python dependency floors move to the oldest releases
that work there: Polars 2.0.0, PyArrow 26.0.0 and Pydantic 2.14.0 (#2871).
CPython 3.12 to 3.14 keep Polars 1.35.2, PyArrow 23.0.1 and Pydantic 2.12.4. - The lxml floor rises from 6.1.0 to 6.1.3 on every supported interpreter
(#2943). lxml 6.1.3 stops loading external parameter entities by default,
and 6.1.1 patched the libxslt that its Linux wheels bundle. yamaa's ODM
reader was not exposed, and it no longer uses lxml: it moved into the Rust
engine, which refuses a DOCTYPE, resolves only the five predefined entities
and never reaches the network (#2967). - Source builds now need Rust 1.82 or later, instead of 1.90 (#3111).
- Release builds use Rust 1.99.1. CI checks and lints the workspace with the
minimum, Rust 1.82.0, and builds and checks the R source package with it:
Rust 1.82.0 was released on 2024-10-17, so on any submission date it is at
least the two-year-old cargo that CRAN asks packages using Rust to test
with. The engine uses edition 2021 and the newest releases that build with
Rust 1.82: Arrow and Parquet 55.2.0 instead of 57.3.0, PyO3 0.27, toml 1.0
and quick-xml 0.41. - The R package supports R 4.4.0 and later instead of 4.6.1 (#3030 D13): the
binding calls only R C API entry points that R 4.4 provides, and the package
passesR CMD checkon R 4.4 (#3058). - R no longer suggests nanoarrow: results are plain data.frames, so the
nanoarrow 0.8.0 floor for Arrow views is gone (#2967).
Language consolidation
0.5.0 carries the rules consolidation and language simplification that were
developed for a separate 1.0.0 line (#2855). The contracts are rewritten as
short rule cards under the principles that rules/README.md lists, and the
language keeps one way to state each thing. Most 0.4.0 specifications
need edits before they validate:
- Some results move without an error. A missing value sorts lowest, so it
comes first in an ascending order unless the order term declaresnulls.
One rounding, the SAS-compatible near-tie rule, serves the rounding
operation and CSV display precision, andintandfloatcompare exactly.
An imputation bound outside the collected month or year is ignored. - Many 0.4.0 spellings fail validation, each with a named condition:
parents(a specification has oneparent), the retireddefine.yaml
route, thedate_*anddatetime_*verbs (nowdiff,shift,impute
andprecisionwith a declaredtype),previous_non_missing(now
locf),str_concat(nowstr_template), and a declaration that repeats
another, such asallowed_valuesbeside a bound codelist or aunique
check on the keys. - One expression grammar serves predicates,
computeandaggregate,
and every expression has one declared result type. Regular expressions use
a portable subset without lookaround or backreferences, matched in linear
time. - Declared metadata is enforced when a specification runs. A mandatory
column holds no missing value, and a bound codelist that lists its items
limits the column's values even when the list is extensible. - A missing single input or an absent record gives missing by default,
counted like a declared handler;require_match: truestates where a
missing match must stop the run. - Every lookup runs one model of four steps (LOOKUP-25): an implicit
join, a named intermediate and a qualified aggregate match their keys and
range, narrow the matched records by their filter, select one record or
reduce them, and answer absence. A filter is asked only about records whose
keys match, so a filter that would fail on a record no row matches no
longer stops the run. A named intermediate that verifies a unique
combination, or drives a row template, still asks its filter about every
record, since it reads every record the filter keeps. A key value whose
type cannot compare with its match value fails asincompatible_input_type
for every kind, even on a record the filter would remove: an implicit join
or an aggregate matched nothing before, and a named intermediate's filter
hid the record, so a run that succeeded can now fail. In the order the
model fixes, an aggregate evaluates its range value with its match values
before any record is matched, even for a row whose missing key value
matches nothing: a named intermediate that the range value reads is
selected for that row too, its missing record counted at the aggregate's
between, or failing the run when the intermediate declares
require_match. A structuredsource:binding takesbetween, as a named
intermediate and an aggregate do. On a row that a named intermediate
drives, a range value qualified by the intermediate reads the record that
built the row; a field the intermediate derives is not supported there yet
and fails asunsupported_operation. An aggregate's emptykeyfails as
invalid_field_type, as a named intermediate's does. - An input
schemalink types a stored artifact only. A s...
yamaa v0.4.0
yamaa 0.4.0
yamaa 0.4.0 is a fresh release with breaking changes. Python and R now run one
shared Rust engine for specification admission, execution, verification,
Define documents and explicit Save. Read Migration before you
upgrade.
Install
0.4.0 is distributed only as assets of the GitHub release tagged
yamaa-v0.4.0: one Python wheel per supported OS, the Python source archive
yamaa-0.4.0.tar.gz and the R source archive yamaa_0.4.0.tar.gz. These
GitHub assets do not establish PyPI publication. CRAN, r-universe and R binary
packages are later work.
python -m pip install ./yamaa-0.4.0-<wheel-tags>.whl
python -m pip install ./yamaa-0.4.0.tar.gz # Python source buildinstall.packages("yamaa_0.4.0.tar.gz", repos = NULL, type = "source")The Linux wheel is manylinux_2_34 and needs glibc 2.34 or later, for example
RHEL 9, Ubuntu 22.04 or Debian 12; older systems build from
yamaa-0.4.0.tar.gz. Each wheel is the exact artifact tested on every
supported interpreter for its OS. The attached source archives are the ones
tested on Linux; native CI also qualifies source builds on macOS and Windows
from each host's own archive.
Source builds need Rust 1.90.0 with Cargo, a C compiler and GNU make. They
download the locked Rust crates from crates.io, and pip's build isolation
fetches maturin, so an offline build needs a pre-filled Cargo cache. Windows
R builds also need Rtools45 and the GNU target on the pinned toolchain:
rustup toolchain install 1.90.0 --target x86_64-pc-windows-gnu. The bundled
rust-toolchain.toml forces Rust 1.90.0, so a target added to another
toolchain is not used. R needs no Python runtime.
The yamaa project on PyPI holds only the outdated 0.1.0, so
pip install yamaa installs a stale API; install 0.4.0 from the release
assets (#2932). R has no ODM XML reader in 0.4.0: convert ODM with Python's
yamaa.write_odm_parquet and read the Parquet file in R (#2933).
Every package carries the project's MIT license as LICENSE.txt. It also
carries LICENSE-THIRD-PARTY.txt, with the license, copyright and NOTICE texts
of every third-party Rust crate in the locked build graph, alongside the
ReadStat, Unicode and YAML parser notices. Wheels keep these files in
yamaa-0.4.0.dist-info/licenses/, the Python source archive keeps them at its
root, and the R package installs them from inst/. The wheels link Apache-2.0
Arrow, Parquet, FlatBuffers and Thrift crates and BSD-3-Clause compression
crates, so the Python license expression is
MIT AND Apache-2.0 AND BSD-3-Clause AND Unicode-3.0 (#2926).
Supported platforms and dependencies
- CPython 3.12, 3.13 and 3.14 on Linux x86_64, macOS arm64 and Windows x64.
- R 4.6.1 source builds on the same three hosts.
- Free-threaded Python, musl and R binary packages are not supported.
Python requires Polars 1.35.2 or later and PyArrow 23.0.1 or later. The
minimum independent readers of saved artifacts are:
| Reader | Minimum |
|---|---|
| Python Polars | 1.35.2 |
| Python PyArrow | 23.0.1 |
| Python lxml | 6.1.0 |
| R arrow | 23.0.1 |
| R jsonlite | 2.0.0 |
| R nanoarrow (Arrow views) | 0.8.0 |
Both packages build the Rust workspace with Rust 1.90.0 and the canonical
Cargo.lock, including Arrow and Parquet 57.3.0, libm 0.2.16 and the vendored
saphyr-parser 0.2.1 with its reviewed compact-flow patch. Arrow and Parquet
are pinned to exactly 57.3.0, with brotli 8.0.4 and lz4_flex 0.13.1 floors, so
an embedder whose Rust graph holds Arrow 57.3 builds the engine unchanged
(#2831, #2832). Saved Parquet records only type-defined column orders, which
Polars 1.35.2 and later read (#2833). The
release guide
has the complete platform, reader and dependency statements.
Language
Every specification is pruned
Every specification is composed and pruned before name and reference
validation, whether or not it declares parents. A file without parents is
a composition of one layer. Pruning removes the input, intermediates and
columns entries that cannot affect the artifact or a declared assertion. An
unresolved reference reachable from a root still fails; one inside a removed
declaration is discarded with it. parents: [] no longer affects pruning.
Any parents field, even an empty one, still orders resolved columns by
dependency
(REQ-0643).
Rules:
REQ-0614,
REQ-0638 to REQ-0641
and
REQ-0060
(#2761).
str_replace
str_replace replaces every match of a portable regular expression with
literal text:
derivation:
str_replace:
source: AE.AETERM
pattern: '\s+'
replacement: " "- The scan is global and runs left to right; matches never overlap.
replacementis literal text:$1,$&, backslashes and braces are copied
as written.- After an empty match, the scan copies the next character unchanged and
continues after it: patternx*with replacement-turnsabinto
-a-b-. - A source with no match is returned unchanged, and an empty result is the
empty string, never missing. A missing source returns the declared
missingvalue.
Rules:
REQ-1318 to REQ-1322
(#2776).
date_impute.not_after
date_impute accepts not_after, the upper bound that mirrors not_before.
A bound moves only the components that imputation supplied, and a complete
source date is returned unchanged. A completed date after the bound becomes
the latest day the collected month or year allows on or before the bound.
When no such day exists, the result is missing and no handler runs. Both
bounds may be declared together. Rules:
REQ-1323 to REQ-1325
(#2781).
Datetimes recorded to the hour or minute
datetime_impute and datetime_precision read source text recorded to the
hour (2025-03-04T08) or the minute (2025-03-04T08:30), as ISO 8601
reduced precision allows. datetime_precision returns D, H, M or S
for a source collected to the day, hour, minute or second, so a case on it
derives the ADaM *TMF flag. datetime_impute keeps every collected field
and supplies only the missing ones: first supplies 00, and last
supplies 23, 59 and 59. Converting or ingesting text as a datetime
column is unchanged: T08:30 still names second zero and T08 is still not
a datetime. Rules:
REQ-1326 to REQ-1329
(#2818).
Row defaults are promoted per template
A row default is promoted only for the row templates that need it. A
candidate that a template filter suppresses never reads a lookup it does not
need, so it no longer fails as unmatched_key
(REQ-1264)
(#2762).
One limit remains. When the templates that still need a column read
different drivers, the column is bound against the whole dataset rather than
against each template's own driver. A derivation in one of those templates
that reads a stored field only its own driver supplies can still fail key
validation. #2829 tracks removing this limit in 0.5.0.
check reports formula findings
For a specification without rows, check now reports three findings that
domain reports at validation, without reading inputs: a formula that reads
a column declared later (forward_reference,
REQ-0071),
a qualified name that is not a declared record lookup
(REQ-0442),
and a cycle among formulas
(REQ-0072).
Findings that need the inputs or come from other derivation kinds are still
reported by domain only (#2796).
A qualified between.value names the row's driver
A between.value written as INPUT.FIELD, in a named intermediate or in an
aggregate, reads the record of the input that drives the row being matched:
the root base without row templates, or the row template's dataset. Inside
another intermediate's derivations, the reading intermediate's dataset
supplies it. Any other input fails validation as unknown_field at that
between.value. This also applies when the intermediate is reached through
another between.value or an aggregate's derive step. The value is never
read through the implicit join.
Earlier, an intermediate compared a different field of the driver record, and
an aggregate read the named input at the driver's record positions. Both gave
wrong values with no message. check reports the refusal for an aggregate;
for an intermediate, domain reports it (#2951). A row template driven by a
secondary input can now read its own driver in a between.value or a
correlated filter
(REQ-0121,
REQ-0472)
(#2888, #2904, #2925).
SAS records deleted in place are refused
...
yamaa v0.3.0
yamaa v0.3.0 anchors Harbor benchmark runs to a fixed source snapshot.
Tag: yamaa-py-0.3.0
Source commit: 845a91ff9ba4ab6599efbd79fafe1c4e1dd14255
Build benchmark tasks from a clean checkout of this tag:
git fetch origin tag yamaa-py-0.3.0
git switch --detach yamaa-py-0.3.0Follow the Harbor setup and run instructions at this release. Each task records the full source commit. Compared runs must use this same commit, grading protocol 4, and the same agent/verifier image references for their language.
- Includes full, conventions, and brief prompt tiers, each with 136 R, 136 Python, and 134 opensas cases: 1,218 tasks across nine language/tier combinations.
- Adds the opensas track with the pinned opensas v0.6.6 runtime and retained upstream notices. Investigator comments, randomization, and age quality remain excluded from that track.
- Uses separate R, Python, and opensas agent/verifier image pairs, with default references
yamaa-harbor-agent-<language>:0.8andyamaa-harbor-verifier-<language>:0.8. Build each pair once and reuse its artifact references for a comparison; shared runs should use immutable versioned references as described in the setup instructions. - Enforces the required language throughout each task and independently verifies trajectories, outputs, held-out inputs, and changed-input derivations.
- Retains benchmark reference edge-case corrections and prepares both Python and R
yamaapackage metadata at version 0.3.0. - Extends shared Rust producer/project results, declarative temporal and rounding behavior, and submission metadata generation. Source packages retain the locked Rust workspace and exclude generated Python caches.
Validation for this snapshot: benchmark SDK version pins and the declared API inventory checks passed; all nine benchmark task/configuration groups were generated locally with the source commit above. Benchmark task generation does not establish completed runtime evaluation. Native migration and installed-package qualification remain tracked in the release-readiness register; CI for this source commit was still pending when this release was prepared.
Full changes: yamaa-py-0.2.0...yamaa-py-0.3.0.
yamaa v0.2.0
Second release of the yamaa Python engine, 593 commits after v0.1.0.
Highlights since v0.1.0:
- Harbor agent-evaluation framework: executable benchmark tasks with
oracle and no-op smoke checks, held-out and changed-input reruns,
and per-benchmark leaderboards - Harbor prompt tiers for every SDTM/ADaM benchmark (full, conventions,
brief) via evaluations/harbor/brief.py - Terminology validation and submission generation/validation
- Continued engine, schema, and verification-language work across the
python package
Full diff: yamaa-py-0.1.0...yamaa-py-0.2.0