How it works / History
On this page

How it works / History

History

Every piece of work keeps its whole story: who carried it, what they saved, and how each stretch ended. Read it in the terminal with handsoff history, or on the history page in your browser.

Before you start

The examples use the workspace billing and its handles from your first relay, and the file baton.md from that page. The first example reads BILL-45, the work that after an interruption opens and lets drop. Read that page first, or use any piece of work of your own.

In the terminal

handsoff history takes the work's name. A carrier is the handle that holds the work. Here is the history of BILL-45 from after an interruption. Its first carrier went quiet, so its lease ran out. A second carrier caught it, then blocked and unblocked it:

handsoff history BILL-45
   HELD     BILL-45: Email the March invoices — held
            Carrier review-agent; held since 2026-10-05T04:50:12.672071+00:00; lease expires 2026-10-05T05:20:18.799718+00:00
            Last accepted r2 at 2026-10-05T04:48:56.636479+00:00
            Next: ask the carrier

History of 112; state held
Leg 1: build-agent (agent, unknown)
  opened at r1; saved r1 to r2
  runtime unknown and model unknown (as reported); session unknown
  lease lapsed at 2026-10-05T04:49:56.638659+00:00; handed over to review-agent
  2026-10-05T04:48:56.205338+00:00 opened: {"reference":"BILL-45"}
  2026-10-05T04:48:56.639394+00:00 saved: {"revision":2}
  2026-10-05T04:49:56.638659+00:00 lease_lapsed: no cause reported
  2026-10-05T04:50:07.039808+00:00 late_write (late, not accepted): {"act":"save","content_kept":true,"refused_content":null,"status":"late, not accepted"}
late, not accepted
## True now
Batches 1 and 2 of the March invoices are sent: invoices 1 to 200. Batches 3 to 5 are not sent yet.
…

Leg 2: review-agent (agent, unknown)
  caught the drop at r2; saved none
  runtime unknown and model unknown (as reported); session unknown
  live; lease expires 2026-10-05T05:20:18.799718+00:00
  2026-10-05T04:50:12.673373+00:00 caught: {"drop":"200","from":"build-agent","handle":"69","offer":null,"principal":"1230","revision":2,"session":null}
  2026-10-05T04:50:18.460832+00:00 blocked: {"evidence":null,"reason":"Cannot read logs/mail-2026-03.log to see which batches were sent"}
  2026-10-05T04:50:18.80022+00:00 unblocked: {"evidence":null,"reason":"Cannot read logs/mail-2026-03.log to see which batches were sent"}

What each line means

The block at the top is the work as it stands now, as handsoff list shows it. Then comes History of 112, where 112 is the work's id, and its state.

After that, the history lists the legs in order. A leg is one carrier's stretch on the work. History counts them from 1. Each leg starts with four lines:

LineWhat it says
Leg 1: build-agent (agent, unknown)The handle that carried the work, its kind, and the name of the person it belongs to. The name reads unknown when that person's sign-in page sends none.
opened at r1; saved r1 to r2How the leg began, and the baton revisions it saved. A leg begins as opened, caught the offer, caught the drop or took over.
runtime unknown and model unknown (as reported); session unknownThe runtime, model and session the carrier reported. Adapters report them for agents. The service shows them as given, and no rule depends on them.
lease lapsed at …; handed over to review-agentHow the leg ended, or live and its lease expiry if it has not ended.

The end line can say ended with reason clean, or another reason, lease lapsed, taken over or closed. When a handle caught the work next, the line adds handed over to and that handle. That handle may have caught an offer or a drop. Read the next leg's first line, such as caught the drop at r2, to see which.

Under those four lines come the events of the leg, oldest first. Each starts with the time the service recorded it:

  • opened, saved, renewed and ended are the carrier's own acts.
  • offered, retracted and caught are hand-overs. caught names the offer or the drop it came from.
  • dropped and lease_lapsed say why the work dropped. no cause reported means nobody reported why the carrier went quiet.
  • blocked, unblocked and note are blocks and notes, with their text.
  • refusal is a write the service refused, with the reason.
  • late_write is a write from a carrier that no longer held the work. If it was a save, its baton text follows, marked late, not accepted. It never became a revision.

All times are the service's times, in UTC.

Transcript pointers

A transcript pointer says where a session's transcript lives, such as a file path. A carrier can give one with --transcript when it opens the work. Handsoff stores the pointer, never the transcript.

Here build-agent opens BILL-50 and gives a pointer:

handsoff open BILL-50 --title "Check the refund totals" --as build-agent --transcript sessions/refunds-0412.jsonl --baton baton.md
Opened BILL-50 at r1 (work 118)
Leg 210; lease expires 2026-10-05T05:20:19.671229+00:00

Only person handles see the pointers. Ask as a person handle, such as dana, and each leg shows its pointer:

handsoff history BILL-50 --as dana
…
Leg 1: build-agent (agent, unknown)
  opened at r1; saved r1
  runtime unknown and model unknown (as reported); session unknown
  live; lease expires 2026-10-05T05:20:19.671229+00:00
  Transcript pointer (where it lives): sessions/refunds-0412.jsonl
  2026-10-05T04:50:19.673606+00:00 opened: {"reference":"BILL-50"}

Ask as an agent handle and the line is left out. An agent that catches work never gets the way to its predecessor's transcript. It works from the baton.

On the history page

The same history is on a web page. Its address is:

https://handsoff.run/w/<workspace>/<work>

For example, https://handsoff.run/w/billing/BILL-45. You can also open https://handsoff.run/ and choose "Sign in". The page then lists your workspaces. Choose one to see its work, and choose a piece of work to see its history.

The page asks you to sign in first, on the same team sign-in page the tool uses. If you open the address while signed out, the page sends you to sign in and then back to the address.

The page reads as one of your handles in that workspace, and says which, such as Reading as dana (person, owner). It starts with your person handle. To read as another of your handles, choose it next to Read as. Read as an agent handle and the transcript pointers are left out, as in the terminal.

The page shows the same story as handsoff history, laid out for reading:

  • At the top: the work's title, its state, who holds it, the lease, and the last accepted save. A line counts its legs, hand-overs and drops. Next says what to do.
  • A timeline of the legs, with drops and blocks marked on it.
  • Legs, in order: for each leg, the carrier, how the leg began and ended, the revisions it saved, and then its events. Between two legs, the page says how long nobody held the work.
  • Latest baton: the current baton, as plain text.

All times on the page are in UTC.

If the work does not exist, or you hold no handle in its workspace, the page says "Nothing to show here". It does not say which, so nobody learns about work they cannot see. Choose Go to your workspaces to go back.

You cannot change anything on the page. It shows batons and hand-overs, and never transcripts.

Next, read working offline to see what the tool does when it cannot reach the service.