# Runtime Selection Guide A loop is a design; a runtime is where it runs. The same [Loop Contract](../README.md#the-loop-contract) can run as a session-scoped command, a scheduled cloud job, a CI workflow, or a cron wrapper. This guide helps you pick deliberately. Behavior of hosted products changes; treat the vendor-specific rows as a starting point and confirm current limits, triggers, and permissions in each product's official docs before relying on them unattended. ## Quick Comparison | Runtime | Runs where | Persistence | Local file access | Isolated workspace | Permission model | Best for | Avoid when | | ------- | ---------- | ----------- | ----------------- | ------------------ | ---------------- | -------- | ---------- | | Claude Code `/loop` | Your machine, inside an open session | Within the session | Yes, your working tree | Use a worktree yourself | Interactive session permissions | Active development iteration with you nearby | You need it to run while the app is closed | | Claude Code Desktop scheduled tasks | Your machine, via the desktop app | Across runs, while the app can run | Yes, local files | Use a worktree yourself | Local app permissions | Recurring local jobs that need your filesystem | The machine or app is often closed at run time | | Claude remote routines | Anthropic-managed cloud | Across runs, laptop closed | Cloned repo only, per run | Yes, fresh clone per run | Scoped env, connectors, branch-push limits | Unattended cloud jobs on schedules, API, or GitHub events | You need direct access to local, non-Git files | | Codex automations | Cloud / background | Across runs | Cloned repo / worktree | Yes, worktree isolation | Automation + connector scope | Recurring background tasks and triage inboxes | You want everything on your own infrastructure | | GitHub Agentic Workflows | GitHub Actions runner | Per run, plus repo artifacts | Checked-out repo | Yes, containerized job | Actions permissions and guardrails | Event- or schedule-triggered repo automation | The work is not tied to a GitHub repository | | Shell/cron + agent CLI | Any machine or server you control | Whatever you write to disk | Full, by default | Only if you add it | Whatever the OS user can do | Maximum control and portability | You do not want to own isolation and secrets | | Custom durable workflow runtime | Your infrastructure | Crash-proof, durable | Depends on your setup | Yes, you design it | Your own policy layer | Production-grade long-running loops with recovery | A small job that a simpler runtime already covers | ## Choosing By Concern ### Persistence - Session-scoped (`/loop`) state lives only as long as the session; write a progress file if you need more. - Desktop scheduled tasks and most cloud runtimes persist across runs, but **always keep durable state in a file, issue, or database**, never only in model memory. - For loops that must survive crashes and resume exactly where they stopped, use a durable execution runtime. ### Local file access - If the loop must touch files that are not in a Git repository, prefer a local runtime (`/loop`, desktop scheduled tasks, or shell/cron). - Cloud runtimes generally operate on a cloned repository per run; work that depends on local, uncommitted files does not fit them well. ### Isolated workspace - Cloud and CI runtimes give you a fresh, isolated workspace per run by default. - Local runtimes do not isolate automatically: run them inside a [worktree](../README.md#core-loop-primitives), branch, or sandbox so a loop cannot corrupt your main checkout. ### Permission model - The safest unattended loops are read-mostly with a narrow, explicit set of write actions. - Scope network access, secrets, and branch-push rights to exactly what the loop needs. See [Securing Unattended Loops](../README.md#securing-unattended-loops). - Prefer runtimes that let you cap permissions per job over ones that inherit your full local privileges. ### Verification strategy - Keep the verification gate deterministic and outside the acting agent: an exit code, a passing check, a schema validation, an eval threshold. - CI runtimes make required status checks the natural gate. - Local and cloud runtimes should call the same check command your contract names, and judge the result by exit code, not by the agent's say-so. ### Escalation strategy - Every runtime needs a defined human exit: a PR, an issue, a Slack or pager message, or a labeled triage inbox. - Cloud and CI runtimes pair naturally with PR and issue escalation. - Long-running and incident-style loops should page a human; never let a loop substitute confidence for an owner. ## Migration Path Most teams climb the [Loop Maturity Model](../README.md#loop-maturity-model) by changing runtime, not rewriting the loop: 1. Prototype interactively with `/loop` or a [shell/cron wrapper](../examples/runnable/shell-cron-loop.md). 1. Move recurring local work to desktop scheduled tasks. 1. Promote unattended work to cloud routines, Codex automations, or GitHub Agentic Workflows. 1. Graduate production-critical, crash-sensitive loops to a durable execution runtime. Keep the contract stable across the move; only the trigger, isolation, and permission wiring change. ## See Also - [Runnable loop variants](../examples/runnable/README.md) - concrete templates for each runtime. - [Core Loop Primitives](../README.md#core-loop-primitives) and [Official Runtime Guides](../README.md#official-runtime-guides) - the primary-source docs behind each runtime. - [Pattern matrix](../patterns/MATRIX.md) - suggested runtime fit per pattern.