fix(routing): world say/whisper silence adjacent prose in every mode - #136
Merged
Conversation
An explicit Eidoverse `say` / `whisper` is the resident's chosen public utterance for that round, but the world-verb set was consulted only in hybrid prose mode. In locus mode a round of ordinary text + `say` published twice: the say text, then the adjacent prose auto-routed to the same world locus (Cairn 2026-09-01, world seq 15146/15147 byte-for-byte; Mica's incident artifact af-world-say-prose-leak-20260901.md). Fold the world verbs into one `isSilencingTool` predicate used at both silencing sites (live round + trailing scan), so they behave exactly like channel sends: sticky from that round on, suppression visible in the [delivered] receipt. Discord send/reply/DM, skip_reply, think() privacy, text-only turns and non-publishing tool rounds are unchanged. Tests: locus-mode say and whisper (nothing auto-routed, receipt reports 2 suppressed), plus a `move` negative control. Mutation control (world verbs removed from the predicate) fails both new tests and the existing hybrid say test. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017op4YjCZABYS9vWBXxeRwH
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.
Incident
Mica's report
af-world-say-prose-leak-20260901.md(SHA-2569507f309…): in locus prose mode, a round of ordinary text + explicit Eidoversesaypublished twice — world seq 15146 = thesaytool input, seq 15147 = the adjacent ordinary text, byte-for-byte (Cairn provider row 230). Not asame_round_think_text_policybypass; nothink()was called and provider-native thinking stayed private.Root cause (confirmed)
src/framework.tsconsultedHYBRID_PUBLICATION_TOOLS(say,whisper) only whenagent.proseRouting === 'hybrid', at both silencing sites (live round + trailing scan). Introduced byc83fadb3(2026-08-14, hybrid envelopes). Discord sends inSILENCING_TOOLSsilenced in every mode; world verbs did not.Fix
Fold the world verbs into one
isSilencingTool(name)predicate used at both sites. An explicit world utterance now behaves exactly like a channel send in every mode: sticky silencing from that round on, suppression visible in the[delivered]receipt. No behavior change for Discord send/reply/DM,skip_reply,think()privacy, text-only turns, non-publishing tool rounds,explicitmode (silencing never applied there), ordisabledmode.Receipts (worktree off
origin/maind9fb35b, node_modules shared)present-while-acting,explicit-prose-routing,same-round-think-policy,prose-stream-router): 74/74--test-force-exit; based9fb35bwas 631/635, also 0 fail)WORLD_PUBLICATION_TOOLSfrom the predicate fails both new locus tests and the existing hybridsaytest; themovenegative control still passesNonblocking notes
emoteis also a world publication verb; left out of the set, matching the report's scope. Whether an emote should silence narration is a doctrine call.bareToolNamestrips the MCPL prefix, so any server exposing a baresay/whispertool (e.g.tavern-mcpl) now silences too. Consistent with hybrid's existing behavior.forking-knowledge-minersymlink to the local checkout, so this lands only on pull + restart.🤖 Generated with Claude Code
https://claude.ai/code/session_017op4YjCZABYS9vWBXxeRwH