The action log is BOX_HOME/log.jsonl: one JSON object per line, in the order things happened. The box rebuilds every task and approval from it at boot. For what the log is for, read The action log.
Append only. The box never rewrites or deletes a line.
One write per event, then fsync. An event the API has answered for is on disk.
Mode 0600, owned by root. Tasks cannot read it.
A torn last line is dropped at boot. A hard power cut can leave half a line at the end. At boot the box cuts the file back to the last newline, counting in bytes, and reads every complete line before it. No complete line is ever lost or changed.
The full spec, with every default filled in. On GurtOS Personal it can also hold folder and folders.
user
string
The Linux user it will run as
{"seq":1,"at":"2026-10-24T09:12:03.411Z","type":"task.created","task":"t3k9x2a1b2","spec":{"workspace":"home","worker":"droid","tools":[],"hosts":[],"budgetCents":25,"source":"api","title":"Fix the failing test","prompt":"Fix the failing test in this project."},"user":"box-t3k9x2a1b2"}
{"seq":9,"at":"2026-10-24T09:13:12.004Z","type":"task.state","task":"t7p1q5r2s3","state":"failed","error":"worker exited with 1: Error: ENOENT: no such file or directory, open 'notes.md'"}
{"seq":3,"at":"2026-10-24T09:12:05.118Z","type":"task.step","task":"t3k9x2a1b2","text":"Droid started (claude-sonnet-4-6)","data":{"session":"a1b2c3d4"}}
{"seq":10,"at":"2026-10-24T09:13:01.006Z","type":"approval.asked","task":"t3k9x2a1b2","approval":{"id":"t3k9x2a1b2.budget.example.spend:9f2c41d07a6be315","task":"t3k9x2a1b2","question":"Spend $8.00 to Test Vendor on example.spend (test spend on a GPU hour)? Budget $5.00, spent $0.00.","costCents":800,"payee":"Test Vendor","purpose":"test spend on a GPU hour","state":"pending"}}
Who answered: a paired device's name, what the box's own screen sent (such as box screen), jira:<name>, asi1, undo, task ended
Only the first answer is written. An answer from a paired device always carries the device's name, whatever the request said. undo and task ended mark approvals the box closed itself, because the task was undone or stopped.
The app that wrote it, or one of the core's own: settings, setup, vault, apps, owner
task
string, optional
A task it is about
data
any
Whatever the app records
The core's own notes record each settings change with its old and new value, each setup step by id, each app turned on or off, each change of owner, and each vault key set, by name only. No note ever holds a vault value.