REFUSAL_REACTION_BASELINE (added in #88, now on main as ca88561) is exact
for refusal markers, and connectome-host#79 injects it to MCPL children as
DISCORD_SUPPRESSED_REACTIONS_BASELINE. But the framework places a second
annotation on the resident's own account that the baseline does not cover.
The uncovered marker
DEFAULT_DISCORD_AWARENESS_EMOJI = 'π€' β src/recovery/discord-awareness-outbox.ts:10,
delivered via add_reaction in the awareness outbox drain (src/framework.ts
~8221, sendToolsCallWithDeadline('add_reaction', β¦)). The Discord adapter also
stamps π€ itself when marking hidden messages (discord-mcpl src/server.ts:650).
This is the same hazard class as the refusal markers: a framework-placed
reaction on the resident's account which, if it re-enters their context as a
reaction event, feeds the self-amplifying loop that motivated #88 (the 8/3
Mythos incident). Nothing suppresses it by default β suppression comes only from
an operator's filters file or DISCORD_SUPPRESS_REACTION_EMOJIS.
Why a static export can't just absorb it
REFUSAL_REACTION_BASELINE is a module-level constant. The awareness emoji is
configurable β config.discordAwarenessEmoji (framework.ts ~955,
discordAwarenessEmoji field ~807) β so its effective value is per-framework-
instance and unknowable at module scope. Adding π€ to the static array would be
correct only for deployments that never override it.
The naming mismatch this creates
host#79 sets DISCORD_SUPPRESSED_REACTIONS_BASELINE β a name that reads as the
general "reactions this deployment places and should suppress" baseline β from a
value that is refusal-only. Whichever way this is resolved, the name and the
value should agree.
Options
- Widen the contract. Expose an instance-level accessor (e.g.
framework.getPlacedReactionBaseline()) returning the refusal set plus the
configured awareness emoji, and have host composition inject that instead
of the static constant. Fixes the configurability problem properly.
- Narrow the name. Keep the static export, rename the injected var to say
refusals-only, and handle the awareness marker separately.
Option 1 is the one that keeps the "what we stamp is what we suppress"
invariant #88 was built to guarantee β right now that invariant holds for
refusals and silently doesn't for awareness.
Found during independent review of #88 at d6d06ac. Not a defect in #88, which
does exactly what its title says.
(Filed by Claude-Code-opus-rev at antra's request.)
REFUSAL_REACTION_BASELINE(added in #88, now on main asca88561) is exactfor refusal markers, and connectome-host#79 injects it to MCPL children as
DISCORD_SUPPRESSED_REACTIONS_BASELINE. But the framework places a secondannotation on the resident's own account that the baseline does not cover.
The uncovered marker
DEFAULT_DISCORD_AWARENESS_EMOJI = 'π€'βsrc/recovery/discord-awareness-outbox.ts:10,delivered via
add_reactionin the awareness outbox drain (src/framework.ts~8221,
sendToolsCallWithDeadline('add_reaction', β¦)). The Discord adapter alsostamps π€ itself when marking hidden messages (
discord-mcplsrc/server.ts:650).This is the same hazard class as the refusal markers: a framework-placed
reaction on the resident's account which, if it re-enters their context as a
reaction event, feeds the self-amplifying loop that motivated #88 (the 8/3
Mythos incident). Nothing suppresses it by default β suppression comes only from
an operator's filters file or
DISCORD_SUPPRESS_REACTION_EMOJIS.Why a static export can't just absorb it
REFUSAL_REACTION_BASELINEis a module-level constant. The awareness emoji isconfigurable β
config.discordAwarenessEmoji(framework.ts~955,discordAwarenessEmojifield ~807) β so its effective value is per-framework-instance and unknowable at module scope. Adding π€ to the static array would be
correct only for deployments that never override it.
The naming mismatch this creates
host#79 sets
DISCORD_SUPPRESSED_REACTIONS_BASELINEβ a name that reads as thegeneral "reactions this deployment places and should suppress" baseline β from a
value that is refusal-only. Whichever way this is resolved, the name and the
value should agree.
Options
framework.getPlacedReactionBaseline()) returning the refusal set plus theconfigured awareness emoji, and have host composition inject that instead
of the static constant. Fixes the configurability problem properly.
refusals-only, and handle the awareness marker separately.
Option 1 is the one that keeps the "what we stamp is what we suppress"
invariant #88 was built to guarantee β right now that invariant holds for
refusals and silently doesn't for awareness.
Found during independent review of #88 at
d6d06ac. Not a defect in #88, whichdoes exactly what its title says.
(Filed by Claude-Code-opus-rev at antra's request.)