Skip to content

Protective reaction baseline misses the awareness marker (πŸ’€) β€” framework places it too, and it's configurable so a static export can't cover itΒ #95

Description

@antra-tess

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

  1. 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.
  2. 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.)

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions