PyO3-backed Manyfold RFC scaffolding and in-memory runtime.
Project description
manyfold
This repository now contains a first-pass implementation scaffold for the
docs/rfc/wiregraph_rfc_rev2.md Manyfold RFC.
Layout
pyproject.toml: maturin/PyO3 Python packaging entrypointCargo.toml: Rust crate for the native core and Python extensionsrc/: Rust in-memory runtime, typed refs, descriptors, envelopes, mailboxes, queries, and control-loop stubspython/manyfold/: Python-facing ergonomic wrapper layerpython/manyfold/primitives.py: primary nouns and verbs for the Python APIpython/manyfold/components.py: convenient components built from graph primitivespython/manyfold/embedded.py: RFC 21 embedded device profile helpers and validationpython/manyfold/reference_examples.py: RFC 23 reference example suite registryexamples/: executable API examples that are also covered by the test suite
Status
This is an RFC stub implementation, not a production runtime. The current code focuses on:
- typed namespace/route/schema identity objects,
- explicit
ReadablePort,WritablePort,WriteBinding, andMailboxsurfaces, - descriptor and envelope scaffolding,
- graph-visible capacitor, resistor, and watchdog flow primitives,
- mailbox credit, overflow, and queue inspection helpers,
- guarded write scheduling with typed retry/backoff policies,
- explicit write-shadow reconciliation with RFC-shaped coherence taints,
- lifecycle bindings as specialized write/shadow bundles with auditable event and optional health routes,
- explicit demand-driven rate matching for bursty streams,
- watermark-aware event-time rolling windows and aggregations,
- stream-table lookup joins against materialized state views,
- route-level payload-demand accounting plus route-level payload-store retention semantics for lazy bulk payloads,
- explicit per-route replay/retention policy overrides in the Python layer,
- explicit taint-repair operators plus stream-bound taint and repair-note query inspection,
- explicit event-lineage inspection by route, trace id, causality id, or correlation id,
- route-local audit snapshots that summarize producers, subscribers, related write requests, and taint repairs,
- catalog/latest/topology/validation query helpers,
- a minimal
ControlLoopepoch stub, - Python object-first routes and shared-stream
ReadThenWriteNextEpochStepcomposition, - embedded device profile helpers for scalar and bulk sensors,
- a named reference example suite that tracks the RFC examples and runs the supported subset,
- Python bindings via PyO3 in the same layout as the referenced project style.
API Design Rules
The repository follows four implementation rules:
- write both very small examples and deeper behavioral tests;
- prefer extensive docstrings, targeted comments for non-obvious logic, and README-level guidance;
- add types aggressively and shape APIs around understandable objects rather than stringly calls;
- keep the top-level
manyfoldnamespace narrow, with advanced helpers living undermanyfold.graphand helper internals prefixed with_.
The intended Python wrapper surface is deliberately narrow:
- build a
TypedRoutewithOwnerName,StreamFamily,StreamName, andSchema - build a
ReadThenWriteNextEpochStepfrom a read stream and an output route graph.latest(route)for snapshot readsgraph.observe(route)for Rx subscriptionsgraph.publish(route, payload)for writesgraph.pipe(source, route)for wiring an Rx source into a routegraph.install(step)for attaching aReadThenWriteNextEpochStepgraph.run_control_loop(name)for advancing a control loop oncesource(route)andsink(route)for naming signal roles without adding runtime nodesgraph.capacitor(source=..., sink=..., capacity=..., demand=..., immediate=...)for active bounded storage that creates demand until fullgraph.resistor(source=..., sink=..., gate=..., release=...)for explicit pass-through, gated, or release-pulsed flow shapinggraph.watchdog(reset_by=..., output=..., after=..., clock=...)for missing-flow detection such as Raft election timeoutsgraph.flow_snapshot(route_or_port)for the current route credit viewgraph.describe_edge(source=..., sink=...)for RFC-ordered edge flow descriptor compositiongraph.configure_flow_defaults(FlowPolicy(...))for graph-wide edge flow defaultsgraph.configure_source_flow(route, FlowPolicy(...))for source-side edge defaultsgraph.configure_sink_flow(route, FlowPolicy(...))for sink-side edge requirementsgraph.scheduler_snapshot(route=None)for queued guarded-write state and retry gatesgraph.mailbox_snapshot(mailbox)for mailbox depth/overflow inspectiongraph.lifecycle(owner, family, intent_schema=...)for RFC-shaped device/runtime lifecycle bindingsgraph.configure_retention(route, RouteRetentionPolicy(...))for explicit replay/retention semanticsgraph.route_audit(route)for route-local producer/subscriber/write/taint audit summariesgraph.lineage(route=None, causality_id=..., correlation_id=...)for retained causality/correlation inspectiongraph.filter(source, predicate=...)for explicit typed metadata/value filteringgraph.window(source, size=..., trigger=..., partition_by=...)for rolling windows with optional trigger- and partition-scoped releasegraph.window_aggregate(source, size=..., aggregate=..., trigger=..., partition_by=...)for rolling window aggregations with explicit trigger and partition policygraph.window_by_time(source, width=..., watermark=..., partition_by=...)for event-time windows driven by explicit watermark progress with per-partition buffersgraph.window_aggregate_by_time(source, width=..., aggregate=..., watermark=..., partition_by=...)for watermark-aware event-time aggregations with partition-scoped stategraph.lookup_join(left, right_state, combine=...)for stream-table joins against materialized stategraph.interval_join(left, right, within=..., combine=...)for bounded streaming joinsFileStore(root).prefix(...)for FoundationDB-style byte keyspaces on local filesEventLog(name, keyspace, schema)for typed append/committed flow over a byte keyspaceSnapshotStore(name, keyspace, schema)for typed latest-value state over a byte keyspaceConsensus.install(graph, ...)for a default Raft-style leader-election component built from capacitors, resistors, and watchdogsMemory(path).remember(graph, route)andMemory(path).resume(graph, route)for disk-backed route memory
These route inputs are object-based rather than ad hoc strings. Schema also
owns payload encoding/decoding, so latest(route) and observe(route) can
return typed values instead of raw payload bytes.
ReadThenWriteNextEpochStep lives in the primary primitives module because it is
becoming a composition unit: it has one required input stream (read), one
required output route (output), and one shared derived stream (write). Any
subscriber to write observes the same emitted values that the graph sees when
the step is installed and started.
Why This Approach Is Useful
Manyfold is trying to make the moving parts of reactive systems visible without making application code feel like a distributed-systems paper. A normal event-driven program often hides the hardest questions in callbacks, queue names, string topics, and retry loops: who owns this signal, what schema is it, is the latest value replayable, what happens when the consumer is slower than the producer, did this write request take effect, and can we explain why this output exists?
The current approach turns those questions into graph-shaped objects. A
TypedRoute names a signal with an owner, family, stream, variant, plane, layer,
and schema. publish, latest, observe, and pipe give the small everyday
API. Capacitors, resistors, watchdogs, mailboxes, windows, joins, retention
policies, write shadows, taints, and lineage records then add behavior in places
where the graph can inspect it.
That is the sales pitch: instead of building a clever pipeline that becomes opaque as soon as it works, you build a flow that can be queried, audited, paused, shaped, replayed, and explained. The implementation in this repository is still an RFC scaffold, but the API direction is already concrete enough to show what kinds of systems this style can support.
Start Here: A Flow Story
Start with the smallest possible story. A device, model, service, or UI control has one thing to say. You give that signal a route. The route is not just a string topic; it carries ownership, stream identity, variant, plane, layer, and payload schema. When a producer publishes a value, the graph closes an envelope around it. When a consumer asks for the latest value, the schema decodes it back into the Python type the application expects.
That first step is deliberately boring. It should feel like saying, "here is a temperature value" or "here is the desired brightness." The important shift is that the graph now knows what the value is, where it belongs, and how to decode it. From there, the interesting control points become explicit instead of being buried in callback code.
Now imagine the consumer cannot keep up. A bursty sensor can publish ten values while the downstream display, planner, or actuator only wants one fresh value at a time. Add a capacitor. The capacitor is graph-visible bounded storage: it can coalesce, hold capacity, and create demand only when it has room. The program no longer has to pretend that "subscribe faster" is a flow-control strategy. The route can say, in the graph, "I have room for one more useful value."
Next, imagine the value is expensive or risky to open. A LiDAR scan, camera frame, debug trace, encrypted blob, or model artifact may have cheap metadata and large payload bytes. Route the metadata first, gate it with a resistor, and only open the payload route when some policy selects it. The graph can expose payload demand separately from metadata observation, which is exactly the distinction a real edge system needs when bandwidth, memory, privacy, or battery life matters.
Then add time. Watermarks make event-time progress explicit. A rolling window can buffer samples until the graph has seen enough time advance to release a meaningful aggregate. This is the difference between "sleep for a bit and hope the data arrived" and "release this window when the input stream has proven it has moved past the boundary."
Finally, add writes. A write request is not the same thing as reported device state, and neither is the same thing as the effective value the application should trust. Manyfold models that difference directly with request, shadow, reported, and effective routes. A control loop can read from one route, derive a write for the next epoch, and expose the shared write stream so observers see the same values the graph sees.
That is the mental model behind the examples: create a route, publish a value, shape demand, gate release, join streams, inspect time, and make writes auditable.
Use Cases Worth Building
Embedded sensor gateways. Manyfold is a natural fit for UART, SPI, BLE, CAN, and serial-adjacent systems where raw physical signals need to become logical application streams. A raw temperature sensor can feed a smoothed logical route. A battery monitor can publish cheap metadata frequently while storing bulk diagnostics behind lazy payload demand. A firmware bridge can declare mailbox capacity and overflow behavior instead of hiding those decisions inside a driver thread.
Robotics and perception. Sensor fusion is mostly a story about time, identity, and pressure. IMU streams, wheel odometry, camera frames, LiDAR metadata, pose estimates, and planner outputs all want separate route identities but shared lineage. Capacitors can stage fast producers. Event-time joins can bind accelerometer and gyro samples within a bounded interval. Lazy payload opening can keep full frames cold until a planner, debugger, or training capture actually asks for them.
Industrial control and actuator shadows. Desired, reported, and effective state are different facts. Treating them as separate routes makes brightness control, motor targets, valve positions, HVAC setpoints, and calibration changes much easier to reason about. The current write-binding and lifecycle surfaces point toward systems where every command can be traced from request through guarded scheduling to reported reconciliation.
Realtime dashboards. UI state is often a graph already: live counters,
health indicators, replayable status, operator commands, and debug panels are
all different views of the same flow. Manyfold's latest and observe calls
cover the common dashboard path, while route audit and lineage queries make it
possible to answer "why did the screen change?" without reconstructing history
from unrelated logs.
Edge AI and selective inference. Model pipelines often need to separate metadata routing from expensive tensor or media payloads. A camera can publish frame metadata, a policy route can decide which frames deserve inference, and a payload route can open only the selected bytes. Taint marks can label nondeterministic or privacy-sensitive transforms, while lineage records preserve which model input produced which output.
Distributed coordination. The default consensus component is intentionally small, but it shows why graph-visible primitives are useful for coordination. Election ticks, watchdog timeouts, request-vote messages, heartbeats, quorum state, and replicated log entries can be named routes instead of hidden channels. That makes the coordination mechanism inspectable and testable as a graph.
Streaming analytics without hidden magic. Windowed aggregates, lookup joins, interval joins, repartition plans, skew metrics, and retention policies are all places where a streaming system can surprise its users. Manyfold's approach is to surface those decisions as descriptors and snapshots. The goal is not just to produce a result, but to preserve enough structure to explain the cost and correctness envelope of that result.
Security, audit, and compliance flows. Some data is encrypted. Some payloads should be visible only to principals with explicit grants. Some values are nondeterministic, repaired, redacted, or derived from sensitive inputs. By tracking capabilities, taints, repair notes, and lineage as graph concepts, this approach gives a future implementation a place to enforce policy and a query surface to explain enforcement decisions.
The common thread across those use cases is that flow control, payload access, write intent, time, joins, and auditability are all first-class. That lets a small script grow toward a real runtime without changing the shape of the program every time another operational concern appears.
The examples/ directory is organized as a short path through the mental
model. Start with a route, add explicit demand, then move into joins,
watermarks, planning, and taint-aware runtime behavior. The supported
examples are validated by the regular unittest run so they do not drift
away from the API.
Start here: create one typed route and read it back
examples/simple_latest.py: Smallest publish/read-back example.
Control the flow: make downstream demand visible
examples/rate_matched_sensor.py: A one-slot capacitor coalesces bursty reads behind explicit demand.
Fuse streams: coordinate independent sensors
examples/imu_fusion_join.py: Capacitors stage accelerometer and gyro streams before an event-time join.
Reason in time: release data by watermark progress
examples/rolling_window_aggregate.py: A capacitor discharges samples behind explicit event-time watermarks.
Scale the graph: plan repartition work explicitly
examples/cross_partition_join.py: A repartition join with skew metrics and planner output.
Audit the hard parts: mark nondeterminism on purpose
examples/ephemeral_entropy_stream.py: Per-request entropy derivation that taints determinism explicitly.
More involved operator, query, transport, mesh, and security coverage stays
in tests/test_graph_reactive.py, with archived exploratory scripts kept
under examples/archived/. The example manifest, README featured-example
list, and RFC reference suite all derive from the shared example catalog,
so supported versus archived status lives in one place.
Best Practices
When extending this repository, prefer a narrow, explicit, well-documented API over a broad convenience surface.
- Write tests for every meaningful behavior change. Keep the smallest,
easiest-to-understand examples close to the usage they demonstrate in
examples/and mirror them with straightforward assertions intests/test_examples.py. Put more complex integration, reactive, and repository-level coverage in the rest of thetests/directory. - Write extensive docstrings and supporting documentation for public modules, classes, and functions. If a section of code is non-obvious, add a concise comment that explains the invariant, constraint, or design reason behind it.
- Always add types. Prefer signatures, return types, and data shapes that make the code self-describing, and keep pushing the API toward something a new reader can grok quickly without tracing through multiple layers of code.
- Only elevate essential concepts into the primary API. Keep helper functions and intermediate building blocks semi-private by default, and use a leading underscore liberally for methods and functions that support the implementation but should not become part of the stable surface area.
Verification
Use cargo test for native verification.
Use uv sync to provision the Python environment and build the extension into
the local .venv. Then run Python verification with uv run.
Typical Python commands:
uv run python -m unittest discover -s tests -p 'test_*.py'uv run python -m manyfold.rfc_checklist_gen --checkuv run manyfold-example-catalog --checkuv run manyfold-example-catalog --list referenceuv run python -m examples.catalog --check-manifestuv run python -m examples.catalog --check-readme
Generate PyO3 .pyi stubs with cargo run --features stub-gen --bin stub_gen.
If the default interpreter is older than Python 3.10, set PYO3_PYTHON to a
3.10+ interpreter first, for example
PYO3_PYTHON=/opt/homebrew/Cellar/python@3.14/3.14.3_1/Frameworks/Python.framework/Versions/3.14/bin/python3.14 cargo run --features stub-gen --bin stub_gen.
Regenerate the RFC implementation checklist with
uv run manyfold-rfc-checklist (or uv run python -m manyfold.rfc_checklist_gen).
The Python package now targets Python 3.10+ because reactivex==5.0.0a2
requires it.
Publishing
The package is configured for PyPI as manyfold using maturin and PyO3.
Release builds are handled by .github/workflows/pypi.yml, which publishes
through PyPI Trusted Publishing. The workflow builds an sdist plus Linux,
macOS Intel, macOS Apple Silicon, and Windows wheels.
Before publishing a release:
- make sure
versionmatches inpyproject.tomlandCargo.toml; - run
cargo test; - run
uv run python -m unittest discover -s tests -p 'test_*.py'; - run
uv run --with build python -m build; - run
uv run --with twine twine check dist/*.
For the first PyPI release, create a pending Trusted Publisher in PyPI:
- PyPI project name:
manyfold - Owner:
Organization5762 - Repository:
manyfold - Workflow filename:
pypi.yml - Environment name:
pypi
Then publish the GitHub release:
git tag v0.1.0
git push origin v0.1.0
Create a GitHub release from v0.1.0 and publish it. The release event runs
the PyPI workflow. You can also start the same workflow manually from GitHub
Actions with workflow_dispatch after the pending publisher exists.
Project details
Release history Release notifications | RSS feed
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 manyfold-0.1.9.tar.gz.
File metadata
- Download URL: manyfold-0.1.9.tar.gz
- Upload date:
- Size: 221.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ec2d37fc6901e959bc5b9a841ebef884d733f05f180e81b18abbbfd710e47e80
|
|
| MD5 |
e7d14e2b87b92bbe4228c1048f839728
|
|
| BLAKE2b-256 |
16b2782507783f34833574f73d3e89188b1cd5625b771fb1b67f621f0e9c062f
|
Provenance
The following attestation bundles were made for manyfold-0.1.9.tar.gz:
Publisher:
pypi.yml on Organization5762/manyfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
manyfold-0.1.9.tar.gz -
Subject digest:
ec2d37fc6901e959bc5b9a841ebef884d733f05f180e81b18abbbfd710e47e80 - Sigstore transparency entry: 1432643667
- Sigstore integration time:
-
Permalink:
Organization5762/manyfold@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Organization5762
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Trigger Event:
release
-
Statement type:
File details
Details for the file manyfold-0.1.9-cp310-abi3-win_amd64.whl.
File metadata
- Download URL: manyfold-0.1.9-cp310-abi3-win_amd64.whl
- Upload date:
- Size: 387.1 kB
- Tags: CPython 3.10+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1704815a5ac296a9b3f76b070dba63b73181b84761b3b742f0dbfc49dd2d69b0
|
|
| MD5 |
b387b59888bf02c1a3b7a4378ef6fedf
|
|
| BLAKE2b-256 |
0f589d52a973eedc25a2a22dcfa58ddcbb8a6f2553f1a0f35f680fe77ab60f4d
|
Provenance
The following attestation bundles were made for manyfold-0.1.9-cp310-abi3-win_amd64.whl:
Publisher:
pypi.yml on Organization5762/manyfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
manyfold-0.1.9-cp310-abi3-win_amd64.whl -
Subject digest:
1704815a5ac296a9b3f76b070dba63b73181b84761b3b742f0dbfc49dd2d69b0 - Sigstore transparency entry: 1432643922
- Sigstore integration time:
-
Permalink:
Organization5762/manyfold@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Organization5762
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Trigger Event:
release
-
Statement type:
File details
Details for the file manyfold-0.1.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: manyfold-0.1.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 549.1 kB
- Tags: CPython 3.10+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fc73f3998c1ef5c67bda4e97d45e37135290c0bfc1630cf7ad3059fe8a269681
|
|
| MD5 |
bc84241d494ff7395a0d40f2515b85a8
|
|
| BLAKE2b-256 |
8d64b7c080bb054821fdfe7c02a5ff429f9c34eb3be04dabc93df43012aab5df
|
Provenance
The following attestation bundles were made for manyfold-0.1.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
pypi.yml on Organization5762/manyfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
manyfold-0.1.9-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
fc73f3998c1ef5c67bda4e97d45e37135290c0bfc1630cf7ad3059fe8a269681 - Sigstore transparency entry: 1432643729
- Sigstore integration time:
-
Permalink:
Organization5762/manyfold@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Organization5762
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Trigger Event:
release
-
Statement type:
File details
Details for the file manyfold-0.1.9-cp310-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: manyfold-0.1.9-cp310-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 502.9 kB
- Tags: CPython 3.10+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c08fc433b91c945397784b5c8715e754be4f22ce046e60a19a0a3d3ce597931b
|
|
| MD5 |
7639d5f85bfe84d96aaaaa4e50445065
|
|
| BLAKE2b-256 |
dca9e46f0e9752b33830b7c1711f369eb72911ef9e81facb20f36c135bd3f75c
|
Provenance
The following attestation bundles were made for manyfold-0.1.9-cp310-abi3-macosx_11_0_arm64.whl:
Publisher:
pypi.yml on Organization5762/manyfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
manyfold-0.1.9-cp310-abi3-macosx_11_0_arm64.whl -
Subject digest:
c08fc433b91c945397784b5c8715e754be4f22ce046e60a19a0a3d3ce597931b - Sigstore transparency entry: 1432643843
- Sigstore integration time:
-
Permalink:
Organization5762/manyfold@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Organization5762
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Trigger Event:
release
-
Statement type:
File details
Details for the file manyfold-0.1.9-cp310-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: manyfold-0.1.9-cp310-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 509.9 kB
- Tags: CPython 3.10+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d6a8a838e6feb8c20fbd15faf0b35935e7f5a5bcf1106f775bd1d8b9b64fe973
|
|
| MD5 |
e3ef80f41865c74df58adfdca2187d0a
|
|
| BLAKE2b-256 |
a9878edafe854b7bdfdf9ae34626cf369d03aa208f8e9018017267afda68a482
|
Provenance
The following attestation bundles were made for manyfold-0.1.9-cp310-abi3-macosx_10_12_x86_64.whl:
Publisher:
pypi.yml on Organization5762/manyfold
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
manyfold-0.1.9-cp310-abi3-macosx_10_12_x86_64.whl -
Subject digest:
d6a8a838e6feb8c20fbd15faf0b35935e7f5a5bcf1106f775bd1d8b9b64fe973 - Sigstore transparency entry: 1432643792
- Sigstore integration time:
-
Permalink:
Organization5762/manyfold@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Branch / Tag:
refs/tags/v0.1.9 - Owner: https://github.com/Organization5762
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@e2d92e23def3e76b5fc0a02ed42d1d9d9b294985 -
Trigger Event:
release
-
Statement type: