tf_tree
A transform tree engine: store time-stamped rigid-body transforms between named coordinate frames and answer "where was frame A relative to frame B at time t?" — fast enough to sit inside a control loop, with diagnostics good enough to debug at 3 a.m.
Linux-first. The single-process engine is portable Rust and much of it
compiles elsewhere; everything that maps memory — attaching to a live arena, the
frozen .tft backend, tf_tree freeze — is Linux-only and behind a
default-off shm feature. That sentence is here rather than in
SUPPORT.md alone because nobody should meet it as a build
error.
Start where you change nothing
Point it at a recording you already have. No node joins anyone's launch file, no
robot is redeployed, and doctor --from-bag needs no features at all:
git clone https://github.com/NoeFontana/tf_tree && cd tf_tree
cargo install --path crates/tf_tree_cli --features shm # shm: `freeze` maps memory
tf_tree doctor --from-bag drive.mcap # what is wrong with this /tf traffic
tf_tree freeze --from-bag drive.mcap -o drive.tft # keep the answer
drive.tft is a frozen transform index, and it is the arena itself written
to disk. There are no pointers anywhere in the arena — every internal reference
is an offset — so opening one is an mmap, with no parsing, no deserialization
and no fixups (PHASE5 §2.1). Sixteen dataloader workers map
the same file, the kernel charges the shared clean pages exactly once and the
untouched ones not at all (measured basis: PHASE2 §3.8),
and each worker queries in its own address space: no IPC, and no ROS node inside
the training loop.
import numpy as np, tf_tree
# Open per worker, after the fork/spawn — docs/PHASE5.md §4.3 says why.
tree = tf_tree.open_file("drive.tft")
plan = tree.plan("base_link", "lidar_top") # compile the route once
stamps = np.asarray(batch_stamps_ns, dtype=np.int64) # integer nanoseconds
poses = plan.at(stamps, layout="quat_twist") # (N, 13) float64
The whole batch is one call into Rust. layout="quat_twist" appends the body
twist to each pose, in the plan's source frame: it is the analytic derivative of
the same interpolation the pose came from, not a finite difference between two
lookups.
docs/PHASE5.md §2.2 is where that argument is made in the
project's own words. A perception dataloader today does one of three bad things
— re-parses the bag in every worker, precomputes poses into a pickle and loses
the ability to query at arbitrary times, or runs a ROS node to serve transforms
during training. This replaces all three and asks nobody to migrate anything,
which is also why it is the part that shipped first.
Numbers belong where they can be reproduced, not in this section.
just bench-report measures your host and writes
report/{results.json,index.html}; the standing figures and their caveats are in
docs/benchmarks/. Benchmarks, and what they are worth
below explains why a row there may legitimately read UNAVAILABLE.
Status
On crates.io from 0.0.1; on PyPI from 0.0.2. The five engine crates are
published — cargo add tf_tree. The Python wheel starts at 0.0.2, because the
0.0.1 commit did not compile off Linux and no wheel for it exists or can; see
CHANGELOG.md. 0.0.x promises nothing between releases —
cargo treats every one as incompatible with every other, so pin exactly.
| Phase | What it is | Status |
|---|---|---|
| 1 | Single-process engine: arena, seqlock buffers, plans, SE(3) math | Implemented |
| 2 | Shared memory: rendezvous, fd passing, claims as leases, reaping | Implemented, except the daemon/recorder surface (§9–§10) and §11.3's fault injection. §3.5's ownership migration has the protocol and not the trigger: kill the arena's owner and lookups keep being served, but no new process can join |
| 3 | Python bindings (PyO3, zero intermediate allocation) | Implemented |
| 4 | C ABI, C++ wrapper, ROS 2 ingest bridge, derivatives | Done, except §5.9's affinity knobs and §6.3's replay rows. at_with_derivatives, both headers, the header-only C++ wrapper with its CMake package, and both halves of the ingest bridge — the rclcpp package in ros/tf_tree_ros included. §7's benchmark gate is partial |
| 5 | Frozen .tft arena, bag ingestion, diagnostics, tf_tree top |
Mostly done. FORMAT_VERSION = 3, the frozen arena (§2), the offline Python API (§4), the §5 counters and tf_tree top — terminal and --web (§7) — all landed. Ingestion is MCAP only (§3); the TFT001–TFT019 catalogue reports all nineteen ids, of which sixteen can detect (§6). §8 is deliberately not built. §9's benchmark artifact and §10's release readiness are partial |
| 6–8 | Multi-host, tf2 compatibility shim, replication |
Not started; Phase 7 is gated by D21 and none of its four gates is met |
The per-phase §0.0 tables in docs/ are the source of truth, not
this one — PHASE2.md,
PHASE4.md,
PHASE5.md. If this table and one
of those disagree, the phase document is right and this is stale.
CI runs again as of 2026-08-16, after a gap since 2026-07-23 that ended
when this repository was made public. A green check is evidence once more — of
what the jobs cover. Gate locally with just first; CI is the second opinion.
First five minutes, with no data at all
The block above assumes you have a recording. This one assumes only the clone:
just quickstart # uv-managed interpreter + venv, with the extension installed into it
.venv/bin/python
import tf_tree
tree = tf_tree.build([("map", "base"), ("base", "cam")])
# stamp in integer nanoseconds; pose is [qw, qx, qy, qz, x, y, z]
tf_tree.push(tree, "base", "map", 1_000, [1.0, 0.0, 0.0, 0.0, 1.0, 2.0, 3.0])
tf_tree.push(tree, "base", "map", 2_000, [1.0, 0.0, 0.0, 0.0, 3.0, 4.0, 5.0])
print(tree.plan("map", "base").at(1_500)[:3, 3]) # -> [2. 3. 4.]
That is a real result and not a toy: the query lands halfway between two samples,
so the printed translation is their interpolated midpoint, and plan() is the
object you keep — compiling the route once and evaluating it many times is the
whole shape of the fast path.
Two things surprise people, both deliberate:
- Stamps are integer nanoseconds. There is no float-seconds overload. At a
2026 epoch the ULP of
float64seconds is 238 ns, so every interval in a 1 kHz stream is wrong after a round trip. - Nothing returns a view into shared memory. An edge's samples are a ring
another process is overwriting, and correct reads go through a seqlock. "Zero
copy" here means no intermediate allocation — use
Plan.at_intoto supply the destination.
Rust is cargo add tf_tree; Python is pip install transform_tree — the
distribution name differs from the import name, because PyPI refuses tf_tree
as too close to the existing tftree (0008
records the measurement). import tf_tree either way. just alone lists
everything the repository can do.
Is this a tf2 replacement?
It is not tf2, not a fork of it, and not affiliated with ROS. It is an
independent engine that solves the same problem with a different data structure,
and it is deliberately named so that people looking for a tf2 alternative can
find it (0008 records that
decision).
There is no drop-in tf2_ros::Buffer shim, and building one is not scheduled.
That is Phase 7, gated by D21 on operating evidence this project has not yet
produced; docs/PHASE7.md is what such a shim would have to
be — including the places it would deliberately refuse to reproduce tf2's
behaviour — and its §0.0 lists four gates, none of them met. What exists today
instead is the ingest bridge (docs/PHASE4.md §5): a node that subscribes to
/tf and fills an arena, which is a one-way seam and not a compatibility layer.
Two things worth stating precisely, because the loose versions of both are wrong:
- The documented
tf2cost is listener and buffer CPU, per node — not/tfbandwidth. Autoware'sManagedTransformBuffer(inautoware_universe) reports taking a LiDAR sensing pipeline from 13 TF listener nodes to 0 — four per-sensor legs at 3 each plus the concatenation node (autowarefoundation/autoware#5385; the upstream discussion about moving it intotf2isros2/geometry2#758). That is a third-party report about their own stack, not atf_treemeasurement, and it is cited for the shape of the problem this engine's process model addresses. No claim is made about/tfbandwidth: no quantified public source for one exists. - Errors are
Copyidentifiers a program can branch on, with the prose in a separate layer (docs/API.mdR5) — a lookup failure names the offending edge as data, not as a formatted string. That is a durable API-shape difference and deliberately not a claim about any particulartf2defect; the misattributed-extrapolation one people cite (ros2/geometry2#832) was fixed by PR #896, merged 2026-03-18 and backported to Kilted, Jazzy and Humble (#897–#899). Marketing against a bug somebody already fixed is how a README goes stale in public.
Shared memory IPC is not a sandbox
Processes sharing a tf_tree arena are mutually trusting, same-user,
cooperating processes. A read-write participant can corrupt any part of the
arena, and no checksum would change that — it holds a writable mapping of the
same pages (PHASE2.md §3.10). Do not attach a process you
would not run as yourself. SECURITY.md draws the line between
this and an actual vulnerability.
Three things the design does guarantee, and they are the ones that matter on a robot:
- A read-only participant cannot corrupt anything, enforced by the MMU, not by convention. It is the default for consumers (D18), and it converts a class of whole-system failures into a single-process fault.
- A participant that crashes, at any instruction, cannot corrupt the arena or wedge anyone else. A killed writer's edge is reclaimed; a killed interner's entry is recoverable; a killed mutator does not leave a permanently locked topology.
- A participant that hangs cannot be mistaken for a crashed one. Liveness is
the kernel's answer about a file lock, not a heartbeat timeout, so a
SIGSTOPped publisher keeps its claims and a stalled one is never reaped out from under itself.
fork() is the sharp edge worth knowing about up front: the arena is mapped
MADV_DONTFORK, so a child has no mapping and every inherited handle reports
ChildDetached. Python's multiprocessing defaults to fork on Linux — open
inside the worker, or use the spawn start method. A frozen .tft is the
deliberate exception: it is a private read-only mapping, a child inherits it
intact, and poisoning it would break multiprocessing for offline users to
defend against a hazard they do not have (docs/PHASE5.md §4.3).
Workspace
crates/
├── tf_tree_math/ no_std SE(3)/SO(3) + dual quaternions; #![forbid(unsafe_code)]
├── tf_tree_arena/ no_std+alloc pointer-free arena + layout math
├── tf_tree_core/ no_std+alloc engine: interning, topology, seqlock buffers, plans
├── tf_tree/ std facade: builder, plan-cached lookup, Display errors
├── tf_tree_ipc/ zero-config rendezvous: runtime dir, OFD lock file, attach protocol
├── tf_tree_c/ C ABI + header-only C++ wrapper
├── tf_tree_bridge/ the ROS-independent half of the /tf ingest bridge
├── tf_tree_ingest/ MCAP -> arena: the two passes behind `ingest` and `freeze --from-bag`
├── tf_tree_py/ PyO3 bindings — binds the Rust core directly, not the C ABI
├── tf_tree_bench/ criterion benches, tf2 differential harness, the §9 report
├── tf_tree_tf2_sys/ the tf2 side of that differential harness — needs a ROS 2 install
└── tf_tree_cli/ binary `tf_tree` (alias `tft`): tree / echo / doctor / top /
ingest / freeze / topology / participants / bench
ros/ ament_cmake packages: the §5 rclcpp bridge, and the DDS comparison
xtask/ loom, miri, and bench-gate runners
docs/ PROJECT.md, API.md, PHASE1–5.md, RUNBOOK.md, benchmarks/, decisions/
tf_tree_py and tf_tree_tf2_sys are outside the cargo --workspace build on
purpose — they link libpython and a ROS 2 install respectively, neither of which
a clean checkout can assume. ros/ is outside it for the same reason and is not
cargo at all. Each has just recipes of its own (just py-*, just ros-build /
just ros-test, just tf2-check), which is what "gate locally" means for them.
Five crates are intended for crates.io: tf_tree, tf_tree_core,
tf_tree_math, tf_tree_arena, tf_tree_ipc. The rest carry publish = false
with the reason in their manifest.
Commands
just quickstart # clean clone -> a Python REPL with the extension installed
just build # cargo build --workspace --all-targets
just test # nextest + doctests
just lint # fmt --check + clippy -D warnings
just loom # concurrency model checking
just miri # UB checking (arena + core + the facade's one unsafe)
just bench # benchmark suite + go/no-go gate
just bench-report # the PHASE5 §9 artifact -> report/{results.json,index.html}
just bench-check # the same artifact against the committed baseline
just shm-torture # PHASE2 §11.4's multi-process soak (30 min; nightly)
just --list for everything.
Benchmarks, and what they are worth
just bench-report emits report/results.json and report/index.html with a
full provenance header. It is built so it cannot print a number it has no
right to: it probes the host, and a row it cannot measure fairly comes out
UNAVAILABLE with the reason and the command that produces it on a host that
can. On a 4-core development machine that means most rows are gaps — which is
the correct output, not a broken tool. docs/PHASE5.md §9.3 is the rule it
enforces, and it includes a "where tf_tree is worse" section, in the same
table.
just bench-check re-runs it and compares against the committed baseline in
crates/tf_tree_bench/baseline/results.json, failing if a claim was withdrawn,
a row was dropped, the arena layout changed, or a directional number moved past
the slack the baseline itself records. It compares claims, not hosts: CPU
model, core count, kernel, governor, load and every reason string are ignored,
so the gate means the same thing on any machine. just bench-baseline-update
regenerates the baseline; that diff belongs in the commit that causes it.
Standing numbers and their caveats live in
docs/benchmarks/.
Reading order
docs/PROJECT.md— overview, architecture, roadmap, and the decision log D1–D22 in §5.docs/API.md— the cross-cutting contract: six rules (§1) every binding obeys, and the §7 checklist a new surface passes. It is not a phase and authorizes nothing on its own.- The phase spec you care about:
PHASE1…PHASE5. Each opens with its own status table. docs/decisions/— the records for things the phase specs do not cover.
Contributing and support
CONTRIBUTING.md · SUPPORT.md (response
expectations, platform support, MSRV policy) ·
SECURITY.md · CODE_OF_CONDUCT.md
MSRV is 1.87. just msrv reads the number out of [workspace.package] rust-version, builds --locked on exactly that toolchain, and checks that
every hand-written rust-version — and this line — still agrees with it.
Licence
Dual MIT / Apache-2.0, at your option. See
NOTICE.
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file transform_tree-0.0.3.tar.gz.
File metadata
- Download URL: transform_tree-0.0.3.tar.gz
- Upload date:
- Size: 654.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c07f4029240677a15a24c681ccccb72a8e64a976bc4a9bd733b28d82cf095e14
|
|
| MD5 |
9ffd379faa83ce3b799aba28439bd961
|
|
| BLAKE2b-256 |
8cbe92167733738687939e7892f154ca98613c699b1f62f9f177e67af8c0deb6
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3.tar.gz:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3.tar.gz -
Subject digest:
c07f4029240677a15a24c681ccccb72a8e64a976bc4a9bd733b28d82cf095e14 - Sigstore transparency entry: 2515858912
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp314-cp314t-win_amd64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp314-cp314t-win_amd64.whl
- Upload date:
- Size: 314.8 kB
- Tags: CPython 3.14t, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0dd17203dda2e50f46ff11c90aa74bdefdb28142f5b4beebe56b5819c279f749
|
|
| MD5 |
5717a8e4b9a8ab0c58c443b04054d2c2
|
|
| BLAKE2b-256 |
4e7839af33a7b94d832a6fbf346609a40afcaab3ec3a7c8e8be513d9c1001588
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-win_amd64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp314-cp314t-win_amd64.whl -
Subject digest:
0dd17203dda2e50f46ff11c90aa74bdefdb28142f5b4beebe56b5819c279f749 - Sigstore transparency entry: 2515859223
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 467.1 kB
- Tags: CPython 3.14t, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2143e1a0bb35751a3ef8b534baacb68a7a7203b9d11460f051321fcb38f6e5b6
|
|
| MD5 |
d5c0b82332948fb1bcb5e00dc1c55558
|
|
| BLAKE2b-256 |
6f9e87b94465ea7b8ce62e9d292db590028968e69025f85776b0e227fd704f56
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_x86_64.whl -
Subject digest:
2143e1a0bb35751a3ef8b534baacb68a7a7203b9d11460f051321fcb38f6e5b6 - Sigstore transparency entry: 2515859150
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 444.3 kB
- Tags: CPython 3.14t, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ecc019bb407ee62b747b5ccff4b11edddc51d7a7ab7d1c7112b70168160ddf75
|
|
| MD5 |
2a1dff8a500a5b1b82db4f42ae7d621a
|
|
| BLAKE2b-256 |
2ee7f7a163679e82aae7c4195d507b4eae84ff584f10ba57dce584a4423a0c8c
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp314-cp314t-manylinux_2_28_aarch64.whl -
Subject digest:
ecc019bb407ee62b747b5ccff4b11edddc51d7a7ab7d1c7112b70168160ddf75 - Sigstore transparency entry: 2515858966
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl
- Upload date:
- Size: 359.7 kB
- Tags: CPython 3.14t, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8181187de7e843c240a9968fcf956ead567e9766cd72f908a1c7b85d1ade5f53
|
|
| MD5 |
2c325b1a2bfa6890fa8f2d6c7764df99
|
|
| BLAKE2b-256 |
e7211dedaf2ad0461b1ef6867eb4a8298e82fcecca5ec2b0ae2d0e2ce058b559
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp314-cp314t-macosx_11_0_arm64.whl -
Subject digest:
8181187de7e843c240a9968fcf956ead567e9766cd72f908a1c7b85d1ade5f53 - Sigstore transparency entry: 2515859124
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-win_amd64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-win_amd64.whl
- Upload date:
- Size: 328.7 kB
- Tags: CPython 3.9+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c46bbb8592b9cfe4dde705d7f78560cbe4674060f358820ff46bcfdad8c984d
|
|
| MD5 |
061f7b978d0d69199a77845097a3c590
|
|
| BLAKE2b-256 |
7f571c5e7d1e94b19c1cc9a0b775066af8f17b4c10d3ef781cd62f130fbc7753
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-win_amd64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-win_amd64.whl -
Subject digest:
2c46bbb8592b9cfe4dde705d7f78560cbe4674060f358820ff46bcfdad8c984d - Sigstore transparency entry: 2515859032
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 692.3 kB
- Tags: CPython 3.9+, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
cbac1d0e6383c3de1eb49b0b5990ae6658c9512224b4dd6e5d97dfd31cd1b82c
|
|
| MD5 |
5bf3f4c3e8ba92937fb0aae449ebacef
|
|
| BLAKE2b-256 |
05cb218050a18e0aed1c9967e6c7b41e0c230481f0a90dad49b3ffdc7289055c
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-musllinux_1_2_x86_64.whl -
Subject digest:
cbac1d0e6383c3de1eb49b0b5990ae6658c9512224b4dd6e5d97dfd31cd1b82c - Sigstore transparency entry: 2515859171
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl
- Upload date:
- Size: 631.2 kB
- Tags: CPython 3.9+, musllinux: musl 1.2+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
85ddd787fc68b334511ca1d164b2cf887212bc86e811f33d6c24471514d817c5
|
|
| MD5 |
65ac8cffd21be95938479883b5392b1d
|
|
| BLAKE2b-256 |
06e0dcba2d37993b6817254c0c656107bc46bb9914f7e07e8716cb6556bf9bae
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-musllinux_1_2_aarch64.whl -
Subject digest:
85ddd787fc68b334511ca1d164b2cf887212bc86e811f33d6c24471514d817c5 - Sigstore transparency entry: 2515859068
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 478.0 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
11b5cdf55327c6a647e28339188962b51b2705415d7b511e7532fae17b9a6b80
|
|
| MD5 |
bb249ed99af6cd53fd134b24a21faeb7
|
|
| BLAKE2b-256 |
532281212c6e7f68d0ba4288f69f8f98524a461df68627e70c9dd5bb8222b4eb
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-manylinux_2_28_x86_64.whl -
Subject digest:
11b5cdf55327c6a647e28339188962b51b2705415d7b511e7532fae17b9a6b80 - Sigstore transparency entry: 2515858940
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl
- Upload date:
- Size: 453.2 kB
- Tags: CPython 3.9+, manylinux: glibc 2.28+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ceaf69d6f06739320acfd14df1763d42fa53784453e22456fa84ac324f333dec
|
|
| MD5 |
cb276cbd0c6e0bd12d07207b227de756
|
|
| BLAKE2b-256 |
b5f1c5418ae7245efc0846de552f8dad18eb7833d5d8d2ffe8799b969458f2b5
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-manylinux_2_28_aarch64.whl -
Subject digest:
ceaf69d6f06739320acfd14df1763d42fa53784453e22456fa84ac324f333dec - Sigstore transparency entry: 2515859201
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 371.4 kB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d21a96f05be632475c66eb89c857ac4e76454d170fc4b31ac77f8e59fb9b10bb
|
|
| MD5 |
8409f72e14cece61fa4ad3881c71ff83
|
|
| BLAKE2b-256 |
9fdeb38e5edf2cd036af4506926bf66485609f1d980210a061fdf1ddf389a529
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-macosx_11_0_arm64.whl -
Subject digest:
d21a96f05be632475c66eb89c857ac4e76454d170fc4b31ac77f8e59fb9b10bb - Sigstore transparency entry: 2515859093
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type:
File details
Details for the file transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 389.1 kB
- Tags: CPython 3.9+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via:
twine/7.0.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a37262ddfc7d76497a937c97860035b886afd4b87965d21022cbcbfc888ed029
|
|
| MD5 |
42c62aa8f2d554e333750e379b02d6f9
|
|
| BLAKE2b-256 |
a11725f65a47a2a6f8fd2e2340b374b39601af7d76cc98ee99ebc1a028a7a128
|
Provenance
The following attestation bundles were made for transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl:
Publisher:
wheels.yml on NoeFontana/tf_tree
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
transform_tree-0.0.3-cp39-abi3-macosx_10_12_x86_64.whl -
Subject digest:
a37262ddfc7d76497a937c97860035b886afd4b87965d21022cbcbfc888ed029 - Sigstore transparency entry: 2515858994
- Sigstore integration time:
-
Permalink:
NoeFontana/tf_tree@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Branch / Tag:
refs/tags/v0.0.3 - Owner: https://github.com/NoeFontana
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
wheels.yml@783b17d4acc2eed53e3bbe6abfb806f5939cfa05 -
Trigger Event:
push
-
Statement type: