Problem
After clicking Approve, the UI shows “Slack post did not complete” and/or API returns:
Run {id} is 'escalated' — cannot review on retry.
Root cause
execute_action resumed via LangGraph RedisSaver, which requires RedisJSON/FT commands not supported on Upstash. Local memory checkpointer also created a new MemorySaver per thread, so resume did not continue at the action node.
post_to_slack() itself works when called directly with a valid SLACK_WEBHOOK_URL.
Fix
- Resume approve → action from
opscanvas:run:{run_id} (call run_action directly)
- Fall back to in-process memory checkpointer when RedisSaver setup fails
- Retry approve when action failed but feedback-loop cap not hit
- UI: “Retry Slack post” + clearer failed/escalated states
- Document
OPSCANVAS_CHECKPOINTER=memory for local dev
Test plan
Closes #34
Problem
After clicking Approve, the UI shows “Slack post did not complete” and/or API returns:
Run {id} is 'escalated' — cannot reviewon retry.Root cause
execute_actionresumed via LangGraphRedisSaver, which requires RedisJSON/FT commands not supported on Upstash. Localmemorycheckpointer also created a newMemorySaverper thread, so resume did not continue at the action node.post_to_slack()itself works when called directly with a validSLACK_WEBHOOK_URL.Fix
opscanvas:run:{run_id}(callrun_actiondirectly)OPSCANVAS_CHECKPOINTER=memoryfor local devTest plan
pytest tests/test_durability.py tests/test_action_retry.pyCloses #34