Skip to content

v0.6.0 - Compaction v2, progressive skills, adaptive thinking

Choose a tag to compare

@pbdeuchler pbdeuchler released this 29 Sep 00:36
· 91 commits to main since this release

Compared against v0.5.0 (7f8955d).

Published crate bumps:

  • halter-protocol 0.5.0 -> 0.6.0
  • halter-hooks 0.5.0 -> 0.6.0
  • halter-config 0.5.0 -> 0.6.0
  • halter-providers 0.5.0 -> 0.6.0
  • halter-session 0.5.0 -> 0.6.0
  • halter-tools 0.5.0 -> 0.6.0
  • halter-runtime 0.5.0 -> 0.6.0
  • halter 0.5.0 -> 0.6.0

Vendored halter-brush-core (0.5.0) and halter-brush-builtins (0.2.0) are unchanged. halter-cli moves to 0.6.0 but remains publish = false.

Changes:

  • Compaction v2. A session token ledger, Halter-owned compaction triggers, a hard context.max_tokens cap, and a public CompactionStrategy API replace signal-scored pruning. Three strategies are selectable via context.compaction: model_summary (new default, a model-written checkpoint), provider_default (provider-native compaction, the 0.5 behavior), and clean_window (rollover with durable notes, session_search, and session recovery).
  • Progressive skill loading. The system prompt lists skills by name and description only; a runtime-owned skill tool loads a body on demand without disturbing the cached prefix.
  • Anthropic adaptive thinking for every model, with effort levels (including xhigh) transmitted verbatim. Budget thinking is deprecated behind DEPRECATED_ANTHROPIC_THINKING_BUDGET=1.
  • OpenRouter routing: [providers.openrouter.routing] pins upstream providers (order, allow_fallbacks).
  • Policy: policy.shell.allow = ["*"], and configurable allowed_read_roots, sensitive_path_patterns, and policy.shell.mode.
  • Fixes: the ledger and cap account for prompt segments, tool declarations, and hook context; failed or no-op compaction passes restore the prior window via a logged ContextRestored; automatic compaction triggers exactly at the threshold.

Upgrading from 0.5

  • ContextConfig: wrap compaction_threshold in Some(..), drop
    pre_compaction_target and prune_signal_threshold, and add
    max_tokens: None, compaction: Default::default(), and
    notes_root: None (or use ..Default::default()). A config must set either
    context.compaction_threshold or models.default.max_input_tokens.
  • To keep 0.5's provider-native compaction, set
    context.compaction = "provider_default".
  • OpenRouterProvider::new_with_headers[_and_resilience]: pass None for the
    new routing argument after temperature.
  • Custom ContextManager implementations: plan no longer receives a
    compaction model/provider, and compact_now is gone.
  • Custom Provider implementations: delete compaction_window.
  • Custom CompactionStrategy implementations: replace
    threshold_notifications with context_boundary.
  • Exhaustive matches on SessionEventPayload need ContextWindowRolledOver,
    ContextProjectionUpdated, and ContextRestored arms; on
    CompactionTrigger, a Rollover arm; on CompactionStrategyKind,
    a CleanWindow arm.
  • SessionState::usage_anchor_floor / estimate_context_tokens users read
    SessionState::token_ledger instead; estimator helpers are imported from
    halter_protocol.
  • resolve_response_chain takes
    (last_response_id, messages_seen_by_provider, total_messages, has_compacted_prefix).
  • SkillDef literals add root (or use ..Default::default()); rename any
    tool called skill.
  • Anthropic endpoints that only accept budget thinking need
    DEPRECATED_ANTHROPIC_THINKING_BUDGET=1.

Full release notes: CHANGELOG.md