Browse documentation

Portable .tine files default to v5 (since 0.42). --for-legacy writes v4. The .tine/ repository format is v3. tine evidence export writes v4. Formats and protocols.

Docs target stable release v0.44.0.Stable vs main checked 2026-11-07

Reference · v0.44.0

OpenTine documentation

From the pinned CLI source. Read upstream.

Current format policy: Portable .tine files default to v5 (since 0.42). --for-legacy writes v4. The .tine/ repository format is v3. tine evidence export writes v4.

How it works

Every run becomes a content-addressed graph — model steps, tool calls, and outcomes, each named by digest. Fork from any step to retry a different way; tine replay --verify re-derives the run and proves it reproduces (digests intact, no structural drift) — all without losing provenance.

<p align="center"> <img src="https://raw.githubusercontent.com/0xcircuitbreaker/opentine/v0.44.0/docs/assets/readme-run-tree.svg" alt="OpenTine run tree: fork, retry, and verify without losing provenance" width="820" /> </p>

The model-agnostic core

OpenTine records (provider, model, usage) on every step as opaque data. It does not have to recognize the provider, the model id, or the shape of the usage dictionary to store them, and nothing in the kernel — verify, fork, diff, replay — reads them. Dollars are applied afterwards, by a separate signed catalog:

tine show run.tine --cost             # the cost recorded at capture time
tine show run.tine --price            # re-derive it now from (provider, model, usage)
tine show run.tine --price --at 2026-07-15  # …against the catalog effective that day
tine import trace.json --format otel-json --price --save run.tine

tine show --cost (tine cost) sums what was recorded when the run happened; tine show --price (tine price) computes the cost post-hoc from the record and writes nothing, so an imported or uncosted run can be priced too, and a step no card covers is reported unknown rather than as free. A provider OpenTine has never heard of still produces a complete, verifiable, diffable, forkable run — and becomes priceable the day someone writes a card for it, with no new release and no adapter.

So opentine.models is a capture convenience, not the boundary of what OpenTine supports: it is there so a first run costs one command, not because a run has to come from it. The universal, model-agnostic on-ramp is OpenTelemetry GenAI — tine import --format otel-json needs no adapter, no key, and no rate card, and prices the result afterwards if you ask it to. See CAPTURE.md.