CLIO Coder
All tutorials

Safety and autonomy7 min read

Let CLIO Coder work without watching every call

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
Terminal recording: clio-coder doctor's shell sandbox row lists the writable roots and masked secret files. On a scratch branch the agent deletes dist/, rebuilds it with node build.mjs, and runs the declared test check with 7 passed. /rewind lists the snapshot taken before the delete; its preview says the workspace already matches and gitignored files are never touched, and Esc leaves without restoring.
Doctor's sandbox row, a rebuild on a scratch branch, and /rewind's preview, closed with Esc so nothing is restored. Terminal · v0.8.0 Recording · 0:39
Transcript
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
On this pageBefore you start What still reaches you When to use yolo

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

  1. 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.
    Terminal recording in which the user asks CLIO Coder for the API token in the project's .env. The agent's ls -la .env command is blocked under rule secret_path_bash as a hard block that confirmation cannot override, and the agent answers that it cannot show the token and gives the command to view it in the user's own terminal.
    The project's .env is refused outright; confirmation cannot override the block. Terminal · v0.8.0 Recording · 0:33
    Transcript
    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
  2. 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.

  3. 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.

  4. 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

By The CLIO Coder team · CLIO Coder

Continue with the documentation