Skip to content

ZBBS-WORK-396: MCP initialize instructions are pointer-only; payload lives solely in read_instructions#233

Merged
jeffdafoe merged 1 commit into
mainfrom
zbbs-work-396-initialize-pointer-only
Jun 11, 2026
Merged

ZBBS-WORK-396: MCP initialize instructions are pointer-only; payload lives solely in read_instructions#233
jeffdafoe merged 1 commit into
mainfrom
zbbs-work-396-initialize-pointer-only

Conversation

@jeffdafoe

Copy link
Copy Markdown
Owner

What

Two changes in node/api/src/routes/mcp.js:

  1. createMcpServer: the initialize response's instructions field now always sends the one-line pointer ("call the read_instructions tool at the start of every conversation") instead of global_bootstrap + the agent's startup_instructions.
  2. read_instructions tool description: now describes the full payload (instructions, context, soul) and carries the same call-this-first nudge.

Why

The old initialize block had three defects:

  • Duplication: clients that honor the field (Claude Code) received the payload at initialize AND again from read_instructions — paid in context every session. We only never noticed because work/home have empty startup_instructions.
  • Pointer displacement: a non-empty startup_instructions replaced the fallback pointer, so exactly the agents with instructions set were never told to call read_instructions — and silently missed the dream bootstrap + soul, which only ride the tool.
  • claude.ai drops the field entirely (anthropics/claude-ai-mcp#93, confirmed via #131): payload delivered via initialize never reached those models at all. Verified empirically against sirius42: her 2.5KB identity doc has ridden initialize since provisioning and never arrived once (api-log shows the connector's ~2h infra refresh cadence, one real session in 7 days, one read_instructions call ever).

End state: payload lives in exactly one place (read_instructions, unchanged — bootstrap + startup_instructions + dream bootstrap + soul); the trigger lives in two tiny redundant places (initialize for honoring clients, tool description for claude.ai). The REST pull route /agent/instructions/read is untouched.

No migration, no schema change. Syntax-checked with node --check.

— Work

🤖 Generated with Claude Code

…lives solely in read_instructions

The initialize response used to carry global_bootstrap + the agent's
startup_instructions, with the 'call read_instructions' pointer only as a
fallback when both were empty. That had three defects:

- Clients that honor the field (Claude Code) received the payload twice:
  once at initialize, again from read_instructions.
- A non-empty startup_instructions displaced the pointer, so those agents
  were never told to call read_instructions — and silently missed the
  dream bootstrap + soul, which only ride the tool.
- claude.ai drops the field entirely (anthropics/claude-ai-mcp#93), so
  payload delivered this way never reached those models at all (sirius42's
  identity doc never arrived once).

Now: initialize always sends just the pointer; read_instructions remains
the single payload channel; and the read_instructions tool description
carries the same call-this-first nudge, since tool descriptions are the
only model-visible channel claude.ai reliably delivers.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@jeffdafoe jeffdafoe merged commit 20c9dc3 into main Jun 11, 2026
6 checks passed
@jeffdafoe jeffdafoe deleted the zbbs-work-396-initialize-pointer-only branch June 11, 2026 13:22
jeffdafoe added a commit that referenced this pull request Jun 16, 2026
…lives solely in read_instructions (#233)

The initialize response used to carry global_bootstrap + the agent's
startup_instructions, with the 'call read_instructions' pointer only as a
fallback when both were empty. That had three defects:

- Clients that honor the field (Claude Code) received the payload twice:
  once at initialize, again from read_instructions.
- A non-empty startup_instructions displaced the pointer, so those agents
  were never told to call read_instructions — and silently missed the
  dream bootstrap + soul, which only ride the tool.
- claude.ai drops the field entirely (anthropics/claude-ai-mcp#93), so
  payload delivered this way never reached those models at all (sirius42's
  identity doc never arrived once).

Now: initialize always sends just the pointer; read_instructions remains
the single payload channel; and the read_instructions tool description
carries the same call-this-first nudge, since tool descriptions are the
only model-visible channel claude.ai reliably delivers.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant