Handoff MCP v0.20 — Estimates Enforced Everywhere, Profiled Session Runs
Release

Handoff MCP v0.20 — Estimates Enforced Everywhere, Profiled Session Runs

The estimate requirement that bulk import and bulk update used to slip past is now enforced. session-execute gains express / standard / full profiles, and the bug that counted a crash as a pass is fixed. The marketplace plugin now ships its skills.

Here is what changed in Handoff MCP v0.20.0: the estimate requirement is now enforced at every write path, the session-execution workflow lets you choose how deep it runs, and the marketplace plugin that shipped no skills is fixed. This release contains breaking changes.

Closing the estimate-requirement loophole

A leaf task placed in todo, in_progress, review, or done needs an estimate (schedule.estimate_hours) — a rule handoff_update_task has enforced for a while. The bulk tools slipped past it, so writing tasks in bulk was a way around the requirement.

  • handoff_import_context (breaking) — importing an estimateless leaf task is now rejected on the same terms as update_task. The whole payload is validated before anything is written, so a single bad entry means no tasks are created and no task IDs are consumed. The error names the offending task and returns a ready-to-send JSON example you can resubmit as-is.
  • handoff_bulk_update_tasks (breaking) — an update that would move an estimateless leaf task into a status that requires one is rejected. Rejections are reported per task in errors[], and the other updates in the batch still apply.

Parent tasks (anything with children) and the blocked / skipped statuses remain exempt. To import historical done tasks without an estimate, set settings.require_estimate_hours = false.

We also fixed a case where an import could write circular dependencies to disk. Cycles that live entirely inside the payload — or span the payload and existing tasks — are now caught in one pre-write pass.

Profiles for session-execute

/session-loop used to run develop → test → review every time. In v0.20 you choose the depth.

  • express — developer only (1 turn)
  • standard — develop → test (2 turns)
  • full — develop → test → review (3 turns, the previous behavior)

Omitting profile now selects standard (breaking). Pass profile: 'full' to keep the old three-stage pipeline. Under every profile the developer still runs the project's quality gates (tests, type-checks, and so on). What express drops is the adversarial review layer, not the gates.

Reasoning effort is tied to the profile too. The express developer runs at medium; the tester and reviewer stay at high — they are the adversarial layers a deeper profile is paying for.

Reliability fixes in session-execute

The goal here was to make sure a "green" result is actually backed by verification.

  • A tester that crashed was counted as a pass, so a session could be approved with no verification behind it. Crashed, empty, and unparseable tester results now all fail the round.
  • The reviewer's report template contains the line **verdict**: APPROVE | REQUEST_CHANGES, which the approval check matched — a session could self-approve. The verdict is now a typed field from structured output instead of prose matched against text.
  • A developer agent that crashed still reported passed: true. A developer that returns no report now fails the session under every profile.
  • Bundled task IDs (t1+t2) never received rework feedback, because the + was read as a regex quantifier. IDs are now escaped and matched whole, so t1 no longer steals the findings reported for t12.

The marketplace plugin now ships its skills

The handoff-mcp plugin advertised five skills (handoff, handoff-load, handoff-memory, handoff-refer, handoff-import) but shipped none of them, so /plugin install registered the MCP server without the skills that drive it.

claude plugin details handoff-mcp@handoff-mcp-marketplace now reports Skills (5) instead of Skills (0). Existing installs pick them up with /plugin update handoff-mcp@handoff-mcp-marketplace followed by a restart.

Installing and updating

npx handoff-mcp-server@latest

If you use it as a Claude Code plugin, /plugin install alphaelements/handoff-mcp keeps you on the latest release.

See the Handoff case study