Tool-agnostic loop design: the capability is what matters, not the product name. This matrix maps each primitive to how it appears in five major agent environments.
| Primitive | Job in the Loop | Grok Build TUI | Claude Code | Codex | Cursor | Windsurf |
|---|---|---|---|---|---|---|
| Automations / Scheduling | Discovery + triage on a cadence | /loop [interval] <prompt>, scheduler_create / scheduler_list / scheduler_delete (recurring, durable, fireImmediately), monitor for streaming events |
/loop, scheduled tasks, cron, hooks, GitHub Actions |
Automations tab: project, prompt, cadence, environment; Triage inbox | Cloud Agents + Automations (cron, webhooks, Linear/GitHub/Slack triggers); foreground Agent chat for ad-hoc /loop-style prompts |
Cascade Workflows (/workflow-name, manual invoke); pair with GitHub Actions or external cron for true scheduling |
| Run-until-done | Keep working until a verifiable condition holds | Goal mode / explicit stopping conditions in loop prompts | /goal — separate model checks completion |
/goal — pause/resume, verifiable stop condition |
Agent mode + hooks (.cursor/hooks.json) for grind-until-green loops |
Workflow steps with explicit verification checkpoints; Memories for cross-session continuity |
| Worktrees | Safe parallel execution | Subagents with isolation: "worktree", background tasks |
git worktree, --worktree, isolation: worktree on subagents |
Built-in worktree per thread | Git worktree per Composer / Cloud Agent task | Workspace isolation; multiple simultaneous Cascade sessions |
| Skills | Persistent project knowledge | SKILL.md in .grok/skills/ or ~/.grok/skills/; invoked by name |
SKILL.md in .claude/skills/ or project skills |
Agent Skills — $name or implicit match |
.cursor/rules/*.mdc (globs, alwaysApply), AGENTS.md, .cursor/skills/ |
.devin/rules/ or .windsurf/rules/ (persistent context); .windsurf/workflows/ (reusable recipes) |
| Plugins & Connectors | Reach into real tools | MCP servers via CallMcpTool |
MCP servers + plugins | Connectors (MCP) + plugins for distribution | MCP in settings; Cloud Agent sandbox with full connector access | MCP via Cascade settings / mcp_config.json |
| Sub-agents | Maker / checker split | Task tool with subagent_type, worktree isolation |
Task subagents in .claude/agents/, agent teams |
Subagents as TOML in .codex/agents/ |
Multi-agent mode, review mode, custom agents in .cursor/agents/ |
Multiple Cascades in parallel; workflow-orchestrated implementer → reviewer steps |
| State / Memory | Track what's done across runs | STATE.md, todos, durable scheduler state |
AGENTS.md, progress files, Linear via MCP |
Markdown or Linear via connector | STATE.md, LOOP.md, Cloud Agent memories |
STATE.md, Cascade Memories, workflow run notes |
| Use case | Grok | Claude Code | Codex | Cursor | Windsurf |
|---|---|---|---|---|---|
| Every 5 minutes | /loop 5m <prompt> |
/loop 5m <prompt> |
Automation, 5m cadence | Automation cron trigger | External cron + /workflow or Action |
| Daily morning | /loop 1d <prompt> |
Cron / /loop 1d |
Automation, daily | Automation daily + AGENTS.md context |
Daily workflow + Memories |
| Until tests pass | Loop + verifier sub-agent | /goal all tests pass |
/goal |
Hooks grind-until-green | Workflow with test/fix loop |
| Survive restart | scheduler_create with durable: true |
Hooks + persisted config | Automation (server-side) | Cloud Agent + repo-persisted state | Memories + committed STATE.md |
| Event-driven (CI fail) | monitor or GitHub Action |
GitHub Action + webhook | Automation + webhook | Automation on PR/issue events | GitHub Action triggers + /workflow |
| Concept | Grok | Claude Code | Codex | Cursor | Windsurf |
|---|---|---|---|---|---|
| Authoring format | SKILL.md + optional scripts/references |
Same | Same | SKILL.md or .mdc rules with frontmatter |
Markdown rules + workflow files |
| Distribution | Copy to .grok/skills/ or user skills dir |
Plugin / copy to project | Plugin bundle | .cursor/skills/ or .cursor/rules/ |
.windsurf/rules/ + .windsurf/workflows/ in repo |
| Invocation | Skill name in prompt or auto-match on description | $skill-name or implicit |
$skill-name |
Rules auto-apply by glob; skills on demand | /workflow-name or Rules always-on in Cascade |
| Split | When to use | Grok | Claude Code | Codex | Cursor | Windsurf |
|---|---|---|---|---|---|---|
| Implementer → Verifier | Any unattended code change | Task + different instructions/model |
.claude/agents/reviewer.md |
TOML agent with higher reasoning_effort |
Review mode or second Cloud Agent pass | Second Cascade or workflow review step |
| Explorer → Implementer | Large unfamiliar codebase | explore subagent_type |
Explorer agent | Fast read-only subagent | @codebase + plan mode first |
Audit workflow (read-only) then implement |
| Triage only | Report-first loops | loop-triage skill |
$loop-triage |
Automation calls skill | AGENTS.md + report-only rule |
Triage workflow, no edit steps |
Recommended filenames (pick one spine per project):
| File | Purpose |
|---|---|
STATE.md |
General loop memory (daily triage) |
issue-triage-state.md |
Issue queue health (feeder for daily triage) |
pr-babysitter-state.md |
PR-specific watcher state |
ci-sweeper-state.md |
Active CI failures + attempt counts |
post-merge-state.md |
Cleanup backlog from recent merges |
Linear / GitHub Projects work equally well — the loop must read and write the same store every run.
You do not need to pick one forever. A well-designed loop transfers:
- Write the skill (tool-agnostic
SKILL.md) - Define the state schema (markdown or JSON)
- Document the verification split (who checks whom)
- Map scheduling to your current TUI, editor, or Action
See examples/ for the same pattern implemented across tools.
| Tool | Starter |
|---|---|
| Grok | starters/minimal-loop |
| Claude Code | starters/minimal-loop-claude |
| Codex | starters/minimal-loop-codex |
| Cursor / Windsurf | Copy SKILL.md + STATE.md from any starter; map scheduling to editor Automations or Workflows (see appendix) |
Audit after copying: npx @cobusgreyling/loop-audit . --suggest
Scaffold automatically: npx @cobusgreyling/loop-init . --pattern daily-triage --tool grok
No dedicated starters yet — map capabilities to the same loop shape:
| Step | Cursor | Windsurf |
|---|---|---|
| 1. Skills | Copy templates/SKILL.md.loop-triage → .cursor/skills/loop-triage/SKILL.md; add always-on triage rules in .cursor/rules/ |
Copy skill content into .windsurf/rules/loop-triage.md |
| 2. State | cp starters/minimal-loop/STATE.md.example STATE.md |
Same — commit STATE.md at repo root |
| 3. Scheduling | Cloud Automation (cron) or manual Agent prompt on cadence | Create .windsurf/workflows/daily-triage.md, invoke /daily-triage |
| 4. Verification | .cursor/agents/loop-verifier.md from templates/SKILL.md.verifier |
Add review step at end of workflow; human gate on denylist paths |
| 5. Connectors | Enable GitHub MCP read-only for issue/PR discovery | Configure GitHub MCP in Cascade settings |
Aider (CLI-only): use --watch or scripted sessions; state in STATE.md; reviewer = second terminal session.
Transfer recipe: copy the tool-agnostic SKILL.md + state schema from this repo; map scheduling to your editor's automation surface.