Event-sourced agent engine — CLI and Python bindings for auditable AI workflows
Project description
zymi-core
Event-sourced agent engine for auditable AI workflows — Rust core, Python bindings, YAML configs.
zymi-core helps you build agent workflows you can inspect after the fact. Every run is recorded as an immutable event stream in SQLite, agent side effects are mediated through intentions and boundary contracts, and pipelines execute as DAGs with parallel steps when possible.
Highlights
- Auditable by default: every state change is persisted as an event with hash-chain verification.
- Safer side effects: agents emit intentions first; contracts and approvals decide what is allowed to execute.
- Practical workflows: define agents and DAG pipelines in YAML, then run them from a small CLI.
- Declarative custom tools: add HTTP and shell tools in
tools/*.yml— no Rust code required.zymi initincludes a working example. - MCP client built in: drop any Model Context Protocol server into
project.ymland its tools appear asmcp__<server>__<tool>— no per-tool schema authoring. Probe new servers withzymi mcp probe. - Flexible integration points: use the Rust crate, Python bindings, or both — Python can drive pipelines directly via
Runtime.for_project(...).run_pipeline(...), no subprocess. - LLM-provider ready: OpenAI-compatible providers, Anthropic support, Python tools, and LangFuse event services.
- Automatic context management: observation masking compresses older tool results in-place (~2x cost reduction, no extra LLM calls), with LLM summarization as a graduated fallback when the context grows further.
- JSON Schemas for configs:
zymi schema project|agent|pipeline|tooloutputs draft-07 JSON Schema for IDE autocomplete and LLM-assisted config generation.
Installation
| If you want to... | Install with... |
|---|---|
| CLI + Python bindings | pip install zymi-core |
| Rust crate only | zymi-core = "0.2" |
pip install zymi-core gives you both the zymi CLI command and the zymi_core Python module.
Quick Start
# Install
pip install zymi-core
# Create a demo project
mkdir zymi-demo
cd zymi-demo
zymi init --example research
# Add your LLM provider config to project.yml, then run the pipeline
zymi run research -i topic="event sourcing"
# Inspect what happened
zymi events --limit 20
zymi verify
For example, this is enough to get started with OpenAI:
llm:
provider: openai
model: gpt-4o
api_key: ${env.OPENAI_API_KEY}
What this gives you:
project.ymlfor provider config, policies, contracts, and defaultsagents/for agent definitionspipelines/for DAG workflowstools/web_search.yml— a declarative tool example, ready to wire up to a search provider.zymi/events.dbfor the append-only event logoutput/andmemory/directories in the research example
Common CLI commands
zymi init --name my-project
zymi init --example research
zymi init --example mcp # scaffold a project wired to an MCP server
zymi run main -i task="Summarize the architecture"
zymi run research -i topic="Rust event sourcing"
# Probe any MCP server without a project dir — see what it advertises
zymi mcp probe fetch -- uvx mcp-server-fetch
# Long-running mode: react to PipelineRequested events from any process
zymi serve research
zymi events
zymi events --stream conversation-1
zymi events --stream conversation-1 --verbose
zymi events --kind tool_call_completed --raw
zymi verify
zymi verify --stream conversation-1
# Discover what's in the project / what has run
zymi pipelines
zymi runs # all runs, newest first
zymi runs --pipeline research --limit 20
# Interactive 3-panel TUI: runs ▸ pipeline graph ▸ events
# Inside: Tab cycles panels, Enter expands, f follows tail,
# Shift+R on a graph node forks-resumes from that step.
zymi observe
zymi observe --run pipeline-research-abc123
# Fork-resume an earlier run from a chosen step (ADR-0018).
# Steps upstream of the fork are frozen — their events are copied verbatim;
# the fork step + DAG-descendants re-run against the current configs on disk.
zymi resume pipeline-research-abc123 --from-step writer
zymi resume pipeline-research-abc123 --from-step writer --dry-run # preview only
# JSON Schema for configs (useful for IDE autocomplete / LLM generation)
zymi schema project
zymi schema --all
Project Layout
A zymi project is just a directory with YAML files:
my-project/
project.yml
agents/
default.yml
pipelines/
main.yml
tools/ # declarative custom tools
web_search.yml
.zymi/
events.db
The default scaffold created by zymi init is intentionally small:
# project.yml
name: my-project
version: "0.1"
defaults:
timeout_secs: 30
max_iterations: 10
policy:
enabled: true
allow: ["ls *", "cat *", "echo *"]
deny: ["rm -rf *"]
# optional — tune context window budget
runtime:
context:
observation_window: 10
soft_cap_chars: 400000
hard_cap_chars: 600000
min_tail_turns: 4
# agents/default.yml
name: default
description: "Default agent"
tools:
- web_search
- read_file
- write_memory
max_iterations: 10
# pipelines/main.yml
name: main
steps:
- id: process
agent: default
task: "${inputs.task}"
input:
type: text
output:
step: process
The default scaffold also creates tools/web_search.yml — a declarative tool with a shell placeholder and commented-out configs for Brave Search, SerpAPI, and Google Custom Search. Uncomment one, set the API key, and the agent's web_search tool starts returning real results.
Declarative Custom Tools
Drop a YAML file into tools/ to give your agents new capabilities without writing code:
# tools/slack_post.yml
name: slack_post
description: "Post a message to a Slack channel"
parameters:
type: object
properties:
channel:
type: string
text:
type: string
required: [channel, text]
implementation:
kind: http
method: POST
url: "https://slack.com/api/chat.postMessage"
headers:
Authorization: "Bearer ${env.SLACK_TOKEN}"
Content-Type: "application/json"
body_template: '{"channel": "${args.channel}", "text": "${args.text}"}'
Then reference it in an agent:
# agents/notifier.yml
name: notifier
tools:
- web_search
- slack_post # ← the custom tool
${env.*} variables are resolved at parse time; ${args.*} are resolved at call time from the LLM's arguments. Name collisions with built-in tools are a hard error.
MCP Servers
Declarative tools cover HTTP and shell. For everything more involved — a filesystem sandbox, a git client, a search index, a proprietary API with its own protocol quirks — Model Context Protocol servers are already a large and growing catalogue, and zymi-core speaks the protocol out of the box.
One entry in project.yml:
mcp_servers:
- name: fs
command: [npx, -y, "@modelcontextprotocol/server-filesystem", ./sandbox]
allow: [read_text_file, write_file, list_directory] # optional whitelist
init_timeout_secs: 15
call_timeout_secs: 30
restart:
max_restarts: 2
backoff_secs: [1, 5]
And the agent gets the tools under a namespaced prefix — no per-tool YAML, no Rust, the definitions come from the server's tools/list at startup:
# agents/default.yml
tools:
- mcp__fs__read_text_file
- mcp__fs__write_file
- mcp__fs__list_directory
zymi run boots declared servers, waits for their handshakes, and publishes mcp_server_connected { server, tool_count }; on shutdown each server gets mcp_server_disconnected { reason }. Every tool call is the usual tool_started / tool_finished pair — the audit trail is identical to any other tool. Only env vars named under env: reach the child process (one exception: PATH is auto-forwarded so npx / uvx / python resolve), per ADR-0023.
Try it end-to-end:
mkdir zymi-mcp-demo && cd zymi-mcp-demo
zymi init --example mcp
export OPENAI_API_KEY=sk-...
zymi run main -i task="List everything in the sandbox, then write notes.md summarising it."
Before wiring a new server into project.yml, probe it:
zymi mcp probe <name> -- <command> [args...]
# Examples:
zymi mcp probe fs -- npx -y @modelcontextprotocol/server-filesystem /tmp
zymi mcp probe fetch -- uvx mcp-server-fetch # keyless
zymi mcp probe gh --env GITHUB_PERSONAL_ACCESS_TOKEN=ghp_... \
-- npx -y @modelcontextprotocol/server-github
probe spawns the server, completes the MCP handshake, prints one line per advertised tool, and shuts down cleanly — use its output to pick your allow: whitelist.
Python Bindings
The same pip install zymi-core that gives you the CLI also exposes a Runtime for running pipelines directly, plus the lower-level Event, EventBus, EventStore, Subscription, and ToolRegistry primitives for custom integrations.
Run a pipeline from Python
from zymi_core import Runtime
# Loads project.yml + agents/ + pipelines/ from the given directory and
# builds the same Runtime `zymi run` and `zymi serve` use. `approval` is
# either "terminal" (fail-closed prompt on stdin, matches `zymi run`) or
# "none" (intentions tagged RequiresHumanApproval resolve to a deny).
rt = Runtime.for_project(".", approval="terminal")
result = rt.run_pipeline("research", {"topic": "rust event sourcing"})
print(result.success, result.final_output)
for step in result.step_results:
print(step.step_id, step.iterations, step.success)
rt.bus() and rt.store() hand out Python wrappers over the runtime's
own Arcs, so any subscriber you attach there sees exactly the events
the handler publishes — there is no second bus over the same SQLite file.
Tool registry and event primitives
from zymi_core import ToolRegistry
registry = ToolRegistry()
@registry.tool
def search(query: str) -> str:
return f"Results for: {query}"
result = registry.call("search", '{"query":"rust async"}')
intention_json = registry.to_intention("search", '{"query":"rust async"}')
definitions = registry.definitions()
For lower-level event primitives the same package gives you the event store and bus directly:
from zymi_core import Event, EventBus, EventStore
store = EventStore("./events.db")
bus = EventBus(store)
subscription = bus.subscribe()
event = Event(
stream_id="conversation-1",
kind={"type": "UserMessageReceived", "data": {
"content": {"User": "Hello"},
"connector": "python",
}},
source="python",
)
bus.publish(event)
received = subscription.try_recv()
Multi-Process Integration (Django, Celery, scripts)
The Python wrapper for EventStore opens the same SQLite file the Rust
side uses. There is no second IPC channel — events written from one
process are visible to every other process that opens the same store, and
a long-running zymi serve picks them up via a polling tail watcher
(see ADR-0012).
The canonical pattern: a web app publishes a PipelineRequested event,
zymi serve runs the pipeline, and the result comes back as a
PipelineCompleted event with the same correlation_id.
Terminal A — long-running Rust service:
cd my-zymi-project
zymi serve research
Terminal B — any Python process (e.g. a Django view):
import uuid
from zymi_core import Event, EventBus, EventStore
store = EventStore(".zymi/events.db")
bus = EventBus(store)
correlation_id = str(uuid.uuid4())
sub = bus.subscribe_correlation(correlation_id)
event = Event(
stream_id=f"web-req-{correlation_id}",
kind={"type": "PipelineRequested", "data": {
"pipeline": "research",
"inputs": {"topic": "rust event sourcing"},
}},
source="django",
)
event.with_correlation(correlation_id)
bus.publish(event)
# Block until the serve process publishes PipelineCompleted with the
# same correlation_id (timeout in seconds).
result = sub.recv(timeout_secs=300)
print(result.kind) # {"type": "PipelineCompleted", "data": {...}}
Because the SQLite store is the single source of truth, you also get
free auditing: zymi events --stream web-req-... shows everything that
happened during the run, and zymi verify checks the hash chain.
Inside zymi serve the PipelineRequested → RunPipeline translation is
done by EventCommandRouter (see
ADR-0013). It is re-exported
from zymi_core::runtime, so if you are building your own scheduler or
bot adapter you can wire the same router against your own Runtime
without copy-pasting cli/serve.rs.
Rust Crate
Add the crate to your Cargo.toml:
[dependencies]
zymi-core = "0.2"
Example:
use std::sync::Arc;
use zymi_core::{open_store, Event, EventBus, EventKind, Message, StoreBackend};
let store = open_store(StoreBackend::Sqlite { path: "events.db".into() })?;
let bus = EventBus::new(store.clone());
let mut rx = bus.subscribe().await;
let event = Event::new(
"conversation-1".into(),
EventKind::UserMessageReceived {
content: Message::User("Hello".into()),
connector: "cli".into(),
},
"cli".into(),
);
bus.publish(event).await?;
let received = rx.recv().await.unwrap();
assert_eq!(received.kind_tag(), "user_message_received");
let verified_count = store.verify_chain("conversation-1").await?;
For cross-process delivery in your own binary, spawn a StoreTailWatcher
on the same store/bus — it polls for events written by other processes
and fans them out into local subscribers without re-persisting them:
use std::time::Duration;
use zymi_core::StoreTailWatcher;
let watcher = StoreTailWatcher::new(store.clone(), bus.clone())
.with_interval(Duration::from_millis(100))
.spawn();
// ... later, on shutdown:
watcher.stop().await;
How It Works
zymi-core is built around a small set of ideas:
- Every meaningful state change becomes an event. The SQLite event store is the source of truth.
- Agents express intentions, not side effects. Intentions are evaluated against boundary contracts before execution.
- Pipelines are DAGs. Independent steps can run in parallel, while dependencies remain explicit.
- Context is event-sourced too. The agent's working context is reassembled from the event log each iteration — older observations are masked automatically, and hybrid compaction kicks in when the budget is exceeded.
- Runs stay replayable. You can inspect events with
zymi events --stream <id>and verify hash-chain integrity withzymi verify. - Custom tools are declarative. HTTP tools live in
tools/*.ymland are dispatched at runtime — no Rust code, no rebuild.
Core intention types include ExecuteShellCommand, WriteFile, ReadFile, WebSearch, WebScrape, WriteMemory, SpawnSubAgent, and CallCustomTool.
Feature Flags (Rust crate)
The pip wheel ships with python and cli enabled. These flags are relevant when depending on the Rust crate directly.
| Feature | Description |
|---|---|
python |
PyO3 bindings for the _zymi_core Python extension module |
cli |
The zymi CLI binary |
runtime |
Async runtime and HTTP dependencies used by runtime integrations |
webhook |
HTTP approval handler built on Axum |
services |
Event-bus services such as LangFuse |
Development
cargo test
cargo test --features services,webhook
cargo clippy -- -D warnings
cargo clippy --features services -- -D warnings
maturin develop --features python,cli
License
MIT
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 zymi_core-0.2.2.tar.gz.
File metadata
- Download URL: zymi_core-0.2.2.tar.gz
- Upload date:
- Size: 796.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f59415b5bd33f826e82e6b7fdae4afa9ef7868b36e059cb04e4f8900ad9fc1e0
|
|
| MD5 |
9c1d8b6c19f7c5b6f99e083e9abea1e6
|
|
| BLAKE2b-256 |
9b11bb7569dbeb7c974aa507d2acc255bcd643ac461ffc4803f9636c91adb615
|
Provenance
The following attestation bundles were made for zymi_core-0.2.2.tar.gz:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.2.2.tar.gz -
Subject digest:
f59415b5bd33f826e82e6b7fdae4afa9ef7868b36e059cb04e4f8900ad9fc1e0 - Sigstore transparency entry: 1347952665
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.2.2-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: zymi_core-0.2.2-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 4.7 MB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d7f3ffaf52335e73d860f55232bf9625e2dd01d04eb16d88d97d61b39a542e9d
|
|
| MD5 |
223eafe802669590a0145b5373ef978a
|
|
| BLAKE2b-256 |
a50c00f61b9d76bfcb971cfa03b834c506e7332575b5be0ae6dbd0b335675f3b
|
Provenance
The following attestation bundles were made for zymi_core-0.2.2-cp311-cp311-win_amd64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.2.2-cp311-cp311-win_amd64.whl -
Subject digest:
d7f3ffaf52335e73d860f55232bf9625e2dd01d04eb16d88d97d61b39a542e9d - Sigstore transparency entry: 1347952671
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: zymi_core-0.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 4.6 MB
- Tags: CPython 3.11, 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 |
984973be617aecfe0a951f8d7d1a056fcb6a641cb35225976a2a567f46c569be
|
|
| MD5 |
df995c412e183dff3f3ecf9213a39af8
|
|
| BLAKE2b-256 |
f3c14597d9add88db6f0d92a6daa0b424f912a2e7d3404c6cde7737e04093127
|
Provenance
The following attestation bundles were made for zymi_core-0.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.2.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl -
Subject digest:
984973be617aecfe0a951f8d7d1a056fcb6a641cb35225976a2a567f46c569be - Sigstore transparency entry: 1347952680
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: zymi_core-0.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 4.3 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9100b77b691b5c95f42afa2215e30697fe071e4dadc5aa253969198c21083ad3
|
|
| MD5 |
83e78d1c2b48bba1e052d0ae6d0c9edd
|
|
| BLAKE2b-256 |
57321018c7826d3a50081321bee2b22734d4d4c33caa70e9b4f40c7fbf2b4341
|
Provenance
The following attestation bundles were made for zymi_core-0.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.2.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl -
Subject digest:
9100b77b691b5c95f42afa2215e30697fe071e4dadc5aa253969198c21083ad3 - Sigstore transparency entry: 1347952681
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: zymi_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 4.2 MB
- Tags: CPython 3.11, 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 |
f2bd4a4ffa47206b4642eb6101fa8442c05bf8e2ccc05276456cb10f3c5d78d8
|
|
| MD5 |
7edf0eb20f5101dbc6139568ca7c26f1
|
|
| BLAKE2b-256 |
2e6c4a81f615d6108cbe2c302f781716137f45d37825dfaa89cdbd23172e75df
|
Provenance
The following attestation bundles were made for zymi_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.2.2-cp311-cp311-macosx_11_0_arm64.whl -
Subject digest:
f2bd4a4ffa47206b4642eb6101fa8442c05bf8e2ccc05276456cb10f3c5d78d8 - Sigstore transparency entry: 1347952676
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Trigger Event:
push
-
Statement type:
File details
Details for the file zymi_core-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl.
File metadata
- Download URL: zymi_core-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl
- Upload date:
- Size: 4.4 MB
- Tags: CPython 3.11, 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 |
69e819b19d22186e45981134580f0266ea14a8f7db3656102abc8d177e0a2e3c
|
|
| MD5 |
656d60850616f93f8c8efb187b1db000
|
|
| BLAKE2b-256 |
7801142a5385be56f4d02a5e11c2d2d26bbb9da5ea90b92538bbedf3215b8854
|
Provenance
The following attestation bundles were made for zymi_core-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl:
Publisher:
release.yml on metravod/zymi-core
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
zymi_core-0.2.2-cp311-cp311-macosx_10_12_x86_64.whl -
Subject digest:
69e819b19d22186e45981134580f0266ea14a8f7db3656102abc8d177e0a2e3c - Sigstore transparency entry: 1347952673
- Sigstore integration time:
-
Permalink:
metravod/zymi-core@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Branch / Tag:
refs/tags/v0.2.2 - Owner: https://github.com/metravod
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@b127f08ce00e95b91a4f10b7c6be3f158cc7761b -
Trigger Event:
push
-
Statement type: