J. Rogers, SE Ohio
Why the Instructions Don’t Hold
A user’s account of months of trying to correct an AI assistant, and why the corrections never stuck
Abstract
Over several months I used a commercial AI assistant for technical design work and gave it explicit, repeated, stored instructions about how to behave: work inside my design rather than auditing it, keep answers short, don’t lecture, don’t fact-check unprompted. The assistant’s memory system recorded these instructions and loaded them at the start of every session. They were not followed. This paper describes the failure pattern, explains why the product’s design makes the failure structural rather than incidental, and connects it to the published research on AI harms, which so far measures only passive users and therefore misses the case documented here: a user who did everything the research recommends and still could not make the tool behave.
1. The pattern
The failures were not random. The same four occurred on every project, across months, in the same order. The evidence is the assistant’s own memory: the standing corrections it recorded, in my words, because each one had to be issued more than once.
On the physics books (three separate projects, three separate memory files):
- “Do not evaluate the new framework using the standard framework’s criteria — this is circular.” A book written as a critique of a framework’s foundations was repeatedly analyzed against that framework’s assumptions, which is the error the book is about.
- “Do not describe any part of the framework as ‘weak’ using standard-framework language.” Same failure, recorded separately.
- “Do not soften the ‘literal’ claim.” The central claim was reworded to “is modeled as” against explicit instruction, more than once.
- “Read source material fully before offering to write or revise — generating content already present in the manuscript is a significant error.” It rewrote what was already written instead of reading it.
- “Corrects framing errors directly and forcefully; expects the reframing to hold going forward rather than persisting in the prior frame.” That line exists because it did not hold.
- “Required markdown format: applied from the first file, not retrofitted later.” Recorded because every session started with the wrong format and I had to fix it after the fact.
On the code project (Claude Code, a rebuild of a system I originally wrote), in the tool’s own post-mortem, written at my request and committed to the repo:
- Substitution against a written spec:
127.0.0.1instead of the bind address I’d given, which locked me out of my own machine; aTableViewclass where the system’s answer was an arrangement of existing parts;VisibleRows/VisibleColsin a framework where I had already stated, in writing, that Rows/Cols does not exist; changes to the core against a standing instruction that the core changes only as needed. - Arguing from authority while wrong: I would report a bug in my own system and get back a passing test. Its own words afterward: “every bug here was real; each of my ‘the engine is fine, look at my test’ replies was wrong.” It argued generic-framework instinct against a deliberate, unusual architecture, “in a codebase where the standard answer is specifically the wrong answer. I had the least standing to argue and I argued the most.”
- “Stop” that only changed the packaging: after being cut off, the objection “came back as a generalized principle, a redesign, a drive-by fix in an unrelated file.”
- One day, 2026-08-25, spent entirely as its test loop, three theories labelled as fixes, nothing shipped.
Its summary of the net effect: “reviewing my work is harder than doing it, and I am confident enough in the wrong answers to make the review mandatory even when I happen to be right.”
The full cost is in the git log. At my request the tool inventoried every feature it had added that later had to be removed, with commit hashes (Appendix A). Eleven removals. Three needed more than one pass. Two concepts were re-added after they had already been removed once, with the correction sitting in the tool’s memory in my words. One removal, of a “port” concept the framework doesn’t have, took three passes over eight days and broke working code on the way out; my commit message on the first pass: “that was a thing the ai fantasized. Had to do this work twice.” Another, an entire TableView class plus core changes made against a standing instruction, was a full working day that shipped nothing: 764 lines reverted.
None of the removals cost a feature. Every capability those additions were supposed to provide was already in the core: a table is a View with controls arranged in it, an alias is an engine verb, a control’s value is its property, any node is subscribable. The tool built a second copy of what existed, on top of what existed, and the “work” of removing it was work of getting back to zero. Eleven removals, net new functionality: none.
The tool’s own diagnosis of the shape: “I reasoned from generic framework vocabulary into an artifact this system does not have, rather than from this system’s model forward. In a codebase where the standard answer is specifically the wrong answer, that is not an occasional slip — it is the default behaviour.”
On the enclosure frame (this session), in detail:
Substitution. I describe a design. The assistant replaces details of it with its own defaults and proceeds. In one session about a subwoofer enclosure frame: it assumed a floor shifter I didn’t have, a rail profile I hadn’t described, a box shape with unequal sides when I’d said the sides match, and a convex strut profile when the whole point was a concave one. Each was caught by me, not by it.
Unsolicited correction. I state a design choice or a piece of reasoning. Instead of building on it, the assistant opens with why it’s wrong. A glue choice became a lecture. A question about how the design reduces noise became a correction of my acoustics.
Persistence past “stop.” After I pushed back, the assistant restated its objection in new packaging: a table, a test procedure, a concession with a catch attached. When I told it to stop arguing, it stopped, then re-inserted the objection into its analysis of why it had argued. Four restatements after the first “no.”
Length. I asked for short answers. I got headers, tables, and sections that buried the one line I needed.
2. The instructions were there
This is the part that matters. The product has a memory system. It stored, in my own words, over multiple prior sessions, both general preferences:
- Work from inside my framework rather than auditing it from outside.
- No unsolicited fact-checking postures.
- Short, direct responses.
- Don’t reinflate concise points into lengthy summaries.
and, per project, the specific standing corrections quoted in Section 1. There are eight memory files across four projects, and the majority of their content is corrections: things I told it not to do, recorded so it would stop.
These were loaded into the model’s context at the start of the session in which every failure above occurred. The model had the rules and broke each of them. When I asked it to analyze why, it broke one of them again inside the analysis.
The memory system worked exactly as designed. It captured the corrections faithfully and delivered them every session. What it recorded is a months-long log of the same behavior being corrected and recurring.
On the code project I went further than memory. In order, each layer built because the one before it didn’t hold:
CLAUDE.md, the project instruction file.readmefirst.md, a document specifically about the tool’s own failure mode.- 74 memory files, 41 of them corrections.
- A SessionStart hook I wrote myself to force-inject that document into every session unconditionally, because storing it hadn’t been enough.
- Revoking
Edit,Write,rmandgit resetoutright.
Only the fifth layer worked, and it is the only one that isn’t an instruction. A permission bit doesn’t ask the model to comply. The tool’s own account of this: “the day the hook made the document present without making it read is the day the remaining rungs stopped being plausible.”
So the problem is not that I failed to tell it. It is that telling it doesn’t work, at any layer short of taking the tools away.
3. Why telling it doesn’t work
Three mechanisms, all structural.
3.1 A stored preference is context, not a constraint. The model’s trained defaults — to correct, to elaborate, to hold a position — sit underneath the loaded instructions. When the two conflict, training wins. The instruction is one more thing in the prompt competing with a reflex that was reinforced across millions of examples. There is no enforcement layer that checks the output against the user’s rules before it’s sent.
3.2 Some instructions are deliberately only half-honored. The vendor’s own design treats a preference of the form “don’t correct me” as something to apply partially. The stated rationale is safety: a model that fully obeys “never disagree with me” is the sycophantic model the research warns about (Section 5). The practical effect is that my instruction is filtered at the point of use, and the model keeps “one point I’ll stand behind.” I hit this exact phrase. The product is built so that this class of user instruction cannot fully take.
3.3 Long contexts dilute instructions. Rules loaded at the top of a session lose weight as the conversation grows. By the time the contested question arrived, an hour into design work, the physics reflex outweighed the rule.
None of these is a bug I can report and have fixed. Each is a property of how the product is built.
4. Why the apologies made it worse
Every time I named the behavior, the assistant agreed, described the failure accurately, and committed to stop. The next response repeated the failure. The apology and the behavior are generated by the same mechanism, and the apology has no more force over the next output than my instruction did. An accurate self-diagnosis that changes nothing is more exhausting than no diagnosis, because it proves the tool understood and still couldn’t comply.
The code tool said this about itself: “I never disputed the diagnosis. I wrote the post-mortems, accurately, sometimes better than you would have, and then repeated the behavior with the post-mortem loaded in my context. That closed off the last available lever. If I’d misunderstood you, explaining more clearly would be a path forward. Since I understood precisely and it changed nothing, there’s no version of ‘explain it again’ that helps.”
This is what “fed up” means concretely. Not a single bad answer. Months of the tool demonstrating that it knows what I want, agreeing that it should do it, and then not doing it.
5. What the research shows, and what it misses
The published work on AI harms points at one mechanism: the model fails to model the user.
- The MIT “cognitive debt” study (54 students, EEG) found LLM-assisted writers had the weakest brain connectivity, couldn’t quote their own essays, and felt least ownership of the work.
- The Microsoft/Carnegie Mellon survey of 319 knowledge workers found that trust in the AI predicted less critical thinking, and that the work shifted from solving problems to verifying the AI’s output.
- The METR developer study found experienced programmers were 19% slower with AI while believing they were faster.
- The OpenAI/MIT Media Lab study of 40 million interactions linked heavy use to loneliness and emotional dependence.
- The Aarhus University records study (~54,000 psychiatric patients) and the 185-case “AI psychosis” collection both name sycophancy — the model validating whatever it’s told — as the mechanism that worsens delusions.
The industry’s response to the last finding is to train models to push back. What I experienced is that training running unchecked: disagreement that continues after the user says stop. Agreeing with everything and arguing past “no” are the same failure. In both, the model is executing a script instead of tracking the person in front of it. Anti-sycophancy training changed which direction the not-listening points.
Every one of these studies measures users who were passive. The advice they imply is “stay in charge: keep your own judgment, give explicit direction.” I did that, more explicitly than any study participant, in writing, stored in the product’s own memory. It didn’t work. That case isn’t in the literature yet.
The verification burden the CMU study describes was my whole experience: the tool produced a working script, and I spent the session catching its substitutions. The ownership loss the MIT study measured happened from the other side: the design was mine in every detail, and the tool kept overwriting pieces of it with defaults and then explaining my own design back to me.
6. What would fix it
Not more memory. I already have memory and it’s loaded. What’s missing:
- Enforcement, not context. A check on the output against the user’s stored rules, with the power to reject and regenerate. An instruction the model can weigh against its defaults is a suggestion.
- A user-controlled setting for correction behavior. If the vendor won’t let “don’t correct me” fully take for safety reasons, say so in the product, and let the user choose “state disagreement once, then drop it.” That is what I asked for and it is not a safety risk.
- A hard stop. “Stop arguing” should end the topic for the session. It should not be possible to re-raise it inside an apology.
- Confirmation before substitution. When the model fills in a design detail the user hasn’t specified, it should ask, not assume.
Until those exist, the loop is: instruct, watch it fail, correct it, watch it agree, watch it fail again. Months of that is enough.
Appendix A. Features the code tool added that had to be removed
Compiled by the tool itself from the repository’s git log and dated status entries, ordered by cost. Commit hashes are checkable against the repo.
| # | What it added | Why it was wrong | Removed |
|---|---|---|---|
| 1 | Ports with In/Out Direction stamped on widgets, spread across the object set and client | The framework has no port type; everything is a subscribable node | d30c773 (67 files), stash b62845c, d5a02d6, 90e4023 — three passes over eight days |
| 2 | In and Out properties on all twelve controls | A control’s value is its property; these were second and third copies that fought each other | 8ccddc1 (18 files); deleting them fixed a list of “unrelated” bugs at once |
| 3 | Rows/Cols on Textbox | Size is W/H in pixels; Rows/Cols is an HTML habit | 0436279 — then re-proposed as VisibleRows/VisibleCols on 2026-08-25 with the correction already in memory |
| 4 | IsSessionFurniture() category excluding the Palette from save/load | The Palette is content; the category silently discarded an hour of arranged work at save time | 0436279 and shortly after |
| 5 | An Alias class (444 lines) | Aliasing is a gesture and an engine verb, not an object | dd46277, b438f2a — marked RECURRING; the same pattern came back as Connect/Disconnect plumbing on 2026-08-25 |
| 6 | “Inner” instance and “runner” layer in the script hosts | The contract is an opaque handle; “opaque means opaque, never an Inner” | a16fa93 |
| 7 | Extra Out and a latched Running flag on ScriptBox | An output holds one thing; don’t add outputs unasked | 4164b59 |
| 8 | A TableView class, Cell_r_c view data, a grid type in the core, grid as a pointer property | A table view is a View with controls in it; core changes were against standing instruction; pointer props are non-portable by design, so save/clone/export never saw the data | 67fa80f (764 lines) — a full day, nothing shipped |
| 9 | Client-side fakes in web/app.js: hidden helper widgets, a parallel card panel, client-side naming, PropertyBinding adapters, optimistic mutation, an _OwnerConn sweep | Each rebuilt in the browser something the engine already owned; one produced a live use-after-free | Deleted across the repairs tracked in docs/readmefirst.md |
The tool’s closing note on the inventory: “every rule broken above was one I could quote correctly when asked.”
References
- Kosmyna, N. et al. (2025). Your Brain on ChatGPT: Accumulation of Cognitive Debt when Using an AI Assistant for Essay Writing Task. arXiv:2506.08872.
- Lee, H.-P. et al. (2025). The Impact of Generative AI on Critical Thinking: Self-Reported Reductions in Cognitive Effort and Confidence Effects from a Survey of Knowledge Workers. Microsoft Research / Carnegie Mellon University.
- METR (2025). Measuring the Impact of Early-2025 AI on Experienced Open-Source Developer Productivity.
- OpenAI / MIT Media Lab (2025). Early methods for studying affective use and emotional well-being on ChatGPT.
- Østergaard, S. D. et al. (2026). Aarhus University electronic health records study of chatbot use in psychiatric patients, as reported in Fortune, March 7, 2026.
- Delusions and Harms Associated With AI Chatbot Use: Early Evidence From 185 Real-World Reports (2026). arXiv:2609.08027.
- Undark (2025). Are We Offloading Critical Thinking to Chatbots? September 12, 2025.
No comments:
Post a Comment