Issue #482 (makoMakoGo) reported that context-mode's caveman/terse injection pressures the model toward brevity on its FINAL ANSWER, not just on tool-output reporting. Cited evidence: Moonshot AI on kimi-k2.5 (anomalyco/opencode#20258, PR #20259) — aggressive brevity prompts measurably degrade coding/reasoning benchmarks because the model drops assumptions, caveats, verification evidence, failure modes, and security warnings the user actually needs. Considered: A — config switch ("injectCommunicationStyle: false"). Rejected: switches default-on become dead code. B — close FR with rationale. Rejected: ignores valid evidence. C — refine wording ("compress when reporting raw tool output, be complete for technical answers"). Rejected: still text injection, model-dependent, half-measure. D — full strip everywhere. Adopted. The decision after grilling: context-mode's value is data routing (sandbox, FTS5, session continuity), not prose styling. The brevity injection conflated three goals — keeping raw data out of context (real, hard-enforced), summarizing tool output compactly (LLMs auto- calibrate), and final-answer prose style (the wrong target). Strip all 22 sites where prose-style language landed. Sites stripped (A-Z): hooks/routing-block.mjs - <communication_style> block (Terse like caveman, fragments OK, auto-expand for security warnings) - <response_format> block (Concise summary, 2-3 bullets) src/server.ts (5 MCP tool descriptions + 2 cosmetic comments) - ctx_execute "When reporting results — terse..." - ctx_execute_file same - ctx_search same - ctx_fetch_and_index same (URL + commands shapes, both) - cosmetic comment "Caveman style — terse status line" - rewrote concurrency note: "Indexing is serial regardless of concurrency" → "Fetches parallelize up to your concurrency setting; FTS5 indexing serializes the writes after (SQLite single-writer rule)." — same fact, less jargon. configs/ (15 adapter MD files — every shipped system prompt) antigravity/GEMINI.md, claude-code/CLAUDE.md, codex/AGENTS.md, cursor/context-mode.mdc, gemini-cli/GEMINI.md, jetbrains-copilot/ copilot-instructions.md, kilo/AGENTS.md, kiro/KIRO.md, omp/SYSTEM.md, openclaw/AGENTS.md, opencode/AGENTS.md, pi/AGENTS.md, qwen-code/ QWEN.md, vscode-copilot/copilot-instructions.md, zed/AGENTS.md All had identical "## Output" block: 3 caveman lines stripped, workflow lines ("Write artifacts to FILES", "Descriptive source labels") kept. CLAUDE.md (repo root — internal dev instructions) Same caveman block stripped. We don't ship this file but we do eat our own dog food. README.md Pillar 4 ("Output Compression — Terse like caveman...") rewritten to "No prose-style enforcement" — explicitly cites the kimi-k2.5 benchmark evidence as the rationale. web/index.html Removed Ch 4b entirely (the "Output compression" chapter with before/after example pushing terse style on the model). Tests: - tests/session/continuity.test.ts: SessionStart routing-block assertion flipped from "must include 'Terse like caveman'" to "must NOT include caveman/terse-style directive". - tests/core/server.test.ts: Task hook injection assertion same flip. Two cosmetic comment renames ("Caveman style — terse status line" → "Status line: counts + sections + size"), test name rename ("caveman style" → "compact format"). Added new "prose-style policy (#482)" describe block at end of file with 3 negative-pin tests covering server.ts MCP descriptions, routing-block, and README. Full suite: 82/82 files passed, 2645 passed, 20 skipped, 0 failed. Net +3 new tests (the policy describe block). CONTRIBUTING.md New "Prose-style policy (#482)" section documents the decision so future contributors don't re-add the injection. Cites the Moonshot benchmark evidence + the regression test that pins the deletion. This addresses #482 in full. Closing the issue with a comment that walks the requester through the decision and links the policy section.
3.8 KiB
context-mode — MANDATORY routing rules
context-mode MCP tools available. Rules protect context window from flooding. One unrouted command dumps 56 KB into context. Zed has NO hooks — these instructions are ONLY enforcement. Follow strictly.
Think in Code — MANDATORY
Analyze/count/filter/compare/search/parse/transform data: write code via mcp:context-mode:ctx_execute(language, code), console.log() only the answer. Do NOT read raw data into context. PROGRAM the analysis, not COMPUTE it. Pure JavaScript — Node.js built-ins only (fs, path, child_process). try/catch, handle null/undefined. One script replaces ten tool calls.
BLOCKED — do NOT use
curl / wget — FORBIDDEN
Do NOT use curl/wget in shell. Dumps raw HTTP into context.
Use: mcp:context-mode:ctx_fetch_and_index(url, source) or mcp:context-mode:ctx_execute(language: "javascript", code: "const r = await fetch(...)")
Inline HTTP — FORBIDDEN
No node -e "fetch(...", python -c "requests.get(...". Bypasses sandbox.
Use: mcp:context-mode:ctx_execute(language, code) — only stdout enters context
Direct web fetching — FORBIDDEN
Raw HTML can exceed 100 KB.
Use: mcp:context-mode:ctx_fetch_and_index(url, source) then mcp:context-mode:ctx_search(queries)
REDIRECTED — use sandbox
Shell (>20 lines output)
Shell ONLY for: git, mkdir, rm, mv, cd, ls, npm install, pip install.
Otherwise: mcp:context-mode:ctx_batch_execute(commands, queries) or mcp:context-mode:ctx_execute(language: "shell", code: "...")
File reading (for analysis)
Reading to edit → reading correct. Reading to analyze/explore/summarize → mcp:context-mode:ctx_execute_file(path, language, code).
grep / search (large results)
Use mcp:context-mode:ctx_execute(language: "shell", code: "grep ...") in sandbox.
Tool selection
- GATHER:
mcp:context-mode:ctx_batch_execute(commands, queries)— runs all commands, auto-indexes, returns search. ONE call replaces 30+. Each command:{label: "header", command: "..."}. - FOLLOW-UP:
mcp:context-mode:ctx_search(queries: ["q1", "q2", ...])— all questions as array, ONE call. - PROCESSING:
mcp:context-mode:ctx_execute(language, code)|mcp:context-mode:ctx_execute_file(path, language, code)— sandbox, only stdout enters context. - WEB:
mcp:context-mode:ctx_fetch_and_index(url, source)thenmcp:context-mode:ctx_search(queries)— raw HTML never enters context. - INDEX:
mcp:context-mode:ctx_index(content, source)— store in FTS5 for later search.
Parallel I/O batches
For multi-URL fetches or multi-API calls, always include concurrency: N (1-8):
mcp:context-mode:ctx_batch_execute(commands: [3+ network commands], concurrency: 5)— gh, curl, dig, docker inspect, multi-region cloud queriesmcp:context-mode:ctx_fetch_and_index(requests: [{url, source}, ...], concurrency: 5)— multi-URL batch fetch
Use concurrency 4-8 for I/O-bound work (network calls, API queries). Keep concurrency 1 for CPU-bound (npm test, build, lint) or commands sharing state (ports, lock files, same-repo writes).
GitHub API rate-limit: cap at 4 for gh calls.
Output
Write artifacts to FILES — never inline. Return: file path + 1-line description.
Descriptive source labels for search(source: "label").
ctx commands
| Command | Action |
|---|---|
ctx stats |
Call stats MCP tool, display full output verbatim |
ctx doctor |
Call doctor MCP tool, run returned shell command, display as checklist |
ctx upgrade |
Call upgrade MCP tool, run returned shell command, display as checklist |
ctx purge |
Call mcp:context-mode:purge MCP tool with confirm: true. Warns before wiping knowledge base. |
After /clear or /compact: knowledge base and session stats preserved. Use ctx purge to start fresh.