Polyglot Tooling and Observability
The Python package is the reference implementation, but the project now ships release contracts for several language bindings. This page records the developer-facing expectations that keep those bindings aligned.
Tooling parity
The Python reference package keeps the language-specific tools that have a clear local benefit:
scaleneis kept for Python-only profiling.mutmutis kept for Python-only mutation testing.pytest-benchmarkis kept for Python performance regression checks.ruffandtyremain the Python lint and type gates.
Those tools are not forced onto the non-Python bindings. The equivalent gates for the other package ecosystems are the native build, lint, test, packaging, and conformance checks documented in the release matrix:
TypeScript:
npm run checkandnpm pack --dry-runGo:
go testandgo vetRust:
cargo fmt,cargo clippy,cargo test,cargo packageJulia:
Pkg.test.NET 11:
dotnet build,dotnet test,dotnet packR:
R CMD buildandR CMD check --as-cran
The release matrix in docs/release/polyglot-bindings.md describes the package-manager targets and tag conventions that go with those gates.
The canonical version source and the manifest lockstep rule are documented in docs/developer_guide/versioning_and_release_policy.rst. Use that policy page when changing any release-manifest version.
Versioning contract
Each binding follows the release conventions of its own ecosystem:
Python tags trigger PyPI/TestPyPI publication, while the conda-forge recipe is updated separately through the feedstock flow.
TypeScript uses
typescript-v*tags and publishes to npm with provenance.Go uses
bindings/go/v*tags that line up with the module proxy rules.Rust uses
rust-v*tags and publishes to crates.io.Julia uses
julia-v*tags with TagBot sync and the General registry..NET uses
dotnet-v*tags and publishesnet11.0packages to NuGet.R uses
r-v*tags and publishes source artifacts through GitHub Releases, with CRAN or r-universe still handled externally.
Logging policy
Library code should stay quiet by default. The CLI is the only surface that is expected to emit user-facing status output, and even there the output must stay stable for scripting.
The current policy is:
--quietsuppresses status chatter.--format jsonand--format csvare the machine-readable output modes.Debug or verbose detail must remain opt-in and must not change stdout payloads that users rely on for automation.
When a binding does not have a direct equivalent for a Python-only tool, the fallback is to keep the gap explicit rather than invent a weak substitute. That keeps the quality gates honest and makes the release contract easier to audit across languages.