Skip to main content

Ocura OSS

A local execution ledger for recording, branching, and comparing command runs.

Record a baseline, explain the next variation, and keep its result connected to the original run. Ocura OSS stores command arguments, outcomes, timing, output logs, declared parameters, and branch lineage in your project. It verifies the relevant records and logs before branching or comparing them.

Use it from your terminal, Python scripts, or an AI agent with a shell. The CLI provides JSON output throughout the workflow; the Python API returns typed results.

Why use it

Ocura OSS is built to just work. It aims to be the easiest way to start recording runs in a new project, especially for local development:

  • Dependency free. It needs Python 3.11 or later and nothing else. Installing it adds no runtime dependencies to your project.
  • Easy setup. pip install ocura-oss, then ocura-oss init. There is no server, database, account, or configuration file. Every command accepts --json and returns a documented exit code, so an AI agent with a shell can do the setup and run the whole workflow.
  • Easy to modify. The whole package is twelve modules, about 4,200 lines of typed Python, and its records are plain JSON files. You or an agent can read all of it and change it to fit your workflow, and the Apache-2.0 license does not require you to publish your changes.

To remove the ledger, delete .ocura-oss/ in your project. That directory holds all ledger records and captured logs.

Install and try

Python 3.11 or later is required. Ocura OSS uses only the standard library at runtime.

Install from PyPI in a virtual environment:

python -m pip install ocura-oss
ocura-oss demo --root ./ocura-oss-demo

The demo runs the complete workflow and retains a new directory for inspection. Its destination must not already exist. To install a repository checkout instead, run python -m pip install . from its root.

Compare two runs

ocura-oss init --name example --json
ocura-oss run --json --param count=1 -- python -c "print(1)"
ocura-oss branch --json --from <chokepoint-id> --reason "try count 2" --param count=2
ocura-oss run --json --pathway <child-pathway-id> -- python -c "print(2)"
ocura-oss verify --json
ocura-oss compare --json

Use the baseline's chokepoint_id to branch and the branch result's id for the child run. When typing an ID by hand, its first four or more hexadecimal characters are enough if they match one record.

Without --json, compare prints:

comparison: ready
source chokepoint: chokepoint-eb61ef56491042ae94e61d1387f3f0d5
source pathway: pathway-1378d1d28cb54987b9e80d59d61aec74
source run: passed 0.056063s
child pathway: pathway-ce4c71137dd449398fe2b4e0198c83c3
  reason: try count 2
  parameters: added count=2
  source run: passed 0.056063s
  child run: passed 0.061312s
  run parameters: changed count (1 -> 2)

compare reports each variant's relationship to its source, parameter changes, outcomes, and timing. parameters is how the branch differs from the pathway it came from; run parameters is how the labels the two runs recorded differ. With no --from, it compares the newest baseline that has a branch. Read the recorded output logs for workload-specific metrics, such as validation loss or accuracy.

Parameters are recorded labels. Set actual inputs in your command as well: --param batch=4 -- python train.py --batch 4. A run on a branch records the branch's parameters without repeating them, and can add or replace labels with its own --param. To declare a value once, add --substitute and write "{batch}" in the command.

Omit --json for terminal output. By default, run streams the command's output while retaining stdout and stderr logs; --json or --quiet keeps that output in the logs without streaming. A first Ctrl+C, or a SIGTERM sent to ocura-oss run, stops the command and records an interrupted attempt; a second Ctrl+C exits immediately and leaves the attempt for ocura-oss recover to close.

When to use something else

Ocura OSS records what ran, how runs relate, and whether those records are still intact. It stops there on purpose:

  • You want dashboards, metric charts, or a tracking server shared by a team. Use an experiment tracker such as MLflow. Ocura OSS has no server and no user interface, and it keeps your output as logs without reading metrics from it.
  • You need to version datasets or model files, or rebuild a pipeline. Use a tool such as DVC. A branch here is lineage metadata; it does not snapshot files.
  • You run one command and keep its output. A log file is enough.

Ocura OSS sits between these: more structure than loose log files, and far less to adopt than a tracking platform.

Autoregressive example: PyTorch, JAX, and Ray

The autoregressive example trains a small character-level next-token model on an included text corpus. Choose PyTorch or JAX, run a baseline and a longer-training variant, then reconstruct the comparison from saved evidence. An optional Ray Core executor runs either backend as a local task. The example stays in the source repository; neither the wheel nor the source distribution includes its scripts or framework dependencies. Install only what you use.

From a repository checkout, after installing Ocura:

python -m pip install -r examples/autoregressive/requirements-pytorch.txt
python examples/autoregressive/experiment.py run --backend pytorch --root ./ar-pytorch
python examples/autoregressive/experiment.py report --root ./ar-pytorch

The guide includes JAX and Ray commands. The script supplies metric reading and interpretation; the package supplies recording, lineage, and verification.

Python and automation

import sys
from ocura_oss import branch, compare, initialize, run, verify

root = initialize("experiment", name="example").root
baseline = run([sys.executable, "-c", "print(1)"], root=root, parameters={"count": "1"})
child = branch(baseline.chokepoint.id, root=root, reason="try count 2", parameters={"count": "2"})
run([sys.executable, "-c", "print(2)"], root=root, pathway_id=child.id)
assert verify(root).ok
comparison = compare(baseline.chokepoint.id, root=root)

Use Store(root).read_verified_log(atom_id, stream="stdout") to consume recorded output as bytes checked against the stored atom's byte count and SHA-256 digest. The method also accepts stream="stderr"; decoding and metric interpretation remain with your script. See the Python API.

An agent can use the same CLI or Python workflow inside its existing execution environment. The automation guide explains JSON results, exit codes, parameter labels, and how to inspect earlier attempts.

Documentation

The full references are included in this checkout and remain readable directly on GitHub. The documentation for the published release is also available online.

Local state and operating model

State lives under .ocura-oss/ in the project root. A den identifies that state; a pathway groups runs in a lineage; an atom records one command attempt; a chokepoint identifies terminal evidence from which a branch can be created.

Each branch records its source and reason. It represents a new line of work; workspace files, process state, and model weights are managed by the workload. Several processes may record runs under one state root at once. Delete .ocura-oss/ to discard that project's records.

Commands run with shell=False in the project root and inherit the invoking environment's permissions. Use trusted, owner-authorized workloads. For generated or otherwise untrusted commands, provide isolation and permissions through your execution environment; Ocura OSS itself does not sandbox or restrict them.

Records retain command arguments, parameter labels, reasons, and output. Keep secrets out of these fields; run --mask-arg and run --no-capture cover a command token or output that cannot be avoided. SHA-256 checksums detect local inconsistencies; they do not authenticate authorship or prevent a writer from replacing records and checksums.

Project status

Ocura OSS is research software under the Apache License 2.0. Versions 0.5.0 and earlier were released under MPL-2.0. The 0.x interface and record format may change before 1.0, and there is no production support commitment.

Bug reports and focused pull requests are welcome. See Contributing and the security policy.

Metadata

Release files for ocura-oss 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for ocura-oss 0.6.0
File Size Uploaded Provenance
ocura_oss-0.6.0.tar.gz 134.4 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for ocura-oss 0.6.0
File Interpreter ABI Platform
ocura_oss-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 188.3 kB

Release files / ocura_oss-0.6.0.tar.gz

Download URL ocura_oss-0.6.0.tar.gz
Size 134.4 kB
Tags Source
SHA-256 checksum
How to use checksums
f6b4d8f08f48660303ccc19e3f09cb3085b5765fed0bdf41235c9b39f0f67e04
BLAKE2b-256 checksum
How to use checksums
a21930d026a796ca532c1217237dab94456168eee2a71d559426c3b23676fce1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 22, 2026.

Transparency log

Release files / ocura_oss-0.6.0-py3-none-any.whl

Download URL ocura_oss-0.6.0-py3-none-any.whl
Size 53.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
86ce44e5f637cb6a7dd564821b8c77f3daa5a3293f2e8f8c02c1609320951547
BLAKE2b-256 checksum
How to use checksums
212e4caacdd19230cd35a19ab074685c9483241f60c513013a5654a004ab5fa1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

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 22, 2026.

Transparency log

Security for ocura-oss 0.6.0

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.

Select from 2 files

Attestation for ocura_oss-0.6.0.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 22, 2026.

Transparency log

A 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.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page