Triage Factory
GitHub Install
← all releases
v1.15.0

Durability and recovery

Runs now carry on through a closed laptop lid, a provider or GitHub outage, a crashed executor and a deploy, and every internal queue that used to retry forever now parks where you can see it.

Lines carrying multi-tenant apply only to the self-hosted multi-tenant deployment; local only to the single-user local binary. Everything else is for everyone.

The big stuff

Runs survive sleep, outages and deploys. Close your laptop mid-run and the run carries on when you open it. On wake, TF also drops connections that died while it slept and polls every org straight away. If the model provider or GitHub goes down, the run hands its claim back and retries on a growing backoff for up to about four hours instead of failing. A deploy or restart hands every running conversation to the next executor, which picks it up without spending any retry budget, so a deploy no longer stops everything that was in flight.

Crashed and stuck runs recover on their own. Every claim now has a 75-second lease that its holder keeps renewing. Both modes’ dispatchers take over a claim whose lease has run out, and the reaper that used to do this has been deleted. A run that sits idle for ten minutes with nothing in flight, or runs past an operation’s deadline, parks itself as stalled and resumes when you message it. Native runs multi-tenant also checkpoint their workspace between tool calls, so a hard kill loses at most five minutes of work (TF_SNAPSHOT_INTERVAL_SEC) plus the tool call that was running.

Also new

Fixes

Upgrading

A 1.14 local install upgrades in place. local The Postgres schema changed inside its baseline migration rather than in new ones, so a 1.14 multi-tenant database won’t pick the changes up: start the deployment on a fresh database. multi-tenant

TF_REAPER_STALE_SEC and TF_SELF_FENCE_SEC are gone. multi-tenant TF_MAX_CLAIM_ATTEMPTS now counts only engagements whose executor was lost; setup failures have their own budget of five, and a clean shutdown spends neither.

On the API: the /api/events/failed/* routes are replaced by /api/orgs/{org_id}/work/…, which covers every queue. Conversation reads gain stop_requested_at and next_attempt_at, and POST /api/tasks/{id}/delegate returns 409 while a live claim still holds the task.