{"id":"hitl-approval-workflows","slug":"hitl-approval-workflows","name":"Human-in-the-loop approval workflows","shortName":"HITL approvals","problemStatement":"Pause agents for human approve/reject on risky tools (spend, delete, send), with timeouts, escalations, and audit trails.","whenNotTopPick":"Notification-only approval UX (Knock/Courier) without durable state, or Inngest wait-for-event fits better.","categoryIds":["cat-cpu-compute"],"depotPickProviderId":"temporal-cloud","depotPickRationale":"Workflow durability + signals. Confidence: high for Temporal patterns; productized HITL UIs vary.","runnersUpIds":["inngest","knock","courier","hatchet"],"weights":{"capabilityFit":0.2,"pricePerformance":0.12,"latencyReliability":0.28,"developerDx":0.14,"privacyPosture":0.08,"lockInRisk":0.08,"maturity":0.1},"methodologyNotes":"Workflow durability + signals. Confidence: high for Temporal patterns; productized HITL UIs vary.","tags":["hitl","approvals","workflows","safety"],"depth":{"whenNotToUse":{"text":"Notification-only approval UX (Knock/Courier) without durable state, or Inngest wait-for-event fits better.","source":"editorial `whenNotTopPick` (data/jtbds.json)"},"whenNotToUseReason":null,"runnerUp":{"providerId":"inngest","name":"Inngest","overallForJob":8.08,"pickOverallForJob":8.18,"beatsPickOn":["pricePerformance","developerDx","lockInRisk"],"source":"first resolvable entry of the job's editorially ranked `runnersUpIds`; scores are stored job-weighted scores"},"runnerUpReason":null,"lockIn":{"pickLockInRisk":5,"runnerUpLockInRisk":4.2,"scale":"0–10 stored curated estimate; higher = more lock-in (worse)","pickExitSignals":[],"runnerUpExitSignals":[],"pickNotes":[],"selfHostFallback":[],"migration":"Runner-up Inngest has lower stored lock-in risk (4.2 vs 5, 0–10, higher = more lock-in).","migrationReason":null,"derivedFrom":"stored lockInRisk scores, provider tags (oss, self-host, openai-compat, open-models), free rows that list this job, and verbatim provider notes. No migration guide was invented."}},"freshness":{"pick":{"score":{"asOf":"2026-09-14","ageDays":43,"stale":true,"staleAfterDays":30,"reason":null},"lastReviewed":{"asOf":"2026-09-14","ageDays":43,"stale":true,"staleAfterDays":30,"reason":null},"sourceCheck":{"checkedAt":"2026-10-27","sourceUrls":3,"sourcesReachable":3,"pricingRows":0,"pricingRowsReconfirmed":0,"note":"A source re-check confirms the page is reachable and, for pricing rows, that the stored amount and SKU name appear on it. It does not re-derive or change the score.","reason":null}}},"depotPick":{"id":"temporal-cloud","slug":"temporal-cloud","name":"Temporal Cloud","tagline":"Default durable orchestration for serious long-running agents. Inngest/Trigger.dev for lighter DX.","overall":8.18},"runnersUp":[{"id":"inngest","slug":"inngest","name":"Inngest","tagline":"Best DX default for durable agent workflows in TypeScript/Python. Temporal when you need harder multi-lang…","overall":8.08},{"id":"knock","slug":"knock","name":"Knock","tagline":"Best agent-native notification fabric (toolkit + human-in-the-loop). Courier remains Depot orchestration…","overall":8.24},{"id":"courier","slug":"courier","name":"Courier","tagline":"Use when your agent/product notifies across many channels with preferences. Skip if you only send email.","overall":8.14},{"id":"hatchet","slug":"hatchet","name":"Hatchet","tagline":"Temporal/Inngest peer for agent task orchestration. Prefer Temporal for serious durability; Inngest for TS…","overall":8.05}]}