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:
| Line | What 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 r2 | How 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 unknown | The 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-agent | How 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,renewedandendedare the carrier's own acts.offered,retractedandcaughtare hand-overs.caughtnames the offer or the drop it came from.droppedandlease_lapsedsay why the work dropped.no cause reportedmeans nobody reported why the carrier went quiet.blocked,unblockedandnoteare blocks and notes, with their text.refusalis a write the service refused, with the reason.late_writeis a write from a carrier that no longer held the work. If it was a save, its baton text follows, markedlate, 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.
Nextsays 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.