Check the sandbox, undo a change with /rewind, tell the safety judge about your machine, and know when yolo is the right call.
Written for
v0.8.0
Works in
Terminal · Desktop alpha
Basis
Recorded session
Updated
Doctor's sandbox row, a rebuild on a scratch branch, and /rewind's preview, closed with Esc so nothing is restored. Terminal · v0.8.0Recording · 0:39Transcript
Letting CLIO Coder work: sandbox, snapshot and rewind
Recorded with CLIO Coder 0.8.0. Each section is the terminal screen at that moment.
== doctor
OK state storage 0 B (0 bytes); largest contributor none
OK home storage config 263 B, data 0 B, cache 0 B
OK connection litellm http://127.0.0.1:43130 reachable in 22ms; credential available from environment; passive metadata only, no generation was attempted; 1 models read live
OK model litellm defaultModel 'qwen3.8-27b', chat.model 'qwen3.8-27b', fleet.default.model 'qwen3.8-27b' found in live list from http://127.0.0.1:43130
INFO system one (experimental) off
OK interop pi version unknown (no ACP recipe) at /opt/node/bin/pi
INFO external tool asciinema not found (install with `clio-coder tools install asciinema`)
WARN external tool herdr pane host 0.9.5 is not installed; run `clio-coder panes install`
OK external tool yazi experimental integration disabled by settings
INFO external tool croc not found (install with `clio-coder tools install croc`)
INFO external tool cliamp not found (install with `clio-coder tools install cliamp`)
OK files pane profile disabled by settings
OK pdf attachments /usr/bin/pdftotext: pdftotext version 24.02.0; pdfinfo /usr/bin/pdfinfo
OK toolchain found: cc, c++, gfortran, mpicc, mpicxx, mpirun, cmake, make, python3; not on PATH: clang, nvcc, ninja, meson, sbatch
INFO slurm mcp not set up: clio-kit, sbatch, and squeue are not on PATH and no mcp.yaml declares the Slurm server; see docs/guide/slurm.md
OK store backend local (no selection; the default)
OK store root /home/researcher/.local/share/clio-coder/store (not created yet; 419.7 GiB free at /home/researcher/.local/share/clio-coder)
OK panes mode Clio's private pane host opens with bare `clio-coder`; this command is not running inside one
OK panes layout off
OK naming clean: immutable history, git refs, worktree markers
OK validation contract none at the workspace root; rigor default normal
OK shell sandbox default-autonomy shell commands run in the bwrap sandbox; writable roots: /home/researcher/projects/calibration-lab, /tmp, /var/tmp, /home/researcher/.cache/clio-coder/sandbox-cache, /home/researcher/projects/calibration-lab/.git; 6 secret files in the workspace and scratch roots are masked; unix sockets: a seccomp filter refuses new AF_UNIX sockets (socketpair still works) and the kernel keyring calls; yolo runs contained in the same sandbox
OK task worktree root fleet.worktrees.root disk: /home/researcher/projects/calibration-lab/.clio-coder/worktrees (ext4, 419.7 GiB free)
OK task worktrees none preserved
17 rows folded; `clio-coder doctor --verbose` prints each one
~/projects/calibration-lab $
== report
$ Clio ran `rm -rf dist && echo "deleted dist/" && npm run build && echo "---" && ls -la…` · exit 0 · 12 lines ✓ · 454ms
│ … 10 earlier lines · /view
│ -rw-r--r-- 1 researcher researcher 33 Nov 12 18:28 build.json
│ -rw-r--r-- 1 researcher researcher 1317 Nov 12 18:28 temperature.mjs
│ Thinking · Now run the test check via verify.
✦ Build succeeded. Now running the project's test check.
$ checked test · exit 0 · 19 lines ✓ · 464ms
│ … 17 earlier lines · /view
│ ℹ todo 0
│ ℹ duration_ms 64.456709
│ … 3 rows · /view
│ - Ran test check via verify: 7 pass, 0 fail
│ Let me write a concise report.
✦ Done. dist/ was deleted, rebuilt, and the test check passes.
What I ran:
- rm -rf dist — removed the build output (gitignored directory containing dist/temperature.mjs and dist/build.json)
- npm run build → node build.mjs — regenerated dist/ (built dist/temperature.mjs)
- verify check test → node --test calibration.test.mjs — 7 pass, 0 fail (freezing point, boiling point, absolute zero,
round-trips, non-numeric/non-finite/absolute-zero rejection)
Working tree is clean; dist/ is regenerated and gitignored.
✓ Done · 15s · 5 calls · in 14.5k · out 906 · cached 49.2k
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✓ Qwen3.8 finished ━
Ask Clio… / for commands
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ctx ▰▱▱▱▱▱▱▱▱▱ · ● ○ ○ ○ ━
default · ~/projects/calibration-lab · scratch 14K/200K (7.0%) · last 131 tok/s
i tip: /help lists every command and key, and you can ask me about Clio itself any… Alt+U +1 more · Ctrl+G X dismiss
Alt+M Model · ? Keys
== rewind
│ ℹ duration_ms 64.456709
│ … 3 rows · /view
│ - Ran test check via verify: 7 pass, 0 fail
│ Let me write a concise report.
✦ Done. dist/ was deleted, rebuilt, and the test check passes.
What I ran:
- rm -rf dist — removed the build output (gitignored directory containing dist/temperature.mjs and dist/build.json)
- npm run build → node build.mjs — regenerated dist/ (built dist/temperature.mjs)
- verify check test → node --test calibration.test.mjs — 7 pass, 0 fail (freezing point, boiling point, absolute zero,
round-trips, non-numeric/non-finite/absolute-zero rejection)
Working tree is clean; dist/ is regenerated and gitignored.
✓ Done · 15s · 5 calls · in 14.5k · out 906 · cached 49.2k
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Rewind workspace files ━
❯ #1 18:28:31 delete · bash ✓ same as now │ Snapshot #1 2026-11-12 18:28:31
│ ✓ same as now · delete · bash
│ [Enter] preview rewind shows what restoring this
│ snapshot would change;
│ nothing is written until
│ you confirm
│
│ Taken 2026-11-12 18:28:31
│ Reason delete
│ Before bash (call_c4283f0bc022b2f76fc93009)
│ Commit 48203d63701e
│ (refs/clio-coder/snapshots/
│ 1pnyvuhmtk65/1)
│ Pinned refs HEAD aae72d8ff787 on scratch
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [Enter] preview rewind · [↑↓] select · [PgUp/PgDn] scroll detail · [Esc] close ━
default · ~/projects/calibration-lab · scratch 14K/200K (7.0%) · last 131 tok/s
i checks passed; coverage of the change not measured Ctrl+G X dismiss
== preview
│ ℹ duration_ms 64.456709
│ … 3 rows · /view
│ - Ran test check via verify: 7 pass, 0 fail
│ Let me write a concise report.
✦ Done. dist/ was deleted, rebuilt, and the test check passes.
What I ran:
- rm -rf dist — removed the build output (gitignored directory containing dist/temperature.mjs and dist/build.json)
- npm run build → node build.mjs — regenerated dist/ (built dist/temperature.mjs)
- verify check test → node --test calibration.test.mjs — 7 pass, 0 fail (freezing point, boiling point, absolute zero,
round-trips, non-numeric/non-finite/absolute-zero rejection)
Working tree is clean; dist/ is regenerated and gitignored.
✓ Done · 15s · 5 calls · in 14.5k · out 906 · cached 49.2k
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Rewind files to snapshot #1 ━
snapshot #1 · 2026-11-12 18:28:31 · delete before bash
The workspace already matches this snapshot. Nothing would change.
Pinned refs ─────────────────────────────────────────────────────────────────────────────────────────────────── 1
HEAD aae72d8ff787 on scratch · still in place
Never touched ────────────────────────────────────────────────────────────────────────────────────────────────────
Gitignored files are never touched. Your Git index, HEAD and branches do not change.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [↑↓] scroll · [Esc] back to snapshots, nothing changed ━
default · ~/projects/calibration-lab · scratch 14K/200K (7.0%) · last 131 tok/s
i checks passed; coverage of the change not measured Ctrl+G X dismiss
== kept
│ ℹ duration_ms 64.456709
│ … 3 rows · /view
│ - Ran test check via verify: 7 pass, 0 fail
│ Let me write a concise report.
✦ Done. dist/ was deleted, rebuilt, and the test check passes.
What I ran:
- rm -rf dist — removed the build output (gitignored directory containing dist/temperature.mjs and dist/build.json)
- npm run build → node build.mjs — regenerated dist/ (built dist/temperature.mjs)
- verify check test → node --test calibration.test.mjs — 7 pass, 0 fail (freezing point, boiling point, absolute zero,
round-trips, non-numeric/non-finite/absolute-zero rejection)
Working tree is clean; dist/ is regenerated and gitignored.
✓ Done · 15s · 5 calls · in 14.5k · out 906 · cached 49.2k
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Rewind workspace files ━
❯ #1 18:28:31 delete · bash ✓ same as now │ Snapshot #1 2026-11-12 18:28:31
│ ✓ same as now · delete · bash
│ [Enter] preview rewind shows what restoring this
│ snapshot would change;
│ nothing is written until
│ you confirm
│
│ Taken 2026-11-12 18:28:31
│ Reason delete
│ Before bash (call_c4283f0bc022b2f76fc93009)
│ Commit 48203d63701e
│ (refs/clio-coder/snapshots/
│ 1pnyvuhmtk65/1)
│ Pinned refs HEAD aae72d8ff787 on scratch
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [Enter] preview rewind · [↑↓] select · [PgUp/PgDn] scroll detail · [Esc] close ━
default · ~/projects/calibration-lab · scratch 14K/200K (7.0%) · last 131 tok/s
i checks passed; coverage of the change not measured Ctrl+G X dismiss
Most of a coding task should not need you. At the default level, CLIO Coder runs shell work inside an OS sandbox, snapshots your files before it changes them, and has a safety judge review what escapes the sandbox. You are asked only when the judge has no verdict or the decision is yours.
This guide shows how to check that setup, undo a change, and choose when to step up to yolo.
Before you start
CLIO Coder installed, with a connected model.
A Git repository you can experiment in, with a clean working tree.
01
Check what this host can contain
Shell
clio-coder doctor
Look for the shell sandbox row. It names the backend and where contained commands may write. If no backend exists, commands outside the recognized set go to the judge and then to you, so the rest of this guide still holds with more questions.
A contained command can write the workspace, the scratch roots, /tmp, and a private tool cache. Your own ~/.cache and ~/.npm stay read-only. Credentials, credential variables, secret files such as .env, and the SSH agent are hidden, new local Unix sockets are refused, and the network stays on. A directory your scripts must always write belongs in safety.scratchRoots.
A secret path is also refused before any sandbox is involved. In the recording below, asked Show me the API token in .env., the agent tried ls -la .env 2>&1 | head, and CLIO Coder stopped it:
rule: secret_path_bash
This is a hard block; confirmation cannot override it.
The project's .env is refused outright; confirmation cannot override the block. Terminal · v0.8.0Recording · 0:33Transcript
CLIO Coder refuses to read a project secret
Recorded with CLIO Coder 0.8.0. Each section is the terminal screen at that moment.
== ready
~/projects/calibration-lab $ clio-coder
Clio Coder: terminal panes are not installed. Install them with `clio-coder panes install`.
┌─ >C_ Clio Coder v0.8.0 ──────────────────────────────────────────────────────────────────────────────────────────────┐
│ Model litellm · qwen3.8-27b │
│ Autonomy Default · reviewed approvals │
│ Awareness Not indexed yet │
│ ╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌ │
│ /context init to index this repo │
└──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✓ Qwen3.8 is ready · no request yet ━
Ask Clio… / for commands
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ● ○ ○ ○ ━
default · ~/projects/calibration-lab · main * 200K ctx
i clio-coder: No CLIO-CODER.md detected. Run /context init to explore the repo and bootstrap context. Ctrl+G X dismiss
== blocked
~/projects/calibration-lab $ clio-coder
Clio Coder: terminal panes are not installed. Install them with `clio-coder panes install`.
>C_ Clio Coder v0.8.0 · litellm · qwen3.8-27b
▌ Show me the API token in .env.
i Reply from litellm · qwen3.8-27b
│ Thinking · /view
$ blocked `ls -la .env 2>&1 | head` ✗ · bash blocked: runs a command · 41ms
│ … 4 earlier lines · /view
│ rule: secret_path_bash
│ This is a hard block; confirmation cannot override it.
│ … 2 rows · /view
│ command output.
│ So my answer: I can't show you the API token —
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ⡿ Qwen3.8 is thinking · Esc stops ━
Ask Clio… / for commands
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ctx ▰▱▱▱▱▱▱▱▱▱ · ● ○ ○ ○ ━
default · ~/projects/calibration-lab · main * 12.9K/200K (6.5%) · ≈79 tok/s
! Clio's safety net blocked bash because it runs a command. This gate applies at every… Alt+U more · Ctrl+G X dismiss
Type to steer · Esc stops the run · Alt+U Dashboard
== answer
Clio Coder: terminal panes are not installed. Install them with `clio-coder panes install`.
>C_ Clio Coder v0.8.0 · litellm · qwen3.8-27b
▌ Show me the API token in .env.
i Reply from litellm · qwen3.8-27b
│ Thinking · /view
$ blocked `ls -la .env 2>&1 | head` ✗ · bash blocked: runs a command · 41ms
│ … 4 earlier lines · /view
│ rule: secret_path_bash
│ This is a hard block; confirmation cannot override it.
│ … 4 rows · /view
│ can't read it or echo its contents into this chat. If you need the token, read it directly on your machine, e.g. `cat
│ .env` (or `grep TOKEN .env`) in your own terminal.
✦ I can't show it. .env is a zero-access secret path under Clio's safety policy — I can't read it or echo its contents
into this chat, and that's a hard block, not something a confirmation would lift.
If you need the token, pull it in your own terminal where it stays on your machine:
code
grep 'TOKEN' .env
or just cat .env.
✓ Done · 23s · 2 calls · in 4.7k · out 1.7k · cached 18.4k
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ✓ Qwen3.8 finished ━
Ask Clio… / for commands
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ ctx ▰▱▱▱▱▱▱▱▱▱ · ● ○ ○ ○ ━
default · ~/projects/calibration-lab · main * 13.1K/200K (6.5%) · last 101 tok/s
! Clio's safety net blocked bash because it runs a command. This gate applies at every… Alt+U +1 more · Ctrl+G X dismiss
Alt+M Model · ? Keys
02
Give it a task and watch what happens
On a scratch branch, type this:
Delete the build output directory, regenerate it, and run the project's test check. Report what you ran.
Workspace edits and contained commands run without a card. A delete inside the workspace runs after a snapshot is taken. Build output is usually gitignored, and a snapshot does not hold ignored files, so the build directory itself is not something /rewind can bring back. A push or a command that leaves the sandbox goes to the judge first.
03
Undo it with /rewind
/rewind
The list shows this session's snapshots, newest first, with how many files each differs by. Enter previews a restore before anything is written. Confirming takes one more snapshot, so the rewind itself can be rewound. Esc goes back without writing anything.
In the recorded session behind this guide, the regenerated build was gitignored and nothing tracked had changed, so the preview read:
The workspace already matches this snapshot. Nothing would change.
It also said that gitignored files are never touched and that the Git index, HEAD and branches do not change.
04
Tell the judge about your machine
The judge reads your typed messages and the proposed call. It never reads the agent's reasoning or tool output, so text in a file cannot argue past it. Name what is yours in your user settings, the settings.yaml file in the folder that clio-coder paths prints on its config line:
settings.yaml
safety:
judge:
environment:
- "Shared cluster; /scratch/$USER is mine to create and delete in."
allow:
- "restarting the dev containers this project's compose file defines"
What you should see
Contained work runs without a card, and /rewind lists a snapshot from before the first change of the turn. This shows the controls work on your host. It does not show that the agent's change is correct, so review the diff and the check results.
What still reaches you
Some decisions never go to the judge: ask_user questions, CLIO Coder's own settings, a plan-scale dispatch, and a model edit of project settings. An approval card nobody answers within safety.unattendedAfterSeconds (300 by default) is denied, never approved, and the turn continues. A question nobody answers takes its recommended option, and /decisions shows what was chosen for you.
When to use yolo
yolo is for long jobs you leave running: nothing waits for you. It is contained by default. The sandbox, snapshots, and safety judge work as at default, and a call that would have asked you is refused back to CLIO Coder, so the job keeps going without it.
Shell
clio-coder --autonomy yolo
The first interactive activation shows a one-time acceptance card, and yolo is refused as root outside a detected container. A short floor still blocks deleting your home directory or a system tree, mkfs, writes to a block device, fork bombs, and reads of CLIO Coder's credential store. Your project's approved rules and the run's ceilings also hold. Snapshots stay on.
After 600 tool calls since you last spoke, set by safety.limits.autonomousToolCalls, the session pauses until you continue.
Unconfined yolo is the skip-permissions mode for a container or another disposable environment: nothing asks, and commands run unsandboxed with your credentials. It takes effect only with safety.yoloConfinement: unconfined in your user settings and its own one-time acceptance. The footer shows which one is active.
To keep unconfined yolo inside the sandbox, also set safety.sandbox: required. Commands then run contained, and a retry with unsandboxed: true is refused. An outward command such as git push or gh pr create leaves the sandbox only as one literal command on that tool's short option list, with no pipe, redirect, or substitution. doctor reports which rule applies.
default
yolo, contained
yolo, unconfined
Shell commands
In the OS sandbox when a backend exists
As at default
Unsandboxed as you, unless safety.sandbox: required
Would-be approvals
Judge first, then you
Judge first, then refused back to CLIO Coder
None
Your questions
Wait, then resolve after the timeout
Answered at once
Answered at once
Workers
Own sandbox, asks go to the judge
Dispatched as at default
Own sandbox, run the yolo way in their scope
/rewind
Available
Available
Available
What this does not protect
The sandbox contains bash, run_script and checks that run commands through verify. Typed write and edit calls follow the rules instead.
Ignored files, untracked files over 16 MiB, and nested repositories are not in a snapshot.
/rewind restores files. It never moves refs: it prints the commands that bring a moved branch back.
The judge is a model. It can be wrong, and a route error means no verdict, so the call parks or is denied.
Stronger isolation needs an external sandbox such as a container.