Skip to content

Agents in Chromeria cannot discover Chromeria tools when schemas are deferred #46

Closed

Description

@lukemaj

Outcome

Agents running in Chromeria know which Chromeria tools exist and when to use each one, even when the harness defers tool schemas and shows only tool names.

Evidence (2026-09-27)

  • A Claude Code planner in Chromeria needed an implementer on a named model and effort. Claude Code listed all 33 t3-code tools by name only (deferred); their descriptions load only after a tool search. The planner never searched, so it missed prism_submit (the routing tool for full jobs) and spawn_thread (small work, or an explicit model and effort), and opened separate terminal sessions instead.
  • The tool descriptions already carry the right guidance: spawn_thread and prism_submit each point to the other. The guidance never reaches an agent that does not load them.
  • MCP server instructions are the channel that reaches the agent at session start even when tools are deferred. In the same session, treg, Notion, and Claude Docs sent instructions; Chromeria sent none.
  • apps/server/src/mcp/McpHttpServer.ts builds the server with McpServer.layerHttp({ name: "T3 Code", version, path: "/mcp", protocols: [McpProtocol.v2025_06_18] }): no description, no instructions.
  • Effect 4.0.0-rc.115: McpSchema has an optional instructions field on the initialize result, but McpServer.layerHttp has no option for it and the server never sets it.

Options to evaluate

  1. Contribute an instructions option to Effect's McpServer.layerHttp upstream (matches the fork Mission: offer generic extension points upstream), then set it in McpHttpServer.ts.
  2. Fork-side: set instructions on the initialize result in Chromeria until Effect supports it.
  3. Provider launch: Chromeria already controls how it launches each harness; it could add a short tool-orientation note there. Covers harnesses that ignore server instructions; check which ones do.

Open decision (user)

The text of the instructions. Reference styles seen: treg (when to reach for it, then the call order), Notion (one edge-case rule), Claude Docs (a full procedure). The user wants to decide the content before implementation.

Acceptance criteria

  • A fresh Claude Code session in Chromeria receives the instructions at start, with all t3-code tools still deferred.
  • Given a full job, such a session chooses prism_submit; given small work or a named model and effort, spawn_thread, without being told the tool names.
  • Codex and OpenCode sessions in Chromeria are checked for whether they receive the instructions.

Non-goals

Blockers

The instruction text (user decision).

Proof

Fresh-session captures for each harness showing the instructions in context and the tool chosen.

Activity

  1. lukemaj commented on Sep 27, 2026

    @lukemaj
    ContributorAuthor

    Research: which harnesses show MCP server instructions to the model (2026-09-27)

    Method: a stdio MCP server whose instructions carry a nonce, run against each installed harness. Where possible, a fake model endpoint recorded the exact request; otherwise a live run asked the model to quote the instructions without tools, using a random passphrase it could not guess.

    Harness (installed version) Instructions reach the model Where MCP tools deferred Evidence
    Claude Code 2.1.283 Yes System reminder "MCP Server Instructions", cut at about 2,048 characters with "… [truncated]" Yes, names only Request capture
    Codex 0.157.1 Yes, full length (2,955 characters tested) Inside the tool_search tool description, as the server's source line Yes, names hidden behind tool_search Request capture; source codex-mcp/src/rmcp_client.rs
    OpenCode 1.18.32 Yes System prompt <mcp_instructions> No, full descriptions sent Request capture; source session/system.ts
    Grok 1.0.41 Yes System reminder "MCP servers connected: - server (N tools): …" Yes, and no tool names at all, only counts Request capture (CLI); live ACP run quoted the passphrase with no tool calls
    Cursor agent 2026.08.25 No, not inline The client sends them to Cursor's backend (mcp_instructions), but the model does not see them Tool names shown Live ACP run (T3's path): the server connected (initialize, tools/list), the model listed nonce_tool and treg's tools, and answered NONE for every server's instructions, treg's included
    Antigravity ACP 1.1.1 No, not inline Written to brain/<session>/mcp/<server>/instructions.md beside the tool schemas; the model reads it only if it opens the file Tools are files too Live ACP run: model answered NONE with no tool calls; file present

    Grok shows no tool names, so without instructions an agent there cannot even see that prism_submit exists.

    Effect

    effect@4.0.0-rc.116 (2026-09-18) and rc.117 (2026-09-21) add instructions to McpServer.layer, layerStdio and layerHttp, wired into every protocol's initialize result (internal/mcpRuntime.ts). Nothing to contribute upstream. Upstream T3 pins rc.115 with a pnpm patch on McpServer.js; it bumps Effect with Alchemy (rc.112 on 2026-09-07, rc.115 on 2026-09-17).

    Elon record

    • Requirement: the orientation text reaches the model in every harness T3 runs, with schemas deferred. "MCP server instructions" was a solution assumption, not the requirement.
    • Deleted: Option 2 (fork-side initialize rewrite or Effect patch): rc.116+ already has the option. Option 1's Effect contribution: already released. A fork-only Effect bump: it means porting upstream's McpServer.js patch plus lockfile conflicts on every rebase until upstream bumps. Antigravity-specific handling: not installed in Chromeria, and its file route exists.
    • Smallest surviving solution (superseded below): instructions on McpServer.layerHttp in McpHttpServer.ts, with the text in a new fork file, once the fork absorbs upstream's Effect bump to rc.116 or later. It reaches the model once per session, travels with the tools, and needs no "when connected" hedge.
    • Interim until that bump: the same text in the launch prompt (RuntimeInstructions.ts, one line appending a fork constant), deleted in the same change that sets instructions, so Claude never sees it twice. Cost while it lives: Cursor, Grok and Antigravity repeat the launch prompt every turn.

    The instruction text is still the user's decision.

    Update after the Cursor run

    Cursor over ACP does not show MCP server instructions to the model, and Antigravity only writes them to a file. MCP instructions would therefore reach four of six harnesses. The launch prompt reaches all six, so it stays the permanent channel and the planned move to McpServer.layerHttp({ instructions }) is dropped. Implemented in #53.

  2. lukemaj commented on Sep 27, 2026

    @lukemaj
    ContributorAuthor

    Merged in #53 as d11ac07.

  3. lukemaj commented on Oct 17, 2026

    @lukemaj
    ContributorAuthor

    What: Close #46 as completed.
    Why: Delivered in PR #53, reinforced in #67. The final record already states the merge: #46 (comment). The old tools were later replaced by native V2 guidance; no further implementation remains in this original discovery outcome.
    So what: Preserve the historical record and continue only the explicitly named remaining work at its existing owner.

    Requirements and who asked: User approved the audited closure/consolidation batch on 2026-10-17.
    Deleted: Duplicate or superseded tracking only; preserve source history, unique acceptance and active work.
    Bottleneck: Tracker state had not been reconciled with delivered code or the accepted successor.
    Checked myself: Original audit, current issue body/state, related issue and PR states immediately before this action, and exact after-state.

    Reconciliation target: #46; action=close-completed; force=false; branch-deletion=false; approval SHA-256=5e186401dfc44e86ca74716e176e53c2c277760d8484d11aa78b9fd22d2eb13b.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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