Sandbox
Disposable Git worktree with the root filesystem read-only and network by policy.
A model saying "tests passed" is a sentence, not a proof. Skep replays the patch on a clean worktree and re-runs the recorded command itself.
Disposable Git worktree with the root filesystem read-only and network by policy.
The agent edits, runs commands, and emits a durable event stream as it goes.
Skep re-applies the patch to a fresh baseline worktree and re-runs the checks.
You read the patch and the evidence. Approval lands it on skep/<id>, never main.
They are genuinely productive. They can also install packages, run broad shell commands, edit outside the intended project, and report success without a separate verifier.
An agent can edit, commit, or push before you have read a single line of the actual diff.
Package installs, arbitrary shell, and outbound network calls need an explicit boundary.
"Tests passed" from the same process that wrote the code is not an independent check.
macOS Seatbelt and Linux bubblewrap keep writes and network inside policy. If no backend can be applied, the worker does not start.
SandboxingA run is confirmed only when the worker said passed and Skep's own replay says passed too.
Verification layerApproval applies the patch to a branch named skep/<task_id>. Skep never pushes it.
Policies & approvalsEvery run, event, command, approval, artifact, and decision is written to a durable local ledger.
Observability & logsWhen a worker hits a gate, Skep stops and asks in the same terminal. Approve once, or approve and remember — a remembered approval that resumes successfully becomes a learned template for similar future work in that repo.
$ skep run ~/code/app "add rate limiting" --execution-mode workspace approval needed: shell.run reason: shell.run requires approval for command: python -m pytest [a] approve once [b] approve + remember [d] deny [s] skip > b resumed: original-task -> resumed-task state: completed verification: passed re-verify: passed [confirmed] (G10) saved template: rate-limiting
Install, run a task, review the evidence, approve the branch.
pipx install skep # Linux sandbox backend: sudo apt install bubblewrap
skep run /path/to/repo \ "fix the failing test" \ --execution-mode workspace
skep status --personal skep review <task_id> skep review <task_id> --approve
Any message starting with / is parsed by the UI and executed against the same HTTP API the buttons use — the assistant's model never sees it. Reads render immediately; mutations show the same confirmation card a model proposal would, audited under actor operator-command.
Explore the CLIThe boundary is real, and it is worth stating exactly where it stops.