{"course":{"slug":"context-engineering","title":"Context Engineering","url":"https://addaly.com/learn/context-engineering","level":"advanced","track":"build"},"lesson":{"slug":"telling-the-user-it-forgot","title":"Being honest about a bounded window","url":"https://addaly.com/learn/context-engineering/telling-the-user-it-forgot","position":57,"of":87,"minutes":8,"answer":"A product may only claim to remember what it actually stores, so show the context indicator, mark where compaction happened, list stored memories with delete controls.","keyIdea":"A product may only claim to remember what it actually stores, so show the context indicator, mark where compaction happened, list stored memories with delete controls, and tell the model precisely what it does and does not have so it asks instead of confabulating."},"body":{"format":"markdown","text":"## The failure users hate is not forgetting\n\nUsers accept that a system has limits. What they do not accept is being told something is remembered when it is not.\n\nThe damaging pattern is specific: an assistant says \"I'll remember that\" and stores nothing; or it silently compacts a conversation and then answers as though the dropped material never existed; or it invents a plausible version of a detail it no longer has. In all three the user's trust breaks not because of the limitation but because the interface lied about it.\n\nSo the design rule is narrow and strict: **the product may only claim to remember what it actually stores, and it must show what it dropped.**\n\n## Four things worth surfacing\n\n**A context indicator.** Something showing how full the window is. A subtle bar, a token count, a \"long conversation\" marker. Users who can see the constraint work with it (they start a new conversation, or restate the important thing) rather than being surprised by it.\n\n**A compaction marker.** A visible line in the transcript: \"Earlier messages summarised.\" With an expand control that shows the summary, and ideally a link to the full history. Users who see it stop being confused about why the assistant's memory changed character mid-conversation.\n\n**The memory list.** Everything stored about the user, with source, date and a delete control per item. This is the mechanism from the memory lesson, presented as a feature rather than a compliance page.\n\n**The sources used.** Which passages, which documents, which memories informed this answer. The selection module argued for this as a correctness mechanism; it is also the thing that lets a user say \"you used the wrong document\" instead of \"it's wrong\".\n\n## Say it in the answer when it matters\n\nWhere something has been lost and the answer depends on it, the answer should say so.\n\n> I no longer have the earlier part of this conversation in full: I have a summary. It records that you chose the standard plan, but not the discount code you mentioned. Could you repeat that?\n\nThis reads as competence rather than weakness, and it is far better than the alternative, which is inventing a discount code that looks right.\n\nIt requires the model to know what it does not have, which it cannot do on its own. You have to tell it: one line above the compacted block saying what kind of material was dropped, and an instruction that it may say so.\n\n## \"Start a new conversation\" is real advice\n\nThe standard support answer sounds like a fob-off and is actually correct engineering, for reasons this course has established:\n\n- A fresh window has no accumulated errors to be consistent with.\n- The task statement is at the top, in the strongest position, instead of buried under forty turns.\n- Nothing has been compacted, so nothing has been lost.\n- The cost per turn resets to the bottom of the quadratic curve.\n\nSo build for it rather than apologising for it. Offer to carry forward a handover note into the new conversation (goal, decisions, artefacts, what failed) so the user gets the clean window without retyping their problem. That is a good feature and it falls straight out of the previous lesson.\n\n## Do not over-promise in the system prompt\n\nA small thing with an outsized effect. If your system prompt says \"you have full memory of everything the user has told you\", the model will act on that claim, and it will confabulate rather than admit a gap, because the instruction says the gap cannot exist.\n\nDescribe the actual arrangement instead:\n\n```\nYou have: a summary of earlier turns, the last 6 turns in full, and a list of\nstored user preferences. You do not have the full earlier conversation. If you\nneed something that is not present, ask for it.\n```\n\nThat paragraph costs forty tokens and converts a class of confident fabrication into a question. It is one of the highest-return sentences in a system prompt for a long-conversation product.\n\n## Measure the honesty, not just the accuracy\n\nTwo metrics that most teams do not track and should:\n\n**The unsupported-detail rate.** On conversations that have been compacted, how often does the answer state a specific value that is not in the retained context? Detectable with the same containment check used for citations: extract ids and numbers from the answer and look for them in the window.\n\n**The ask-rate.** How often does the assistant ask for something it has lost, rather than guessing? A rate of zero on a system that regularly compacts is not good news; it means it is filling gaps rather than naming them.\n\nBoth are computed from artefacts you already have, and both move when your compaction policy changes, which makes them exactly the kind of regression signal the last module of this course is built around."},"check":{"question":"A system prompt states \"you have complete memory of the conversation\", but the implementation compacts older turns. What behaviour does this combination produce?","options":[{"text":"The model refuses to answer questions about older turns, since it cannot verify them.","correct":false,"tempting":"Refusal is what a truthful description of the arrangement tends to produce, not a false claim of completeness."},{"text":"The model asks the user to repeat details, because it notices the summary is incomplete.","correct":false,"tempting":"Asking requires the model to have been told what is missing; the instruction asserts nothing is."},{"text":"The model fabricates specifics from the compacted region, because the instruction says the gap cannot exist.","correct":true},{"text":"Compaction is disabled at runtime, because the instruction conflicts with the assembly policy.","correct":false,"tempting":"Treats a sentence in a prompt as controlling code; the assembler compacts regardless of what the prompt claims."}]},"prev":{"slug":"forgetting-on-purpose","title":"Deleting what you kept","url":"https://addaly.com/learn/context-engineering/forgetting-on-purpose"},"next":{"slug":"forcing-a-schema","title":"Structured output, and what a schema does not buy you","url":"https://addaly.com/learn/context-engineering/forcing-a-schema"},"authorship":"Founder and series editor: Dr Mustafa Mun. Written by AI models to a written standard. Exam keys checked blind by a second model: 3,665 of 3,666 agreed. Academic review invited.","review":{"status":"Draft, open for academic review"},"cite":"Addaly (2026) 'Being honest about a bounded window', in Context Engineering. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/context-engineering/telling-the-user-it-forgot (Accessed: 13 October 2026).","licence":{"name":"CC BY-NC-SA 4.0","url":"https://creativecommons.org/licenses/by-nc-sa/4.0/"},"reader":{"schema":1,"title":"Being honest about a bounded window","courseTitle":"Context Engineering","module":{"index":6,"slug":"conversation-and-memory","title":"Conversation, memory and compaction"},"answer":null,"keyIdea":"A product may only claim to remember what it actually stores, so show the context indicator, mark where compaction happened, list stored memories with delete controls, and tell the model precisely what it does and does not have so it asks instead of confabulating.","hero":{"kind":"plate","image":null,"alt":null,"caption":null},"blocks":[{"t":"h2","id":"the-failure-users-hate-is-not-forgetting","runs":[{"text":"The failure users hate is not forgetting"}]},{"t":"p","runs":[{"text":"Users accept that a system has limits. What they do not accept is being told something is remembered when it is not."}]},{"t":"p","runs":[{"text":"The damaging pattern is specific: an assistant says “I’ll remember that” and stores nothing; or it silently compacts a conversation and then answers as though the dropped material never existed; or it invents a plausible version of a detail it no longer has. In all three the user’s trust breaks not because of the limitation but because the interface lied about it."}]},{"t":"p","runs":[{"text":"So the design rule is narrow and strict: "},{"text":"the product may only claim to remember what it actually stores, and it must show what it dropped.","b":true}]},{"t":"h2","id":"four-things-worth-surfacing","runs":[{"text":"Four things worth surfacing"}]},{"t":"p","runs":[{"text":"A context indicator.","b":true},{"text":" Something showing how full the window is. A subtle bar, a token count, a “long conversation” marker. Users who can see the constraint work with it (they start a new conversation, or restate the important thing) rather than being surprised by it."}]},{"t":"p","runs":[{"text":"A compaction marker.","b":true},{"text":" A visible line in the transcript: “Earlier messages summarised.” With an expand control that shows the summary, and ideally a link to the full history. Users who see it stop being confused about why the assistant’s memory changed character mid-conversation."}]},{"t":"p","runs":[{"text":"The memory list.","b":true},{"text":" Everything stored about the user, with source, date and a delete control per item. This is the mechanism from the memory lesson, presented as a feature rather than a compliance page."}]},{"t":"p","runs":[{"text":"The sources used.","b":true},{"text":" Which passages, which documents, which memories informed this answer. The selection module argued for this as a correctness mechanism; it is also the thing that lets a user say “you used the wrong document” instead of “it’s wrong”."}]},{"t":"h2","id":"say-it-in-the-answer-when-it-matters","runs":[{"text":"Say it in the answer when it matters"}]},{"t":"p","runs":[{"text":"Where something has been lost and the answer depends on it, the answer should say so."}]},{"t":"quote","runs":[{"text":"I no longer have the earlier part of this conversation in full: I have a summary. It records that you chose the standard plan, but not the discount code you mentioned. Could you repeat that?"}]},{"t":"p","runs":[{"text":"This reads as competence rather than weakness, and it is far better than the alternative, which is inventing a discount code that looks right."}]},{"t":"p","runs":[{"text":"It requires the model to know what it does not have, which it cannot do on its own. You have to tell it: one line above the compacted block saying what kind of material was dropped, and an instruction that it may say so."}]},{"t":"h2","id":"start-a-new-conversation-is-real-advice","runs":[{"text":"“Start a new conversation” is real advice"}]},{"t":"p","runs":[{"text":"The standard support answer sounds like a fob-off and is actually correct engineering, for reasons this course has established:"}]},{"t":"ul","items":[[{"text":"A fresh window has no accumulated errors to be consistent with."}],[{"text":"The task statement is at the top, in the strongest position, instead of buried under forty turns."}],[{"text":"Nothing has been compacted, so nothing has been lost."}],[{"text":"The cost per turn resets to the bottom of the quadratic curve."}]]},{"t":"p","runs":[{"text":"So build for it rather than apologising for it. Offer to carry forward a handover note into the new conversation (goal, decisions, artefacts, what failed) so the user gets the clean window without retyping their problem. That is a good feature and it falls straight out of the previous lesson."}]},{"t":"h2","id":"do-not-over-promise-in-the-system-prompt","runs":[{"text":"Do not over-promise in the system prompt"}]},{"t":"p","runs":[{"text":"A small thing with an outsized effect. If your system prompt says “you have full memory of everything the user has told you”, the model will act on that claim, and it will confabulate rather than admit a gap, because the instruction says the gap cannot exist."}]},{"t":"p","runs":[{"text":"Describe the actual arrangement instead:"}]},{"t":"code","lang":"","label":"Text","text":"You have: a summary of earlier turns, the last 6 turns in full, and a list of\nstored user preferences. You do not have the full earlier conversation. If you\nneed something that is not present, ask for it."},{"t":"p","runs":[{"text":"That paragraph costs forty tokens and converts a class of confident fabrication into a question. It is one of the highest-return sentences in a system prompt for a long-conversation product."}]},{"t":"h2","id":"measure-the-honesty-not-just-the-accuracy","runs":[{"text":"Measure the honesty, not just the accuracy"}]},{"t":"p","runs":[{"text":"Two metrics that most teams do not track and should:"}]},{"t":"p","runs":[{"text":"The unsupported-detail rate.","b":true},{"text":" On conversations that have been compacted, how often does the answer state a specific value that is not in the retained context? Detectable with the same containment check used for citations: extract ids and numbers from the answer and look for them in the window."}]},{"t":"p","runs":[{"text":"The ask-rate.","b":true},{"text":" How often does the assistant ask for something it has lost, rather than guessing? A rate of zero on a system that regularly compacts is not good news; it means it is filling gaps rather than naming them."}]},{"t":"p","runs":[{"text":"Both are computed from artefacts you already have, and both move when your compaction policy changes, which makes them exactly the kind of regression signal the last module of this course is built around."}]}],"check":{"question":[{"text":"A system prompt states “you have complete memory of the conversation”, but the implementation compacts older turns. What behaviour does this combination produce?"}],"options":[{"text":[{"text":"The model refuses to answer questions about older turns, since it cannot verify them."}],"correct":false,"tempting":[{"text":"Refusal is what a truthful description of the arrangement tends to produce, not a false claim of completeness."}]},{"text":[{"text":"The model asks the user to repeat details, because it notices the summary is incomplete."}],"correct":false,"tempting":[{"text":"Asking requires the model to have been told what is missing; the instruction asserts nothing is."}]},{"text":[{"text":"The model fabricates specifics from the compacted region, because the instruction says the gap cannot exist."}],"correct":true,"tempting":null},{"text":[{"text":"Compaction is disabled at runtime, because the instruction conflicts with the assembly policy."}],"correct":false,"tempting":[{"text":"Treats a sentence in a prompt as controlling code; the assembler compacts regardless of what the prompt claims."}]}],"order":[0,3,1,2],"why":null},"prev":{"slug":"forgetting-on-purpose","title":"Deleting what you kept","minutes":9},"next":{"slug":"forcing-a-schema","title":"Structured output, and what a schema does not buy you","minutes":9}}}