The engine fell back to MemoryState because there was no Redis to talk to, so every value was lost on restart. Adds a redis service with append-only persistence, reachable only from the backend, and points REDIS_HOST at it. state.py and pipeline.py leave the strict-mypy exclusion. redis-py types its calls as sync/async unions; the casts narrow that at the points of use rather than switching to redis.asyncio, which would make a deliberately synchronous backend asynchronous. nodes.py stays excluded. The .env.example CORS entry belongs with the CI work that follows. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KkmeRiyeYmVZqJVwuyHq9o