Context Tax Audit
Every request carries more than the user's sentence: system prompt, environment info, the skill list, tool definitions, per-turn context blocks, reminders. Most of it is worth paying for. The audit finds what is not, and what is placed so that it breaks the prompt cache.
Companion to MCode Engineering Notes 05 (how the agent learns the
current time — and why stuffing date into the system prompt breaks the
prefix cache).
Plain-text checklist: checklists/context-tax.md.
1. Inventory one real request
Capture an actual request the agent sends (debug log, proxy, or the code that assembles it). List every part except the user's message:
| Part | Where it sits | How often it changes | Tokens |
|---|
Count tokens with a tokenizer and name it; treat the counts as relative. Do a fresh-session first request and a later turn, since they often differ.
2. Necessity - what breaks if you delete it?
For each part, write one sentence: "without this, the model would ...". Typical answers: without environment info it guesses the OS and shell; without the current time it assumes its training year; without a time budget it does not wrap up before a deadline. If you cannot write the sentence, the part is a candidate for removal.
3. Prompt-cache placement
Caches match on prefix. One changed byte invalidates everything after it.
- Content that is at the front and changes every request is the most expensive. Move it later.
- Content written into history and never edited costs once and then stays cacheable.
- Content attached only to the current request is never cached and is paid at full price every time. Control its frequency.
Rules of thumb:
- Stable first, volatile last. Keep
# Environmentfree of current time; put time in per-turn<agent-context>(or the equivalent user-message block). - Never rewrite reminders already in history; change only future turns.
- Use only the precision you need. A timestamp to the second guarantees every copy differs once placement is already right.
- Request-only reminders never enter the cache — control how often they fire, but do not confuse that thrift with protecting the prefix.
4. Run the checklist
| Item | Question |
|---|---|
| Prefix awareness | Can you point to the stable prefix vs what changes every turn? |
| Necessity | For each part, where does the model go wrong without it? |
| Position | Is anything volatile inside the system prompt or tool definitions? (e.g. time in # Environment) |
| Frequency | Does a changing field need every turn / request, or only at the start, key points, or on change? |
| Precision | Does it need seconds, exact counts? Higher precision means more turn-to-turn variation. |
| History | Are reminders already in history ever rewritten later? |
| Recovery paths | If you remove something, does it vanish entirely on compaction, session resume or subagents? Who restores it? |
| Measurement | Before and after a change, do you look at cache hit rate, cost per turn and task quality, not just token count? |
Output
The inventory table, a list of parts to cut, move, reduce in frequency or reduce in precision (each with the reason), and what to measure to confirm the change helped.


