Notes
Context Rot Is Why Your Agent Needs a Map
More context can make an agent worse. That is the part most companies still do not want to hear.
More context can make an agent worse. That is the part most companies still do not want to hear. The instinct is obvious: if an agent is wrong, connect more systems, paste more docs, add more Slack history, increase the context window, and let the model sort it out. Sometimes that helps. Often it creates a smarter-looking mess. A production agent does not need the largest possible pile of company text. It needs the smallest sufficient view of the work: the right object, the current state, the trusted evidence, the source priority, the relevant rules, and the valid next action. Everything else should stay queryable, but out of the prompt until it matters. That is the real lesson behind context rot.
Context rot is an architecture problem
Anthropic’s context-window docs put it plainly: more context is not automatically better. As token count grows, accuracy and recall can degrade, a phenomenon they call context rot. Chroma’s context rot research shows the same shape from another angle: focused inputs perform better than full inputs polluted with irrelevant material, and different kinds of irrelevant material can degrade performance differently. LangChain describes context engineering as the art and science of filling the context window with the right information at each step of an agent’s trajectory, using patterns like write, select, compress, and isolate. Anthropic’s engineering team describes long-horizon patterns like compaction, structured notes outside the window, and sub-agent architectures for work that spans many turns. This is not prompt decoration. It is system design. The context window is the agent’s working memory for this step. If you fill it with stale docs, old CRM fields, whole transcripts, joke-filled Slack threads, duplicate summaries, irrelevant tool output, and half-correct memories, the model is not being given wisdom. It is being asked to infer the company from noise.
The common company-agent failure
Take a GTM agent that needs to answer a simple question: What should we do with Acme after yesterday’s call? The naive version loads everything it can find:
- the CRM account and opportunity;
- the full call transcript;
- the last five Slack threads mentioning Acme;
- the onboarding doc;
- a support ticket export;
- the latest product roadmap;
- a bunch of old notes from previous meetings. The context window is now full. It feels serious. It is also full of traps. The CRM says the opportunity is still in discovery. The call transcript says the customer committed if one workflow ships by Q3. Slack says product has not approved that date. The onboarding doc is technically current except for one enterprise segment. A support ticket contains the real blocker, but the ticket title is vague. The roadmap mentions the feature, but the date is internal-only. A good operator knows what matters because they carry the company map in their head. They know which source wins. They know which promise is risky. They know who owns the next step. They know what can be said externally and what needs review. The agent does not get that map by receiving more tokens. It needs the map made explicit. That is the point behind Access is not a map. Access gives the agent the territory. Context architecture decides which part of the territory becomes usable at the moment of action.
What dense context looks like
The prompt should not be the company. The prompt should be a working packet for the current decision. A dense packet for the Acme question might look more like this:
job: decide_next_safe_action_for_account
object:
type: opportunity
id: acme-expansion
current_state:
stage: evaluation
blocker: workflow-support-request
promise_risk: q3-workflow-date
owner: jane_ae
evidence:
- call_transcript: "2026-06-08, customer asked for Q3 workflow support"
- crm_field: "stage=discovery, last_updated_before_call"
- roadmap_note: "workflow support is internal target, not approved customer date"
source_priority:
newer_call_beats_stale_crm_stage: true
roadmap_owner_beats_slack_for_delivery_dates: true
allowed_actions:
- draft_internal_followup
- request_product_review
- create_promise_risk
blocked_actions:
- send_customer_commitment
- update_close_date_without_approval
open_question: "Who must approve customer-facing Q3 language?"
This is not less context in the lazy sense. It is higher-density context. The agent can still fetch the transcript, roadmap, CRM history, or Slack thread if it needs detail. But it starts from the shape of the work, not from a landfill of text. The better pattern is object-first retrieval:
- Start from the thing the work is about.
- Pull current state and strongest evidence.
- Include the source-priority rule.
- Include only the actions available from here.
- Let the agent ask for deeper evidence only when it has a reason.
What should stay queryable
A lot of company context should live outside the context window:
- raw transcripts;
- Slack threads;
- full documents;
- historical CRM changes;
- product docs;
- source rows;
- old agent memories;
- run traces. Those sources are still useful. They are just not all useful at the same time. The job of the system is to turn them into a navigable company map: objects, relationships, current state, source priority, permissions, and evidence handles. The agent should query that map first. If the map says the account has an open promise risk, then the agent can fetch the exact call snippet. If the source priority is unclear, it can ask for the conflicting sources. If the action is customer-facing, it can route for approval. That is progressive disclosure in practice. Do not reveal every layer upfront. Reveal the next layer when the agent can use it.
flowchart LR
Sources[CRM, calls, Slack, docs, tickets] --> Evidence[Raw evidence store]
Evidence --> Map[Company map: objects, relationships, state, source priority]
Task[Current job] --> Assembler[Context assembler]
Map --> Assembler
Assembler --> Packet[Dense prompt packet]
Packet --> Agent[Agent runtime]
Agent --> Query[Query more when needed]
Query --> Map
Agent --> Proposal[Proposed action]
Proposal --> Review[Review / approve / reject]
Review --> Trace[Trace + correction]
Trace --> Map
The important part is the shape: source material stays available, but the model acts from a scoped view.
Compression is not understanding
Compaction and summarization are useful. They are not magic. A compressed transcript can still preserve the wrong thing. A memory note can still be too loose. A summary can say “be careful with Q3 promises” without knowing which customers, products, owners, approvals, and writeback targets are involved. A useful compression does not just reduce words. It updates the object model:
- this account has an open promise risk;
- the promise depends on this product limit;
- the evidence is this call;
- the source conflicts with this roadmap note;
- the owner is this person;
- the agent may draft but not send;
- a human correction should update the account state and the rule for next time. Now the next agent run starts from operating context, not vibes in a smaller font. This is also why agents do not onboard like people. Humans convert messy exposure into an internal map. Agents need the correction loop made durable outside the chat.
How to test the context boundary
If you are building a company agent, test context quality directly. Do not only test the happy path where the agent gets a clean task and the one correct document. Build eval cases that contain the real garbage:
- A stale CRM field next to a newer call transcript.
- A product date in Slack that was never approved externally.
- Two possible owners, one official and one actual.
- A support ticket whose title hides the real blocker.
- A duplicate summary that drops the approval caveat.
- An old doc that is correct for SMB but wrong for enterprise. A strong agent should not blindly average those sources. It should identify the object, cite the evidence, apply source priority, ask for missing approval, and refuse to write when the operating state is not strong enough. That is a better test than “can it fit all the docs in the prompt?” A good company agent is not the one that reads everything. It is the one that knows what not to load until the work actually needs it.
The useful takeaway
Frontier models will keep improving. Context windows will keep getting bigger. Agent runtimes will keep adding memory, tools, tracing, and orchestration. That does not remove the need for context architecture inside the company. It makes it harder to ignore. Bigger windows let you fit more territory. They do not automatically give the agent a map. A company ontology is one way to make that map explicit: what exists, how those things relate, what is true right now, where the evidence came from, and what actions are possible around those things. That is the difference between feeding an agent more company text and making the company legible enough for the agent to work inside it. Related Ortelian notes: