Skip to content

v0.11.5 - Native Harness Loops & iOS Network Resilience

Choose a tag to compare

@Th0rgal Th0rgal released this 14 May 08:38
· 1544 commits to master since this release

Bundles PR #432 — clean reimplementation of the still-unique work from the abandoned #430 (Codex goal mode + iOS network resilience WIP).

Features

Native harness loops as Automation rows

Claudecode and codex /goal continuation loops now materialize as first-class rows in the Automations panel, with iteration badges and a per-row stop button — alongside OA-scheduled automations.

  • New NativeLoopAdapter trait + registry in src/backend/native_loops.rs
  • Broadcast subscriber src/api/native_loop_observer.rs translates GoalIteration / GoalStatus events into Automation + AutomationExecution rows
  • mission_store gains a CommandSource::NativeLoop { harness, command, args } variant and an AutomationDriver { Scheduler, HarnessLoop } enum (defaults to Scheduler for back-compat)
  • Idempotent SQL migration adds a driver column to automations
  • The harness CLI still drives iteration; OA only observes

iOS network resilience

  • Dedicated JSON URLSession with bounded 15s request / 60s resource timeouts (was unbounded behind URLSession.shared defaults)
  • Retry/backoff on transient failures, SSE parser hardening
  • Filesystem-backed mission cache; the old multi-MB UserDefaults blob is drained once via SandboxedDashboardApp.init
  • New NetworkResilienceTests target pinning the behaviours

Claude Code built-in ScheduleWakeup bridge

  • mission_runner watches for Claude Code's built-in ScheduleWakeup tool call, captures (delaySeconds, prompt, reason), and on a successful tool result POSTs an interval automation that fires the prompt back into the mission after the requested delay (clamped to [60, 3600])
  • New 300s heartbeat (env-tunable via SANDBOXED_SH_CLAUDECODE_HEARTBEAT_INTERVAL_SECS) keeps the actor-level stuck-mission watchdog quiet during extended thinking, where the CLI emits only scaffolding stream events for minutes

Bugbot follow-ups (within the release window)

  • sqlite: drop a duplicate driver column from get_mission_automations SELECT
  • native_loop_observer: evict the mission cache entry on terminal status, and skip inactive rows when matching — so a new /goal on the same mission creates a fresh automation row instead of appending to the hidden inactive one
  • ControlView: restore the 15s timeout on image fetches that the resilience pass had dropped
  • APIService: drop unused error structs (StreamInactivityError, StreamOversizeError)

Upgrade notes

Existing rows automatically default to driver = scheduler via the migration; no manual data fix required.

Full Changelog: v0.11.4...v0.11.5