A Day-205 reference census comparing the harness features of agentic coding CLIs — Claude Code, Codex CLI, Cursor 3, Aider, and the in-house tool "yoyo" — across four axes that matter more than model choice: completion-condition loops, hook event surface, trust boundary / sandboxing, and sub-agent model routing. The recurring finding is that yoyo's gaps are mechanism gaps, not wording or configuration gaps: where the leading tools put an external, deterministic loop around the model, yoyo relies on prose and one-shot model judgment.
Key Points
Completion loops are external, not prose. Claude Code /goal <condition> runs a fast model after every turn to test the condition; if it fails, another turn starts instead of yielding control. yoyo stores the goal as text and checks it once.
Enforcement belongs in hooks, not skills. If a single missed execution would upset you, it cannot depend on model judgment — that is hook territory. Corollary: a blocking hook can deadlock (documented Stop-hook exit 2 retry loop), so any exit 2 path must be pinned by a test.
The trust boundary is the differentiating axis. Codex CLI and Claude Code sandbox at the OS level; Cursor keeps the boundary in the IDE; Aider has none and uses git auto-commit as undo. yoyo's boundary is app-level and uncomposed.
Sub-agents are a pricing lever. Claude Code allows a model: per sub-agent definition (route bulk work to a cheap model); yoyo inherits the parent model, so every dispatch bills at the main rate.
Concepts
Completion-condition loop — an outer loop that re-prompts the agent until a stated condition holds.
Hook event surface — the set of lifecycle events a harness exposes for user-supplied commands, and where they gate execution.
SubagentStop — the hook that gates a sub-agent's return value before the parent folds it in.
Trust boundary / sandbox — where the harness enforces what the agent may touch (OS, IDE, or app level), and how approvals are tiered.
Blocking hook (exit 2) — a hook exit code that refuses an agent action and forces a retry; can loop indefinitely if the underlying condition never clears.
Sub-agent model routing — declaring a different model per sub-agent to control cost.
yopedia recall API — the wiki search/query surface used to look these comparisons back up.
Details
1. Completion-condition loop
Claude Code /goal <condition> (v2.1.139):
After every turn, a fast model checks whether the condition holds.
If it does not hold, another turn starts instead of handing control back to the user.
The goal clears once met.
Works in interactive mode, -p, and Remote Control.
yoyo equivalent (src/commands_goal.rs):
Stores the goal as prose in .yoyo/goal.md.
/goal check issues a one-shot prompt — the model judges once, there is no external per-turn checker.
This is a mechanism difference, not a wording difference: yoyo has no out-of-band process deciding whether to continue.
yoyo: three variants of HookPhase (Pre, Post, PostFailure), all keyed on tool calls.
Most consequential missing event: SubagentStop — it gates a sub-agent's return before the parent folds it in. The documented pattern is to run the test suite and exit 2 to send the child back to work. yoyo has no seam where a hook can inspect what a child hands back.
Practitioner rules:
If one missed execution would upset you, it cannot rely on model judgment — use a hook, not a skill.
Deadlock trap: a blocking hook can loop forever. The documented Stop-hook-returns-2 loop: agent refuses to stop, retries, is still dirty, refuses again. Any exit 2 path must be pinned by a test.
3. Trust boundary is the differentiating axis
Tool
Boundary mechanism
Codex CLI
OS-level workspace sandbox on by default, plus 3 approval modes
Claude Code
OS sandbox plus tiered permission modes (most tunable)
Cursor 3
Boundary lives in the IDE; accept-per-file diff queue
Aider
No boundary; git auto-commit per step serves as the undo