Skip to content

v0.5.0

Latest

Choose a tag to compare

@peckda peckda released this 30 Aug 17:55

Makes /coco:loop run without stalling, and makes its progress visible without stopping it.

Fixes

  • The loop no longer stops to report. /coco:loop is 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 by end_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.md now 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.md gets the same after its plan gate.
  • loop.pause_on_error now defaults to false. 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, left in_progress, and logged; the no-progress circuit breaker still catches a genuinely stuck loop.
  • loop.parallel.enabled now defaults to true. Worktree isolation is proven, and enabling it costs nothing when it cannot apply.
  • scripts/setup.sh keyed its parallel-enable sed to enabled: 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.yaml against 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:dashboard every loop.dashboard_every iterations (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.md is 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 wizard sed still 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-tracker

Then, 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