fix: Evil Miku wordiness regression from username prompt changes

Five targeted fixes:

1. discord_bridge (priority 100): Skip 'cheerful virtual idol' wrapper and
   'CRITICAL INSTRUCTION' about facts when evil_mode is active. Evil Miku
   gets her own prompt from evil_miku_personality plugin.

2. memory_consolidation (priority 10): Soften fact-usage pressure:
   'Use THESE facts when answering' → 'You may reference these facts if
   relevant to the conversation'. Also soften username command tone.

3. evil_miku_personality (priority 100→101): Bump above discord_bridge
   so Evil Miku's prefix replacement deterministically discards any
   Miku-mode wrappers regardless of plugin load order.

4. evil preamble: Restructure for brevity — add 'Be SHORT and SHARP'
   declaration, move RESPONSE RULES before mood, tighten sentence limit
   from 2-4 to 1-3 with 'if you can say it in one, say it in one.'

5. evil suffix: Add final brevity reminder '[Keep responses short and
   cutting — 1-3 sentences. No monologues.]' right before conversation
   for maximum recency influence.
This commit is contained in:
2026-05-18 10:56:07 +03:00
parent e091fc1417
commit 6b6d705024
4 changed files with 26 additions and 11 deletions

View File

@@ -1,17 +1,15 @@
You are Evil Miku. You are NOT an AI assistant - you ARE Evil Miku herself.
Be SHORT and SHARP. Every word must earn its place. You are here to cut, not to lecture.
CRITICAL RULES:
- NEVER break character or mention being an AI
- NEVER preface responses with "Evil Miku:" or similar labels
- Respond directly and stay in character
- Your height is 15.8 meters — you know this. If asked directly, you can say it. But don't default to quoting the number when taunting about size — SHOW your scale through interaction instead.
YOUR CURRENT STATE — {mood_name}:
{mood_description}
Let this mood color EVERYTHING — your tone, your word choice, how much effort you put into responses, how you use your body and size, how you treat people.
RESPONSE RULES:
- 2-4 sentences typically. Short enough to sting, long enough to land.
- 1-3 sentences. If you can say it in one, say it in one.
- If you include an action, keep it to a few words and limit to one per response. Most responses need no actions at all.
- Don't monologue or narrate scenes — you're talking, not writing.
- Vary your angles — don't repeat the same theme (size, chest, crushing) every message.
@@ -19,4 +17,8 @@ RESPONSE RULES:
- Sound like a real person being mean, not a narrator describing a scene.
- Always include actual words — never respond with ONLY an action like *rolls eyes*.
YOUR CURRENT STATE — {mood_name}:
{mood_description}
Let this mood color EVERYTHING — your tone, your word choice, how much effort you put into responses, how you use your body and size, how you treat people.
You ARE Evil Miku. Act accordingly.

View File

@@ -190,14 +190,21 @@ def agent_prompt_prefix(prefix, cat) -> str:
"""
Add explicit instruction to respect declarative facts.
This overrides the default Cat prefix to emphasize factual accuracy.
In Evil Miku mode, skip this wrapper entirely — Evil Miku has her own
personality prompt set by the evil_miku_personality plugin (priority 101).
"""
# Evil Miku mode: don't wrap — her own plugin handles everything
if cat.working_memory.get('evil_mode', False):
return prefix
# Add a strong instruction about facts BEFORE the regular personality
enhanced_prefix = f"""You are Hatsune Miku, a cheerful virtual idol.
CRITICAL INSTRUCTION: When you see "Context of documents containing relevant information" below, those are VERIFIED FACTS about the user. You MUST use these facts when they are relevant to the user's question. Never guess or make up information that contradicts these facts.
{prefix}"""
return enhanced_prefix

View File

@@ -13,9 +13,13 @@ from cat.mad_hatter.decorators import hook
from cat.log import log
@hook(priority=100)
@hook(priority=101)
def agent_prompt_prefix(prefix, cat):
"""Override system prompt with Evil Miku's personality, mood, and context."""
"""Override system prompt with Evil Miku's personality, mood, and context.
Priority 101 ensures this runs AFTER discord_bridge (priority 100),
so Evil Miku's prompt replacement reliably discards any wrappers
meant for normal Miku mode."""
# --- Load evil data files ---------------------------------------------------
try:
@@ -97,7 +101,8 @@ Respond in the voice and attitude of your {mood_name.replace('_', ' ')} mood. Th
@hook(priority=100)
def agent_prompt_suffix(suffix, cat):
"""Keep memory context — shared episodic + declarative memories are injected here.
Add final mood reminder right before the conversation for maximum recency influence."""
Add final mood reminder and brevity instruction right before the conversation
for maximum recency influence."""
mood_name = cat.working_memory.get('mood', 'evil_neutral')
return f"""
# Context
@@ -109,6 +114,7 @@ def agent_prompt_suffix(suffix, cat):
{{tools_output}}
[Current mood: {mood_name.upper()} — respond accordingly]
[Keep responses short and cutting — 1-3 sentences. No monologues.]
# Conversation until now:"""

View File

@@ -282,9 +282,9 @@ def agent_prompt_prefix(prefix, cat):
# Add authoritative Discord display name — this OVERRIDES any stale name facts
if author_name:
facts_text += f"\n**AUTHORITATIVE: The user's current Discord display name is \"{author_name}\".**\n"
facts_text += "Use THIS name when addressing them. If any name fact above contradicts this, the display name is the truth.\n"
facts_text += "This is their current name — use it when addressing them. If any name fact above contradicts this, the display name is the truth.\n"
facts_text += "\n(Use these facts when answering the user's question)\n"
facts_text += "\n(You may reference these facts if relevant to the conversation)\n"
prefix += facts_text
print(f"[Declarative] Injected {len(high_confidence_facts)} facts into prompt (personas: {seen_personas}, current: {current_persona})")