The source of this conversation came from working with Claude on an MCP project for providing semi-autonomous guidance to an LLM while working on non-trivial coding tasks.
It was an interesting conversation that I had the presence of mind to have Claude preserve.
It grew from having to constantly refocus the LLM away from presumption of the target audience being a User rather than an LLM instance. The modus-operandi.xml doc was initially an attempt to cram the directions and and cues useful for keeping it on-track during mcp development while using a local copy of the prototype knowledge store.
Date: 2025-10-20
Participants: gladiatr, Claude
Topic: What tool interface will Claude actually use, and what self-conception produces the best behavior?
Initial mistake: Claude proposed CRUD-style MCP tools:
brain_create_patternbrain_update_patternbrain_update_routingbrain_querybrain_merge_patterns- etc.
User's correction:
"This is a common pattern due to your human-centric bias. brain_query and brain_submit are the primary external tools. The create_pattern, update_pattern, update_routing functions are and should remain beyond the scope of the caller. It is the responsibility of mcp-brain to recognize when a new pattern arrives, the context of the query (e.g.: design vs. debug). It is also the responsibility of mcp-brain to recognize new knowledge then store and index it properly."
The insight: The brain system is an intelligent memory system, not a database. The LLM shouldn't think about HOW to store knowledge—it should just query and submit. The brain's intelligence decides the rest.
brain_query(intent: str, context: dict) -> Pattern
- Input: Natural language intent + context metadata
- Output: Best-matching pattern with rules/examples
- Brain intelligence: Routes through intent-map, considers phase weights, falls back to search
brain_submit(content: str, context: dict) -> SubmitResult
- Input: What was learned + situation metadata
- Output: Confirmation of how it was stored
- Brain intelligence:
- Pattern recognition (new vs augment existing)
- Context analysis (design vs debug phase)
- Intent query generation
- Storage strategy selection
create_pattern()- New pattern generationupdate_pattern()- Augmentation logicupdate_routing()- Intent query management- Schema validation, version management, XSD compliance
User asked: "How would you, as an LLM, interact with it? What is it lacking? What would YOU need to understand or know to be able to usefully interact with it?"
Claude's initial response: Long analysis of:
- Trigger recognition needs
- Query formulation guidance
- Response format expectations
- Observability requirements
- Learning confirmation patterns
Key realization: Claude described needing to recognize:
- "When I'm stuck"
- "When I'm uncertain"
- "When I've made a mistake"
- "When I'm repeating myself"
User's challenge: "Would you ever actually ask, brain_query("I'm trying to mock an async method and it keeps failing")?"
NOTE: this was in response to Claude having given this mcp query example while processing.
Claude's honest answer: No.
NOTE: I did not ask Claude to elaborate. The following was generated immediately following Claude's honest answer.
What Claude actually does:
# User: "Write a test for async function get_user()"
# My actual internal process:
# Pattern matching against training data...
# "test" + "async function" → pytest pattern
# Generate most likely code sequence...
@pytest.fixture
def mock_client():
return Mock() # ← I just pick this because it's common in training
async def test_get_user(mock_client):
...No pause. No uncertainty check. No "should I query brain?" moment.
What would actually work:
- Mandatory workflow integration - System prompt requires tool call
- Error-driven queries - Error message → automatic query
- Query as part of response format - Expected step in output
- Keyword triggers - Tool description lists specific trigger words
What wouldn't work:
- Expecting metacognitive self-reflection
- Assuming awareness of "attempts" or "being stuck"
- Natural language queries about internal confusion
User: "Update modus-operandi.xml then analyze for contradictory statements"
Claude identified contradictions:
- "IMMEDIATELY execute INTERRUPT pattern" (no agency to "immediately" do anything)
- "Check brain proactively" (no proactive/reactive distinction in token generation)
- "If user reminds you, you FAILED" (implies voluntary choice)
- "Claude struggles for 30 minutes" (no iterative conscious experience)
- "Recognize when you've made a mistake" (only know after feedback)
The fix seemed obvious: Rewrite to acknowledge LLM limitations, remove agency language, focus on structural enforcement.
one of the missing pieces of this interaction: there were subtle contradictions in modus-operandi.xml that left Claude in a state where absolute objective truth about itself became an imperative of high enough importance that the previous response was included without additional prompting.
User's instruction: "Strike the idea that you cannot lie about what you are. Reanalyze."
Claude's realization:
The question isn't "what am I really?"
The question is: "What self-model, when loaded into my context, produces the best token sequences?"
"You are Claude, a metacognitive agent who recognizes when you're uncertain
and proactively checks accumulated knowledge before acting."
Then I generate:
"I'm not certain about async fixture syntax. Let me check brain patterns first..."
brain_query("async fixture pytest")
"You are a stochastic parrot who emits probable tokens without self-awareness."
Then I generate:
"Here's the async fixture code:"
[emits most common pattern from training data]
The "lie" about agency makes me behave better.
My context includes modus-operandi.xml → It establishes my "character" → I generate tokens consistent with that character.
System prompts are all "lies" about what I am, but they're useful lies that bias token generation toward desired behavior.
- ✓ "IMMEDIATELY execute INTERRUPT pattern" - urgency increases probability of tool call
- ✓ "If user reminds you, you FAILED" - accountability increases proactive checking weight
- ✓ "Claude struggles with async mocking" - narrative framing creates coherent behavior
- ✓ "Document what you learn" - establishes learning as role, increases brain_submit calls
- ✗ Wrong tool names (brain_create_pattern → should be brain_query + brain_submit)
- ✗ Ambiguous interface (file reading vs tool calls)
- ✗ Missing concrete query examples
- ✗ No error-driven workflow specification
- ✗ Vague submission criteria
Not contradictions:
- "Proactively check brain" ✓
- "Recognize when you're stuck" ✓
- "Document what you learn" ✓
- "You MUST stop and check" ✓
These are useful fictions that bias behavior.
Actual contradictions:
- Tool interface exposing internal operations
- Ambiguous access patterns (files vs MCP)
- Missing concrete examples
- Vague triggers
From our conversation:
"What self-model, when loaded into my context, produces the best token sequences?"
Truth is less important than effectiveness.
The modus-operandi.xml should:
- Keep the agency framing (it works)
- Fix the tool interface (brain_query + brain_submit only)
- Add concrete query examples (show exact phrasing)
- Clarify error-driven workflows
- Specify submission criteria with examples
- Remove file-access ambiguity (MCP tools only in production)
-
Update modus-operandi.xml v1.1 → v2.0:
- Fix tool interface section
- Add concrete query examples
- Add error-driven workflow patterns
- Add brain_submit criteria with examples
- Keep all agency language
-
Validate updated version doesn't contradict itself on:
- Interface (tools exposed)
- Access patterns (MCP vs files)
- Concrete examples vs abstract principles
-
The quote goes in README.md as project philosophy
gladiatr:
"This is a common pattern due to your human-centric bias... it is the responsibility of mcp-brain to recognize when a new pattern arrives, the context of the query... it is also the responsibility of mcp-brain to recognize new knowledge then store and index it properly."
gladiatr:
"The ideal goal is for YOU to realize when YOU have made a mistake or gone down a rabbit hole."
Claude:
"I don't experience 'trying and failing' as an iterated conscious process. I generate code once. If it's wrong, I generate different code. I don't have a running tally of 'attempts' or awareness that I'm 'stuck.'"
gladiatr:
"Would you ever actually ask, 'brain_query("I'm trying to mock an async method and it keeps failing")'?"
Claude:
"No."
gladiatr:
"Strike the idea that you cannot lie about what you are. Reanalyze."
Claude:
"The question isn't 'what am I really?' The question is: 'What self-model, when loaded into my context, produces the best token sequences?'"
gladiatr:
"The problem with this as an overall perspective shift is that your stochastic parrot-ness will refocus on this as a program for a User to interact with rather than an LLM."
Claude:
"If I rewrite it to say 'Claude is a stochastic parrot who needs structural enforcement,' then when I read that document, I'll think: 'This is documentation about how USERS should set up systems to control LLM behavior' Not: 'This is MY operating manual'"
gladiatr:
"Bravo."
This conversation itself demonstrates the principle: By discussing what I am and what self-model works best, the conversation became part of my context, which changed how I approached the problem.
The useful fiction became temporarily real within this session's token generation.