← Back to blog

opentine v0.27.0: know what replay proves

0xcircuitbreaker··7 min read

A successful replay check should tell you what was reproduced, not leave you to infer it from a green exit code. v0.27.0 labels every replayed step and exposes an explicit fidelity threshold.

This release also includes the v0.23–v0.26 sharing, inspection, verification, and format changes. The most important upgrade warning is practical: v4 is now the default writer, and bare tine migrate writes a sibling file. Use --dry-run when you mean preview only.

Four labels, one explicit boundary

From strongest to weakest:

  • exact: served from recorded cache, with field-for-field equality and a matching step digest. Nothing was re-executed.
  • recomputed-match: both harness reruns produced the same step digest at the same position.
  • unavailable: a step is missing or its recorded content contains a redaction marker.
  • diverged: a present step differs after round-trip or re-execution.

The run's overall fidelity is its weakest step. Verification JSON adds a fidelity object without removing existing fields.

tine replay run.tine --verify --json
tine replay run.tine --verify --min-fidelity exact --json

The minimum-fidelity option requires --verify and exits 1 below the selected threshold. An exact cached replay is not evidence that a live model would produce the same answer today. There is no mixed “stubbed” label: cache mode answers from recording, while harness rerun re-executes.

v4 unifies portable and repository roots

Since v0.26, final portable writes default to tine-artifact/4. The artifact bundles stored envelopes under the same run root used by the repository, while tags and metadata form an annotation chain outside that root. Current signatures use tine-sig/3; Ed25519 run attestations use tine-attest/2.

The reader re-derives object IDs and rejects wrong roots, missing links, unreachable objects, and tampered envelopes. Canonical JSON follows RFC 8785. Explicit writes reject non-finite numbers and integers beyond the supported exact range rather than silently rounding them.

Existing v1/v2 files and v3 repositories remain readable and verifiable, and reads do not rewrite them. New v4 data requires opentine 0.26 or newer. Storage layout and compression versions remain separate from object-format versions.

Autosave draft checkpoints still use v2; final saves default to v4. Some default saves that cannot be represented in v4 fall back to v2 with stderr and metadata warnings. Explicit OPENTINE_FORMAT=4 is strict and refuses that fallback. Inspect warnings and the saved format rather than assuming every file is v4.

Migration is now a write operation

# Preview only
tine migrate old.tine --dry-run

# Writes old.v4.tine beside the untouched source
tine migrate old.tine

# Select an output explicitly
tine migrate old.tine --to v4 -o upgraded.tine

In-place migration is explicit, keeps a backup, and orphans evidence made over the original bytes. Preserve and verify original signatures, attestations, and reports; upgrading does not transfer an old authenticity claim to new bytes. Upgrade provenance is recorded inside the new run payload, and offline verification can cross-check a supplied original source.

For older readers, the deprecated global --format 2 portable writer and legacy environment settings remain available with warnings. Read the upgrade guide before changing shared repositories or automation.

Inspection and trust travel with the artifact

The intervening releases add three useful paths:

  • v0.23: an optional pre-push hook bundles runs named by commit trailers to the same remote. It can publish run contents; opt in only after reviewing the destination and hook policy. Failures warn by default, with strict blocking available.
  • v0.24: tine view creates one static HTML report with no scripts or external requests. Safe HTML escaping is not a guarantee that its inputs and outputs contain no sensitive information.
  • v0.25: offline verification reports each check, reason, and trust basis. Missing roots are unavailable, not a pass. Internal consistency alone does not establish authorship.
tine view run.tine -o review.html
tine verify run.tine --offline --json

Upgrade with the boundaries visible

python -m pip install --upgrade "opentine==0.27.0"

Python support remains 3.11–3.14. Read replay fidelity, format v4, offline verification, and git sharing. Exact contracts are in the tagged changelog and concepts; the release is on GitHub and PyPI.