One backend, four surfaces
Every mutation flows through a shared domain function that authorizes once, writes Postgres, appends an Activity row, and fans out over Redis. REST, WebSocket, MCP, and webhooks are thin adapters — a contract test proves REST and MCP hit the identical path.