feat(threads): per-thread mute (LC-546) #515
Loading…
Reference in a new issue
No description provided.
Delete branch "feat/LC-546-per-thread-mute"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What
Per-thread mute (LC-546), the first Round-4 quick win. Lets a member silence one noisy thread's reply notifications without unfollowing every thread they have participated in. It is the exact inverse of LC-310 thread following.
How
thread_muterstable (chat/0084), a standalone subscription keyed by the thread root message, mirroringthread_followers(schema, index,ON DELETE CASCADE). db module exposes idempotentmute/unmute,is_muted, and a bulkmuters()for the fan-out.notify_thread_followersdrops any follower present in the thread's muter set. Replying auto-follows you (LC-310), so filtering at fan-out time (rather than deleting the follow) lets mute win over an existing auto-follow with a single bulk lookup +HashSetcheck.POST/DELETE /room/{id}/thread/{parent}/mute(same access + parent gate as follow), aThreadMuteFragmentbutton that swaps itselfouterHTML, and the mute state surfaced on the thread panel so the toggle renders correctly on open. The button sits beside the follow toggle in the panel header. en/es strings added (i18n parity test green).Tests
db_thread_muters- round-trip, idempotency, FK cascade on root delete.routes_thread_mute- endpoints flip state and swap the button (hx-post<->hx-delete); a muter stays auto-followed yet muted across a later reply (the fan-out filter's precondition); anonymous mute redirects to login with no row written.Green locally on
just check, fulljust test, andjust test-saas.🤖 Generated with Claude Code
https://claude.ai/code/session_016e15V7qtQgNFaK3VNYpwkw
Adds POST/DELETE /room/{id}/thread/{parent}/mute (same access + parent gate as follow), a ThreadMuteFragment button that swaps itself outerHTML, and the mute state (is_muted) on the thread panel so the toggle renders correct on open. Button sits beside the follow toggle in the panel header. en/es strings for mute/muted labels and titles. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016e15V7qtQgNFaK3VNYpwkw