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

Workflows

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.

Fleet coordination: tasks, leases and steering (0.43)

CommandWhat it does
tine task add ID [--title T] --repo PATHCreates coord/tasks/ID (opentine-coord/1)
tine task claim ID --holder NAME [--ttl S] --repo PATHTakes the lease by one compare-and-swap ref move; prints the new fencing token
tine task heartbeat ID --holder NAME --fencing N [--ttl S]Extends the lease; refused (stale) once it expired or was re-claimed
tine task done ID --holder NAME --fencing NCloses the task; refused for a stale holder
tine task list --repo PATHEvery task, its status, holder, token and lease end
tine fleet resume fleet.toml --id ID [--trust]Runs the members of fleet ID that did not finish; the manifest digest must match the record
tine fleet logs ID [--member KEY]Prints each member's captured output
tine fleet send ID --member M --message TEXT --repo PATHQueues a steer message in coord/mailbox/ID/M

Every task and mailbox version is an annotation chained by previous_id, so the ref's history is the record's audit trail. Of any number of racing claimants exactly one compare-and-swap wins; an expired lease is re-claimed with a higher fencing token. With --json each task verb prints {"command": "task <verb>", "task": {...}} ("tasks": [...] for list); a refused operation exits 1 with {"error": {"code": "held|stale|done|exists|missing|contended", ...}}.

A sent message is delivered by the member's tine hook capture at its next turn end (the hook inherits OPENTINE_FLEET_ID and OPENTINE_FLEET_MEMBER from tine fleet up), once, and recorded as a human step with actor steer. The generic response carries "steer": [TEXT, ...]; Claude Code's Stop hook gets {"decision": "block", "reason": TEXT}, so the agent continues with the message. Capture must be enabled (hooks.capture).

tine serve (0.43) also takes POST /v1/tenants/T/ref-txn with {"updates": [{"name", "new", "expected_old"}, ...]} (at most 64): every move is checked exactly as PUT /refs/<name> checks it, then all are applied in one index transaction or none (409 {"updated": false}). The server lists "ref_txn": true in /v1/capabilities; tine push then moves the head and the run's annotation ref in one transaction, and keeps one PUT per ref against a server that does not list it.