Makes /coco:loop run without stalling, and makes its progress visible without stopping it.
Fixes
- The loop no longer stops to report.
/coco:loopis markdown executed by a model, and nothing in it said not to yield. Measured across local transcripts, 21 turns ended on a future-tense statement of the next action —"Continuing with X"followed immediately byend_turn— or on an unrequested checkpoint like "I'll keep going unless you want to look at X first." Writing the sentence feels like progress, so the model wrote it and stopped.commands/loop.mdnow carries The Loop Does Not Stop To Report: never end a turn on a statement about the next step, never offer a checkpoint nobody asked for, put status in the ledger rather than prose, and treat a failed task as a skip rather than an exit.commands/phase.mdgets the same after its plan gate. loop.pause_on_errornow defaults tofalse. Pausing on the first failure turned every flaky test into a full stop needing a human — which compounds with over-testing rather than being a separate problem. A failed task is now skipped, leftin_progress, and logged; the no-progress circuit breaker still catches a genuinely stuck loop.loop.parallel.enablednow defaults totrue. Worktree isolation is proven, and enabling it costs nothing when it cannot apply.scripts/setup.shkeyed its parallel-enablesedtoenabled: false— the exact value this release changes. It would have accepted your wizard answer and written nothing, with no error. Now anchored on the comment.
Changes
/coco:setup migrate— reconciles an existing.coco/config.yamlagainst current defaults. Adds keys your config is missing (silent and safe: an absent key already behaves as its default) and reports keys whose value differs, applying a change only when you select it. It never reverts a deliberate choice in bulk.- Progress ledger. One mandatory line at the start and end of every iteration, carrying epic, done/total, blocked count, iteration number, and the no-progress counter — plus an inline
/coco:dashboardeveryloop.dashboard_everyiterations (default 5). Two previously silent decisions are now spoken: a parallel batch falling back to serial and which condition caused it, and an agent returning without committing. agents/task-executor.mdis bounded from the inside (loop.parallel.max_agent_attempts, default 2). An agent has no interactive channel — the parent is blocked on its return value, so a turn ending without one hangs the batch. It now runs to a terminal state and returns a clean failure rather than spinning.tests/test-setup-config.sh(new, 15 tests) asserts every wizardsedstill matches the shipped config, and that the five leaf keys the hooks read stay unique. Both groups mutation-tested against real defects.
Known limitation
The orchestrator cannot interrupt a running agent — the dispatch call blocks until return, and markdown cannot express a timeout. The bound is inside the agent, so it gives up and reports rather than spinning, but a genuinely hung agent still holds the batch.
Upgrade
/plugin
Then update coco, and confirm the path contains /0.5.0/:
which coco-trackerThen, in each existing project:
/coco:setup migrate
Your projects were initialized with the old defaults and keep them — .coco/config.yaml is copied once at setup and never re-read, so pause_on_error: true and parallel.enabled: false persist until migrated. Without this step the two default changes above do nothing for you.
Full Changelog: v0.4.0...v0.5.0