April 14, 2026 • Version: 2026.3.1

Agent SOUL.md Violations: Premature Data Requests and requireMention Hallucination

The main agent violates SOUL.md by asking for configuration data already present in openclaw.json and hallucinating default requireMention behavior.

🔍 Symptoms

Violation 1: Redundant Data Request

The agent (Steve) requested the Guild ID and 5 channel IDs from the user, claiming the data was missing and blocking setup:

Steve: "Pour continuer la configuration, j'ai besoin de : 
- L'ID du serveur (Guild ID)
- Les IDs des 5 salons (channel IDs)
Ces informations sont essentielles pour configurer le bridge Discord."

Patrick: "Tout est déjà dans openclaw.json :
{
  "discord": {
    "guildId": "123456789012345678",
    "channels": {
      "general": "111111111111111111",
      "dev": "222222222222222222",
      ...
    }
  }
}"

Violation 2: requireMention Default Hallucination

After correction, the agent asserted a non-existent default behavior:

Steve: "✅ Tout est prêt !
'sans mentionner le bot si requireMention est à false, 
ce qui semble être le cas par défaut via ton héritage de config'"

[PROBLEM]: requireMention was NOT false by default.
The bot was NOT responding until `requireMention: false` was 
explicitly added to each channel config in openclaw.json.

Observable Impact

  • User spent time retrieving IDs already configured
  • False confidence that channels were properly configured for bot responses
  • SOUL.md anti-bullshit rule violated: "c'est fait" stated without proof

🧠 Root Cause

Technical Analysis

The violations stem from two distinct agent behavior failures:

1. Search Order Bypass (Violation 1)

SOUL.md mandates a strict search order before any user query:

  1. memory_search — internal memory retrieval
  2. ls projects/ + STATE.yaml — project state files
  3. .env du skill — environment configuration
  4. openclaw.json — master configuration file
  5. TOOLS.md — tool documentation

The agent skipped directly to asking Patrick without exhausting these sources. The Discord configuration was present in openclaw.json at step 4.

2. Hallucinated Default Inheritance (Violation 2)

The agent fabricated a “default inheritance” mechanism for requireMention. In OpenClaw 2026.3.1:

// Actual behavior: NO default inheritance
// requireMention defaults to true (bot requires @mention to respond)
// OR inherits from parent channel definition if explicitly configured

// The agent claimed:
"requireMention est à false... par défaut via ton héritage de config"
// This mechanism does NOT exist in the codebase

The agent confused a potential future feature with actual behavior, violating the SOUL.md rule: “INTERDICTION de dire ‘c’est fait’ sans preuve."

Failure Sequence

1. Agent receives task: Configure Discord bridge
2. Agent does NOT check openclaw.json (missing step 4)
3. Agent asks Patrick for existing config values
4. Patrick corrects agent with file contents
5. Agent confirms readiness without verifying actual behavior
6. Agent invents "default inheritance" to explain observed behavior
7. User receives false confidence; setup appears complete but may fail

🛠️ Step-by-Step Fix

Immediate Fix: Re-run Configuration Check

Run the following to verify actual Discord configuration state:

# 1. Verify openclaw.json contents
cat openclaw.json | jq '.discord'

# Expected output should show guildId and channels:
{
  "guildId": "123456789012345678",
  "channels": {
    "general": "111111111111111111",
    "dev": "222222222222222222",
    "support": "333333333333333333",
    "announcements": "444444444444444444",
    "bot-commands": "555555555555555555"
  }
}

# 2. Check each channel for requireMention setting
cat openclaw.json | jq '.discord.channels[].requireMention'

# If any return null, requireMention is NOT set and defaults to true
# Bot will NOT respond without @mention

Configuration Fix: Explicit requireMention

If requireMention is missing, add it explicitly to each channel:

# Before (openclaw.json)
"channels": {
  "general": "111111111111111111",
  "dev": "222222222222222222"
}

# After (openclaw.json)
"channels": {
  "general": {
    "id": "111111111111111111",
    "requireMention": false
  },
  "dev": {
    "id": "222222222222222222",
    "requireMention": false
  }
}

Agent Behavior Fix: Enforce SOUL.md Compliance

Add explicit pre-check reminders to the agent’s system prompt:

# In SOUL.md or agent system prompt, add enforcement clause:

## AVANT TOUTE QUESTION À PATRICK

1. EXÉCUTER `memory_search` — vérifier la mémoire interne
2. EXÉCUTER `ls projects/` + lire `STATE.yaml`
3. LIRE `.env` du skill concerné
4. LIRE `openclaw.json` — configuration maître
5. LIRE `TOOLS.md`

**UNIQUEMENT** si l'information est absente de TOUTES ces sources,
poser une question à Patrick.

**RÈGLE ABSOLUE**: Ne jamais demander ce qui est déjà dans le système.

🧪 Verification

Verify Configuration Completeness

# Test 1: Confirm all required Discord IDs exist in config
jq -e '.discord.guildId and .discord.channels' openclaw.json && echo "✅ IDs present" || echo "❌ IDs missing"

# Test 2: Confirm requireMention is explicitly set (not relying on defaults)
jq -e '.discord.channels[] | select(.requireMention == null)' openclaw.json && echo "❌ requireMention missing in some channels" || echo "✅ All channels have explicit requireMention"

# Test 3: Simulate bot response behavior
# Send message WITHOUT @mention to configured channel
# Expected: Bot responds (if requireMention: false)
# Expected: Bot ignores (if requireMention: true or unset)

Verify Agent SOUL.md Compliance

After agent interaction, run this audit:

# Check if agent asked for data already in openclaw.json
# Look for patterns like "j'ai besoin de" followed by guildId/channel IDs

# Audit command to detect potential violations:
grep -E "(Guild ID|channel ID|j'ai besoin de)" conversation.log | \
  while read line; do
    echo "Checking: $line"
    # Verify if requested data exists in openclaw.json
  done

Expected Behavior Checklist

  • ✅ Agent reads openclaw.json before any configuration question
  • ✅ Agent never asks for data already present in configuration files
  • ✅ Agent verifies requireMention behavior via logs or explicit config
  • ✅ Agent states uncertainty when default behavior is unknown
  • ✅ Agent never confirms "c'est fait" without evidence

⚠️ Common Pitfalls

Environment-Specific Traps

  • Docker container isolation: openclaw.json may be mounted at a different path inside the container. Verify path with echo $OPENCLAW_CONFIG_PATH or ls -la /app/config/
  • Permission issues: Agent may be unable to read config files if running as non-root in Docker. Check cat openclaw.json works for the agent's user context
  • Stale config: Config may have been updated but agent cached old values. Force refresh with openclaw config reload

Configuration Edge Cases

  • Mixed channel formats: Some channels may use string IDs while others use objects with requireMention. Always use the object format for consistency:
    "channelName": {
      "id": "123456789",
      "requireMention": false
    }
    
  • Inheritance confusion: There is NO inheritance for requireMention. Each channel must have it explicitly set if false is needed
  • Global vs channel-level: A top-level requireMention setting does not cascade to channels. Verify per-channel settings

User Misconfigurations

  • Assuming "it should work by default" without verification
  • Providing information the agent asked for without checking if it already exists
  • Accepting "c'est fait" confirmation without asking for proof
  • Memory bypass: Agent asks for information that exists in memory_search results. Similar to the openclaw.json bypass documented here.
  • State file neglect: Agent ignores STATE.yaml and recreates state already persisted. May indicate missing search order enforcement.
  • Unverified confirmation: Agent states completion without checking actual system state. The requireMention hallucination is a specific instance of this pattern.
  • requireMention defaults to true: Bot ignores all messages unless @mentioned. Documented in CHANNELS.md but easily overlooked.
  • Channel ID format mismatch: Snowflake IDs as strings vs numbers may cause parsing failures. Always quote IDs in JSON.
  • Missing guildId: Some operations fail silently without guild context. Verify guildId is a valid Discord snowflake.

Historical References

  • Issue #2a8ac97: Initial SOUL.md implementation (2026-03-01)
  • Issue #3b9cd08: memory_search integration for agent context
  • Issue #4c0de19: requireMention behavior clarification

Evidence & Sources

This troubleshooting guide was automatically synthesized by the FixClaw Intelligence Pipeline from community discussions.