This release is a pre-release and may not be stable for production use.
tuvl
/ˈtuːvəl/ · തൂവൽ · feather
Typed workflows of agents — code, database/HTTP/MCP tools, rules, models,
bounded tool loops and people — on a durable, journaled runtime,
built spec-first and served as REST, SSE and MCP.
tuvl 2.0 is a redesign with no 1.x compatibility layer — see the CHANGELOG. Versions follow SemVer.
A tuvl workflow is a graph of agents. Each agent has a typed contract — inputs, outputs, the
signals it emits — and an engine that implements it:
| Engine | Determinism | |
|---|---|---|
code |
a Python function | deterministic |
tool |
a database, HTTP, blob storage or MCP operation | deterministic |
decide |
ordered rules, then an optional decision model | deterministic → bounded |
llm |
one structured model call | bounded |
loop |
a model using tools within hard budgets | bounded |
map |
a workflow run once for every item of a list | as the child |
human |
a form for a person | external |
pending |
a contract waiting for an implementation | — |
Signals route to the next agent or a named end. tuvl lint project checks contracts, data flow, types
and policy statically and prints each workflow's determinism profile and worst-case token cost. Every
run is durable and journaled: it survives restarts, waits for people, can be paused, stepped and
steered, and can be pinned and replayed as a zero-token test fixture.
kind: Workflow
version: tuvl/v2
metadata: { name: refund_flow, description: Handle a refund request }
spec:
models: [Order, Refund]
trigger:
http: { path: /api/refunds, method: POST }
input: { order_id: uuid, reason: str }
agents:
- id: load_order
description: Load the order
engine: tool
inputs: { order_id: uuid }
outputs: { order: Order }
tool: { use: db, model: Order, op: read, where: { id: "{{ order_id }}" } }
routes: { default: triage, not_found: END.missing, error: END.failed }
- id: triage
description: Decide how the refund is handled
engine: decide
inputs: { order: Order, reason: str }
outputs: { lane: "enum[auto, review]" }
decide:
rules:
- { when: "order.total > 500", then: review }
- { when: "true", then: auto }
routes: { auto: issue_refund, review: approval, error: END.failed }
# … issue_refund (code), approval (human)
outputs:
default: { status: 200, body: { refund_id: "{{ refund.id }}" } }
missing: { status: 404, body: { error: unknown order } }
failed: { status: 500, rollback: true, body: { error: refund failed } }
Install
uv tool install "tuvl[standard]" # CLI + Insight (dev UI)
# or, in a project
uv add "tuvl[standard]"
tuvl alone is the production server; [standard] adds Insight, served only in dev mode, and the
development tools (tuvl generate code, tuvl run tests, tuvl serve mcp). Features with their own packages are
extras: tuvl[mcp], tuvl[redis], tuvl[vector], tuvl[otel-grpc]. tuvl ship installs only the ones a project uses.
Quick start
tuvl init demo --sample --preset gemini -y # a ticket-triage project with a spec, tests and a lock
cd demo
tuvl lint project --strict # contracts, data flow, cost
tuvl run tests # offline tests
tuvl dev --auto-login # Insight at http://localhost:8885/insight
Spec-driven
tuvl create spec refund-automation # write the intent (Markdown, with checked Data and Flows)
tuvl lint spec # is the spec complete and consistent? (zero tokens)
tuvl verify spec # does the implementation match it, step by step?
tuvl list tasks # task statuses, derived — never typed in
tuvl generate code # schemas, code stubs, tests (no model)
The coding agent builds; tuvl referees. Every step above is deterministic and spends no tokens.
Coding agents get the same operations over MCP (tuvl serve mcp) and a skill set in .agents/skills/.
The CI gate:
tuvl lint project --strict && tuvl generate code --check && tuvl verify lock && tuvl run tests && tuvl list tasks --strict
Authoring with your coding agent
Already have Claude Code, Codex or Gemini CLI? tuvl can drive it from an idea to a packaged project, and accept only what its own checks (no model in the loop) pass:
tuvl import idea brief.pdf # IDEA-SK-0004: a numbered, immutable copy of the brief
tuvl generate spec --idea IDEA-SK-0004 # your agent drafts SPEC-SK-0004-01 on a branch; a person approves it
tuvl approve spec SPEC-SK-0004-01 && tuvl generate tasks SPEC-SK-0004-01
tuvl generate code --spec SPEC-SK-0004-01 --all # models and skeletons first, then your agent, one PR per task
tuvl review code && tuvl ship --format both # gate, image and a runnable archive
tuvl dev shows the same path in a terminal UI, and every step is in a local audit ledger. Details:
docs/authoring.md.
Surfaces
- REST + SSE: each workflow's route,
POST /api/workflows/{name}/runs, runs, journal events, approvals, operator control; OpenAPI generated from the contracts. - MCP export:
trigger.mcp.enabledlists a workflow as a tool on/mcp. - TypeScript:
@tuvl/clientwithnpx tuvl-client generatefor typed inputs and outputs. - Insight: specs and task board, workflow canvas, runs with breakpoints, step mode and approvals, change-engine checks against pinned fixtures, judge calibration.
Production
tuvl generate lock && tuvl ship --tag registry/app:1.0 # gates, Dockerfile (pinned tuvl + only the extras you use), Helm chart
tuvl serve app --role api # or: worker — scale HTTP and execution separately
Ed25519-signed JWT auth, default-deny triggers, scoped CRUD, approvals with no self-approval, secure fields kept away from models, optional Postgres row-level multi-tenancy.
Documentation
tuvl.dev · in this repository: agentic manual, runtime, engines, decide, loop and tools, judges, storage, models, spec-driven, Insight, API, CLI, security, observability.
License & contributing
tuvl is licensed under the Apache License, Version 2.0 — see LICENSE and NOTICE. It is free to use, modify and distribute, with an express patent grant. The name "tuvl" and the logos are not licensed for use as a brand (Apache-2.0 §6).
Releases up to and including 2.0.0b4 were published under the MIT License and remain available
under it. Starting with 2.0.0b5 tuvl is Apache-2.0; see the changelog.
Development currently happens in a private repository, so the full source is not yet publicly browsable. This is temporary: the complete codebase will be published openly in a future release. In the meantime the project is open to contribution — bug reports, feature proposals, and patches are all welcome. See CONTRIBUTING to get started, or reach out at developer@tuvl.io.
Metadata
Release files for tuvl 2.0.0b9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| tuvl-2.0.0b9.tar.gz | 1.4 MB | With provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| tuvl-2.0.0b9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 2.1 MB
Release files / tuvl-2.0.0b9.tar.gz
| Download URL | tuvl-2.0.0b9.tar.gz |
|---|---|
| Size | 1.4 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8df06c0cd37f00c979317fd48fe35949f6de70affc0a6f7d4195ecba7d546b2a
|
|
BLAKE2b-256 checksum How to use checksums |
10fc7872267ea20e78fee6b4ee669779239e9993489f9c0389425c034bf87d7a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logRelease files / tuvl-2.0.0b9-py3-none-any.whl
| Download URL | tuvl-2.0.0b9-py3-none-any.whl |
|---|---|
| Size | 700.0 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
86f91db3f8b15931701ce2bfd2a11c9ea2f649c655243c07e34fc48294069e22
|
|
BLAKE2b-256 checksum How to use checksums |
67c0d1744426e1c15899575deb827124268017a34cbe0d45e0608b1f5387ca84
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
uv/0.13.5 {"installer":{"name":"uv","version":"0.13.5","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"macOS","version":null,"id":null,"libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logSecurity for tuvl 2.0.0b9
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
Full provenance
All 2 files in this release have been uploaded with provenance metadata.
Attestation for tuvl-2.0.0b9.tar.gz
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Oct 24, 2026.
Transparency logA note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.