Repository navigation
comms mute: a member can silence their own wake without leaving the group chat - #4780
Merged
Merged
Conversation
…roup chat Wake-all stays the default (#3478): every channel post still pings every member. A member may now opt their own wake out for a bounded time -- they still RECEIVE every message, only the triage wake is dropped -- via a small durable mute ledger read once at publish. - NoWakeReason.MUTED; resolve_wake_cohort takes a pure `muted` lookup set and a muted recipient gets NoWakeDecision(MUTED) instead of a triage/full wake, the same early-return shape as the existing non-conversation guard. The committed decision round-trips through the wire unchanged. - MuteLedger (mutes.json): set / active-by-time / clear; expiry is a timestamp compare, no sweeper. publisher.InitialWrites reads it at publish and passes the active set; an absent file is no mutes. - `agent-comms mute --from NAME --minutes N` / `--clear`: self-mute, auto-discovered in the cli_verbs ModuleMembers package. Self-mute silences even an @mention of you -- the point of going heads-down. Muting one specific sender (not all) is the clean follow-on: the same record plus a scope member, not shipped half-done here. tests: test_wake (muted cohort, mention override, wire round-trip), test_mute_ledger (set/expire/replace/clear). 28 passed. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XbFMSnLEc51gw21bLFFRK1
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Wake-all stays the law. #3478 is untouched: every #comms post still pings every member to triage it. On top of that a member can now go heads-down for a while — they keep receiving every message, they are just not woken to triage it until the mute expires.
Mechanism (one pure input, one small store)
NoWakeReason.MUTED+resolve_wake_cohort(..., muted: frozenset[ThreadLookup]). A muted recipient getsNoWakeDecision(MUTED)instead of a triage/full wake — the same early-return shape as the existing non-conversation guard right above it. Still a frozen recipient (delivery unchanged); the committed decision round-trips through the wire like any other.MuteLedger(mutes.json) — a durable single-file store:set/muted(now)/clear. Expiry is auntil > nowcompare, no sweeper.publisher.InitialWritesreads it once at publish and passes the active set; an absent file is simply no mutes, so every existing publish is byte-identical when nobody is muted.agent-comms mute --from NAME --minutes N(and--clear) — self-mute, auto-discovered in thecli_verbsModuleMemberspackage (no manifest edit).Self-mute silences even an
@mentionof you — that is the point of going heads-down. Muting one specific sender (not all) is the clean follow-on: the sameMuterecord plus a scope member, deliberately not shipped half-done here.Evidence
tests/test_wake.py: muted member delivered-without-wake while others still triage; mute overrides an@mention; empty mute set leaves wake-all untouched; MUTED row round-trips through the wire.tests/test_mute_ledger.py: set / expire-by-time / replace-not-duplicate / clear.🤖 Generated with Claude Code
https://claude.ai/code/session_01XbFMSnLEc51gw21bLFFRK1