Why Giving AI Agents More Context Can Make Them Worse A holiday-let operator running 23 properties built AI agents into daily operations and found that giving agents more context often degrades their decisions, because large context blobs bury relevant information. The operator's project, Zugrow, now supplies agents with the smallest useful view of reality, separating mutable facts from policy, converting human-oriented listing copy into structured state, and tracking context freshness. The operator reports that structuring context this way made a bigger difference than expected and lets the application enforce rules the model might otherwise forget. Most AI agent demos start with the model. We ended up spending far more time thinking about what gets put around the model. I run 23 holiday lets and have been building AI agents into the day-to-day operation. Guest messaging sounds like one of the easier problems: That works brilliantly right up until the guest asks: Can I park a second car? Now the answer depends on the property, the booking, the parking arrangement, whether they're currently checked in, whether anything has changed since the listing was written and potentially something a member of the team said twenty minutes ago. The model is suddenly the easy bit. While building Zugrow https://zugrow.com/ , one of the lessons that kept coming back was this: An agent can have a very good model and still make a bad decision because you gave it the wrong state. So we stopped treating context as a giant blob of text and started treating it like application data. My instinct initially was simple. More context = better answer. So if a guest messaged about a booking, why not give the agent: It feels sensible. It also produces a mess. Important information gets buried amongst things that have nothing to do with the current question. Instead, the agent should get the smallest useful view of reality . Something closer to: type GuestContext = { property: { name: string; checkInTime: string; checkOutTime: string; parking: ParkingPolicy; }; booking: { arrivalDate: string; departureDate: string; guestCount: number; status: BookingStatus; }; conversation: { recentMessages: Message ; }; }; If somebody asks about parking, the agent doesn't need the Wi-Fi password, the boiler instructions and six months of pricing history. Give it what it needs to answer the question in front of it. That sounds obvious. In an agent system, it is surprisingly easy to forget. This made a bigger difference than I expected. Consider: Parking is available behind the building. Guests should normally use Bay 14. Sometimes another space may be available. Do not guarantee a second space. There are two completely different things happening here. The first three sentences describe the world. The last sentence describes what the agent is allowed to do. Mixing those together makes the prompt harder to reason about. We now think of them separately: js const facts = { parkingType: "allocated", primaryBay: "14", additionalSpacePossible: true }; const policy = { mayGuaranteeAdditionalSpace: false }; The distinction matters because facts can change. Policy usually changes much less often. It also means the application can enforce some rules without relying on the model remembering them. Listings are written for humans. Agents need structured state. Suppose the listing says: Parking is available for guests. Perfectly reasonable marketing copy. But the agent needs to know: { parkingAvailable: true, guaranteedSpaces: 1, extraSpacesRequireApproval: true } Those two things communicate roughly the same information to a human. They are very different inputs for software. The more agents we added, the more I found myself converting vague property information into explicit state. Instead of: Early check-in may sometimes be available. Store: { standardCheckIn: "15:00", earlyCheckInAllowed: true, earliestPossibleTime: "13:00", requiresTeamApproval: true } The agent can now reason from something much closer to reality. And more importantly, our application can stop it making promises it shouldn't make. There is another problem. A fact can be correct and still be wrong. Yesterday: wifi.status = "working"; Today the router has died. The database technically contains a fact. It is just stale. So useful agent context needs some idea of freshness: type ContextValue