Preloop 0.15.0: flow schedules, self-hosted runners, security audit presets

Preloop 0.15.0 shipped on 20 August 2026. It is a large release; five highlights from the changelog.
Native flow schedules
Flows can now run on a schedule without an external cron caller hitting the webhook endpoint. schedule_config takes a raw 5-field cron expression or friendly forms: interval (every N minutes/hours/days), daily at a time, or weekly on chosen days, all timezone-aware. A preview endpoint validates a config without saving it and returns the next few run times.
The console flow editor gains a Schedule trigger type with friendly-first forms, cron behind an Advanced toggle, and a live preview of the next three runs. Paused flows never fire, and a tick that lands while a previous execution is still running is skipped and recorded as an audit event rather than silently stacking.
Self-hosted runners
preloop runner registers a machine with your account, keeps a durable WebSocket, heartbeats, leases matching flow jobs, and streams logs back. enable/start/status and friends install it as a launchd plist, systemd user unit, or Windows scheduled task. Flows can pin a runner_pool; if no matching runner is online, the job queues for 15 minutes and then fails, with no silent fallback to hosted compute. A new console page lists your runners.
Security audit preset pack
Three single-execution presets built on the Observe/Eval pattern, aimed at release evidence work: SBOM Verify checks validity, NTIA/CRA minimum elements, and completeness for CI-emitted SPDX/CycloneDX documents (it verifies, never generates, an SBOM). SBOM Exploit Check maps components to CVEs via OSV.dev, flags CISA KEV entries, applies a severity gate, and echoes VEX suppressions instead of dropping them. Release Security Audit runs both in one execution plus a drift comparison against a previous run's result, built for webhook-fed release builds and scheduled re-audits. All three run read-only and produce a versioned result.json plus an evidence pack.
Eval-grade flows
One flow definition can now drive an evaluation grid: a trigger's matrix key fans out up to 25 model x harness cells, each its own execution, all sharing a batch_id with a status/cost/token rollup endpoint. Trigger payloads can seed files into the agent's workspace before it starts, with strict path and size validation, instead of embedding fixtures into prompts. And /workspace/result.json is now a first-class verdict channel: captured by the runner even from exited containers, served on its own endpoint, and counted as positive completion confirmation of equal standing with the printed sentinel, cutting false FAILED verdicts on long runs.
Cost accounting gets honest
When the provider reports a request's actual cost in the response, the gateway records it as authoritative over catalog estimates, marked cost_source='provider'. Usage that could not be priced is now labelled unpriced instead of rendering as $0.00. And history is repairable: a synchronous reprice endpoint re-scans up to 92 days in-request, and a daily-ledger CSV backfill distributes provider-actual daily totals across still-unpriced rows, tagged reconciled and never mixed with estimates. Re-runs are idempotent.
Also in 0.15.0: preloop claude (remote control of Claude Code sessions from phone or web, with the native TUI regaining control on release), signed SLSA build provenance on every release asset, CloudNativePG scheduled backups in the Helm chart, approval requests that show which access rule gated the call, a chat-style session transcript view, per-session prompt-cache accounting, and flow execution durations in the console.
The full changelog is in the 0.15.0 release notes.