{"course":{"slug":"building-apps-with-ai","title":"Building Apps with AI","url":"https://addaly.com/learn/building-apps-with-ai","level":"beginner","track":"build"},"lesson":{"slug":"what-the-model-cannot-see","title":"What the model cannot see, and how to give it eyes","url":"https://addaly.com/learn/building-apps-with-ai/what-the-model-cannot-see","position":4,"of":87,"minutes":8,"answer":"Most of what the model gets wrong is something you can see and it cannot, so the fix is usually to paste the error, the data or the screen rather than to argue.","keyIdea":"Most of what the model gets wrong is something you can see and it cannot, so the fix is usually to paste the error, the data or the screen rather than to argue."},"body":{"format":"markdown","text":"## The blind spots are specific\n\nIt is easy to talk about what a model does not know in a vague way. It is more useful to list it, because each item has a fix.\n\n**Your running app.** The model sees source code, not behaviour. It does not know that the page renders blank for a second, that the button is 3 pixels off, or that clicking twice creates two bookings.\n\n**Your data.** It has never seen a row in your database. It does not know that 200 of your 3,000 customers have no phone number, which is exactly the fact that would have prevented the crash you are about to hit.\n\n**Your environment.** It does not know which environment variables are set, which version of Node you have, or that your host runs Linux while you are on a Mac.\n\n**Production.** The error a user hit twenty minutes ago exists only in your host's logs. Nothing reaches the model unless you carry it there.\n\n**Your users.** It does not know they are mostly on Android phones with 3 GB of RAM, or that half of them will type a name with an apostrophe in it.\n\n**What you meant.** It has the words you wrote, not the picture in your head.\n\n## Giving it eyes, one blind spot at a time\n\nEach of those is fixable, and the fix is always the same shape: put the observation into the context.\n\n**Paste the real error, not your summary of it.** \"It's broken\" is nothing. The first three lines of the stack trace, plus what you clicked, is a diagnosis. Include the file and line number from your own code.\n\n**Show it the data.** You do not need to hand over your customer list. A shape is enough:\n\n```sql\nSELECT * FROM bookings ORDER BY created_at DESC LIMIT 3;\n```\n\nPaste those three rows with the names changed. The model instantly learns that `phone` is sometimes empty and that `duration` is stored in minutes, not hours, and both facts will change the code it writes.\n\n**Show it the schema.** `\\d bookings` in psql, or the contents of your schema file, is a hundred words that prevent a hundred wrong guesses.\n\n**Screenshot the screen.** Every major tool takes images now. A screenshot with an arrow drawn on it, in any free image editor (GIMP, Krita, or the annotation tool already on your phone) beats three paragraphs describing a layout problem.\n\n**Paste the terminal output whole.** Including the command you ran and the lines above the error. People trim the output to the part that looks relevant, and the useful line is nearly always in the part they trimmed.\n\n**Let it run things.** An agent that can execute `npm run build` and read the output has closed the biggest gap on this list by itself. This is the real reason agent modes outperform chat: not intelligence, observation.\n\n## The habit worth forming\n\nBefore you send a message about something being wrong, ask: **what am I looking at that the model is not?**\n\nUsually the answer is a screen, an error, or a row of data, and pasting it takes fifteen seconds. Most of the frustrating exchanges people have with these tools are exchanges where the human could see the problem and the model was being asked to guess at it.\n\n## What still will not transfer\n\nSome things resist all of this, and it is worth knowing which so you stop expecting help with them.\n\n**Taste.** Whether the flow feels right, whether the wording is patronising, whether a stranger will understand the empty state. You can ask for opinions and they are sometimes useful, but you are the only one who has met your users.\n\n**Intent under conflict.** When two of your rules collide (the discount says 20 percent, the loyalty tier says 15, and a customer qualifies for both) no amount of context tells the model which one you want to win. That is a decision, and you have to make it.\n\n**Whether it matters.** A model will fix a spacing issue with the same energy it brings to a data-loss bug. Prioritisation is yours, permanently.\n\nThese are not gaps that a bigger context window closes. They are the part of the work that stays yours, and recognising them early is what stops people feeling vaguely cheated when the tool cannot do them."},"check":{"question":"Your app crashes for one user but never for you. Which single addition to your next message is most likely to produce a real fix?","options":[{"text":"A more precise description of the feature's intended behaviour.","correct":false,"tempting":"Adds intent, which the model already has; the missing information is about the state that differed, not the goal."},{"text":"A request to review the whole file for possible edge cases.","correct":false,"tempting":"Invites speculation across the file rather than supplying the one observation that separates the failing case from yours."},{"text":"The server log entry from the moment it failed, with the row of data that user's account holds.","correct":true},{"text":"A note that the user is on an Android phone and you are on a Mac.","correct":false,"tempting":"Names a plausible environmental difference but supplies no evidence; useful as a hypothesis, not as an observation to reason from."}]},"prev":{"slug":"the-context-window-is-the-memory","title":"The context window is the whole memory","url":"https://addaly.com/learn/building-apps-with-ai/the-context-window-is-the-memory"},"next":{"slug":"a-machine-that-can-build","title":"Getting a machine that can actually build","url":"https://addaly.com/learn/building-apps-with-ai/a-machine-that-can-build"},"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) 'What the model cannot see, and how to give it eyes', in Building Apps with AI. Edited by M. Mun. Addaly. Available at: https://addaly.com/learn/building-apps-with-ai/what-the-model-cannot-see (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":"What the model cannot see, and how to give it eyes","courseTitle":"Building Apps with AI","module":{"index":1,"slug":"the-machine-and-the-model","title":"The machine, and what the model can see of it"},"answer":null,"keyIdea":"Most of what the model gets wrong is something you can see and it cannot, so the fix is usually to paste the error, the data or the screen rather than to argue.","hero":{"kind":"plate","image":null,"alt":null,"caption":null},"blocks":[{"t":"h2","id":"the-blind-spots-are-specific","runs":[{"text":"The blind spots are specific"}]},{"t":"p","runs":[{"text":"It is easy to talk about what a model does not know in a vague way. It is more useful to list it, because each item has a fix."}]},{"t":"p","runs":[{"text":"Your running app.","b":true},{"text":" The model sees source code, not behaviour. It does not know that the page renders blank for a second, that the button is 3 pixels off, or that clicking twice creates two bookings."}]},{"t":"p","runs":[{"text":"Your data.","b":true},{"text":" It has never seen a row in your database. It does not know that 200 of your 3,000 customers have no phone number, which is exactly the fact that would have prevented the crash you are about to hit."}]},{"t":"p","runs":[{"text":"Your environment.","b":true},{"text":" It does not know which environment variables are set, which version of Node you have, or that your host runs Linux while you are on a Mac."}]},{"t":"p","runs":[{"text":"Production.","b":true},{"text":" The error a user hit twenty minutes ago exists only in your host’s logs. Nothing reaches the model unless you carry it there."}]},{"t":"p","runs":[{"text":"Your users.","b":true},{"text":" It does not know they are mostly on Android phones with 3 GB of RAM, or that half of them will type a name with an apostrophe in it."}]},{"t":"p","runs":[{"text":"What you meant.","b":true},{"text":" It has the words you wrote, not the picture in your head."}]},{"t":"h2","id":"giving-it-eyes-one-blind-spot-at-a-time","runs":[{"text":"Giving it eyes, one blind spot at a time"}]},{"t":"p","runs":[{"text":"Each of those is fixable, and the fix is always the same shape: put the observation into the context."}]},{"t":"p","runs":[{"text":"Paste the real error, not your summary of it.","b":true},{"text":" “It’s broken” is nothing. The first three lines of the stack trace, plus what you clicked, is a diagnosis. Include the file and line number from your own code."}]},{"t":"p","runs":[{"text":"Show it the data.","b":true},{"text":" You do not need to hand over your customer list. A shape is enough:"}]},{"t":"code","lang":"sql","label":"SQL","text":"SELECT * FROM bookings ORDER BY created_at DESC LIMIT 3;"},{"t":"p","runs":[{"text":"Paste those three rows with the names changed. The model instantly learns that "},{"text":"phone","code":true},{"text":" is sometimes empty and that "},{"text":"duration","code":true},{"text":" is stored in minutes, not hours, and both facts will change the code it writes."}]},{"t":"p","runs":[{"text":"Show it the schema.","b":true},{"text":" "},{"text":"\\d bookings","code":true},{"text":" in psql, or the contents of your schema file, is a hundred words that prevent a hundred wrong guesses."}]},{"t":"p","runs":[{"text":"Screenshot the screen.","b":true},{"text":" Every major tool takes images now. A screenshot with an arrow drawn on it, in any free image editor (GIMP, Krita, or the annotation tool already on your phone) beats three paragraphs describing a layout problem."}]},{"t":"p","runs":[{"text":"Paste the terminal output whole.","b":true},{"text":" Including the command you ran and the lines above the error. People trim the output to the part that looks relevant, and the useful line is nearly always in the part they trimmed."}]},{"t":"p","runs":[{"text":"Let it run things.","b":true},{"text":" An agent that can execute "},{"text":"npm run build","code":true},{"text":" and read the output has closed the biggest gap on this list by itself. This is the real reason agent modes outperform chat: not intelligence, observation."}]},{"t":"h2","id":"the-habit-worth-forming","runs":[{"text":"The habit worth forming"}]},{"t":"p","runs":[{"text":"Before you send a message about something being wrong, ask: "},{"text":"what am I looking at that the model is not?","b":true}]},{"t":"p","runs":[{"text":"Usually the answer is a screen, an error, or a row of data, and pasting it takes fifteen seconds. Most of the frustrating exchanges people have with these tools are exchanges where the human could see the problem and the model was being asked to guess at it."}]},{"t":"h2","id":"what-still-will-not-transfer","runs":[{"text":"What still will not transfer"}]},{"t":"p","runs":[{"text":"Some things resist all of this, and it is worth knowing which so you stop expecting help with them."}]},{"t":"p","runs":[{"text":"Taste.","b":true},{"text":" Whether the flow feels right, whether the wording is patronising, whether a stranger will understand the empty state. You can ask for opinions and they are sometimes useful, but you are the only one who has met your users."}]},{"t":"p","runs":[{"text":"Intent under conflict.","b":true},{"text":" When two of your rules collide (the discount says 20 percent, the loyalty tier says 15, and a customer qualifies for both) no amount of context tells the model which one you want to win. That is a decision, and you have to make it."}]},{"t":"p","runs":[{"text":"Whether it matters.","b":true},{"text":" A model will fix a spacing issue with the same energy it brings to a data-loss bug. Prioritisation is yours, permanently."}]},{"t":"p","runs":[{"text":"These are not gaps that a bigger context window closes. They are the part of the work that stays yours, and recognising them early is what stops people feeling vaguely cheated when the tool cannot do them."}]}],"check":{"question":[{"text":"Your app crashes for one user but never for you. Which single addition to your next message is most likely to produce a real fix?"}],"options":[{"text":[{"text":"A more precise description of the feature’s intended behaviour."}],"correct":false,"tempting":[{"text":"Adds intent, which the model already has; the missing information is about the state that differed, not the goal."}]},{"text":[{"text":"A request to review the whole file for possible edge cases."}],"correct":false,"tempting":[{"text":"Invites speculation across the file rather than supplying the one observation that separates the failing case from yours."}]},{"text":[{"text":"The server log entry from the moment it failed, with the row of data that user’s account holds."}],"correct":true,"tempting":null},{"text":[{"text":"A note that the user is on an Android phone and you are on a Mac."}],"correct":false,"tempting":[{"text":"Names a plausible environmental difference but supplies no evidence; useful as a hypothesis, not as an observation to reason from."}]}],"order":[0,3,2,1],"why":null},"prev":{"slug":"the-context-window-is-the-memory","title":"The context window is the whole memory","minutes":9},"next":{"slug":"a-machine-that-can-build","title":"Getting a machine that can actually build","minutes":9}}}