Skip to content

Default automatic handoff notes to disabled #31

Description

@boadij

Summary

Automatic handoff-note generation should be opt-in rather than enabled by default.

New Downshift configurations currently enable handoffBeforeDownshift, and configurations that omit the field are also interpreted as enabled. This means users can receive extra injected user messages and an additional premium-model turn without explicitly choosing that behavior.

Current behavior

Two code paths currently default handoff notes to on:

  1. configureInitial() writes:
handoffBeforeDownshift: true
  1. readConfig() interprets a missing field as enabled:
handoffBeforeDownshift: raw.handoffBeforeDownshift !== false

The README example also presents:

"handoffBeforeDownshift": true

Expected behavior

Handoff notes should be disabled unless the user explicitly enables them.

The default configuration should behave as:

"handoffBeforeDownshift": false

When disabled, reaching the threshold should switch directly to the economy target without injecting HANDOFF_MARKER or CONTINUE_MARKER messages.

Rationale

Handoff generation is useful, but it is not a passive feature. It:

  • injects a synthetic user message into durable conversation history,
  • performs an additional premium-model generation,
  • can enqueue a continuation turn,
  • increases token usage and latency,
  • changes the visible lifecycle of an otherwise completed or interrupted task.

The narrower and safer default is therefore direct model switching. Users who want the richer handoff flow can enable it explicitly from the configuration menu.

This does not replace the lifecycle fixes tracked in #30. Explicitly enabled handoffs must still handle terminal and aborted turns safely.

Proposed implementation

  1. Change configureInitial() to write handoffBeforeDownshift: false.
  2. Change the missing-field fallback in readConfig() to false.
  3. Keep explicitly stored true and false values unchanged.
  4. Update the README example and configuration guidance to show handoff notes as disabled by default and opt-in.
  5. Ensure /downshift still exposes the setting and allows users to enable it deliberately.

Compatibility

  • Existing configs containing "handoffBeforeDownshift": true remain enabled.
  • Existing configs containing "handoffBeforeDownshift": false remain disabled.
  • Legacy configs without the field resolve to disabled.
  • No threshold, model-selection, session-tree, or compaction semantics should change.

Because legacy missing-field behavior changes from enabled to disabled, document this in the release notes.

Non-goals

  • Do not remove handoff support.
  • Do not change explicit /downshift now behavior beyond respecting the configured handoff policy.
  • Do not change threshold comparison semantics.
  • Do not alter explicitly configured handoff values.
  • Do not combine this default change with the terminal and abort lifecycle implementation from Do not continue after terminal or aborted handoff turns #30 unless both changes remain independently testable.

Acceptance criteria

  • Fresh guided setup creates handoffBeforeDownshift: false.
  • A config without handoffBeforeDownshift is read as false.
  • An explicit handoffBeforeDownshift: true remains enabled.
  • An explicit handoffBeforeDownshift: false remains disabled.
  • The configuration menu shows handoff note: no for a fresh config.
  • Reaching the threshold under the default config switches directly to economy without sending a handoff user message.
  • Users can enable handoff notes through /downshift, after which the existing handoff flow is used.
  • README configuration examples and explanatory text reflect the opt-in default.
  • Release notes mention the changed fallback for legacy configs missing the field.

Test coverage

Add focused coverage for:

  • initial configuration creation defaulting handoff notes to false,
  • reading configs with the field absent, true, and false,
  • direct threshold downshift under a fresh/default config,
  • enabling the setting through the configuration menu,
  • preservation of explicitly enabled handoff behavior,
  • status and menu output for the new default.

Metadata

Metadata

Assignees

Labels

enhancementNew feature or request

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions