If you use Cursor, a 7% token-cost cut already shipped inside the product. If you assemble your own agent requests, Cursor’s 23 September write-up is a list of cuts with the denominator attached. On 23 September 2026, Jediah Katz, Connor O’Keefe, and Calvin Yee reported that harness changes reduced user token cost by 7% with no reduction in agent quality.
A 66% shorter system prompt is 66% of the system prompt. The bill moved by 7%.
What each percentage is a share of
A harness is the code that builds each model request: the system prompt, the tool list, the cache markers, and which notes a subagent (a second model call) is allowed to carry. Cursor’s spend chart is an image. The article text does not give each bar’s share, so those widths stay out of this piece. MCP is the protocol a coding agent uses to call an external tool server. One row below is an earlier MCP change, measured only on sessions that called an MCP tool.
| Change | Result | This percentage is a share of |
|---|---|---|
| The harness changes together | token cost down 7%, quality unchanged | the bill |
| System prompt trim | about 66% shorter | the system prompt |
| Built-in tools loaded on demand | description tokens down 60% | tool-description tokens in the static prompt |
| MCP tools moved on demand earlier | total tokens down 46.9% | sessions that actually called an MCP tool |
| Explicit cache breakpoints | cold cache misses down 20% | the miss rate |
| Line numbers on every tenth line | cache-read tokens down 1.6% | cache-read tokens |
Every figure is Cursor’s own production measurement or A/B test. Nothing here is an independent rerun.
What stayed in every request
Static context is text sent on every turn: tool definitions and rules. Dynamic context is a tool definition loaded only when that tool is needed.
Cursor had added extra tools - background shells, cloud subagents, and web access - on top of the main shell tool. Most of those added tools are used in fewer than 20% of conversations, and each one still occupied the prompt. They A/B tested which definitions the model needs to see from the first turn, watching tokens, cost, latency, tool-call errors, and whether people kept using the agent.
What stayed static:
- read, search, edit, and the main shell tool
ask_question, because some models invented calls to it when the definition was absentcreate_plan, because Plan Mode (the agent writes a plan before it edits) needs it immediately
Everything else loads on demand. An earlier move of MCP tools into that same pattern had already cut total tokens 46.9% on sessions that called an MCP tool.
The system prompt shrank by about 66% for a separate reason. Weaker models needed lists of “DO NOT”, “You must”, and “Important” before they would follow a tool. Newer models followed a plain description of what the tool does. Cursor says that result held across model families, and that they test on real traffic because their test sets cluster on hard problems and miss ordinary requests.
The cache breakpoint, then the line numbers
A prompt cache reuses the unchanged front of a request so you do not pay full input price again. A cold cache miss is a turn that cannot reuse that front. Before GPT-5.6, OpenAI picked the cache boundary automatically. From GPT-5.6, the client can mark an explicit breakpoint.
Cursor puts the breakpoint after the part of the request that does not change from turn to turn, and before the conversation, which keeps growing. Skills (instruction blocks attached to the agent), the subagent list, and environment info move past that breakpoint into a phantom user message: request-specific text that must not sit inside the cached prefix. Cold cache misses fell 20%.
The same rule, stated from the provider side: a cache hit requires the prefix to stay byte-for-byte the same. The checklist for that is Don’t break the prompt cache. The one-line version is Cache-stable prefix.
File reads were the other quiet tax. The Read tool numbered every line, because models are bad at counting and need line numbers to cite code. One number is about 3 to 5 tokens. Across tens of thousands of lines that adds up. Numbering every tenth line cut cache-read tokens 1.6%. Cursor says models could still cite code, and quality did not drop.
Subagents, only when something else asks
A subagent is a second model call with its own context window. It returns a result to the parent, so the parent does not have to keep the search transcript. That saves tokens. It also duplicates work when the two calls cannot see each other’s notes. Subagent context isolation is the same trade.
Cursor deleted instructions that pushed subagents for codebase exploration. The pattern was already in training data, and the extra prompt produced more subagents than the task needed. They also stopped the parent from picking a different model for the subagent unless the user or the harness asked for one. Cursor can still pair a planner model with a cheaper one.
Grok Bot is another agent product named at the end of the post. The post says the same lessons are going there, and it gives no numbers.
What to copy
You cannot flip these on. They are already how Cursor builds a request. If you own the harness, five moves from the post are concrete:
- Delete “DO NOT” lists once the model follows a one-line tool description. Check that on ordinary sessions. Cursor A/B tests on real traffic because eval sets cluster on hard problems.
- Keep read, search, edit, and the main shell tool in the static prompt. Defer an added tool used in under 20% of conversations.
- Leave a tool in the static prompt when models invent calls to it. That is why
ask_questionstayed. - Put skills, subagent lists, and environment info after the cache breakpoint.
- Number every tenth line on file reads, not every line.
Remember 7% when you look at the invoice. The 66% and the 60% are prompt cuts behind that bill change. The 46.9% is earlier, and only on sessions that called an MCP tool.