<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: davidvk89</title>
    <description>The latest articles on DEV Community by davidvk89 (@davidvk89).</description>
    <link>https://dev.to/davidvk89</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg</url>
      <title>DEV Community: davidvk89</title>
      <link>https://dev.to/davidvk89</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/davidvk89"/>
    <language>en</language>
    <item>
      <title>I Just Wanted Bannerlord NPCs to Remember Things</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Thu, 02 Jul 2026 15:58:18 +0000</pubDate>
      <link>https://dev.to/davidvk89/i-just-wanted-bannerlord-npcs-to-remember-things-aia</link>
      <guid>https://dev.to/davidvk89/i-just-wanted-bannerlord-npcs-to-remember-things-aia</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkfo4us2g7de0i9s4nl7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fzkfo4us2g7de0i9s4nl7.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I did not want to write.&lt;/p&gt;

&lt;p&gt;I did not want to think.&lt;/p&gt;

&lt;p&gt;I did not want to code.&lt;/p&gt;

&lt;p&gt;I just wanted Bannerlord NPCs to remember things.&lt;/p&gt;

&lt;p&gt;That was the whole crime.&lt;/p&gt;

&lt;p&gt;Bannerlord is a strange game for me because it has so much of what I like. Big map. Clans. Armies. Marriages. Trade. Sieges. Prisoners. Fiefs. Lords and ladies with family names, banners, grudges, and theoretically important political ambitions.&lt;/p&gt;

&lt;p&gt;It has rich systems.&lt;/p&gt;

&lt;p&gt;It also has a world that can feel weirdly dead.&lt;/p&gt;

&lt;p&gt;Not bad. Not empty. Just… dead in the specific way sandbox games can be dead. Things happen, but the world does not always seem to understand that they happened. A lord is captured. A battle is won. A marriage is arranged. A village burns. A clan rises. A family member dies.&lt;/p&gt;

&lt;p&gt;And then the game politely continues being a spreadsheet wearing armor.&lt;/p&gt;

&lt;p&gt;So I started playing with an LLM alongside the campaign.&lt;/p&gt;

&lt;p&gt;At first, it was just prose.&lt;/p&gt;

&lt;p&gt;And honestly? The prose was the hook.&lt;/p&gt;

&lt;p&gt;Suddenly a council scene had weight. A companion could have an opinion. A marriage negotiation could feel like more than a transaction screen. A village notable could become a person with fears, leverage, and memory. A warband returning from a battle could carry more than loot and wounded troops. It could carry consequences.&lt;/p&gt;

&lt;p&gt;For a week or two, that was enough.&lt;/p&gt;

&lt;p&gt;I was not thinking about architecture. I was thinking, “This is fun.”&lt;/p&gt;

&lt;p&gt;Then the magic started fading.&lt;/p&gt;

&lt;p&gt;Not immediately. That is the dangerous part. At first, it works well enough to make you believe. Then, a few sessions later, small cracks start showing.&lt;/p&gt;

&lt;p&gt;A character remembers something slightly wrong.&lt;/p&gt;

&lt;p&gt;Someone knows something they should not know.&lt;/p&gt;

&lt;p&gt;A private thought leaks into public dialogue.&lt;/p&gt;

&lt;p&gt;A rumor hardens into fact.&lt;/p&gt;

&lt;p&gt;A future plan from a planning note starts acting like current canon.&lt;/p&gt;

&lt;p&gt;By around session four, the medieval sandbox is no longer a roleplay companion. It is a gossip-powered hallucination engine with horses.&lt;/p&gt;

&lt;p&gt;That was the point where I realized the problem was not prose quality.&lt;/p&gt;

&lt;p&gt;The LLM could write. That was not the issue.&lt;/p&gt;

&lt;p&gt;The issue was memory.&lt;/p&gt;

&lt;p&gt;If I wanted the world to feel alive for longer than a few sessions, the characters needed some kind of stable memory. Not just “the whole chat so far.” That would not be enough. Long chats get heavy, messy, and full of things that are not supposed to become true.&lt;/p&gt;

&lt;p&gt;The characters needed structured memory.&lt;/p&gt;

&lt;p&gt;Who are they? What do they know? What do they believe? What did they witness directly? What were they told second-hand? What is rumor? What is private? What is public? What has happened in the world? What is the current scene? What is the current political situation? What is old enough to matter but not so immediate that it should dominate every conversation?&lt;/p&gt;

&lt;p&gt;This was the moment the companion app idea appeared.&lt;/p&gt;

&lt;p&gt;The first idea was simple: flat JSON files.&lt;/p&gt;

&lt;p&gt;Nothing glamorous. No grand platform. No elaborate database. Just structured files that could hold character memory, world state, campaign events, and useful context.&lt;/p&gt;

&lt;p&gt;The important thing was not the storage format. The important thing was that the memory had to be sliceable.&lt;/p&gt;

&lt;p&gt;A character should not receive the entire world.&lt;/p&gt;

&lt;p&gt;A scout does not need the same context as a spouse. A village elder does not need the same context as a clan council. A captured enemy lord should not know the player’s private plans. A merchant should not suddenly become omniscient because the LLM was given too much campaign history.&lt;/p&gt;

&lt;p&gt;The right actor needed the right context packet at the right time.&lt;/p&gt;

&lt;p&gt;That sentence sounds boring until you start thinking about multiplayer.&lt;/p&gt;

&lt;p&gt;In single-player, a hallucination can sometimes be treated as flavor until it breaks continuity. In multiplayer, it becomes fairness. Hidden information. Player trust. Canon. Authority. Maybe even moderation.&lt;/p&gt;

&lt;p&gt;If an LLM says something happened, did it happen?&lt;/p&gt;

&lt;p&gt;If an NPC reveals secret information, was that information actually available to them?&lt;/p&gt;

&lt;p&gt;If two generated scenes contradict each other, which one is true?&lt;/p&gt;

&lt;p&gt;If a player tricks the system into saying something useful, does that become world state?&lt;/p&gt;

&lt;p&gt;I needed one exact point where LLM output stopped being suggestion and became truth.&lt;/p&gt;

&lt;p&gt;That was the beginning of the trust gate, though I did not have that language yet.&lt;/p&gt;

&lt;p&gt;At the time, it was much less dignified. It was more like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Wait. No. The AI cannot just say that and make it canon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Very academic.&lt;/p&gt;

&lt;p&gt;So the companion app started becoming a memory and context-routing problem. The LLM was not just a writer anymore. It was an actor receiving a bounded context packet and producing output that still needed to be accepted before it changed the world.&lt;/p&gt;

&lt;p&gt;Then I asked a coding agent to help build the app.&lt;/p&gt;

&lt;p&gt;And within a few prompts, the development process started showing the same disease as the story layer.&lt;/p&gt;

&lt;p&gt;The coding agent could move quickly. Sometimes very quickly. It could generate a mockup, create files, wire routes, adjust behavior, and make the thing look like progress.&lt;/p&gt;

&lt;p&gt;But it could also grab the wrong idea, preserve a temporary assumption, broaden the scope, or act on something that was only ever meant as background thinking.&lt;/p&gt;

&lt;p&gt;That was when the recursion became hard to ignore.&lt;/p&gt;

&lt;p&gt;The app needed controlled context so fictional characters would not accidentally act from the wrong memory.&lt;/p&gt;

&lt;p&gt;The coding agent needed controlled context so it would not accidentally build from the wrong project understanding.&lt;/p&gt;

&lt;p&gt;Same shape. Different layer.&lt;/p&gt;

&lt;p&gt;So I started applying the same instinct to the development workflow.&lt;/p&gt;

&lt;p&gt;The project documentation became the development equivalent of actor memory. It preserved what the project currently was, what the architecture meant, which data shapes existed, which API contracts mattered, and which ugly things were intentionally deferred.&lt;/p&gt;

&lt;p&gt;The Codex Contract became the context packet. Not the whole planning conversation. Not every idea. Not the future dream. Just the bounded implementation slice: what to change, what to preserve, what not to touch, what to verify, what documentation to update, and what to report back.&lt;/p&gt;

&lt;p&gt;Final Review became the trust gate. The coding agent’s output was not automatically accepted project state just because it existed. It had to be checked against the contract, tested, reviewed, and folded back into the documentation before it became part of the next cycle’s memory.&lt;/p&gt;

&lt;p&gt;In hindsight, this is funny.&lt;/p&gt;

&lt;p&gt;I started by wanting Bannerlord characters to remember things.&lt;/p&gt;

&lt;p&gt;Then I built memory files for fictional actors.&lt;/p&gt;

&lt;p&gt;Then the coding agent building those files needed its own version of memory.&lt;/p&gt;

&lt;p&gt;Then the documentation started behaving like project memory.&lt;/p&gt;

&lt;p&gt;Then the review step became the point where output became accepted truth.&lt;/p&gt;

&lt;p&gt;Then I found myself writing about operational memory, controlled context flow, and trust gates like a person who definitely meant to end up here.&lt;/p&gt;

&lt;p&gt;I did not.&lt;/p&gt;

&lt;p&gt;This started as play.&lt;/p&gt;

&lt;p&gt;Then the toy developed architecture.&lt;/p&gt;

&lt;p&gt;This is probably the most honest version of the story:&lt;/p&gt;

&lt;p&gt;"I was hooked by the prose first. The serious part came later, because the fun thing had a real problem underneath it. Making an LLM-powered sandbox feel alive is not only a writing problem. It is a memory problem. A context problem. An authority problem."&lt;/p&gt;

&lt;p&gt;And, apparently, building the tool to solve that problem creates the same problem one layer up.&lt;/p&gt;

&lt;p&gt;That does not mean I solved it. The companion app is still very much a prototype. The workflow is still something I am testing, tightening, and trying not to overclaim.&lt;/p&gt;

&lt;p&gt;But the path makes sense to me now.&lt;/p&gt;

&lt;p&gt;I wanted NPCs to remember things.&lt;/p&gt;

&lt;p&gt;To make that work, I needed structured memory.&lt;/p&gt;

&lt;p&gt;To use that memory safely, I needed scoped context.&lt;/p&gt;

&lt;p&gt;To make scoped context reliable, I needed review boundaries.&lt;/p&gt;

&lt;p&gt;To build the app without losing control of it, I needed the same pattern in my development process.&lt;/p&gt;

&lt;p&gt;So yes, I spent a week trying to make AI-assisted development less chaotic.&lt;/p&gt;

&lt;p&gt;But the real origin is much less grand than that.&lt;/p&gt;

&lt;p&gt;I just wanted Bannerlord NPCs to remember things.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>gamedev</category>
      <category>devjournal</category>
      <category>programming</category>
    </item>
    <item>
      <title>Case File: Context Drift</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Thu, 02 Jul 2026 13:59:00 +0000</pubDate>
      <link>https://dev.to/davidvk89/case-file-context-drift-2iak</link>
      <guid>https://dev.to/davidvk89/case-file-context-drift-2iak</guid>
      <description>&lt;h2&gt;
  
  
  A Thought Trail on Operational Memory, Controlled Context Flow, and AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;I started with what looked like a practical AI coding problem.&lt;/p&gt;

&lt;p&gt;The coding agent was moving too fast. Not computationally fast. Conceptually fast. It could turn a loose idea into code before I had fully decided whether that idea was stable, temporary, rejected, or just something I was thinking through.&lt;/p&gt;

&lt;p&gt;At first, the obvious suspect was prompting. Maybe I needed clearer prompts, better task descriptions, or more detail each time.&lt;/p&gt;

&lt;p&gt;That helped, but it did not explain the whole pattern.&lt;/p&gt;

&lt;p&gt;Then documentation looked guilty. If the AI kept losing track of project state, maybe I needed better documentation: cleaner notes, clearer architecture descriptions, more explicit decisions, and more reminders about what not to touch.&lt;/p&gt;

&lt;p&gt;That helped too.&lt;/p&gt;

&lt;p&gt;But that still was not the whole mechanism.&lt;/p&gt;

&lt;p&gt;The problem was not simply that the AI lacked context. The problem was that different parts of the workflow stopped sharing the same understanding of project state.&lt;/p&gt;

&lt;p&gt;The human had one version of the project in mind. The assistant had another, shaped by conversation context. The coding agent had another, shaped by the prompt and files it was given. The documentation had another, depending on whether it had been updated. The codebase had the actual state, but not necessarily the intent behind that state.&lt;/p&gt;

&lt;p&gt;That gap is what I started calling &lt;strong&gt;context drift&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In AI-assisted development, context drift happens when the human, assistant, coding agent, documentation, and codebase stop sharing the same understanding of project state.&lt;/p&gt;

&lt;p&gt;When that happens, a coding agent can act on incomplete, stale, speculative, or polluted context faster than the human can mentally reorganize the project.&lt;/p&gt;

&lt;p&gt;That was the failure mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  The AI Did Not Need More Context. It Needed the Right Context at the Right Time.
&lt;/h2&gt;

&lt;p&gt;My first useful response was not “write more documentation.”&lt;/p&gt;

&lt;p&gt;It was separating broad reasoning from narrow implementation.&lt;/p&gt;

&lt;p&gt;The assistant could reason broadly. It could help explore options, identify risks, compare designs, recover intent, and translate vague thoughts into engineering language.&lt;/p&gt;

&lt;p&gt;But the coding agent needed something different.&lt;/p&gt;

&lt;p&gt;It needed bounded implementation instructions: what to change, what to preserve, what to avoid, what to verify, what documentation to update, and what to report back.&lt;/p&gt;

&lt;p&gt;That pressure eventually became a stricter handoff artifact: a reviewed implementation contract.&lt;/p&gt;

&lt;p&gt;In my workflow, I called these Codex Contracts. The name matters less than the role.&lt;/p&gt;

&lt;p&gt;The contract was not just a better prompt. It was the reduction point between broad reasoning and narrow execution.&lt;/p&gt;

&lt;p&gt;A planning conversation could stay messy. It could include uncertainty, rejected ideas, half-formed thoughts, possible future directions, and things I was not ready to implement.&lt;/p&gt;

&lt;p&gt;But the coding agent should not act directly on that whole mess.&lt;/p&gt;

&lt;p&gt;The implementation contract translated broad reasoning into bounded authority.&lt;/p&gt;

&lt;p&gt;That distinction became one of the most important ideas in the whole project:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Context access is not authority to act.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A coding agent may have access to project documentation, prior discussion, planning notes, future ideas, rejected options, and implementation constraints.&lt;/p&gt;

&lt;p&gt;But not all of that context should be allowed to direct implementation.&lt;/p&gt;

&lt;p&gt;Useful reasoning context is not automatically implementation authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation Changed Role
&lt;/h2&gt;

&lt;p&gt;As the workflow developed, documentation started to change role.&lt;/p&gt;

&lt;p&gt;At first, documentation was just helpful notes: architecture notes, current-state summaries, known technical debt, and decisions I did not want to forget.&lt;/p&gt;

&lt;p&gt;But once those documents were updated, reviewed, and reused as future context, they became something stronger.&lt;/p&gt;

&lt;p&gt;They started functioning as &lt;strong&gt;operational project memory&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That does not mean the documentation became source code. It did not compile, execute, or replace tests, code review, or engineering judgment.&lt;/p&gt;

&lt;p&gt;But it could guide implementation.&lt;/p&gt;

&lt;p&gt;When a coding agent reads documentation and acts from it, documentation becomes part of the instruction surface that shapes future code changes.&lt;/p&gt;

&lt;p&gt;That changes how seriously documentation needs to be treated.&lt;/p&gt;

&lt;p&gt;A normal bad documentation update is already a problem because it can mislead a human. But in an AI-assisted workflow, a bad documentation update can become bad memory.&lt;/p&gt;

&lt;p&gt;If that bad memory is later reused by an assistant or included in coding-agent context, it can preserve false project state and feed it back into future work.&lt;/p&gt;

&lt;p&gt;That is why documentation review stopped feeling like cleanup.&lt;/p&gt;

&lt;p&gt;It became part of the mechanism.&lt;/p&gt;

&lt;p&gt;The documentation had to be required, bounded, reviewed, updated, and reused inside controlled context flow.&lt;/p&gt;

&lt;p&gt;More documentation alone was not the answer.&lt;/p&gt;

&lt;p&gt;More context alone was not the answer.&lt;/p&gt;

&lt;p&gt;The mechanism was the combination:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Reviewed documentation preserved project memory, and controlled context flow determined when and how that memory entered reasoning, implementation, review, and future reuse.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Slow Down the AI, Speed Up the Human
&lt;/h2&gt;

&lt;p&gt;The slogan I kept coming back to was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Slow down the AI. Speed up the human.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sounds backwards at first. The whole selling point of AI coding tools is speed. Why slow them down?&lt;/p&gt;

&lt;p&gt;Because the AI was already fast.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiht0n7xgr5z3vsj00725.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fiht0n7xgr5z3vsj00725.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;How the loop works: broad planning context is reduced into a reviewed implementation contract, executed narrowly by the coding agent, reviewed through a trust gate, and preserved as operational project memory for the next loop.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The problem was that it could move faster than I could safely understand, review, and direct. The workflow did not make the AI faster. It made the AI’s speed usable.&lt;/p&gt;

&lt;p&gt;By slowing down the transition from reasoning to implementation, I could keep more authority over what the coding agent was actually allowed to act on.&lt;/p&gt;

&lt;p&gt;The assistant could help reason, translate, and compress context. The implementation contract could define the task boundary. The coding agent could execute narrowly. Final review could compare the result against the contract. Documentation updates could preserve accepted project state for the next task.&lt;/p&gt;

&lt;p&gt;My role shifted away from repeated re-explanation and cleanup, and toward intent, judgment, review, and final acceptance.&lt;/p&gt;

&lt;p&gt;That is what “slow down the AI, speed up the human” meant in practice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Artifact Trail Mattered
&lt;/h2&gt;

&lt;p&gt;The prototype did not prove that this workflow works generally.&lt;/p&gt;

&lt;p&gt;It was one solo prototype, over a short development period, using a prompt-only AI-assisted workflow. It did not test large teams, multiple branches, long timelines, enterprise tooling, or multiple people updating the same project-memory layer.&lt;/p&gt;

&lt;p&gt;So the evidence boundary has to stay narrow.&lt;/p&gt;

&lt;p&gt;But the prototype did leave something useful behind: an artifact trail.&lt;/p&gt;

&lt;p&gt;There were project-memory files, consecutive implementation contracts, documentation updates, final reviews, and later reuse of reviewed context across multiple development passes.&lt;/p&gt;

&lt;p&gt;That mattered because the artifacts showed context moving through the workflow.&lt;/p&gt;

&lt;p&gt;Broad reasoning did not move directly into coding-agent execution. It was reduced into reviewed implementation contracts. Those contracts acted as the handoff point between assistant reasoning and coding-agent execution.&lt;/p&gt;

&lt;p&gt;After implementation, the result was reviewed, documentation was updated, and that reviewed documentation became usable context for later AI-assisted tasks.&lt;/p&gt;

&lt;p&gt;That did not make the prototype proof.&lt;/p&gt;

&lt;p&gt;But it did make the mechanism visible.&lt;/p&gt;

&lt;p&gt;The value of the prototype was not that it answered the scale question.&lt;/p&gt;

&lt;p&gt;The value was that it made the scale question concrete enough to ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  This Is Not a Claim of Inventing Software Engineering
&lt;/h2&gt;

&lt;p&gt;A fair critique is that none of this sounds completely new.&lt;/p&gt;

&lt;p&gt;Specifications, reviews, architecture decision records, acceptance criteria, technical-debt tracking, implementation boundaries, and living documentation all existed before this.&lt;/p&gt;

&lt;p&gt;I am not claiming otherwise.&lt;/p&gt;

&lt;p&gt;The interesting question is narrower:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Do familiar software-engineering practices take on a different operational role when arranged around AI-assisted development, where assistants and coding agents may read, reuse, and act on project context?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In my prototype, the answer appeared to be yes.&lt;/p&gt;

&lt;p&gt;Documentation was no longer only explanatory. It became operational. It became part of the memory layer.&lt;/p&gt;

&lt;p&gt;Controlled context flow became the routing and authority layer.&lt;/p&gt;

&lt;p&gt;The implementation contract became the reduction point between broad reasoning and narrow execution.&lt;/p&gt;

&lt;p&gt;Review before reuse became the safety gate before documentation could become trusted future context.&lt;/p&gt;

&lt;p&gt;The pieces were familiar.&lt;/p&gt;

&lt;p&gt;The arrangement mattered because the failure mode was specific to AI-assisted development.&lt;/p&gt;

&lt;p&gt;The problem was not only whether the AI had enough context.&lt;/p&gt;

&lt;p&gt;The problem was whether the AI was acting from the right context, at the right time, with the right authority.&lt;/p&gt;

&lt;h2&gt;
  
  
  Better Tools Do Not Remove the Principle
&lt;/h2&gt;

&lt;p&gt;Manual file passing was part of my prototype, but it was never the principle.&lt;/p&gt;

&lt;p&gt;I manually dragged files around because that was what my tools allowed and because I wanted direct control over what context went where.&lt;/p&gt;

&lt;p&gt;A better tool should reduce that manual overhead. Repo-aware coding agents should be able to inspect files, retrieve documentation, index project state, understand code structure, and work directly inside development environments.&lt;/p&gt;

&lt;p&gt;That is the better direction.&lt;/p&gt;

&lt;p&gt;But repo awareness does not remove the deeper problem.&lt;/p&gt;

&lt;p&gt;Access to more context is not the same as controlled context flow.&lt;/p&gt;

&lt;p&gt;A repo-aware agent with broad access can still act from the wrong context if it treats unreviewed planning, stale documentation, rejected ideas, or future possibilities as actionable implementation instruction.&lt;/p&gt;

&lt;p&gt;That is why the principle is not manual file separation.&lt;/p&gt;

&lt;p&gt;The principle is controlled separation between reasoning context, reviewed project memory, implementation authority, coding-agent instructions, documentation updates, and future reusable context.&lt;/p&gt;

&lt;p&gt;Better tooling should reduce manual overhead while preserving or strengthening those control points.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Security Turn
&lt;/h2&gt;

&lt;p&gt;The final clue was not another workflow improvement.&lt;/p&gt;

&lt;p&gt;It was the risk hiding inside the improvement.&lt;/p&gt;

&lt;p&gt;If documentation could become operational project memory, then documentation was no longer only a record of the project. It could become part of the instruction surface future AI-assisted work relied on.&lt;/p&gt;

&lt;p&gt;Not executable code.&lt;/p&gt;

&lt;p&gt;Not a replacement for tests, review, or engineering judgment.&lt;/p&gt;

&lt;p&gt;But still something that could influence future code changes.&lt;/p&gt;

&lt;p&gt;That changed the case.&lt;/p&gt;

&lt;p&gt;A bad documentation update was not just a bad note anymore.&lt;/p&gt;

&lt;p&gt;If it passed review and entered future context, it could become bad memory.&lt;/p&gt;

&lt;p&gt;If a coding agent treated that memory as implementation guidance, then misleading or poisoned documentation could shape code without anyone directly changing the source code.&lt;/p&gt;

&lt;p&gt;This was not a newly discovered attack class. It belonged to a known family of LLM security risks showing up inside the mechanism.&lt;/p&gt;

&lt;p&gt;OWASP describes indirect prompt injection as occurring when an LLM accepts input from external sources such as websites or files, and notes that the impact depends partly on the agency built into the system. OWASP lists possible impacts including unauthorized function access, arbitrary command execution in connected systems, and manipulation of critical decisions. (&lt;a href="https://genai.owasp.org/llmrisk/llm01-prompt-injection/" rel="noopener noreferrer"&gt;OWASP Gen AI Security Project&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;OWASP’s prompt-injection prevention cheat sheet also lists RAG poisoning/retrieval attacks and agent-specific attacks among common attack types. (&lt;a href="https://cheatsheetseries.owasp.org/cheatsheets/LLM_Prompt_Injection_Prevention_Cheat_Sheet.html" rel="noopener noreferrer"&gt;OWASP Cheat Sheet Series&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;In my project’s terms, the risk is this:&lt;/p&gt;

&lt;p&gt;A bad actor may not need to attack the source code directly.&lt;/p&gt;

&lt;p&gt;They may attack the project memory layer that future AI-assisted work relies on.&lt;/p&gt;

&lt;p&gt;That made the old distinction sharper:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documentation access is not implementation authority.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A coding agent may be able to read broad project documentation.&lt;/p&gt;

&lt;p&gt;That does not mean every sentence inside it should be allowed to guide implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trust Gates
&lt;/h2&gt;

&lt;p&gt;This is where the trust gate mattered.&lt;/p&gt;

&lt;p&gt;A trust gate is the point where context becomes more authoritative than it had been before.&lt;/p&gt;

&lt;p&gt;Planning context becomes implementation authority. Draft documentation becomes operational project memory. Coding-agent output becomes accepted project state.&lt;/p&gt;

&lt;p&gt;A future tooling system might implement that with permissions, review workflows, provenance checks, authority labels, policy enforcement, or some better mechanism I have not designed.&lt;/p&gt;

&lt;p&gt;In my prototype, the trust gate was crude and manual.&lt;/p&gt;

&lt;p&gt;It was me dragging files.&lt;/p&gt;

&lt;p&gt;It was me deciding what crossed the boundary.&lt;/p&gt;

&lt;p&gt;It was me deciding what stayed background context, what became implementation instruction, and what the coding agent was actually allowed to act on.&lt;/p&gt;

&lt;p&gt;In hindsight, manual file dragging wasn't just awkward tooling.&lt;/p&gt;

&lt;p&gt;It was a crude chain of custody.&lt;/p&gt;

&lt;p&gt;That is why the detective metaphor started to fit.&lt;/p&gt;

&lt;p&gt;The important question was not only:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;What does the AI know?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Where did this context come from?&lt;br&gt;&lt;br&gt;
Has it been reviewed?&lt;br&gt;&lt;br&gt;
What authority does it have?&lt;br&gt;&lt;br&gt;
What is allowed to act on it?&lt;br&gt;&lt;br&gt;
What happens if it is wrong?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is not just a workflow question.&lt;/p&gt;

&lt;p&gt;At scale, it becomes a security and governance question.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Limit of the Prototype
&lt;/h2&gt;

&lt;p&gt;This is also where the prototype reaches its honest limit.&lt;/p&gt;

&lt;p&gt;The artifact trail can show the mechanism. It can make the workflow inspectable. It can explain why documentation, controlled context flow, implementation authority, and review before reuse mattered in one observed workflow.&lt;/p&gt;

&lt;p&gt;But it cannot prove safety at scale.&lt;/p&gt;

&lt;p&gt;The same property that makes operational documentation useful also makes it sensitive.&lt;/p&gt;

&lt;p&gt;If it can preserve project intent, it can also preserve false authority.&lt;/p&gt;

&lt;p&gt;If it can help guide future implementation, it can also misguide future implementation when stale, poisoned, or poorly reviewed.&lt;/p&gt;

&lt;p&gt;If this mechanism scales, then documentation governance becomes part of the safety model.&lt;/p&gt;

&lt;p&gt;Projects would need to know which documents are passive explanation, which are planning-only, which are trusted operational memory, and which are allowed to become implementation authority. They would need provenance, ownership, review rules, stale-memory detection, conflict reporting, and better tooling around context routing and agent authority boundaries.&lt;/p&gt;

&lt;p&gt;That is bigger than one solo prototype.&lt;/p&gt;

&lt;p&gt;And that is the point.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Think I Found
&lt;/h2&gt;

&lt;p&gt;I do not think I proved a finished methodology.&lt;/p&gt;

&lt;p&gt;I do not think I proved long-term project memory.&lt;/p&gt;

&lt;p&gt;I do not think this exact workflow should be copied unchanged.&lt;/p&gt;

&lt;p&gt;What I think I found is a prototype-scale mechanism:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Documentation-as-operational-memory, when maintained through controlled context flow, may support long-term project memory in AI-assisted development.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is a hypothesis, not a conclusion.&lt;/p&gt;

&lt;p&gt;The prototype supports a narrower claim:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;In one prompt-only AI-assisted development workflow, this mechanism appeared to reduce context drift and make later work more reviewable, bounded, and easier to resume.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is enough to make the mechanism worth testing.&lt;/p&gt;

&lt;p&gt;It is not enough to declare it solved.&lt;/p&gt;

&lt;p&gt;The next work belongs to larger projects, longer timelines, multiple agents, team workflows, repo-aware tooling, and better security testing.&lt;/p&gt;

&lt;p&gt;The case stops being only mine at exactly the point where the implication becomes too large to validate honestly alone.&lt;/p&gt;

&lt;p&gt;That is not a failure of the prototype.&lt;/p&gt;

&lt;p&gt;That is the research boundary.&lt;/p&gt;

&lt;p&gt;The prototype found a mechanism specific enough to inspect. The artifact trail makes it possible to challenge. The hypothesis is clear enough to test.&lt;/p&gt;

&lt;p&gt;Scaling it belongs to better tooling, better security boundaries, and more rigorous testing than one person can honestly provide.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>softwareengineering</category>
      <category>programming</category>
      <category>documentation</category>
    </item>
    <item>
      <title>From Vibes to Project Memory</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Tue, 30 Jun 2026 14:06:11 +0000</pubDate>
      <link>https://dev.to/davidvk89/from-vibes-to-project-memory-2poe</link>
      <guid>https://dev.to/davidvk89/from-vibes-to-project-memory-2poe</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxyw7zca33pooectauem7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxyw7zca33pooectauem7.png" alt=" " width="654" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That is the full set published.&lt;/p&gt;

&lt;p&gt;I did not write these articles because I think I found the final answer to AI-assisted development.&lt;/p&gt;

&lt;p&gt;I wrote them because I spent one serious week building with AI, ran into context drift almost immediately, and found a small workflow that made the project feel less fragile.&lt;/p&gt;

&lt;p&gt;The three pieces ended up covering the same idea from different angles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vibe Coding Done Right&lt;/strong&gt; — the workflow&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Documentation as Project Memory in AI-Assisted Development&lt;/strong&gt; — the memory system&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Defensive AI Engineering&lt;/strong&gt; — the objections and limits&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, they trace the thing I was really trying to do:&lt;/p&gt;

&lt;p&gt;move from vibes to memory.&lt;/p&gt;

&lt;p&gt;From a messy human experience with AI tools into written documentation, bounded contracts, and a workflow I could actually inspect.&lt;/p&gt;

&lt;p&gt;The supporting GitHub repo is there too, not as a framework or package, but as the artifact trail from the case study.&lt;/p&gt;

&lt;p&gt;The main thing I learned is still simple:&lt;/p&gt;

&lt;p&gt;AI-assisted development is not only a coding problem.&lt;/p&gt;

&lt;p&gt;It is a context management problem.&lt;/p&gt;

&lt;p&gt;For me, the useful pattern became:&lt;/p&gt;

&lt;p&gt;Explore in conversation.&lt;br&gt;&lt;br&gt;
Build from a contract.&lt;br&gt;&lt;br&gt;
Preserve the result in documentation.&lt;br&gt;&lt;br&gt;
Reuse that documentation as context for the next task.&lt;/p&gt;

&lt;p&gt;The result was not perfect AI coding.&lt;/p&gt;

&lt;p&gt;The result was reviewable AI coding.&lt;/p&gt;

&lt;p&gt;That was the part worth writing down.&lt;/p&gt;

&lt;p&gt;I’m going to leave the series there. It was a one-week field report, not a manifesto. Maybe I will come back to the ideas later after using the workflow more, maybe I will not.&lt;/p&gt;

&lt;p&gt;For now, it exists. That was the goal.&lt;/p&gt;

&lt;p&gt;Thank you to everyone who read, skimmed, questioned, or followed along.&lt;/p&gt;

&lt;p&gt;And if you made it all the way through the series: genuinely, thank you for making it this far.&lt;/p&gt;

&lt;p&gt;If there is one sentence behind the whole project, it is this:&lt;/p&gt;

&lt;p&gt;Slow down the AI. Speed up the human.&lt;/p&gt;

&lt;p&gt;The AI does not need help moving faster. The human needs enough structure to stay in control.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Defensive AI Engineering</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:43:50 +0000</pubDate>
      <link>https://dev.to/davidvk89/defensive-ai-engineering-2m27</link>
      <guid>https://dev.to/davidvk89/defensive-ai-engineering-2m27</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ok05w6mogf66sl5namp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F3ok05w6mogf66sl5namp.png" alt=" " width="654" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When you tell developers that my solution to AI context drift was keeping four live markdown files updated alongside every code change, the reaction is entirely predictable:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“You’ve just traded code debt for documentation debt. This kills velocity.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or, from the IDE-purists:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Why are you manually passing files around when native agents can scrape your whole repo?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These are fair critiques.&lt;/p&gt;

&lt;p&gt;If you treat documentation as a post-work chore or rely blindly on an autonomous agent to manage its own sandbox, the system collapses under its own weight.&lt;/p&gt;

&lt;p&gt;But the TB / CC / FR loop — Task Brief / Codex Contract / Final Review — is not a bureaucratic process. It is a defensive pattern.&lt;/p&gt;

&lt;p&gt;Coming from a background in cybersecurity, my default mode of operating is isolation, strict boundary enforcement, and assuming the agent will misbehave if given loose permissions.&lt;/p&gt;

&lt;p&gt;This was the solution that fit my project, my tools, and my risk tolerance. The useful part is not that every developer should copy my exact setup. The useful part is that the pattern can change shape depending on the team, tooling, and codebase.&lt;/p&gt;

&lt;p&gt;Here is how the project memory loop holds up against the four harshest criticisms of AI-assisted engineering.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. The "Documentation Tax" Can Be Shifted, Not Removed
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Critique:&lt;/strong&gt; Maintaining four separate documentation files — &lt;code&gt;DEV_ARCHITECTURE.md&lt;/code&gt;, &lt;code&gt;DEV_DATA_SHAPES.md&lt;/code&gt;, &lt;code&gt;DEV_API_CONTRACTS.md&lt;/code&gt;, and &lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt; — for every meaningful code change creates a bottleneck.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reality:&lt;/strong&gt; The human developer does not need to write most of the documentation manually.&lt;/p&gt;

&lt;p&gt;In this workflow, documentation is a required transactional output of the implementation contract. Because the context memory is defined during the Task Brief and refined into a bounded Codex Contract, the coding agent is the one tasked with updating the relevant markdown files.&lt;/p&gt;

&lt;p&gt;The human’s job is to act as editor and gatekeeper during Final Review, verifying the AI’s reported documentation updates against the actual code changes.&lt;/p&gt;

&lt;p&gt;That still costs attention. It is not free.&lt;/p&gt;

&lt;p&gt;But the cost moves from “remember everything later and write documentation someday” to “review the documentation while the task context is still fresh.”&lt;/p&gt;

&lt;p&gt;You are not eliminating the documentation tax. You are turning it into a reviewable part of the implementation transaction.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Case for Separated Context
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Critique:&lt;/strong&gt; Manually passing project files into an assistant or switching between an assistant and a coding agent feels primitive when IDE-integrated tools can auto-index a codebase.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reality:&lt;/strong&gt; Full-repository context is convenient, but convenience is not the same thing as control.&lt;/p&gt;

&lt;p&gt;The important separation in this workflow is not physical air-gapping. It is memory separation.&lt;/p&gt;

&lt;p&gt;The assistant can operate from broader project memory: architecture, tradeoffs, future direction, unresolved concerns, and the reasoning behind the current shape of the system.&lt;/p&gt;

&lt;p&gt;The coding agent should not automatically receive all of that.&lt;/p&gt;

&lt;p&gt;The coding agent should receive the bounded implementation slice: what to build, what to preserve, what not to touch, which files are likely involved, what documentation must be updated, and how to report back.&lt;/p&gt;

&lt;p&gt;That is the purpose of the Codex Contract.&lt;/p&gt;

&lt;p&gt;The CC acts as a translation layer between broad architectural thinking and narrow implementation work. It lets the assistant help preserve strategy and future direction without creating a route for the coding agent to start building future ideas too early.&lt;/p&gt;

&lt;p&gt;A planning conversation can contain useful context that is dangerous implementation context.&lt;/p&gt;

&lt;p&gt;“This might become a system later” is useful for architectural memory.&lt;/p&gt;

&lt;p&gt;It is not useful as permission for the coding agent to start building that system now.&lt;/p&gt;

&lt;p&gt;By keeping assistant memory and coding-agent context separate, the workflow forces intentionality. The coding agent only receives the implementation details and documentation updates that belong in the current task.&lt;/p&gt;

&lt;p&gt;That keeps it in executor mode rather than co-architect-with-selective-memory mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Grading the Homework: Mitigating AI Hallucinations
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Critique:&lt;/strong&gt; You cannot trust an AI to verify its own work or accurately report that it updated the documentation correctly. LLMs are notoriously prone to sycophancy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reality:&lt;/strong&gt; Correct.&lt;/p&gt;

&lt;p&gt;LLMs will absolutely grade their own homework poorly if left unsupervised.&lt;/p&gt;

&lt;p&gt;That is exactly why the Final Review stage relies on strict human acceptance and manual testing.&lt;/p&gt;

&lt;p&gt;The assistant can assist in reviewing the coding agent’s return, but it does not replace human verification. The human remains the ultimate source of truth for scope and risk.&lt;/p&gt;

&lt;p&gt;Furthermore, every software engineering methodology has a single point of failure: the human developer.&lt;/p&gt;

&lt;p&gt;If a human engineer experiences a lapse in judgment, a critical oversight, or a medical emergency, the system breaks.&lt;/p&gt;

&lt;p&gt;The loop does not assume the AI is perfect.&lt;/p&gt;

&lt;p&gt;It assumes the AI is volatile, and creates a rhythm to catch mistakes before they are born.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. The Scale Bottleneck: Moving Beyond the Prototype
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;The Critique:&lt;/strong&gt; This works for a solo developer handling local JSON persistence. On an enterprise team with dozens of developers working on different branches, simultaneously modifying core markdown files will cause catastrophic Git merge conflicts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Reality:&lt;/strong&gt; This is a completely accurate limitation of the manual prototype.&lt;/p&gt;

&lt;p&gt;For a solo project, dragging files into a browser provides a simple, zero-cost map.&lt;/p&gt;

&lt;p&gt;For a sprawling, multi-developer enterprise repository, the method would need to evolve from manual file handling to an automated tooling layer.&lt;/p&gt;

&lt;p&gt;The architectural blueprint to solve this likely requires two next-generation components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Memory Controller:&lt;/strong&gt; a system utility that programmatically parses, slices, and modularizes the core documentation files based on directory domains, feeding the LLM a compressed context packet rather than the entire repo documentation history.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The Semantic Diff Validator:&lt;/strong&gt; a verification gate that compares the old documentation state against the new state, isolating the structural variance and presenting the human reviewer with a focused slice to approve or reject during pull requests.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Until better tooling exists around this kind of workflow, teams will have to adapt to these branching realities.&lt;/p&gt;

&lt;p&gt;But the underlying principle remains useful:&lt;/p&gt;

&lt;p&gt;AI-assisted development becomes safer when project memory is explicit, implementation context is bounded, and human review remains the final gate.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Defensive AI engineering means accepting a simple truth:&lt;/p&gt;

&lt;p&gt;AI coding agents are incredibly fast, but they are strong enough to cause damage before lunch if left unconstrained.&lt;/p&gt;

&lt;p&gt;The TB / CC / FR loop is not about slowing down development for the sake of process.&lt;/p&gt;

&lt;p&gt;It is about establishing reviewable guardrails so that velocity does not turn into chaotic drift into the fog.&lt;/p&gt;

&lt;p&gt;By treating documentation as a live transaction, keeping assistant memory separate from coding-agent context, and forcing human sign-off, you keep the human firmly in control of the codebase.&lt;/p&gt;

&lt;h2&gt;
  
  
  Author’s note
&lt;/h2&gt;

&lt;p&gt;Small clarification on the intent behind this article:&lt;/p&gt;

&lt;p&gt;I am not claiming that the individual mechanics here are new.&lt;/p&gt;

&lt;p&gt;Specs, reviews, ADRs, acceptance criteria, technical debt tracking, and living documentation all existed before this. I am not institutionally trained as a software engineer, so I fully expect overlap between the names I used and the names the industry already has for similar practices.&lt;/p&gt;

&lt;p&gt;One of the strongest gains I found in the AI-assisted workflow was that the assistant helped translate my more natural, experience-based language into precise engineering terms. I could start with “this feels unsafe” or “the AI might build the wrong thing,” and refine that into ideas like scope boundaries, trust boundaries, implementation contracts, and project memory.&lt;/p&gt;

&lt;p&gt;So the naming is personal.&lt;/p&gt;

&lt;p&gt;The underlying problem is not.&lt;/p&gt;

&lt;p&gt;The problem is context memory: AI coding agents can act on incomplete, stale, speculative, or polluted context faster than the human can reorganize the project mentally.&lt;/p&gt;

&lt;p&gt;My claim is not that I invented the individual mechanics.&lt;/p&gt;

&lt;p&gt;My claim is that treating documentation as required implementation output can turn documentation into reusable project memory for AI-assisted development.&lt;/p&gt;

&lt;p&gt;That worked at prototype scale for me. I hope people with deeper engineering experience and better tooling can test, challenge, adapt, and harden the same idea at larger scales.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Documentation as Project Memory in AI-Assisted Development</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:26:14 +0000</pubDate>
      <link>https://dev.to/davidvk89/documentation-as-project-memory-in-ai-assisted-development-2699</link>
      <guid>https://dev.to/davidvk89/documentation-as-project-memory-in-ai-assisted-development-2699</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffgkfkvr5mxsz50y8w2oj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffgkfkvr5mxsz50y8w2oj.png" alt=" " width="654" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;A practical case study in keeping AI-generated software bounded, reviewable, and maintainable.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;AI-assisted development has a context problem. Coding agents can implement quickly, but they depend heavily on the context they receive. A long planning conversation is often poor implementation context: it may contain rejected options, future ideas, shorthand, loose assumptions, and half-decisions.&lt;/p&gt;

&lt;p&gt;For a human, that is normal design exploration. For a coding agent, it can become accidental permission.&lt;/p&gt;

&lt;p&gt;This case study describes a workflow for reducing that risk by treating documentation as project memory. The implementation was tested under a strict constraint: every code change in the project went through the AI-assisted workflow. I did not write code directly, even when it would have been faster.&lt;/p&gt;

&lt;p&gt;The core pattern is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Explore in conversation. Build from a contract. Preserve the result in documentation. Reuse that documentation as context for the next task.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The case study is intended to be read alongside the project documents and three consecutive Codex Contracts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEV_ARCHITECTURE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_DATA_SHAPES.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_API_CONTRACTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CP-0011.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CP-0012.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;CP-0013.txt&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Together, these documents show the method operating across a short development sequence rather than a single isolated task.&lt;/p&gt;

&lt;h2&gt;
  
  
  Problem: context decay
&lt;/h2&gt;

&lt;p&gt;The practical risk in AI-assisted development is context decay: decisions are made faster than they are preserved.&lt;/p&gt;

&lt;p&gt;Architecture, API behavior, data shapes, validation rules, temporary compromises, and deferred work can disappear into chat history or human memory. Once that happens, later tasks start from incomplete or stale context.&lt;/p&gt;

&lt;p&gt;The solution in this implementation was to make documentation part of the development transaction.&lt;/p&gt;

&lt;p&gt;Documentation is not written “after the work.” It is a required output of the work.&lt;/p&gt;

&lt;p&gt;If a task changes architecture, the architecture document changes. If it changes an API response, the API contract changes. If it changes stored data, the data shape document changes. If it exposes a problem that should not be fixed yet, the technical debt document changes.&lt;/p&gt;

&lt;p&gt;In this project, the main memory files are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEV_ARCHITECTURE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_DATA_SHAPES.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_API_CONTRACTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These files are operational project memory. They preserve decisions, constrain future work, and provide current context for later AI-assisted tasks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation: TB / CC / FR
&lt;/h2&gt;

&lt;p&gt;The workflow uses three stages:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Task Brief:&lt;/strong&gt; explore the problem.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Codex Contract:&lt;/strong&gt; define the bounded implementation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Final Review:&lt;/strong&gt; check the result and update project memory.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The control model is two-way review: the human reviews the AI’s output, and the assistant reviews the human’s instructions for ambiguity, scope creep, and loose language. The human decides when the contract is clear enough to hand off, and when the result is acceptable.&lt;/p&gt;

&lt;p&gt;In practice:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;explore → contract → review → implement → test → review result → patch code or docs → continue from updated documentation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Task Brief
&lt;/h2&gt;

&lt;p&gt;The Task Brief is where the task is explored before it becomes implementation work.&lt;/p&gt;

&lt;p&gt;The goal is to identify scope, risks, constraints, non-goals, affected files, expected behavior, and documentation impact.&lt;/p&gt;

&lt;p&gt;This stage may include uncertainty, alternative designs, and questions. It is not sent directly to the coding agent.&lt;/p&gt;

&lt;p&gt;The assistant is useful here as a reviewer and translator. It helps convert engineering instincts into clearer technical language:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;“This feels unsafe” becomes “this crosses a trust boundary.”&lt;/li&gt;
&lt;li&gt;“Do not save failed AI output” becomes “protect the validation and commit boundary.”&lt;/li&gt;
&lt;li&gt;“This ugly thing should not be fixed now” becomes “record it as technical debt and keep it out of scope.”&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The output of the Task Brief is not code. The output is a clearer implementation target.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex Contract
&lt;/h2&gt;

&lt;p&gt;The Codex Contract is the bounded instruction set given to the coding agent.&lt;/p&gt;

&lt;p&gt;It is not a transcript of the planning conversation. It is the cleaned-up implementation contract.&lt;/p&gt;

&lt;p&gt;A good contract states:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the goal;&lt;/li&gt;
&lt;li&gt;relevant context;&lt;/li&gt;
&lt;li&gt;files likely involved;&lt;/li&gt;
&lt;li&gt;behavior that must be preserved;&lt;/li&gt;
&lt;li&gt;non-goals;&lt;/li&gt;
&lt;li&gt;acceptance criteria;&lt;/li&gt;
&lt;li&gt;verification steps;&lt;/li&gt;
&lt;li&gt;required documentation updates;&lt;/li&gt;
&lt;li&gt;final report requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The non-goals are critical.&lt;/p&gt;

&lt;p&gt;With coding agents, “do not do this” is often as important as “do this.” If the contract does not explicitly say not to refactor a legacy route, the agent may refactor it. The refactor may be technically reasonable and still be wrong for the current task.&lt;/p&gt;

&lt;p&gt;The contract defines the box.&lt;/p&gt;

&lt;p&gt;Documentation updates are part of that box.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Review
&lt;/h2&gt;

&lt;p&gt;Final Review checks both implementation and memory.&lt;/p&gt;

&lt;p&gt;The review asks:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Did the implementation match the contract?&lt;/li&gt;
&lt;li&gt;Did it preserve required behavior?&lt;/li&gt;
&lt;li&gt;Did it avoid unrelated changes?&lt;/li&gt;
&lt;li&gt;Did it update the correct documentation?&lt;/li&gt;
&lt;li&gt;Did it record deferred work as technical debt?&lt;/li&gt;
&lt;li&gt;Did the report accurately describe what changed?&lt;/li&gt;
&lt;li&gt;Does anything need a bounded patch?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manual testing remains required. The assistant can help review the coding agent’s return, but it does not replace human acceptance.&lt;/p&gt;

&lt;p&gt;The workflow is therefore not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write code, then someday update docs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Design the slice, implement the slice, update the docs, review the result, patch if needed, repeat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is the mechanism that turns documentation into project memory.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why contract review matters
&lt;/h2&gt;

&lt;p&gt;The contract review step exists because conversational language can leak into technical instructions.&lt;/p&gt;

&lt;p&gt;A simple example from this case study is the phrase “dynamic frontend.” In conversation, that is understandable shorthand. The project has a browser interface with dynamic behavior: polling, player input submission, scene rendering, choices, Chronicle rendering, and rollback wiring.&lt;/p&gt;

&lt;p&gt;But the project-memory wording is more precise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a static browser frontend served by the Node backend, with dynamic client-side behavior owned by &lt;code&gt;public/app.js&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That distinction matters. In a CC, “dynamic frontend” could be misread as permission to introduce a frontend framework, server-side rendering, a build step, or a broader UI restructure. None of that is intended.&lt;/p&gt;

&lt;p&gt;This is exactly the failure mode the workflow is designed to catch. Human shorthand is useful during exploration. It must be cleaned up before implementation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Representative sequence: CP-0011 to CP-0013
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;CP-0011&lt;/code&gt;, &lt;code&gt;CP-0012&lt;/code&gt;, and &lt;code&gt;CP-0013&lt;/code&gt; are included as three consecutive Codex Contracts from the same development phase.&lt;/p&gt;

&lt;p&gt;They are useful together because they show the workflow being applied repeatedly across different kinds of context work:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;CP-0011&lt;/code&gt; establishes a narrow Thread Context Controller v0.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CP-0012&lt;/code&gt; establishes a Messages Side Channel v0.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;CP-0013&lt;/code&gt; deprecates legacy Enforcement data and adds clean scoped Enforcement v0.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The details differ, but the contract pattern is the same. Each task defines a bounded implementation, preserves legacy behavior, names what must not be changed, gives acceptance criteria, requires verification, and tells Codex what to report back.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;CP-0013&lt;/code&gt; is the strongest documentation-memory example because it explicitly requires narrow updates across:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEV_DATA_SHAPES.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_API_CONTRACTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_ARCHITECTURE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sequence matters. It shows that documentation as project memory was not a one-off instruction. It was part of the operating pattern across consecutive development passes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Example pattern
&lt;/h2&gt;

&lt;p&gt;Assume a feature is hardcoded in a legacy file. It should eventually become a cleaner system, but the current task should only create a safe v0 seam.&lt;/p&gt;

&lt;p&gt;A weak instruction would be:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Refactor this feature into a better system.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That instruction has no boundary.&lt;/p&gt;

&lt;p&gt;A better Task Brief clarifies the scope:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We are not building the full system yet. We are creating a clean v0 seam. The old legacy data must remain. The new code should read clean records, skip legacy records, and expose a separate API field. No migration. No deletion. No broad refactor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The Codex Contract turns that into implementation instructions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Create a controller for clean v0 records. Preserve the old API field. Add a new clean projection. Do not rewrite existing files. Do not change JSON loading behavior. Do not refactor unrelated legacy routes. Update architecture notes, API contracts, data shapes, and technical debt only where this task changes them. Report changed files, validation rules, documentation updates, and risks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now the coding agent has a bounded task. It knows what to build, what not to touch, where documentation belongs, and what to report back.&lt;/p&gt;

&lt;p&gt;Final Review then checks the implementation, the report, and the documentation updates. Any correction goes back through the loop as a bounded patch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why it works
&lt;/h2&gt;

&lt;p&gt;This pattern works because documentation becomes part of the development transaction.&lt;/p&gt;

&lt;p&gt;The documents are updated while the context is fresh. The coding agent receives a bounded contract instead of a messy conversation. The assistant can reason from current project documents instead of stale chat history. The developer does not have to keep the whole system in working memory.&lt;/p&gt;

&lt;p&gt;The result is not perfect AI coding.&lt;/p&gt;

&lt;p&gt;The result is reviewable AI coding.&lt;/p&gt;

&lt;p&gt;A change can be evaluated against the contract. A working implementation can still be rejected if it violates scope. Deferred work can be preserved without being accidentally implemented. Future tasks can begin from documented project state.&lt;/p&gt;

&lt;h2&gt;
  
  
  Scope
&lt;/h2&gt;

&lt;p&gt;The implementation described here was built as a local prototype with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Node backend;&lt;/li&gt;
&lt;li&gt;static browser frontend with dynamic client-side behavior;&lt;/li&gt;
&lt;li&gt;local JSON persistence;&lt;/li&gt;
&lt;li&gt;rollback support;&lt;/li&gt;
&lt;li&gt;validation gates;&lt;/li&gt;
&lt;li&gt;LLM gateway compatible with local or OpenAI-style providers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;ChatGPT was used for planning, review, and learning. Codex was used as the coding agent. LM Studio was used for local model testing.&lt;/p&gt;

&lt;p&gt;The exact tools are not the important part.&lt;/p&gt;

&lt;p&gt;The transferable pattern is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;conversation for exploration, contract for implementation, documentation for memory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Under this implementation, documentation acted as project memory because three conditions were enforced:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;documentation updates were required by the implementation contract;&lt;/li&gt;
&lt;li&gt;documentation updates were checked during final review;&lt;/li&gt;
&lt;li&gt;updated documentation was reused as context for later tasks.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The workflow does not remove the need for human judgment. It depends on it. The human still owns scope, acceptance, risk decisions, and final review.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Documentation as project memory is a practical control mechanism for AI-assisted development.&lt;/p&gt;

&lt;p&gt;The value is not that documentation exists.&lt;/p&gt;

&lt;p&gt;The value is that documentation becomes operational.&lt;/p&gt;

&lt;p&gt;It constrains the next task, preserves decisions, records deferred work, and reduces dependence on chat history or human memory.&lt;/p&gt;

&lt;p&gt;That is what kept the project understandable under a prompt-only implementation constraint.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/davidvk89" rel="noopener noreferrer"&gt;
        davidvk89
      &lt;/a&gt; / &lt;a href="https://github.com/davidvk89/ai-project-memory-loop" rel="noopener noreferrer"&gt;
        ai-project-memory-loop
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A lightweight workflow for using live project documentation as memory in AI-assisted development.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ai-project-memory-loop&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Supporting files for a one-week case study in using live project documentation as memory during AI-assisted development.&lt;/p&gt;
&lt;p&gt;This repository is not a framework, package, or complete methodology. It is the artifact trail behind three companion articles about keeping AI-assisted development bounded, reviewable, and human-led.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Core idea&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;AI-assisted development has a context problem.&lt;/p&gt;
&lt;p&gt;Coding agents can move quickly, but they only work from the context they are given. A long planning conversation can contain rejected ideas, shorthand, future plans, temporary assumptions, and half-decisions. For a human, that is normal design exploration. For a coding agent, it can become accidental permission.&lt;/p&gt;
&lt;p&gt;The workflow documented here uses a lightweight loop:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;Task Brief      -&amp;gt; explore the problem
Codex Contract  -&amp;gt; define the bounded implementation
Final Review    -&amp;gt; test, inspect, patch, and update project memory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The project memory files are updated as part of the work, not someday after the work. That gives the…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/davidvk89/ai-project-memory-loop" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Vibe Coding Done Right</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Tue, 30 Jun 2026 13:13:43 +0000</pubDate>
      <link>https://dev.to/davidvk89/vibe-coding-done-right-3o66</link>
      <guid>https://dev.to/davidvk89/vibe-coding-done-right-3o66</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvh4199zz88e0l6cfuqx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fmvh4199zz88e0l6cfuqx.png" alt=" " width="654" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Or: spec-driven AI-assisted development for solo developers.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I did not set out to invent a software development workflow. I was trying to build a small local app with AI help, learn as I went, and avoid turning the project into a mysterious pile of files that technically ran but could no longer be explained by anyone involved.&lt;/p&gt;

&lt;p&gt;AI coding tools are powerful. They can generate code quickly, refactor without getting bored, write boilerplate, spot patterns, and produce useful documentation. They can also confidently make changes that are almost right, broaden the scope, fix things you did not ask them to fix, or “helpfully” redesign a part of the system you were trying to keep boring.&lt;/p&gt;

&lt;p&gt;For a solo developer, that creates a practical problem. The AI can move faster than your ability to keep the project organized. At first, this feels like productivity. A few sessions later, you may be staring at a codebase wondering when the raccoon got into the wiring.&lt;/p&gt;

&lt;p&gt;The issue is not that the AI is bad. The issue is that AI-assisted development needs structure. Not heavy enterprise-process structure. Just enough structure to separate thinking from building, and building from review.&lt;/p&gt;

&lt;p&gt;Spec-driven does not mean big upfront design. It means writing just enough specification before spending coding-agent credits.&lt;/p&gt;

&lt;p&gt;The casual name is the TB / CC / FR loop:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TB: Task Brief&lt;/li&gt;
&lt;li&gt;CC: Codex Contract&lt;/li&gt;
&lt;li&gt;FR: Final Review&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;After introducing those names, I just call it the loop.&lt;/p&gt;

&lt;p&gt;In my workflow, ChatGPT is the assistant: planner, tutor, reviewer, and sometimes patient explainer of software engineering terms I probably should have known already. Codex is the coding agent: the builder that gets the final bounded contract.&lt;/p&gt;

&lt;p&gt;That separation matters. The assistant can help me think through the mess. Codex should get the cleaned-up version.&lt;/p&gt;

&lt;h2&gt;
  
  
  My stack
&lt;/h2&gt;

&lt;p&gt;This workflow did not come from an expensive or exotic setup.&lt;/p&gt;

&lt;p&gt;My stack is practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Windows as my main environment&lt;/li&gt;
&lt;li&gt;ChatGPT Plus in the browser for planning, review, and architectural discussion&lt;/li&gt;
&lt;li&gt;Codex through its desktop client as the coding agent&lt;/li&gt;
&lt;li&gt;PowerShell for running the project and checking output&lt;/li&gt;
&lt;li&gt;Visual Studio Code with the codebase open beside everything&lt;/li&gt;
&lt;li&gt;LM Studio running a local LLM so I can test my application layer without needing a paid API key for every experiment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;LM Studio is useful because I am building an app that talks to a language model. I need to test that loop often. Running a local model lets me test rough application behavior without worrying that every broken model response or half-working route is costing money through an API.&lt;/p&gt;

&lt;p&gt;Codex credits matter too. Burning through them because I handed the coding agent a vague contract is not just wasteful; eventually, you run out. That is one reason I started separating architectural discussion from implementation. ChatGPT can help me think, review, and refine the task. Codex should get the bounded contract that is actually ready to build.&lt;/p&gt;

&lt;p&gt;This is not a luxury AI engineering stack. It is one paid subscription, local tooling where possible, and a workflow that tries to make the most of both.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why solo AI coding gets messy
&lt;/h2&gt;

&lt;p&gt;When I started using AI to help build my project, the temptation was simple: explain what I wanted, let the coding agent make changes, test the result, then continue.&lt;/p&gt;

&lt;p&gt;That works for tiny changes. It does not scale well once the project starts developing architecture.&lt;/p&gt;

&lt;p&gt;Software projects are full of invisible context:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This part is temporary.&lt;/li&gt;
&lt;li&gt;This ugly thing is legacy, but still required.&lt;/li&gt;
&lt;li&gt;This file should not become a dumping ground.&lt;/li&gt;
&lt;li&gt;This route must preserve its API contract.&lt;/li&gt;
&lt;li&gt;This data shape is intentionally minimal.&lt;/li&gt;
&lt;li&gt;This feature sounds useful, but it belongs later.&lt;/li&gt;
&lt;li&gt;This bug should be fixed, but not inside this task.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A human developer on a team may know this from conversations, code reviews, planning meetings, or institutional memory. A coding agent does not have stable shared context unless you give it one.&lt;/p&gt;

&lt;p&gt;But giving it everything creates a different problem. The agent may grab onto the wrong idea from earlier discussion and implement something half-decided, future-facing, or experimental.&lt;/p&gt;

&lt;p&gt;So the trick is not “give the AI everything.”&lt;/p&gt;

&lt;p&gt;The trick is to give the AI the right bounded slice.&lt;/p&gt;

&lt;h2&gt;
  
  
  The loop
&lt;/h2&gt;

&lt;p&gt;The loop separates the work into three stages.&lt;/p&gt;

&lt;p&gt;A TB, or Task Brief, is where I think through the problem. This is the design space. What are we trying to do? Why does it matter? What are the risks? What does this touch? What should we avoid? Are we building the real system, or just an extension point for the future?&lt;/p&gt;

&lt;p&gt;This is the place for discussion, uncertainty, and tradeoffs.&lt;/p&gt;

&lt;p&gt;A CC, or Codex Contract, is the reviewed instruction set that Codex receives.&lt;/p&gt;

&lt;p&gt;This is not the place for brainstorming. This is the place for instructions.&lt;/p&gt;

&lt;p&gt;An FR, or Final Review, happens after Codex reports back. This is not the same kind of review as the CC review. The CC is rigorously reviewed before Codex builds. The FR happens after Codex is done: I manually test the feature, inspect the result, and have the assistant check Codex’s return against the contract.&lt;/p&gt;

&lt;p&gt;This is where the human stays in charge.&lt;/p&gt;

&lt;p&gt;The loop is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think through the task → write the CC → review the CC → let Codex build → manually test and review Codex’s return → patch if needed → move to the next slice.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That may sound formal, but in practice it is lightweight. It keeps the project from becoming a long improvisation session where every step technically makes sense but the whole thing slowly loses shape.&lt;/p&gt;

&lt;h2&gt;
  
  
  The CC is the contract
&lt;/h2&gt;

&lt;p&gt;The CC is the heart of the workflow.&lt;/p&gt;

&lt;p&gt;A good CC is not just a set of instructions. It is a small implementation contract.&lt;/p&gt;

&lt;p&gt;It should include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the goal&lt;/li&gt;
&lt;li&gt;current context&lt;/li&gt;
&lt;li&gt;known legacy behavior&lt;/li&gt;
&lt;li&gt;non-goals&lt;/li&gt;
&lt;li&gt;likely files involved&lt;/li&gt;
&lt;li&gt;rules that must not be broken&lt;/li&gt;
&lt;li&gt;acceptance criteria&lt;/li&gt;
&lt;li&gt;verification steps&lt;/li&gt;
&lt;li&gt;final report requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The non-goals are especially important.&lt;/p&gt;

&lt;p&gt;With AI coding, “do not do this” is often as valuable as “do this.” If you do not explicitly say “do not refactor this legacy route,” there is a real chance the agent will decide the route looks messy and try to improve it. Sometimes it will even be right that the code is messy. That does not mean it belongs in the current task.&lt;/p&gt;

&lt;p&gt;A CC gives the coding agent a box to work inside.&lt;/p&gt;

&lt;p&gt;The box is not there because the agent is weak. The box is there because the agent is strong enough to cause damage quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Review the CC before handing it off
&lt;/h2&gt;

&lt;p&gt;One part of the workflow that matters more than I expected is reviewing the CC before giving it to Codex.&lt;/p&gt;

&lt;p&gt;At first, I thought of the CC as something I wrote and then sent. Now I treat it like a small design artifact that deserves review before it becomes implementation fuel.&lt;/p&gt;

&lt;p&gt;My process is simple. I read the CC myself while also having the assistant review it. I look for context I do not want Codex to act on. If I see future ideas, speculative comments, or background discussion that should not become code, I remove it or mark it clearly as out of scope.&lt;/p&gt;

&lt;p&gt;At the same time, I ask the assistant to look for ambiguity, missing constraints, contradictions, and places where Codex might reasonably misunderstand the task. If the review brings up a good point, I patch the CC before committing it to Codex.&lt;/p&gt;

&lt;p&gt;Sometimes this takes one review. Most of the time it takes two. For larger architectural tasks, it may take four or five passes.&lt;/p&gt;

&lt;p&gt;That is not wasted time. It is much cheaper to patch a contract than to untangle an implementation that faithfully followed a bad one.&lt;/p&gt;

&lt;p&gt;The question is not only: does this contract describe what I want?&lt;/p&gt;

&lt;p&gt;It is also: does this contract contain anything I do not want Codex to treat as permission?&lt;/p&gt;

&lt;p&gt;That second question matters a lot.&lt;/p&gt;

&lt;p&gt;AI coding agents are good at picking up intent, but they are not always good at knowing which parts of a conversation were final, deferred, speculative, rejected, or just me thinking out loud. Reviewing the CC creates a checkpoint between design discussion and implementation.&lt;/p&gt;

&lt;p&gt;In normal software development, code review happens after someone writes code. In this workflow, contract review happens before the AI writes code. It does not replace implementation review, but it prevents a surprising number of mistakes from being born in the first place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keep the coding agent’s context clean
&lt;/h2&gt;

&lt;p&gt;The coding agent does not need the entire conversation history.&lt;/p&gt;

&lt;p&gt;That is intentional.&lt;/p&gt;

&lt;p&gt;The broad architectural discussion happens elsewhere. The CC is the distilled result. It gives Codex just enough context to implement the task without dragging in every idea, doubt, future feature, and half-joking comment that came up during planning.&lt;/p&gt;

&lt;p&gt;This separation matters because solo developers often think through projects conversationally. That is useful. It is also messy. A conversation can contain today’s plan, tomorrow’s idea, a rejected approach, a metaphor, and a possible future feature that should not be touched for three months.&lt;/p&gt;

&lt;p&gt;You do not want all of that in the implementation context.&lt;/p&gt;

&lt;p&gt;Instead, Codex should receive something closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Here is the task. Here is the boundary. Here are the contracts. Here is what success means. Here is what you must not touch. Report back when done.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That keeps Codex in executor mode rather than co-architect-with-selective-memory mode.&lt;/p&gt;

&lt;h2&gt;
  
  
  Documentation is project memory
&lt;/h2&gt;

&lt;p&gt;This workflow depends on good documentation, but not the ceremonial kind.&lt;/p&gt;

&lt;p&gt;I am not talking about writing a polished manual nobody reads. I mean living project documents that help make the next decision.&lt;/p&gt;

&lt;p&gt;This may be the most important part of the method: with the right CC, the documentation starts to write itself.&lt;/p&gt;

&lt;p&gt;I do not manually write most of my documentation. The CC tells Codex which documentation files to update and what kind of change belongs where.&lt;/p&gt;

&lt;p&gt;In my project, that usually means:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;DEV_ARCHITECTURE.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_DATA_SHAPES.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DEV_API_CONTRACTS.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we discuss architecture during the TB, the CC tells Codex to update &lt;code&gt;DEV_ARCHITECTURE.md&lt;/code&gt;. If the implementation changes an API response, the CC tells it to update &lt;code&gt;DEV_API_CONTRACTS.md&lt;/code&gt;. If a data shape changes, it belongs in &lt;code&gt;DEV_DATA_SHAPES.md&lt;/code&gt;. If something is intentionally deferred, it goes into &lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;I do not usually review the documentation line by line myself. The Final Review is based on Codex’s return: what files it changed, what behavior it implemented, what it says it verified, and what documentation it reports updating.&lt;/p&gt;

&lt;p&gt;Most of the time, I have the assistant review that return and check whether the reported documentation updates match the CC and the implementation summary. If something is missing, too broad, or in the wrong document, I ask for a patch and send that back through the loop.&lt;/p&gt;

&lt;p&gt;So the workflow is not:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Write code, then someday write docs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;It is closer to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Design the slice, build the slice, have Codex update the docs, review Codex’s return, patch if needed, repeat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;These documents are not just for future users. They are for me, for the AI assistant, and for the project itself.&lt;/p&gt;

&lt;p&gt;For me, they reduce the amount I have to keep in my head. I can check what the system currently promises, what is legacy, what is intentionally deferred, and what should not be touched yet.&lt;/p&gt;

&lt;p&gt;For the AI assistant, they provide current project memory. I can feed the docs into ChatGPT and it can reason from the latest architecture instead of guessing from stale conversation history. That makes the next TB or CC sharper because the assistant is working from documented project truth, not vibes.&lt;/p&gt;

&lt;p&gt;For the project, the docs act like a stabilizer. They guide contracts, preserve decisions, and make technical debt explicit. &lt;code&gt;TECHNICAL_DEBT.md&lt;/code&gt; is especially useful. It lets me say, “Yes, this is ugly. No, we are not fixing it in this task.”&lt;/p&gt;

&lt;p&gt;The docs also solve a practical problem with long AI chats. Eventually, a long conversation can become slow, heavy, or awkward to continue. If the project memory only lives in that chat, starting fresh means losing context. But if the docs are up to date, I can open a fresh chat, upload the docs, add a short context packet, and continue from a clean starting point.&lt;/p&gt;

&lt;p&gt;That turns documentation into long-term memory.&lt;/p&gt;

&lt;p&gt;Good docs turn the project from a memory test into a map. A sharper map makes the CC sharper. A sharper CC makes the implementation safer. A safer implementation makes the docs easier to update.&lt;/p&gt;

&lt;p&gt;That is the loop beginning to reinforce itself.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use the assistant to learn, not just brainstorm
&lt;/h2&gt;

&lt;p&gt;The assistant is not only there to brainstorm features or polish contracts. For me, it is also part of the learning process.&lt;/p&gt;

&lt;p&gt;I am not approaching the project as someone who already knows every software engineering pattern by name. A lot of the value comes from asking what something is called, why a design feels risky, what tradeoff I am making, or how an experienced engineer would describe the problem.&lt;/p&gt;

&lt;p&gt;That turns the assistant into more than a planning partner. It becomes a tutor, translator, and reviewer.&lt;/p&gt;

&lt;p&gt;Sometimes I ask for the industry term. Sometimes I ask for the simple version. Sometimes I ask for the “software engineer review” of an idea that feels right but may have hidden problems. That is how vague instincts become clearer concepts.&lt;/p&gt;

&lt;p&gt;There is one trick I found useful: sometimes you have to be strict with your assistant.&lt;/p&gt;

&lt;p&gt;If the answer starts drifting, getting too soft, or turning into pleasant brainstorming when I need implementation discipline, I say something like:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Review this like a software engineer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Write the CC like a software engineer.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That kind of instruction helps reset the tone. It tells the assistant to stop being encouraging for a moment and start looking for ambiguity, missing constraints, scope creep, and failure modes.&lt;/p&gt;

&lt;p&gt;That is important for a beginner mindset. Beginner-friendly does not mean vague. It means clear enough that you can learn without pretending you already know everything.&lt;/p&gt;

&lt;h2&gt;
  
  
  A small example
&lt;/h2&gt;

&lt;p&gt;Imagine you have a feature that is currently hardcoded in a messy legacy file. You know it needs to become a clean, reusable system eventually. The tempting AI instruction is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Please refactor this feature into a better system.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That is dangerous. “Better” can mean anything.&lt;/p&gt;

&lt;p&gt;A TB would first clarify the actual goal:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“We are not building the full system yet. We are creating a clean v0 seam. The old legacy data must remain. The new code should read clean records, skip legacy records, and expose a separate API field. No migration. No deletion. No broad refactor.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Then the CC would translate that into implementation instructions:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Create a controller for the clean v0 records. Preserve the old API field. Add a new clean projection. Do not rewrite existing files. Do not change JSON loading behavior. Do not refactor unrelated legacy routes. Add docs. Report changed files, validation rules, and risks.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Before sending that CC, I would review it. If it included a paragraph about future advanced filtering, and I did not want that implemented yet, I would remove it or put it under non-goals. If the assistant pointed out that “clean projection” could be confused with “LLM context,” I would patch the CC to define those as separate outputs.&lt;/p&gt;

&lt;p&gt;Only then would I hand it to Codex.&lt;/p&gt;

&lt;p&gt;The result is not glamorous, but it is safe. And safe is underrated when you are building with tools that can rewrite half your project before lunch.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this helps solo developers
&lt;/h2&gt;

&lt;p&gt;Solo developers have an unusual burden. You are the product owner, architect, developer, tester, reviewer, and documentation department. Now, with AI, you may also be managing one or more very fast assistants.&lt;/p&gt;

&lt;p&gt;The loop helps because it creates a small team structure even when you are working alone:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You, during TB: architect&lt;/li&gt;
&lt;li&gt;You, reviewing CC: editor and risk filter&lt;/li&gt;
&lt;li&gt;ChatGPT: tutor and reviewer&lt;/li&gt;
&lt;li&gt;Codex: implementer&lt;/li&gt;
&lt;li&gt;Docs: shared memory&lt;/li&gt;
&lt;li&gt;You, during FR: tester and reviewer&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation makes the work feel less like constantly reacting and more like moving through deliberate slices.&lt;/p&gt;

&lt;p&gt;When you are learning, you do not always know the perfect architecture upfront. That is fine. The point is not to be a senior engineer cosplaying as a process consultant. The point is to slow the project down just enough that you can understand what changed and why.&lt;/p&gt;

&lt;p&gt;A beginner-friendly workflow should not require pretending to know everything. It should make uncertainty manageable.&lt;/p&gt;

&lt;h2&gt;
  
  
  The real benefit
&lt;/h2&gt;

&lt;p&gt;The real benefit of this workflow is not that it makes AI coding perfect. It does not.&lt;/p&gt;

&lt;p&gt;The benefit is that it makes AI coding reviewable.&lt;/p&gt;

&lt;p&gt;You can compare the implementation against the CC. You can test the feature manually. You can have the assistant review Codex’s return. You can update the docs. You can reject a change for violating scope even if the code works. You can preserve decisions instead of rediscovering them three sessions later.&lt;/p&gt;

&lt;p&gt;It also makes the contract itself reviewable. That is easy to overlook. A clean CC is not just better writing; it is risk reduction.&lt;/p&gt;

&lt;p&gt;Without structure, AI-assisted development can feel like accelerating into fog.&lt;/p&gt;

&lt;p&gt;With lightweight specs, it feels more like driving with a map. You may still take wrong turns, but at least you know which road you meant to be on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Closing thought
&lt;/h2&gt;

&lt;p&gt;Vibe coding done right is not about making solo projects more bureaucratic. It is about making them less fragile.&lt;/p&gt;

&lt;p&gt;The loop gives the work a rhythm:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Think clearly. Write the contract. Review the contract. Build narrowly. Test manually. Review honestly. Document what changed. Repeat.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That rhythm keeps the human in charge without wasting the AI’s strengths.&lt;/p&gt;

&lt;p&gt;The coding agent can move fast. The docs can remember. The CC can define the box. The assistant can help you learn why the box should look that way. The review can catch ambiguity before it becomes code. The FR can protect the project from “almost right.”&lt;/p&gt;

&lt;p&gt;And the solo developer can keep building without needing to hold the entire system in their head at once.&lt;/p&gt;

&lt;p&gt;That, for me, is the point.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr2pv10kxbseqi59yv00z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fr2pv10kxbseqi59yv00z.png" alt=" " width="654" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
    <item>
      <title>I spent a week trying to make AI-assisted development less chaotic.</title>
      <dc:creator>davidvk89</dc:creator>
      <pubDate>Tue, 30 Jun 2026 12:52:54 +0000</pubDate>
      <link>https://dev.to/davidvk89/i-spent-a-week-trying-to-make-ai-assisted-development-less-chaotic-366h</link>
      <guid>https://dev.to/davidvk89/i-spent-a-week-trying-to-make-ai-assisted-development-less-chaotic-366h</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvstdjwy0pu75fm88p86.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyvstdjwy0pu75fm88p86.png" alt=" " width="654" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Hi, I’m David.&lt;/p&gt;

&lt;p&gt;I’m close enough to middle age that I have no interest in pretending I discovered the future of software development in a week.&lt;/p&gt;

&lt;p&gt;What I did do was spend one serious week building a small local app with AI assistance, while trying to keep the project understandable.&lt;/p&gt;

&lt;p&gt;That turned out to be harder, and more interesting, than I expected.&lt;/p&gt;

&lt;p&gt;The coding agent could move quickly. Sometimes very quickly. It could generate code, refactor, write boilerplate, and help move the project forward.&lt;/p&gt;

&lt;p&gt;But it could also widen scope, preserve the wrong assumption, “helpfully” redesign something I wanted to keep boring, or act on context that was never meant to become implementation work.&lt;/p&gt;

&lt;p&gt;The main lesson I took from that week was simple:&lt;/p&gt;

&lt;p&gt;AI-assisted development is not only a coding problem.&lt;/p&gt;

&lt;p&gt;It is a context management problem.&lt;/p&gt;

&lt;p&gt;So I started using a lightweight loop:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Task Brief      -&amp;gt; think through the problem
Codex Contract  -&amp;gt; give the coding agent a bounded instruction set
Final Review    -&amp;gt; test, inspect, patch, and update project memory
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The result was not perfect AI coding.&lt;/p&gt;

&lt;p&gt;The result was reviewable AI coding.&lt;/p&gt;

&lt;p&gt;That distinction felt important enough to write down.&lt;/p&gt;
&lt;h2&gt;
  
  
  The three articles
&lt;/h2&gt;

&lt;p&gt;I published three companion articles from that first week.&lt;/p&gt;

&lt;p&gt;They are meant to stand on their own, but together they describe the workflow, the memory system, and the objections I think are worth taking seriously.&lt;/p&gt;
&lt;h2&gt;
  
  
  1. Vibe Coding Done Right
&lt;/h2&gt;

&lt;p&gt;This is the accessible starting point.&lt;/p&gt;

&lt;p&gt;It explains how I used a lightweight, spec-driven workflow as a solo developer working with ChatGPT, Codex, VS Code, PowerShell, and a local LLM through LM Studio.&lt;/p&gt;

&lt;p&gt;The point is not the exact stack.&lt;/p&gt;

&lt;p&gt;The point is the separation:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one place for thinking, learning, and review;&lt;/li&gt;
&lt;li&gt;another place for bounded implementation;&lt;/li&gt;
&lt;li&gt;documentation as the memory that keeps the next task grounded.&lt;/li&gt;
&lt;/ul&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/davidvk89/vibe-coding-done-right-3o66" class="crayons-story__hidden-navigation-link"&gt;Vibe Coding Done Right&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/davidvk89" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" alt="davidvk89 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/davidvk89" class="crayons-story__secondary fw-medium m:hidden"&gt;
              davidvk89
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                davidvk89
                
              
              &lt;div id="story-author-preview-content-4031384" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/davidvk89" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;davidvk89&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/davidvk89/vibe-coding-done-right-3o66" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/davidvk89/vibe-coding-done-right-3o66" id="article-link-4031384"&gt;
          Vibe Coding Done Right
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/davidvk89/vibe-coding-done-right-3o66#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            12 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;/div&gt;
&lt;br&gt;


&lt;h2&gt;
  
  
  2. Documentation as Project Memory in AI-Assisted Development
&lt;/h2&gt;

&lt;p&gt;This is the more technical case-study piece.&lt;/p&gt;

&lt;p&gt;The part that surprised me most was documentation.&lt;/p&gt;

&lt;p&gt;Not documentation as a polished manual.&lt;br&gt;
Not documentation as a chore at the end.&lt;br&gt;
Not documentation nobody reads.&lt;/p&gt;

&lt;p&gt;Documentation as project memory.&lt;/p&gt;

&lt;p&gt;The project used a small set of live documents to preserve architecture, data shapes, API contracts, and technical debt.&lt;/p&gt;

&lt;p&gt;Those documents were updated as part of the implementation transaction, not someday after the work.&lt;/p&gt;

&lt;p&gt;That gave the next AI-assisted task a cleaner starting point.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/davidvk89/documentation-as-project-memory-in-ai-assisted-development-2699" class="crayons-story__hidden-navigation-link"&gt;Documentation as Project Memory in AI-Assisted Development&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/davidvk89" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" alt="davidvk89 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/davidvk89" class="crayons-story__secondary fw-medium m:hidden"&gt;
              davidvk89
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                davidvk89
                
              
              &lt;div id="story-author-preview-content-4031530" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/davidvk89" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;davidvk89&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/davidvk89/documentation-as-project-memory-in-ai-assisted-development-2699" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/davidvk89/documentation-as-project-memory-in-ai-assisted-development-2699" id="article-link-4031530"&gt;
          Documentation as Project Memory in AI-Assisted Development
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/davidvk89/documentation-as-project-memory-in-ai-assisted-development-2699#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            7 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  3. Defensive AI Engineering: Hardening the Project Memory Loop
&lt;/h2&gt;

&lt;p&gt;This one is for the reasonable skeptics.&lt;/p&gt;

&lt;p&gt;Because the obvious criticisms are fair.&lt;/p&gt;

&lt;p&gt;Isn’t this just documentation debt?&lt;/p&gt;

&lt;p&gt;Why manually pass context around when IDE agents can read the repo?&lt;/p&gt;

&lt;p&gt;Can you trust AI to update its own docs?&lt;/p&gt;

&lt;p&gt;Does this scale beyond one solo developer building a prototype?&lt;/p&gt;

&lt;p&gt;I do not think those questions should be hand-waved away.&lt;/p&gt;

&lt;p&gt;The third article is my attempt to stress-test the workflow rather than sell it as a universal answer.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/davidvk89/defensive-ai-engineering-2m27" class="crayons-story__hidden-navigation-link"&gt;Defensive AI Engineering&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/davidvk89" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" alt="davidvk89 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/davidvk89" class="crayons-story__secondary fw-medium m:hidden"&gt;
              davidvk89
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                davidvk89
                
              
              &lt;div id="story-author-preview-content-4031722" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/davidvk89" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;davidvk89&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/davidvk89/defensive-ai-engineering-2m27" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jun 30&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/davidvk89/defensive-ai-engineering-2m27" id="article-link-4031722"&gt;
          Defensive AI Engineering
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/productivity"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;productivity&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/davidvk89/defensive-ai-engineering-2m27#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  Supporting repo
&lt;/h2&gt;

&lt;p&gt;I also published a small GitHub repo with the supporting files from the case study.&lt;/p&gt;

&lt;p&gt;It is not a framework or package.&lt;/p&gt;

&lt;p&gt;It is just the artifact trail: project-memory files, example Codex Contracts, and supporting notes from the development sequence.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/davidvk89" rel="noopener noreferrer"&gt;
        davidvk89
      &lt;/a&gt; / &lt;a href="https://github.com/davidvk89/ai-project-memory-loop" rel="noopener noreferrer"&gt;
        ai-project-memory-loop
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      A lightweight workflow for using live project documentation as memory in AI-assisted development.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;ai-project-memory-loop&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Supporting files for a one-week case study in using live project documentation as memory during AI-assisted development.&lt;/p&gt;
&lt;p&gt;This repository is not a framework, package, or complete methodology. It is the artifact trail behind three companion articles about keeping AI-assisted development bounded, reviewable, and human-led.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Core idea&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;AI-assisted development has a context problem.&lt;/p&gt;
&lt;p&gt;Coding agents can move quickly, but they only work from the context they are given. A long planning conversation can contain rejected ideas, shorthand, future plans, temporary assumptions, and half-decisions. For a human, that is normal design exploration. For a coding agent, it can become accidental permission.&lt;/p&gt;
&lt;p&gt;The workflow documented here uses a lightweight loop:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;Task Brief      -&amp;gt; explore the problem
Codex Contract  -&amp;gt; define the bounded implementation
Final Review    -&amp;gt; test, inspect, patch, and update project memory
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The project memory files are updated as part of the work, not someday after the work. That gives the…&lt;/p&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/davidvk89/ai-project-memory-loop" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Why I’m posting this
&lt;/h2&gt;

&lt;p&gt;I am not claiming authority on AI engineering.&lt;/p&gt;

&lt;p&gt;Maybe someone else is also trying to use AI coding tools without turning their project into a mysterious pile of files that technically runs but no longer makes sense.&lt;/p&gt;

&lt;p&gt;If so, I hope some part of this is useful.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;A few moments later...&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I spent another week trying to understand why it worked
&lt;/h2&gt;

&lt;p&gt;After publishing the first three articles, I kept digging into what had actually made the workflow useful.&lt;/p&gt;

&lt;p&gt;The original series explains the practical project: how I tried to make AI-assisted development less chaotic during one week of building. The follow-up article is different. It is a deeper thought trail about the mechanism the prototype exposed.&lt;/p&gt;

&lt;p&gt;That mechanism is not just “better prompting” or “better documentation.” It is documentation functioning as operational project memory, maintained through controlled context flow.&lt;/p&gt;

&lt;p&gt;The follow-up also explains the harder boundary: if documentation can become project memory for AI-assisted work, then documentation becomes part of the instruction surface future agents may rely on. That makes review, implementation authority, trust gates, and security boundaries part of the story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Case File: Context Drift&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;A Thought Trail on Operational Memory, Controlled Context Flow, and AI-Assisted Development&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxcxqmpb96ss6xpso4xup.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fxcxqmpb96ss6xpso4xup.png" alt=" " width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/davidvk89/case-file-context-drift-2iak" class="crayons-story__hidden-navigation-link"&gt;Case File: Context Drift&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/davidvk89" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" alt="davidvk89 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/davidvk89" class="crayons-story__secondary fw-medium m:hidden"&gt;
              davidvk89
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                davidvk89
                
              
              &lt;div id="story-author-preview-content-4051755" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/davidvk89" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;davidvk89&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/davidvk89/case-file-context-drift-2iak" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/davidvk89/case-file-context-drift-2iak" id="article-link-4051755"&gt;
          Case File: Context Drift
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/documentation"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;documentation&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/davidvk89/case-file-context-drift-2iak#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            10 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;





&lt;p&gt;&lt;em&gt;Meanwhile...&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  I Just Wanted Bannerlord NPCs to Remember Things
&lt;/h2&gt;

&lt;p&gt;The practical series explains what I built.&lt;/p&gt;

&lt;p&gt;The deep dive explains the mechanism I later found inside the workflow.&lt;/p&gt;

&lt;p&gt;But the actual origin was much less grand: I was playing Bannerlord with an LLM, got hooked on the prose, and then realized the world needed memory if the magic was going to survive more than a few sessions.&lt;/p&gt;

&lt;p&gt;That path led to character memory, context packets, trust gates, and eventually the same controlled-context problem showing up in the development workflow itself.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/davidvk89/i-just-wanted-bannerlord-npcs-to-remember-things-aia" class="crayons-story__hidden-navigation-link"&gt;I Just Wanted Bannerlord NPCs to Remember Things&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/davidvk89" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" alt="davidvk89 profile" class="crayons-avatar__image" width="460" height="460"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/davidvk89" class="crayons-story__secondary fw-medium m:hidden"&gt;
              davidvk89
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                davidvk89
                
              
              &lt;div id="story-author-preview-content-4052605" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/davidvk89" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1014488%2Fc7126a8d-bc3f-4eb5-9deb-7831cb5a5744.jpeg" class="crayons-avatar__image" alt="" width="460" height="460"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;davidvk89&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/davidvk89/i-just-wanted-bannerlord-npcs-to-remember-things-aia" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/davidvk89/i-just-wanted-bannerlord-npcs-to-remember-things-aia" id="article-link-4052605"&gt;
          I Just Wanted Bannerlord NPCs to Remember Things
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/gamedev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;gamedev&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devjournal"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devjournal&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/davidvk89/i-just-wanted-bannerlord-npcs-to-remember-things-aia#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success crayons-icon c-btn__icon"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>programming</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
