Hourly sweep finds approval_gates where status='pending' AND expiresAt <= NOW(). For each expired gate, calls expireApprovalGate(gateId) to set status='expired', then marks the associated pipeline_run as 'failed' with error='Approval gate expired after 24h — pipeline abandoned'. Sends notification to project owner.
Type: nightly_batch Trigger: Scheduled: 0 * * * * Entities: approval_gates,pipeline_runs,notification_settings Recommendation: