v0.3.3
Both TenantByIdKeyFormatter and TenantBySlugKeyFormatter previously shared the same "cache:invalidate:tenant" channel, causing parse failures when the slug formatter received bare id payloads (and vice versa). Split into "cache:invalidate:tenant:id" and "cache:invalidate:tenant:slug" so each formatter only receives payloads it can parse. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>